xref: /freebsd-13.1/lib/libc/stdlib/getopt_long.3 (revision bd45f567)
1829a229dSAndrey A. Chernov.\"	$OpenBSD: getopt_long.3,v 1.10 2004/01/06 23:44:28 fgsch Exp $
2829a229dSAndrey A. Chernov.\"	$NetBSD: getopt_long.3,v 1.14 2003/08/07 16:43:40 agc Exp $
3a35a7e76SEric Melville.\"
4a35a7e76SEric Melville.\" Copyright (c) 1988, 1991, 1993
5a35a7e76SEric Melville.\"	The Regents of the University of California.  All rights reserved.
6a35a7e76SEric Melville.\"
7a35a7e76SEric Melville.\" Redistribution and use in source and binary forms, with or without
8a35a7e76SEric Melville.\" modification, are permitted provided that the following conditions
9a35a7e76SEric Melville.\" are met:
10a35a7e76SEric Melville.\" 1. Redistributions of source code must retain the above copyright
11a35a7e76SEric Melville.\"    notice, this list of conditions and the following disclaimer.
12a35a7e76SEric Melville.\" 2. Redistributions in binary form must reproduce the above copyright
13a35a7e76SEric Melville.\"    notice, this list of conditions and the following disclaimer in the
14a35a7e76SEric Melville.\"    documentation and/or other materials provided with the distribution.
15829a229dSAndrey A. Chernov.\" 3. Neither the name of the University nor the names of its contributors
16a35a7e76SEric Melville.\"    may be used to endorse or promote products derived from this software
17a35a7e76SEric Melville.\"    without specific prior written permission.
18a35a7e76SEric Melville.\"
19a35a7e76SEric Melville.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20a35a7e76SEric Melville.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21a35a7e76SEric Melville.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22a35a7e76SEric Melville.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23a35a7e76SEric Melville.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24a35a7e76SEric Melville.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25a35a7e76SEric Melville.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26a35a7e76SEric Melville.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27a35a7e76SEric Melville.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28a35a7e76SEric Melville.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29a35a7e76SEric Melville.\" SUCH DAMAGE.
30a35a7e76SEric Melville.\"
31a35a7e76SEric Melville.\"     @(#)getopt.3	8.5 (Berkeley) 4/27/95
32187f61dfSRuslan Ermilov.\" $FreeBSD$
33a35a7e76SEric Melville.\"
34*bd45f567SGlen Barber.Dd December 25, 2011
35a35a7e76SEric Melville.Dt GETOPT_LONG 3
36a35a7e76SEric Melville.Os
37a35a7e76SEric Melville.Sh NAME
38829a229dSAndrey A. Chernov.Nm getopt_long ,
39829a229dSAndrey A. Chernov.Nm getopt_long_only
40a35a7e76SEric Melville.Nd get long options from command line argument list
41a35a7e76SEric Melville.Sh LIBRARY
42a35a7e76SEric Melville.Lb libc
43a35a7e76SEric Melville.Sh SYNOPSIS
44187f61dfSRuslan Ermilov.In getopt.h
4575207c7aSAndrey A. Chernov.Vt extern char *optarg ;
4675207c7aSAndrey A. Chernov.Vt extern int optind ;
4775207c7aSAndrey A. Chernov.Vt extern int optopt ;
4875207c7aSAndrey A. Chernov.Vt extern int opterr ;
4975207c7aSAndrey A. Chernov.Vt extern int optreset ;
50a35a7e76SEric Melville.Ft int
51187f61dfSRuslan Ermilov.Fo getopt_long
52187f61dfSRuslan Ermilov.Fa "int argc" "char * const *argv" "const char *optstring"
53829a229dSAndrey A. Chernov.Fa "const struct option *longopts" "int *longindex"
54829a229dSAndrey A. Chernov.Fc
55829a229dSAndrey A. Chernov.Ft int
56829a229dSAndrey A. Chernov.Fo getopt_long_only
57829a229dSAndrey A. Chernov.Fa "int argc" "char * const *argv" "const char *optstring"
58829a229dSAndrey A. Chernov.Fa "const struct option *longopts" "int *longindex"
59187f61dfSRuslan Ermilov.Fc
60a35a7e76SEric Melville.Sh DESCRIPTION
61a35a7e76SEric MelvilleThe
62a35a7e76SEric Melville.Fn getopt_long
63a35a7e76SEric Melvillefunction is similar to
64a35a7e76SEric Melville.Xr getopt 3
65187f61dfSRuslan Ermilovbut it accepts options in two forms: words and characters.
66187f61dfSRuslan ErmilovThe
67a35a7e76SEric Melville.Fn getopt_long
68187f61dfSRuslan Ermilovfunction provides a superset of the functionality of
69a35a7e76SEric Melville.Xr getopt 3 .
701fae73b1SRuslan ErmilovThe
71a35a7e76SEric Melville.Fn getopt_long
721fae73b1SRuslan Ermilovfunction
73187f61dfSRuslan Ermilovcan be used in two ways.
74187f61dfSRuslan ErmilovIn the first way, every long option understood
75a35a7e76SEric Melvilleby the program has a corresponding short option, and the option
76a35a7e76SEric Melvillestructure is only used to translate from long options to short
77187f61dfSRuslan Ermilovoptions.
78187f61dfSRuslan ErmilovWhen used in this fashion,
79a35a7e76SEric Melville.Fn getopt_long
80a35a7e76SEric Melvillebehaves identically to
81a35a7e76SEric Melville.Xr getopt 3 .
82a35a7e76SEric MelvilleThis is a good way to add long option processing to an existing program
83a35a7e76SEric Melvillewith the minimum of rewriting.
84a35a7e76SEric Melville.Pp
85a35a7e76SEric MelvilleIn the second mechanism, a long option sets a flag in the
86187f61dfSRuslan Ermilov.Vt option
87a35a7e76SEric Melvillestructure passed, or will store a pointer to the command line argument
88a35a7e76SEric Melvillein the
89187f61dfSRuslan Ermilov.Vt option
90187f61dfSRuslan Ermilovstructure passed to it for options that take arguments.
91187f61dfSRuslan ErmilovAdditionally,
92a35a7e76SEric Melvillethe long option's argument may be specified as a single argument with
93187f61dfSRuslan Ermilovan equal sign, e.g.,
94a35a7e76SEric Melville.Pp
95187f61dfSRuslan Ermilov.Dl "myprogram --myoption=somevalue"
96187f61dfSRuslan Ermilov.Pp
97187f61dfSRuslan ErmilovWhen a long option is processed, the call to
98a35a7e76SEric Melville.Fn getopt_long
99187f61dfSRuslan Ermilovwill return 0.
100187f61dfSRuslan ErmilovFor this reason, long option processing without
101a35a7e76SEric Melvilleshortcuts is not backwards compatible with
102a35a7e76SEric Melville.Xr getopt 3 .
103a35a7e76SEric Melville.Pp
104a35a7e76SEric MelvilleIt is possible to combine these methods, providing for long options
105187f61dfSRuslan Ermilovprocessing with short option equivalents for some options.
106187f61dfSRuslan ErmilovLess
107a35a7e76SEric Melvillefrequently used options would be processed as long options only.
108a35a7e76SEric Melville.Pp
109a35a7e76SEric MelvilleThe
110a35a7e76SEric Melville.Fn getopt_long
111a35a7e76SEric Melvillecall requires a structure to be initialized describing the long
112187f61dfSRuslan Ermilovoptions.
113187f61dfSRuslan ErmilovThe structure is:
114187f61dfSRuslan Ermilov.Bd -literal -offset indent
115a35a7e76SEric Melvillestruct option {
116a35a7e76SEric Melville	char *name;
117a35a7e76SEric Melville	int has_arg;
118a35a7e76SEric Melville	int *flag;
119a35a7e76SEric Melville	int val;
120a35a7e76SEric Melville};
121a35a7e76SEric Melville.Ed
122a35a7e76SEric Melville.Pp
123a35a7e76SEric MelvilleThe
124187f61dfSRuslan Ermilov.Va name
125a35a7e76SEric Melvillefield should contain the option name without the leading double dash.
126a35a7e76SEric Melville.Pp
127a35a7e76SEric MelvilleThe
128187f61dfSRuslan Ermilov.Va has_arg
129a35a7e76SEric Melvillefield should be one of:
130187f61dfSRuslan Ermilov.Pp
131187f61dfSRuslan Ermilov.Bl -tag -width ".Dv optional_argument" -offset indent -compact
132187f61dfSRuslan Ermilov.It Dv no_argument
133187f61dfSRuslan Ermilovno argument to the option is expect
134187f61dfSRuslan Ermilov.It Dv required_argument
135187f61dfSRuslan Ermilovan argument to the option is required
136629a7369SRuslan Ermilov.It Dv optional_argument
137a35a7e76SEric Melvillean argument to the option may be presented.
138a35a7e76SEric Melville.El
139a35a7e76SEric Melville.Pp
140a35a7e76SEric MelvilleIf
141187f61dfSRuslan Ermilov.Va flag
142187f61dfSRuslan Ermilovis not
143187f61dfSRuslan Ermilov.Dv NULL ,
144187f61dfSRuslan Ermilovthen the integer pointed to by it will be set to the
145a35a7e76SEric Melvillevalue in the
146187f61dfSRuslan Ermilov.Va val
147187f61dfSRuslan Ermilovfield.
148187f61dfSRuslan ErmilovIf the
149187f61dfSRuslan Ermilov.Va flag
150187f61dfSRuslan Ermilovfield is
151187f61dfSRuslan Ermilov.Dv NULL ,
152187f61dfSRuslan Ermilovthen the
153187f61dfSRuslan Ermilov.Va val
154187f61dfSRuslan Ermilovfield will be returned.
155187f61dfSRuslan ErmilovSetting
156187f61dfSRuslan Ermilov.Va flag
157187f61dfSRuslan Ermilovto
158187f61dfSRuslan Ermilov.Dv NULL
159187f61dfSRuslan Ermilovand setting
160187f61dfSRuslan Ermilov.Va val
161a35a7e76SEric Melvilleto the corresponding short option will make this function act just
162a35a7e76SEric Melvillelike
163a35a7e76SEric Melville.Xr getopt 3 .
164829a229dSAndrey A. Chernov.Pp
165829a229dSAndrey A. ChernovIf the
166829a229dSAndrey A. Chernov.Fa longindex
167829a229dSAndrey A. Chernovfield is not
168829a229dSAndrey A. Chernov.Dv NULL ,
169829a229dSAndrey A. Chernovthen the integer pointed to by it will be set to the index of the long
170829a229dSAndrey A. Chernovoption relative to
171829a229dSAndrey A. Chernov.Fa longopts .
172829a229dSAndrey A. Chernov.Pp
173829a229dSAndrey A. ChernovThe last element of the
174829a229dSAndrey A. Chernov.Fa longopts
175829a229dSAndrey A. Chernovarray has to be filled with zeroes.
176829a229dSAndrey A. Chernov.Pp
177829a229dSAndrey A. ChernovThe
178829a229dSAndrey A. Chernov.Fn getopt_long_only
179829a229dSAndrey A. Chernovfunction behaves identically to
180829a229dSAndrey A. Chernov.Fn getopt_long
181829a229dSAndrey A. Chernovwith the exception that long options may start with
182829a229dSAndrey A. Chernov.Ql -
183829a229dSAndrey A. Chernovin addition to
184829a229dSAndrey A. Chernov.Ql -- .
185829a229dSAndrey A. ChernovIf an option starting with
186829a229dSAndrey A. Chernov.Ql -
187829a229dSAndrey A. Chernovdoes not match a long option but does match a single-character option,
188829a229dSAndrey A. Chernovthe single-character option is returned.
189829a229dSAndrey A. Chernov.Sh RETURN VALUES
190829a229dSAndrey A. ChernovIf the
191829a229dSAndrey A. Chernov.Fa flag
192829a229dSAndrey A. Chernovfield in
193629a7369SRuslan Ermilov.Vt "struct option"
194829a229dSAndrey A. Chernovis
195829a229dSAndrey A. Chernov.Dv NULL ,
196829a229dSAndrey A. Chernov.Fn getopt_long
197829a229dSAndrey A. Chernovand
198829a229dSAndrey A. Chernov.Fn getopt_long_only
199829a229dSAndrey A. Chernovreturn the value specified in the
200829a229dSAndrey A. Chernov.Fa val
201829a229dSAndrey A. Chernovfield, which is usually just the corresponding short option.
202829a229dSAndrey A. ChernovIf
203829a229dSAndrey A. Chernov.Fa flag
204829a229dSAndrey A. Chernovis not
205829a229dSAndrey A. Chernov.Dv NULL ,
206829a229dSAndrey A. Chernovthese functions return 0 and store
207829a229dSAndrey A. Chernov.Fa val
208829a229dSAndrey A. Chernovin the location pointed to by
209829a229dSAndrey A. Chernov.Fa flag .
210829a229dSAndrey A. ChernovThese functions return
211829a229dSAndrey A. Chernov.Ql \&:
212829a229dSAndrey A. Chernovif there was a missing option argument,
213829a229dSAndrey A. Chernov.Ql \&?
214829a229dSAndrey A. Chernovif the user specified an unknown or ambiguous option, and
215829a229dSAndrey A. Chernov\-1 when the argument list has been exhausted.
21624a0682cSRuslan Ermilov.Sh ENVIRONMENT
21724a0682cSRuslan Ermilov.Bl -tag -width ".Ev POSIXLY_CORRECT"
21824a0682cSRuslan Ermilov.It Ev POSIXLY_CORRECT
21924a0682cSRuslan ErmilovIf set, option processing stops when the first non-option is found and
22024a0682cSRuslan Ermilova leading
22124a0682cSRuslan Ermilov.Ql -
22224a0682cSRuslan Ermilovor
22324a0682cSRuslan Ermilov.Ql +
22424a0682cSRuslan Ermilovin the
22524a0682cSRuslan Ermilov.Fa optstring
22624a0682cSRuslan Ermilovis ignored.
22724a0682cSRuslan Ermilov.El
228a35a7e76SEric Melville.Sh EXAMPLES
229a35a7e76SEric Melville.Bd -literal -compact
230a35a7e76SEric Melvilleint bflag, ch, fd;
231a35a7e76SEric Melvilleint daggerset;
232a35a7e76SEric Melville
233a35a7e76SEric Melville/* options descriptor */
234a35a7e76SEric Melvillestatic struct option longopts[] = {
235829a229dSAndrey A. Chernov	{ "buffy",	no_argument,		NULL, 		'b' },
236829a229dSAndrey A. Chernov	{ "fluoride",	required_argument,	NULL, 	       	'f' },
237a35a7e76SEric Melville	{ "daggerset",	no_argument,		\*[Am]daggerset,	1 },
238829a229dSAndrey A. Chernov	{ NULL,		0,			NULL, 		0 }
239a35a7e76SEric Melville};
240a35a7e76SEric Melville
241a35a7e76SEric Melvillebflag = 0;
242*bd45f567SGlen Barberwhile ((ch = getopt_long(argc, argv, "bf:", longopts, NULL)) != -1) {
243a35a7e76SEric Melville	switch (ch) {
244a35a7e76SEric Melville	case 'b':
245a35a7e76SEric Melville		bflag = 1;
246a35a7e76SEric Melville		break;
247a35a7e76SEric Melville	case 'f':
248829a229dSAndrey A. Chernov		if ((fd = open(optarg, O_RDONLY, 0)) == -1)
249829a229dSAndrey A. Chernov			err(1, "unable to open %s", optarg);
250a35a7e76SEric Melville		break;
251a35a7e76SEric Melville	case 0:
252a35a7e76SEric Melville		if (daggerset) {
253a35a7e76SEric Melville			fprintf(stderr,"Buffy will use her dagger to "
254829a229dSAndrey A. Chernov			    "apply fluoride to dracula's teeth\en");
255a35a7e76SEric Melville		}
256a35a7e76SEric Melville		break;
257a35a7e76SEric Melville	default:
258a35a7e76SEric Melville		usage();
259a35a7e76SEric Melville	}
260*bd45f567SGlen Barber}
261a35a7e76SEric Melvilleargc -= optind;
262a35a7e76SEric Melvilleargv += optind;
263a35a7e76SEric Melville.Ed
264a35a7e76SEric Melville.Sh IMPLEMENTATION DIFFERENCES
265187f61dfSRuslan ErmilovThis section describes differences to the
266187f61dfSRuslan Ermilov.Tn GNU
267187f61dfSRuslan Ermilovimplementation
268a35a7e76SEric Melvillefound in glibc-2.1.3:
269187f61dfSRuslan Ermilov.Bl -bullet
2708a4dd785SAndrey A. Chernov.\" .It
2718a4dd785SAndrey A. Chernov.\" Handling of
2728a4dd785SAndrey A. Chernov.\" .Ql -
2738a4dd785SAndrey A. Chernov.\" as first char of option string in presence of
2748a4dd785SAndrey A. Chernov.\" environment variable
2758a4dd785SAndrey A. Chernov.\" .Ev POSIXLY_CORRECT :
2768a4dd785SAndrey A. Chernov.\" .Bl -tag -width ".Bx"
2778a4dd785SAndrey A. Chernov.\" .It Tn GNU
2788a4dd785SAndrey A. Chernov.\" ignores
2798a4dd785SAndrey A. Chernov.\" .Ev POSIXLY_CORRECT
2808a4dd785SAndrey A. Chernov.\" and returns non-options as
2818a4dd785SAndrey A. Chernov.\" arguments to option '\e1'.
2828a4dd785SAndrey A. Chernov.\" .It Bx
2838a4dd785SAndrey A. Chernov.\" honors
2848a4dd785SAndrey A. Chernov.\" .Ev POSIXLY_CORRECT
2858a4dd785SAndrey A. Chernov.\" and stops at the first non-option.
2868a4dd785SAndrey A. Chernov.\" .El
2873700175bSAndrey A. Chernov.\" .It
2883700175bSAndrey A. Chernov.\" Handling of
2893700175bSAndrey A. Chernov.\" .Ql -
2903700175bSAndrey A. Chernov.\" within the option string (not the first character):
2913700175bSAndrey A. Chernov.\" .Bl -tag -width ".Bx"
2923700175bSAndrey A. Chernov.\" .It Tn GNU
2933700175bSAndrey A. Chernov.\" treats a
2943700175bSAndrey A. Chernov.\" .Ql -
2953700175bSAndrey A. Chernov.\" on the command line as a non-argument.
2963700175bSAndrey A. Chernov.\" .It Bx
2973700175bSAndrey A. Chernov.\" a
2983700175bSAndrey A. Chernov.\" .Ql -
2993700175bSAndrey A. Chernov.\" within the option string matches a
3003700175bSAndrey A. Chernov.\" .Ql -
3013700175bSAndrey A. Chernov.\" (single dash) on the command line.
3023700175bSAndrey A. Chernov.\" This functionality is provided for backward compatibility with
3033700175bSAndrey A. Chernov.\" programs, such as
3043700175bSAndrey A. Chernov.\" .Xr su 1 ,
3053700175bSAndrey A. Chernov.\" that use
3063700175bSAndrey A. Chernov.\" .Ql -
3073700175bSAndrey A. Chernov.\" as an option flag.
3083700175bSAndrey A. Chernov.\" This practice is wrong, and should not be used in any current development.
3093700175bSAndrey A. Chernov.\" .El
310f2fd86b7SAndrey A. Chernov.\" .It
311f2fd86b7SAndrey A. Chernov.\" Handling of
312f2fd86b7SAndrey A. Chernov.\" .Ql ::
313f2fd86b7SAndrey A. Chernov.\" in options string in presence of
314f2fd86b7SAndrey A. Chernov.\" .Ev POSIXLY_CORRECT :
315f2fd86b7SAndrey A. Chernov.\" .Bl -tag -width ".Bx"
316f2fd86b7SAndrey A. Chernov.\" .It Both
317f2fd86b7SAndrey A. Chernov.\" .Tn GNU
318f2fd86b7SAndrey A. Chernov.\" and
319f2fd86b7SAndrey A. Chernov.\" .Bx
320f2fd86b7SAndrey A. Chernov.\" ignore
321f2fd86b7SAndrey A. Chernov.\" .Ev POSIXLY_CORRECT
322f2fd86b7SAndrey A. Chernov.\" here and take
323f2fd86b7SAndrey A. Chernov.\" .Ql ::
324f2fd86b7SAndrey A. Chernov.\" to
325f2fd86b7SAndrey A. Chernov.\" mean the preceding option takes an optional argument.
326f2fd86b7SAndrey A. Chernov.\" .El
32788485399SAndrey A. Chernov.\" .It
32888485399SAndrey A. Chernov.\" Return value in case of missing argument if first character
32988485399SAndrey A. Chernov.\" (after
33088485399SAndrey A. Chernov.\" .Ql +
33188485399SAndrey A. Chernov.\" or
33288485399SAndrey A. Chernov.\" .Ql - )
33388485399SAndrey A. Chernov.\" in option string is not
33488485399SAndrey A. Chernov.\" .Ql \&: :
33588485399SAndrey A. Chernov.\" .Bl -tag -width ".Bx"
33688485399SAndrey A. Chernov.\" .It Tn GNU
33788485399SAndrey A. Chernov.\" returns
33888485399SAndrey A. Chernov.\" .Ql \&?
33988485399SAndrey A. Chernov.\" .It Bx
34088485399SAndrey A. Chernov.\" returns
34188485399SAndrey A. Chernov.\" .Ql \&:
34288485399SAndrey A. Chernov.\" (since
34388485399SAndrey A. Chernov.\" .Bx Ns 's
34488485399SAndrey A. Chernov.\" .Fn getopt
34588485399SAndrey A. Chernov.\" does).
34688485399SAndrey A. Chernov.\" .El
3472298a6e7SAndrey A. Chernov.\" .It
3482298a6e7SAndrey A. Chernov.\" Handling of
3492298a6e7SAndrey A. Chernov.\" .Ql --a
3502298a6e7SAndrey A. Chernov.\" in getopt:
3512298a6e7SAndrey A. Chernov.\" .Bl -tag -width ".Bx"
3522298a6e7SAndrey A. Chernov.\" .It Tn GNU
3532298a6e7SAndrey A. Chernov.\" parses this as option
3542298a6e7SAndrey A. Chernov.\" .Ql - ,
3552298a6e7SAndrey A. Chernov.\" option
3562298a6e7SAndrey A. Chernov.\" .Ql a .
3572298a6e7SAndrey A. Chernov.\" .It Bx
3582298a6e7SAndrey A. Chernov.\" parses this as
3592298a6e7SAndrey A. Chernov.\" .Ql -- ,
3602298a6e7SAndrey A. Chernov.\" and returns \-1 (ignoring the
3612298a6e7SAndrey A. Chernov.\" .Ql a ) .
3622298a6e7SAndrey A. Chernov.\" (Because the original
3632298a6e7SAndrey A. Chernov.\" .Fn getopt
3642298a6e7SAndrey A. Chernov.\" does.)
3652298a6e7SAndrey A. Chernov.\" .El
366187f61dfSRuslan Ermilov.It
367187f61dfSRuslan ErmilovSetting of
368187f61dfSRuslan Ermilov.Va optopt
369187f61dfSRuslan Ermilovfor long options with
370187f61dfSRuslan Ermilov.Va flag
371187f61dfSRuslan Ermilov!=
372187f61dfSRuslan Ermilov.Dv NULL :
373829a229dSAndrey A. Chernov.Bl -tag -width ".Bx"
374187f61dfSRuslan Ermilov.It Tn GNU
375187f61dfSRuslan Ermilovsets
376187f61dfSRuslan Ermilov.Va optopt
377187f61dfSRuslan Ermilovto
378187f61dfSRuslan Ermilov.Va val .
379829a229dSAndrey A. Chernov.It Bx
380187f61dfSRuslan Ermilovsets
381187f61dfSRuslan Ermilov.Va optopt
382187f61dfSRuslan Ermilovto 0 (since
383187f61dfSRuslan Ermilov.Va val
384187f61dfSRuslan Ermilovwould never be returned).
385a35a7e76SEric Melville.El
3862298a6e7SAndrey A. Chernov.\" .It
3872298a6e7SAndrey A. Chernov.\" Handling of
3882298a6e7SAndrey A. Chernov.\" .Ql -W
3892298a6e7SAndrey A. Chernov.\" with
3902298a6e7SAndrey A. Chernov.\" .Ql W;
3912298a6e7SAndrey A. Chernov.\" in option string in
3922298a6e7SAndrey A. Chernov.\" .Fn getopt
3932298a6e7SAndrey A. Chernov.\" (not
3942298a6e7SAndrey A. Chernov.\" .Fn getopt_long ) :
3952298a6e7SAndrey A. Chernov.\" .Bl -tag -width ".Bx"
3962298a6e7SAndrey A. Chernov.\" .It Tn GNU
3972298a6e7SAndrey A. Chernov.\" causes a segfault.
3982298a6e7SAndrey A. Chernov.\" .It Bx
3992298a6e7SAndrey A. Chernov.\" no special handling is done;
4002298a6e7SAndrey A. Chernov.\" .Ql W;
4012298a6e7SAndrey A. Chernov.\" is interpreted as two separate options, neither of which take an argument.
4022298a6e7SAndrey A. Chernov.\" .El
403187f61dfSRuslan Ermilov.It
404187f61dfSRuslan ErmilovSetting of
405187f61dfSRuslan Ermilov.Va optarg
406187f61dfSRuslan Ermilovfor long options without an argument that are
407187f61dfSRuslan Ermilovinvoked via
408187f61dfSRuslan Ermilov.Ql -W
409187f61dfSRuslan Ermilov.Ql ( W;
410187f61dfSRuslan Ermilovin option string):
411829a229dSAndrey A. Chernov.Bl -tag -width ".Bx"
412187f61dfSRuslan Ermilov.It Tn GNU
413187f61dfSRuslan Ermilovsets
414187f61dfSRuslan Ermilov.Va optarg
415187f61dfSRuslan Ermilovto the option name (the argument of
416187f61dfSRuslan Ermilov.Ql -W ) .
417829a229dSAndrey A. Chernov.It Bx
418187f61dfSRuslan Ermilovsets
419187f61dfSRuslan Ermilov.Va optarg
420187f61dfSRuslan Ermilovto
421187f61dfSRuslan Ermilov.Dv NULL
422187f61dfSRuslan Ermilov(the argument of the long option).
423a35a7e76SEric Melville.El
424187f61dfSRuslan Ermilov.It
425187f61dfSRuslan ErmilovHandling of
426187f61dfSRuslan Ermilov.Ql -W
427187f61dfSRuslan Ermilovwith an argument that is not (a prefix to) a known
428187f61dfSRuslan Ermilovlong option
429187f61dfSRuslan Ermilov.Ql ( W;
430187f61dfSRuslan Ermilovin option string):
431829a229dSAndrey A. Chernov.Bl -tag -width ".Bx"
432187f61dfSRuslan Ermilov.It Tn GNU
433187f61dfSRuslan Ermilovreturns
434187f61dfSRuslan Ermilov.Ql -W
435187f61dfSRuslan Ermilovwith
436187f61dfSRuslan Ermilov.Va optarg
437187f61dfSRuslan Ermilovset to the unknown option.
438829a229dSAndrey A. Chernov.It Bx
439187f61dfSRuslan Ermilovtreats this as an error (unknown option) and returns
440187f61dfSRuslan Ermilov.Ql \&?
441187f61dfSRuslan Ermilovwith
442187f61dfSRuslan Ermilov.Va optopt
443187f61dfSRuslan Ermilovset to 0 and
444187f61dfSRuslan Ermilov.Va optarg
445187f61dfSRuslan Ermilovset to
446187f61dfSRuslan Ermilov.Dv NULL
447187f61dfSRuslan Ermilov(as
448187f61dfSRuslan Ermilov.Tn GNU Ns 's
449187f61dfSRuslan Ermilovman page documents).
450a35a7e76SEric Melville.El
451f2fd86b7SAndrey A. Chernov.\" .It
452f2fd86b7SAndrey A. Chernov.\" The error messages are different.
453187f61dfSRuslan Ermilov.It
454829a229dSAndrey A. Chernov.Bx
455187f61dfSRuslan Ermilovdoes not permute the argument vector at the same points in
456187f61dfSRuslan Ermilovthe calling sequence as
457187f61dfSRuslan Ermilov.Tn GNU
458187f61dfSRuslan Ermilovdoes.
459187f61dfSRuslan ErmilovThe aspects normally used by
460187f61dfSRuslan Ermilovthe caller (ordering after \-1 is returned, value of
461187f61dfSRuslan Ermilov.Va optind
462187f61dfSRuslan Ermilovrelative
463187f61dfSRuslan Ermilovto current positions) are the same, though.
464187f61dfSRuslan Ermilov(We do fewer variable swaps.)
465a35a7e76SEric Melville.El
466a35a7e76SEric Melville.Sh SEE ALSO
467a35a7e76SEric Melville.Xr getopt 3
468a35a7e76SEric Melville.Sh HISTORY
469a35a7e76SEric MelvilleThe
470a35a7e76SEric Melville.Fn getopt_long
471829a229dSAndrey A. Chernovand
472829a229dSAndrey A. Chernov.Fn getopt_long_only
473c2025a76SJoel Dahlfunctions first appeared in the
474187f61dfSRuslan Ermilov.Tn GNU
475c2025a76SJoel Dahllibiberty library.
476187f61dfSRuslan ErmilovThe first
477829a229dSAndrey A. Chernov.Bx
478829a229dSAndrey A. Chernovimplementation of
479829a229dSAndrey A. Chernov.Fn getopt_long
480829a229dSAndrey A. Chernovappeared in
481829a229dSAndrey A. Chernov.Nx 1.5 ,
482829a229dSAndrey A. Chernovthe first
483829a229dSAndrey A. Chernov.Bx
484829a229dSAndrey A. Chernovimplementation of
485829a229dSAndrey A. Chernov.Fn getopt_long_only
486829a229dSAndrey A. Chernovin
487829a229dSAndrey A. Chernov.Ox 3.3 .
488829a229dSAndrey A. Chernov.Fx
489829a229dSAndrey A. Chernovfirst included
490829a229dSAndrey A. Chernov.Fn getopt_long
491829a229dSAndrey A. Chernovin
492829a229dSAndrey A. Chernov.Fx 5.0 ,
493829a229dSAndrey A. Chernov.Fn getopt_long_only
494829a229dSAndrey A. Chernovin
495829a229dSAndrey A. Chernov.Fx 5.2 .
496a35a7e76SEric Melville.Sh BUGS
497829a229dSAndrey A. ChernovThe
498629a7369SRuslan Ermilov.Fa argv
499829a229dSAndrey A. Chernovargument is not really
500629a7369SRuslan Ermilov.Vt const
501829a229dSAndrey A. Chernovas its elements may be permuted (unless
502829a229dSAndrey A. Chernov.Ev POSIXLY_CORRECT
503829a229dSAndrey A. Chernovis set).
504829a229dSAndrey A. Chernov.Pp
505187f61dfSRuslan ErmilovThe implementation can completely replace
506a35a7e76SEric Melville.Xr getopt 3 ,
507a35a7e76SEric Melvillebut right now we are using separate code.
508