311 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\"	$NetBSD: getopt_long.3,v 1.18 2007/07/02 17:56:17 ginsbach Exp $
 | 
						|
.\"
 | 
						|
.\" Copyright (c) 1988, 1991, 1993
 | 
						|
.\"	The Regents of the University of California.  All rights reserved.
 | 
						|
.\"
 | 
						|
.\" Redistribution and use in source and binary forms, with or without
 | 
						|
.\" modification, are permitted provided that the following conditions
 | 
						|
.\" are met:
 | 
						|
.\" 1. Redistributions of source code must retain the above copyright
 | 
						|
.\"    notice, this list of conditions and the following disclaimer.
 | 
						|
.\" 2. Redistributions in binary form must reproduce the above copyright
 | 
						|
.\"    notice, this list of conditions and the following disclaimer in the
 | 
						|
.\"    documentation and/or other materials provided with the distribution.
 | 
						|
.\" 3. Neither the name of the University nor the names of its contributors
 | 
						|
.\"    may be used to endorse or promote products derived from this software
 | 
						|
.\"    without specific prior written permission.
 | 
						|
.\"
 | 
						|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 | 
						|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
						|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
						|
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 | 
						|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
						|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
						|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
						|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
						|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
						|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
						|
.\" SUCH DAMAGE.
 | 
						|
.\"
 | 
						|
.\"     @(#)getopt.3	8.5 (Berkeley) 4/27/95
 | 
						|
.\"
 | 
						|
.Dd July 2, 2007
 | 
						|
.Dt GETOPT_LONG 3
 | 
						|
.Os
 | 
						|
.Sh NAME
 | 
						|
.Nm getopt_long
 | 
						|
.Nd get long options from command line argument list
 | 
						|
.Sh LIBRARY
 | 
						|
.Lb libc
 | 
						|
.Sh SYNOPSIS
 | 
						|
.In getopt.h
 | 
						|
.Ft int
 | 
						|
.Fn getopt_long "int argc" "char * const *argv" "const char *optstring" "struct option *long_options" "int *index"
 | 
						|
.Sh DESCRIPTION
 | 
						|
The
 | 
						|
.Fn getopt_long
 | 
						|
function is similar to
 | 
						|
.Xr getopt 3
 | 
						|
but it accepts options in two forms: words and characters.
 | 
						|
The
 | 
						|
.Fn getopt_long
 | 
						|
function provides a superset of the functionality of
 | 
						|
.Xr getopt 3 .
 | 
						|
.Fn getopt_long
 | 
						|
can be used in two ways.
 | 
						|
In the first way, every long option understood by the program has a
 | 
						|
corresponding short option, and the option structure is only used to
 | 
						|
translate from long options to short options.
 | 
						|
When used in this fashion,
 | 
						|
.Fn getopt_long
 | 
						|
behaves identically to
 | 
						|
.Xr getopt 3 .
 | 
						|
This is a good way to add long option processing to an existing program
 | 
						|
with the minimum of rewriting.
 | 
						|
.Pp
 | 
						|
In the second mechanism, a long option sets a flag in the
 | 
						|
.Fa option
 | 
						|
structure passed, or will store a pointer to the command line argument
 | 
						|
in the
 | 
						|
.Fa option
 | 
						|
structure passed to it for options that take arguments.
 | 
						|
Additionally, the long option's argument may be specified as a single
 | 
						|
argument with an equal sign, e.g.
 | 
						|
.Bd -literal
 | 
						|
myprogram --myoption=somevalue
 | 
						|
.Ed
 | 
						|
.Pp
 | 
						|
When a long option is processed the call to
 | 
						|
.Fn getopt_long
 | 
						|
will return 0.
 | 
						|
For this reason, long option processing without
 | 
						|
shortcuts is not backwards compatible with
 | 
						|
.Xr getopt 3 .
 | 
						|
.Pp
 | 
						|
It is possible to combine these methods, providing for long options
 | 
						|
processing with short option equivalents for some options.
 | 
						|
Less frequently used options would be processed as long options only.
 | 
						|
.Pp
 | 
						|
Abbreviated long option names are accepted when
 | 
						|
.Fn getopt_long
 | 
						|
