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.3308
1 files changed, 206 insertions, 102 deletions
diff --git a/src/lib/libc/stdlib/getopt.3 b/src/lib/libc/stdlib/getopt.3
index f843881afd..ecdf42ab76 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.42 2011/03/05 22:10:11 guenther Exp $
33.\" 29.\"
34.Dd April 19, 1994 30.Dd $Mdocdate: March 5 2011 $
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,25 @@ 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; except in the case where
77the argument is optional, denoted with two colons, no leading whitespace
78is permitted.
78.Pp 79.Pp
79On return from 80On return from
80.Fn getopt , 81.Fn getopt ,
@@ -87,23 +88,23 @@ contains the index to the next
87argument for a subsequent call 88argument for a subsequent call
88to 89to
89.Fn getopt . 90.Fn getopt .
90The variable
91.Va optopt
92saves the last
93.Em known
94option character returned by
95.Fn getopt .
96.Pp 91.Pp
97The variable 92The variables
98.Va opterr 93.Va opterr
99and 94and
100.Va optind 95.Va optind
101are both initialized to 1. 96are both initialized to 1.
102The 97The
103.Va optind 98.Va optind
104variable may be set to another value before a set of calls to 99variable may be set to another value larger than 0 before a set of calls to
105.Fn getopt 100.Fn getopt
106in order to skip over more or less argv entries. 101in order to skip over more or less
102.Fa argv
103entries.
104An
105.Va optind
106value of 0 is reserved for compatibility with GNU
107.Fn getopt .
107.Pp 108.Pp
108In order to use 109In order to use
109.Fn getopt 110.Fn getopt
@@ -119,101 +120,154 @@ must be reinitialized.
119.Pp 120.Pp
120The 121The
121.Fn getopt 122.Fn getopt
122function 123function 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 124The interpretation of options in the argument list may be cancelled
127by the option 125by the option
128.Ql -- 126.Ql --
129(double dash) which causes 127(double dash) which causes
130.Fn getopt 128.Fn getopt
131to signal the end of argument processing and returns \-1. 129to signal the end of argument processing and return \-1.
132When all options have been processed (i.e., up to the first non-option 130When all options have been processed (i.e., up to the first non-option
133argument), 131argument),
134.Fn getopt 132.Fn getopt
135returns \-1. 133returns \-1.
136.Sh DIAGNOSTICS 134.Sh RETURN VALUES
137If the 135The
138.Fn getopt 136.Fn getopt
139function encounters a character not found in the string 137function returns the next known option character in
140.Va optarg 138.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 139If
150.Va optstring 140.Fn getopt
151has a leading 141encounters a character not found in
152.Ql \&: 142.Fa optstring
153then a missing option argument causes a 143or if it detects a missing option argument,
154.Ql \&: 144it returns
155to be returned in addition to suppressing any error messages. 145.Sq \&?
156.Pp 146(question mark).
157Option arguments are allowed to begin with 147If
158.Dq Li \- ; 148.Fa optstring
159this is reasonable but 149has a leading
160reduces the amount of error checking possible. 150.Sq \&:
161.Sh EXTENSIONS 151then a missing option argument causes
152.Sq \&:
153to be returned instead of
154.Sq \&? .
155In either case, the variable
156.Va optopt
157is set to the character that caused the error.
162The 158The
163.Va optreset
164variable was added to make it possible to call the
165.Fn getopt 159.Fn getopt
166function multiple times. 160function returns \-1 when the argument list is exhausted.
167This is an extension to the 161.Sh EXAMPLES
168.St -p1003.2 162The following code accepts the options
169specification. 163.Fl b
170.Sh EXAMPLE 164and
171.Bd -literal -compact 165.Fl f Ar argument
172extern char *optarg; 166and adjusts
173extern int optind; 167.Va argc
168and
169.Va argv
170after option argument processing has completed.
171.Bd -literal -offset indent
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;
182 case 'f': 180 case 'f':
183 if ((fd = open(optarg, O_RDONLY, 0)) < 0) { 181 if ((fd = open(optarg, O_RDONLY, 0)) == -1)
184 (void)fprintf(stderr, 182 err(1, "%s", optarg);
185 "myname: %s: %s\en", optarg, strerror(errno));
186 exit(1);
187 }
188 break; 183 break;
189 case '?':
190 default: 184 default:
191 usage(); 185 usage();
186 /* NOTREACHED */
187 }
192} 188}
193argc -= optind; 189argc -= optind;
194argv += optind; 190argv += optind;
195.Ed 191.Ed
196.Sh HISTORY 192.Sh DIAGNOSTICS
193If the
194.Fn getopt
195function encounters a character not found in the string
196.Fa optstring
197or detects
198a missing option argument, it writes an error message to
199.Em stderr
200and returns
201.Ql \&? .
202Setting
203.Va opterr
204to a zero will disable these error messages.
205If
206.Fa optstring
207has a leading
208.Ql \&:
209then a missing option argument causes a
210.Ql \&:
211to be returned in addition to suppressing any error messages.
212.Pp
213Option arguments are allowed to begin with
214.Ql - ;
215this is reasonable but reduces the amount of error checking possible.
216.Sh SEE ALSO
217.Xr getopt 1 ,
218.Xr getopt_long 3 ,
219.Xr getsubopt 3
220.Sh STANDARDS
197The 221The
198.Fn getopt 222.Fn getopt
199function appeared 223function implements a superset of the functionality specified by
200.Bx 4.3 . 224.St -p1003.1 .
201.Sh BUGS 225.Pp
226The following extensions are supported:
227.Bl -tag -width "xxx"
228.It Li o
202The 229The
230.Va optreset
231variable was added to make it possible to call the
203.Fn getopt 232.Fn getopt
204function was once specified to return 233function multiple times.
205.Dv EOF 234.It Li o
206instead of \-1. 235If the
207This was changed by 236.Va optind
208.St -p1003.2-92 237variable is set to 0,
209to decouple
210.Fn getopt 238.Fn getopt
211from 239will behave as if the
212.Pa <stdio.h> . 240.Va optreset
213.Pp 241variable has been set.
242This is for compatibility with
243.Tn GNU
244.Fn getopt .
245New code should use
246.Va optreset
247instead.
248.It Li o
249If the first character of
250.Fa optstring
251is a plus sign
252.Pq Ql + ,
253it will be ignored.
254This is for compatibility with
255.Tn GNU
256.Fn getopt .
257.It Li o
258If the first character of
259.Fa optstring
260is a dash
261.Pq Ql - ,
262non-options will be returned as arguments to the option character
263.Ql \e1 .
264This is for compatibility with
265.Tn GNU
266.Fn getopt .
267.It Li o
214A single dash 268A single dash
215.Dq Li - 269.Pq Ql -
216may be specified as an character in 270may be specified as a character in
217.Fa optstring , 271.Fa optstring ,
218however it should 272however it should
219.Em never 273.Em never
@@ -221,40 +275,90 @@ have an argument associated with it.
221This allows 275This allows
222.Fn getopt 276.Fn getopt
223to be used with programs that expect 277to be used with programs that expect
224.Dq Li - 278.Ql -
225as an option flag. 279as an option flag.
226This practice is wrong, and should not be used in any current development. 280This practice is wrong, and should not be used in any current development.
227It is provided for backward compatibility 281It is provided for backward compatibility
228.Em only . 282.Em only .
283Care should be taken not to use
284.Ql -
285as the first character in
286.Fa optstring
287to avoid a semantic conflict with
288.Tn GNU
289.Fn getopt
290semantics (see above).
229By default, a single dash causes 291By default, a single dash causes
230.Fn getopt 292.Fn getopt
231to return \-1. 293to return \-1.
232This is, we believe, compatible with System V. 294.El
295.Pp
296Historic
297.Bx
298versions of
299.Fn getopt
300set
301.Fa optopt
302to the last option character processed.
303However, this conflicts with
304.St -p1003.1
305which stipulates that
306.Fa optopt
307be set to the last character that caused an error.
308.Sh HISTORY
309The
310.Fn getopt
311function appeared in
312.Bx 4.3 .
313.Sh BUGS
314The
315.Fn getopt
316function was once specified to return
317.Dv EOF
318instead of \-1.
319This was changed by
320.St -p1003.2-92
321to decouple
322.Fn getopt
323from
324.Aq Pa stdio.h .
233.Pp 325.Pp
234It is also possible to handle digits as option letters. 326It is possible to handle digits as option letters.
235This allows 327This allows
236.Fn getopt 328.Fn getopt
237to be used with programs that expect a number 329to be used with programs that expect a number
238.Pq Dq Li \&-\&3 330.Pq Dq Li \-3
239as an option. 331as an option.
240This practice is wrong, and should not be used in any current development. 332This practice is wrong, and should not be used in any current development.
241It is provided for backward compatibility 333It is provided for backward compatibility
242.Em only . 334.Em only .
243The following code fragment works in most cases. 335The following code fragment works in most cases and can handle mixed
336number and letter arguments.
244.Bd -literal -offset indent 337.Bd -literal -offset indent
245int length; 338int aflag = 0, bflag = 0, ch, lastch = '\e0';
246char *p; 339int length = -1, newarg = 1, prevoptind = 1;
247 340
248while ((c = getopt(argc, argv, "0123456789")) != -1) 341while ((ch = getopt(argc, argv, "0123456789ab")) != -1) {
249 switch (c) { 342 switch (ch) {
250 case '0': case '1': case '2': case '3': case '4': 343 case '0': case '1': case '2': case '3': case '4':
251 case '5': case '6': case '7': case '8': case '9': 344 case '5': case '6': case '7': case '8': case '9':
252 p = argv[optind - 1]; 345 if (newarg || !isdigit(lastch))
253 if (p[0] == '-' && p[1] == ch && !p[2]) 346 length = 0;
254 length = atoi(++p); 347 else if (length > INT_MAX / 10)
255 else 348 usage();
256 length = atoi(argv[optind] + 1); 349 length = (length * 10) + (ch - '0');
257 break; 350 break;
351 case 'a':
352 aflag = 1;
353 break;
354 case 'b':
355 bflag = 1;
356 break;
357 default:
358 usage();
258 } 359 }
360 lastch = ch;
361 newarg = optind != prevoptind;
362 prevoptind = optind;
259} 363}
260.Ed 364.Ed