summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/getopt.3
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/getopt.3')
-rw-r--r--src/lib/libc/stdlib/getopt.3288
1 files changed, 200 insertions, 88 deletions
diff --git a/src/lib/libc/stdlib/getopt.3 b/src/lib/libc/stdlib/getopt.3
index f843881afd..e0dc3701f9 100644
--- a/src/lib/libc/stdlib/getopt.3
+++ b/src/lib/libc/stdlib/getopt.3
@@ -9,11 +9,7 @@
9.\" 2. Redistributions in binary form must reproduce the above copyright 9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\" notice, this list of conditions and the following disclaimer in the 10.\" notice, this list of conditions and the following disclaimer in the
11.\" documentation and/or other materials provided with the distribution. 11.\" documentation and/or other materials provided with the distribution.
12.\" 3. All advertising materials mentioning features or use of this software 12.\" 3. Neither the name of the University nor the names of its contributors
13.\" must display the following acknowledgement:
14.\" This product includes software developed by the University of
15.\" California, Berkeley and its contributors.
16.\" 4. Neither the name of the University nor the names of its contributors
17.\" may be used to endorse or promote products derived from this software 13.\" may be used to endorse or promote products derived from this software
18.\" without specific prior written permission. 14.\" without specific prior written permission.
19.\" 15.\"
@@ -29,20 +25,20 @@
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE. 26.\" SUCH DAMAGE.
31.\" 27.\"
32.\" @(#)getopt.3 8.4 (Berkeley) 4/19/94 28.\" $OpenBSD: getopt.3,v 1.31 2005/03/26 22:02:15 millert Exp $
33.\" 29.\"
34.Dd April 19, 1994 30.Dd December 17, 2002
35.Dt GETOPT 3 31.Dt GETOPT 3
36.Os BSD 4.3 32.Os
37.Sh NAME 33.Sh NAME
38.Nm getopt 34.Nm getopt
39.Nd get option character from command line argument list 35.Nd get option character from command line argument list
40.Sh SYNOPSIS 36.Sh SYNOPSIS
41.Fd #include <unistd.h> 37.Fd #include <unistd.h>
42.Vt extern char *optarg; 38.Vt extern char *optarg;
39.Vt extern int opterr;
43.Vt extern int optind; 40.Vt extern int optind;
44.Vt extern int optopt; 41.Vt extern int optopt;
45.Vt extern int opterr;
46.Vt extern int optreset; 42.Vt extern int optreset;
47.Ft int 43.Ft int
48.Fn getopt "int argc" "char * const *argv" "const char *optstring" 44.Fn getopt "int argc" "char * const *argv" "const char *optstring"
@@ -61,20 +57,23 @@ if it has been specified in the string of accepted option characters,
61.Pp 57.Pp
62The option string 58The option string
63.Fa optstring 59.Fa optstring
64may contain the following elements: individual characters, and 60may contain the following elements: individual characters,
65characters followed by a colon to indicate an option argument 61characters followed by a colon, and characters followed by two colons.
66is to follow. 62A character followed by a single colon indicates that an argument
63is to follow the option on the command line.
64Two colons indicates that the argument is optional \- this is an
65extension not covered by POSIX.
67For example, an option string 66For example, an option string
68.Li "\&""x"" 67.Qq x
69recognizes an option 68recognizes an option
70.Dq Fl x , 69.Fl x ,
71and an option string 70and an option string
72.Li "\&""x:"" 71.Qq Li x:
73recognizes an option and argument 72recognizes an option and argument
74.Dq Fl x Ar argument . 73.Fl x Ar argument .
75It does not matter to 74It does not matter to
76.Fn getopt 75.Fn getopt
77if a following argument has leading white space. 76if a following argument has leading whitespace.
78.Pp 77.Pp
79On return from 78On return from
80.Fn getopt , 79.Fn getopt ,
@@ -87,23 +86,23 @@ contains the index to the next
87argument for a subsequent call 86argument for a subsequent call
88to 87to
89.Fn getopt . 88.Fn getopt .
90The variable
91.Va optopt
92saves the last
93.Em known
94option character returned by
95.Fn getopt .
96.Pp 89.Pp
97The variable 90The variables
98.Va opterr 91.Va opterr
99and 92and
100.Va optind 93.Va optind
101are both initialized to 1. 94are both initialized to 1.
102The 95The
103.Va optind 96.Va optind
104variable may be set to another value before a set of calls to 97variable may be set to another value larger than 0 before a set of calls to
105.Fn getopt 98.Fn getopt
106in order to skip over more or less argv entries. 99in order to skip over more or less
100.Fa argv
101entries.
102An
103.Va optind
104value of 0 is reserved for compatibility with GNU
105.Fn getopt .
107.Pp 106.Pp
108In order to use 107In order to use
109.Fn getopt 108.Fn getopt
@@ -119,63 +118,62 @@ must be reinitialized.
119.Pp 118.Pp
120The 119The
121.Fn getopt 120.Fn getopt
122function 121function returns \-1 when the argument list is exhausted.
123returns \-1
124when the argument list is exhausted, or a non-recognized
125option is encountered.
126The interpretation of options in the argument list may be cancelled 122The interpretation of options in the argument list may be cancelled
127by the option 123by the option
128.Ql -- 124.Ql --
129(double dash) which causes 125(double dash) which causes
130.Fn getopt 126.Fn getopt
131to signal the end of argument processing and returns \-1. 127to signal the end of argument processing and return \-1.
132When all options have been processed (i.e., up to the first non-option 128When all options have been processed (i.e., up to the first non-option
133argument), 129argument),
134.Fn getopt 130.Fn getopt
135returns \-1. 131returns \-1.
136.Sh DIAGNOSTICS 132.Sh RETURN VALUES
137If the 133The
138.Fn getopt 134.Fn getopt
139function encounters a character not found in the string 135function returns the next known option character in
140.Va optarg 136.Fa optstring .
141or detects
142a missing option argument it writes an error message and returns
143.Ql ?
144to the
145.Em stderr .
146Setting
147.Va opterr
148to a zero will disable these error messages.
149If 137If
150.Va optstring 138.Fn getopt
151has a leading 139encounters a character not found in
152.Ql \&: 140.Fa optstring
153then a missing option argument causes a 141or if it detects a missing option argument,
154.Ql \&: 142it returns
155to be returned in addition to suppressing any error messages. 143.Sq \&?
156.Pp 144(question mark).
157Option arguments are allowed to begin with 145If
158.Dq Li \- ; 146.Fa optstring
159this is reasonable but 147has a leading
160reduces the amount of error checking possible. 148.Sq \&:
161.Sh EXTENSIONS 149then a missing option argument causes
150.Sq \&:
151to be returned instead of
152.Sq \&? .
153In either case, the variable
154.Va optopt
155is set to the character that caused the error.
162The 156The
163.Va optreset
164variable was added to make it possible to call the
165.Fn getopt 157.Fn getopt
166function multiple times. 158function returns \-1 when the argument list is exhausted.
167This is an extension to the 159.Sh ENVIRONMENT
168.St -p1003.2 160.Bl -tag -width POSIXLY_CORRECTXX
169specification. 161.It Ev POSIXLY_CORRECT
170.Sh EXAMPLE 162If set, a leading
163.Sq -
164in
165.Ar optstring
166is ignored.
167.El
168.Sh EXAMPLES
171.Bd -literal -compact 169.Bd -literal -compact
172extern char *optarg; 170extern char *optarg;
173extern int optind; 171extern int optind;
174int bflag, ch, fd; 172int bflag, ch, fd;
175 173
176bflag = 0; 174bflag = 0;
177while ((ch = getopt(argc, argv, "bf:")) != -1) 175while ((ch = getopt(argc, argv, "bf:")) != -1) {
178 switch(ch) { 176 switch (ch) {
179 case 'b': 177 case 'b':
180 bflag = 1; 178 bflag = 1;
181 break; 179 break;
@@ -189,31 +187,90 @@ while ((ch = getopt(argc, argv, "bf:")) != -1)
189 case '?': 187 case '?':
190 default: 188 default:
191 usage(); 189 usage();
190 }
192} 191}
193argc -= optind; 192argc -= optind;
194argv += optind; 193argv += optind;
195.Ed 194.Ed
196.Sh HISTORY 195.Sh DIAGNOSTICS
196If the
197.Fn getopt
198function encounters a character not found in the string
199.Fa optstring
200or detects
201a missing option argument it writes an error message to
202.Em stderr
203and returns
204.Ql \&? .
205Setting
206.Va opterr
207to a zero will disable these error messages.
208If
209.Fa optstring
210has a leading
211.Ql \&:
212then a missing option argument causes a
213.Ql \&:
214to be returned in addition to suppressing any error messages.
215.Pp
216Option arguments are allowed to begin with
217.Ql - ;
218this is reasonable but reduces the amount of error checking possible.
219.Sh SEE ALSO
220.Xr getopt 1 ,
221.Xr getopt_long 3 ,
222.Xr getsubopt 3
223.Sh STANDARDS
197The 224The
198.Fn getopt 225.Fn getopt
199function appeared 226function implements a superset of the functionality specified by
200.Bx 4.3 . 227.St -p1003.1 .
201.Sh BUGS 228.Pp
229The following extensions are supported:
230.Bl -tag -width "xxx"
231.It Li o
202The 232The
233.Va optreset
234variable was added to make it possible to call the
203.Fn getopt 235.Fn getopt
204function was once specified to return 236function multiple times.
205.Dv EOF 237.It Li o
206instead of \-1. 238If the
207This was changed by 239.Va optind
208.St -p1003.2-92 240variable is set to 0,
209to decouple
210.Fn getopt 241.Fn getopt
211from 242will behave as if the
212.Pa <stdio.h> . 243.Va optreset
213.Pp 244variable has been set.
245This is for compatibility with
246.Tn GNU
247.Fn getopt .
248New code should use
249.Va optreset
250instead.
251.It Li o
252If the first character of
253.Fa optstring
254is a plus sign
255.Pq Ql + ,
256it will be ignored.
257This is for compatibility with
258.Tn GNU
259.Fn getopt .
260.It Li o
261If the first character of
262.Fa optstring
263is a dash
264.Pq Ql - ,
265non-options will be returned as arguments to the option character
266.Ql \e1 .
267This is for compatibility with
268.Tn GNU
269.Fn getopt .
270.It Li o
214A single dash 271A single dash
215.Dq Li - 272.Pq Ql -
216may be specified as an character in 273may be specified as a character in
217.Fa optstring , 274.Fa optstring ,
218however it should 275however it should
219.Em never 276.Em never
@@ -221,39 +278,94 @@ have an argument associated with it.
221This allows 278This allows
222.Fn getopt 279.Fn getopt
223to be used with programs that expect 280to be used with programs that expect
224.Dq Li - 281.Ql -
225as an option flag. 282as an option flag.
226This practice is wrong, and should not be used in any current development. 283This practice is wrong, and should not be used in any current development.
227It is provided for backward compatibility 284It is provided for backward compatibility
228.Em only . 285.Em only .
286Care should be taken not to use
287.Ql -
288as the first character in
289.Fa optstring
290to avoid a semantic conflict with
291.Tn GNU
292.Fn getopt
293semantics (see above).
229By default, a single dash causes 294By default, a single dash causes
230.Fn getopt 295.Fn getopt
231to return \-1. 296to return \-1.
232This is, we believe, compatible with System V. 297.El
298.Pp
299Unlike
300.Tn GNU
301.Fn getopt ,
302.Ox
303does not permute the argument vector to allow non-options to be
304interspersed with options on the command line.
305Programs requiring this behavior should use
306.Xr getopt_long 3
307instead.
308Because of this (and unlike
309.Tn GNU ) ,
310the
311.Ox
312.Fn getopt
313supports optional arguments separated by whitespace.
314.Pp
315Historic
316.Bx
317versions of
318.Fn getopt
319set
320.Fa optopt
321to the last option character processed.
322However, this conflicts with
323.St -p1003.1
324which stipulates that
325.Fa optopt
326be set to the last character that caused an error.
327.Sh HISTORY
328The
329.Fn getopt
330function appeared in
331.Bx 4.3 .
332.Sh BUGS
333The
334.Fn getopt
335function was once specified to return
336.Dv EOF
337instead of \-1.
338This was changed by
339.St -p1003.2-92
340to decouple
341.Fn getopt
342from
343.Aq Pa stdio.h .
233.Pp 344.Pp
234It is also possible to handle digits as option letters. 345It is possible to handle digits as option letters.
235This allows 346This allows
236.Fn getopt 347.Fn getopt
237to be used with programs that expect a number 348to be used with programs that expect a number
238.Pq Dq Li \&-\&3 349.Pq Dq Li \-3
239as an option. 350as an option.
240This practice is wrong, and should not be used in any current development. 351This practice is wrong, and should not be used in any current development.
241It is provided for backward compatibility 352It is provided for backward compatibility
242.Em only . 353.Em only .
243The following code fragment works in most cases. 354The following code fragment works in most cases.
244.Bd -literal -offset indent 355.Bd -literal -offset indent
245int length; 356int ch;
357long length;
246char *p; 358char *p;
247 359
248while ((c = getopt(argc, argv, "0123456789")) != -1) 360while ((ch = getopt(argc, argv, "0123456789")) != -1) {
249 switch (c) { 361 switch (ch) {
250 case '0': case '1': case '2': case '3': case '4': 362 case '0': case '1': case '2': case '3': case '4':
251 case '5': case '6': case '7': case '8': case '9': 363 case '5': case '6': case '7': case '8': case '9':
252 p = argv[optind - 1]; 364 p = argv[optind - 1];
253 if (p[0] == '-' && p[1] == ch && !p[2]) 365 if (p[0] == '-' && p[1] == ch && !p[2])
254 length = atoi(++p); 366 length = ch - '0';
255 else 367 else
256 length = atoi(argv[optind] + 1); 368 length = strtol(argv[optind] + 1, NULL, 10);
257 break; 369 break;
258 } 370 }
259} 371}