processes long options if the abbreviation is unique.
 | 
						|
An exact match is always preferred for a defined long option.
 | 
						|
.Pp
 | 
						|
The
 | 
						|
.Fn getopt_long
 | 
						|
call requires a structure to be initialized describing the long options.
 | 
						|
The structure is:
 | 
						|
.Bd -literal
 | 
						|
struct option {
 | 
						|
	char *name;
 | 
						|
	int has_arg;
 | 
						|
	int *flag;
 | 
						|
	int val;
 | 
						|
};
 | 
						|
.Ed
 | 
						|
.Pp
 | 
						|
The
 | 
						|
.Fa name
 | 
						|
field should contain the option name without the leading double dash.
 | 
						|
.Pp
 | 
						|
The
 | 
						|
.Fa has_arg
 | 
						|
field should be one of:
 | 
						|
.Bl -tag -width "optional_argument"
 | 
						|
.It Li no_argument
 | 
						|
no argument to the option is expect.
 | 
						|
.It Li required_argument
 | 
						|
an argument to the option is required.
 | 
						|
.It Li optional_argument
 | 
						|
an argument to the option may be presented.
 | 
						|
.El
 | 
						|
.Pp
 | 
						|
If
 | 
						|
.Fa flag
 | 
						|
is not
 | 
						|
.Dv NULL ,
 | 
						|
then the integer pointed to by it will be set to the value in the
 | 
						|
.Fa val
 | 
						|
field.
 | 
						|
If the
 | 
						|
.Fa flag
 | 
						|
field is
 | 
						|
.Dv NULL ,
 | 
						|
then the
 | 
						|
.Fa val
 | 
						|
field will be returned.
 | 
						|
Setting
 | 
						|
.Fa flag
 | 
						|
to
 | 
						|
.Dv NULL
 | 
						|
and setting
 | 
						|
.Fa val
 | 
						|
to the corresponding short option will make this function act just
 | 
						|
like
 | 
						|
.Xr getopt 3 .
 | 
						|
.Pp
 | 
						|
If the
 | 
						|
.Fa index
 | 
						|
field is not
 | 
						|
.Dv NULL ,
 | 
						|
the integer it points to will be set to the index of the long option
 | 
						|
in the
 | 
						|
.Fa long_options
 | 
						|
array.
 | 
						|
.Pp
 | 
						|
The last element of the
 | 
						|
.Fa long_options
 | 
						|
array has to be filled with zeroes (see
 | 
						|
.Sx EXAMPLES
 | 
						|
section).
 | 
						|
.Sh EXAMPLES
 | 
						|
.Bd -literal -compact
 | 
						|
extern char *optarg;
 | 
						|
extern int optind;
 | 
						|
int bflag, ch, fd;
 | 
						|
int daggerset;
 | 
						|
 | 
						|
/* options descriptor */
 | 
						|
static struct option longopts[] = {
 | 
						|
	{ "buffy",	no_argument,		0, 		'b' },
 | 
						|
	{ "fluoride",	required_argument,	0, 	       	'f' },
 | 
						|
	{ "daggerset",	no_argument,		\*[Am]daggerset,	1 },
 | 
						|
	{ NULL,		0,			NULL, 		0 }
 | 
						|
};
 | 
						|
 | 
						|
bflag = 0;
 | 
						|
while ((ch = getopt_long(argc, argv, "bf:", longopts, NULL)) != -1)
 | 
						|
	switch (ch) {
 | 
						|
	case 'b':
 | 
						|
		bflag = 1;
 | 
						|
		break;
 | 
						|
	case 'f':
 | 
						|
		if ((fd = open(optarg, O_RDONLY, 0)) \*[Lt] 0) {
 | 
						|
			(void)fprintf(stderr,
 | 
						|
			    "myname: %s: %s\en", optarg, strerror(errno));
 | 
						|
			exit(1);
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case 0:
 | 
						|
		if(daggerset) {
 | 
						|
			fprintf(stderr,"Buffy will use her dagger to "
 | 
						|
				       "apply fluoride to dracula's teeth\en");
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	case '?':
 | 
						|
	default:
 | 
						|
		usage();
 | 
						|
}
 | 
						|
argc -= optind;
 | 
						|
argv += optind;
 | 
						|
.Ed
 | 
						|
.Sh IMPLEMENTATION DIFFERENCES
 | 
						|
This section describes differences to the GNU implementation
 | 
						|
found in glibc-2.1.3:
 | 
						|
.Bl -tag -width "xxx"
 | 
						|
.It Li o
 | 
						|
handling of - as first char of option string in presence of
 | 
						|
environment variable POSIXLY_CORRECT:
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li GNU
 | 
						|
ignores POSIXLY_CORRECT and returns non-options as
 | 
						|
arguments to option '\e1'.
 | 
						|
.It Li NetBSD
 | 
						|
honors POSIXLY_CORRECT and stops at the first non-option.
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
handling of :: in options string in presence of POSIXLY_CORRECT:
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li Both
 | 
						|
GNU and NetBSD ignore POSIXLY_CORRECT here and take :: to
 | 
						|
mean the preceding option takes an optional argument.
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
return value in case of missing argument if first character
 | 
						|
(after + or -) in option string is not ':':
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li GNU
 | 
						|
returns '?'
 | 
						|
.It NetBSD
 | 
						|
returns ':' (since NetBSD's getopt does).
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
handling of --a in getopt:
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li GNU
 | 
						|
parses this as option '-', option 'a'.
 | 
						|
.It Li NetBSD
 | 
						|
parses this as '--', and returns \-1 (ignoring the a).
 | 
						|
(Because the original getopt does.)
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
setting of optopt for long options with flag !=
 | 
						|
.Dv NULL :
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li GNU
 | 
						|
sets optopt to val.
 | 
						|
.It Li NetBSD
 | 
						|
sets optopt to 0 (since val would never be returned).
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
handling of -W with W; in option string in getopt (not getopt_long):
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li GNU
 | 
						|
causes a segfault.
 | 
						|
.It Li NetBSD
 | 
						|
returns \-1, with optind pointing past the argument of -W
 | 
						|
(as if `-W arg' were `--arg', and thus '--' had been found).
 | 
						|
.\" How should we treat W; in the option string when called via
 | 
						|
.\" getopt?  Ignore the ';' or treat it as a ':'? Issue a warning?
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
setting of optarg for long options without an argument that are
 | 
						|
invoked via -W (W; in option string):
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li GNU
 | 
						|
sets optarg to the option name (the argument of -W).
 | 
						|
.It Li NetBSD
 | 
						|
sets optarg to
 | 
						|
.Dv NULL
 | 
						|
(the argument of the long option).
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
handling of -W with an argument that is not (a prefix to) a known
 | 
						|
long option (W; in option string):
 | 
						|
.Bl -tag -width "NetBSD"
 | 
						|
.It Li GNU
 | 
						|
returns -W with optarg set to the unknown option.
 | 
						|
.It Li NetBSD
 | 
						|
treats this as an error (unknown option) and returns '?' with
 | 
						|
optopt set to 0 and optarg set to
 | 
						|
.Dv NULL
 | 
						|
(as GNU's man page documents).
 | 
						|
.El
 | 
						|
.It Li o
 | 
						|
The error messages are different.
 | 
						|
.It Li o
 | 
						|
NetBSD does not permute the argument vector at the same points in
 | 
						|
the calling sequence as GNU does.
 | 
						|
The aspects normally used by the caller
 | 
						|
(ordering after \-1 is returned, value of optind relative
 | 
						|
to current positions) are the same, though.
 | 
						|
(We do fewer variable swaps.)
 | 
						|
.El
 | 
						|
.Sh SEE ALSO
 | 
						|
.Xr getopt 3
 | 
						|
.Sh HISTORY
 | 
						|
The
 | 
						|
.Fn getopt_long
 | 
						|
function first appeared in GNU libiberty.
 | 
						|
The first
 | 
						|
.Nx
 | 
						|
implementation appeared in 1.5.
 | 
						|
.Sh BUGS
 | 
						|
The implementation can completely replace
 | 
						|
.Xr getopt 3 ,
 | 
						|
but right now we are using separate code.
 | 
						|
.Pp
 | 
						|
The
 | 
						|
.Fa argv
 | 
						|
argument is not really const.
 |