xref: /original-bsd/lib/libc/stdlib/getopt.3 (revision 7afc0fa3)
1.\" Copyright (c) 1988, 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" %sccs.include.redist.man%
5.\"
6.\"     @(#)getopt.3	8.4 (Berkeley) 04/19/94
7.\"
8.Dd
9.Dt GETOPT 3
10.Os BSD 4.3
11.Sh NAME
12.Nm getopt
13.Nd get option character from command line argument list
14.Sh SYNOPSIS
15.Fd #include <stdlib.h>
16.Vt extern char *optarg;
17.Vt extern int   optind;
18.Vt extern int   optopt;
19.Vt extern int   opterr;
20.Vt extern int   optreset;
21.Ft int
22.Fn getopt "int argc" "char * const *argv" "const char *optstring"
23.Sh DESCRIPTION
24The
25.Fn getopt
26function incrementally parses a command line argument list
27.Fa argv
28and returns the next
29.Em known
30option character.
31An option character is
32.Em known
33if it has been specified in the string of accepted option characters,
34.Fa optstring .
35.Pp
36The option string
37.Fa optstring
38may contain the following elements: individual characters, and
39characters followed by a colon to indicate an option argument
40is to follow.
41For example, an option string
42.Li "\&""x""
43recognizes an option
44.Dq Fl x ,
45and an option string
46.Li "\&""x:""
47recognizes an option and argument
48.Dq Fl x Ar argument .
49It does not matter to
50.Fn getopt
51if a following argument has leading white space.
52.Pp
53On return from
54.Fn getopt ,
55.Va optarg
56points to an option argument, if it is anticipated,
57and the variable
58.Va optind
59contains the index to the next
60.Fa argv
61argument for a subsequent call
62to
63.Fn getopt .
64The variable
65.Va optopt
66saves the last
67.Em known
68option character returned by
69.Fn getopt .
70.Pp
71The variable
72.Va opterr
73and
74.Va optind
75are both initialized to 1.
76The
77.Va optind
78variable may be set to another value before a set of calls to
79.Fn getopt
80in order to skip over more or less argv entries.
81.Pp
82In order to use
83.Fn getopt
84to evaluate multiple sets of arguments, or to evaluate a single set of
85arguments multiple times,
86the variable
87.Va optreset
88must be set to 1 before the second and each additional set of calls to
89.Fn getopt ,
90and the variable
91.Va optind
92must be reinitialized.
93.Pp
94The
95.Fn getopt
96function
97returns an
98.Dv EOF
99when the argument list is exhausted, or a non-recognized
100option is encountered.
101The interpretation of options in the argument list may be cancelled
102by the option
103.Ql --
104(double dash) which causes
105.Fn getopt
106to signal the end of argument processing and return an
107.Dv EOF .
108When all options have been processed (i.e., up to the first non-option
109argument),
110.Fn getopt
111returns
112.Dv EOF .
113.Sh DIAGNOSTICS
114If the
115.Fn getopt
116function encounters a character not found in the string
117.Va optarg
118or detects
119a missing option argument it writes an error message and returns
120.Ql ?
121to the
122.Em stderr .
123Setting
124.Va opterr
125to a zero will disable these error messages.
126If
127.Va optstring
128has a leading
129.Ql \&:
130then a missing option argument causes a
131.Ql \&:
132to be returned in addition to suppressing any error messages.
133.Pp
134Option arguments are allowed to begin with
135.Dq Li \- ;
136this is reasonable but
137reduces the amount of error checking possible.
138.Sh EXTENSIONS
139The
140.Va optreset
141variable was added to make it possible to call the
142.Fn getopt
143function multiple times.
144This is an extension to the
145.St -p1003.2
146specification.
147.Sh EXAMPLE
148.Bd -literal -compact
149extern char *optarg;
150extern int optind;
151int bflag, ch, fd;
152
153bflag = 0;
154while ((ch = getopt(argc, argv, "bf:")) != EOF)
155	switch(ch) {
156	case 'b':
157		bflag = 1;
158		break;
159	case 'f':
160		if ((fd = open(optarg, O_RDONLY, 0)) < 0) {
161			(void)fprintf(stderr,
162			    "myname: %s: %s\en", optarg, strerror(errno));
163			exit(1);
164		}
165		break;
166	case '?':
167	default:
168		usage();
169}
170argc -= optind;
171argv += optind;
172.Ed
173.Sh HISTORY
174The
175.Fn getopt
176function appeared
177.Bx 4.3 .
178.Sh BUGS
179A single dash
180.Dq Li -
181may be specified as an character in
182.Fa optstring ,
183however it should
184.Em never
185have an argument associated with it.
186This allows
187.Fn getopt
188to be used with programs that expect
189.Dq Li -
190as an option flag.
191This practice is wrong, and should not be used in any current development.
192It is provided for backward compatibility
193.Em only .
194By default, a single dash causes
195.Fn getopt
196to return
197.Dv EOF .
198This is, we believe, compatible with System V.
199.Pp
200It is also possible to handle digits as option letters.
201This allows
202.Fn getopt
203to be used with programs that expect a number
204.Pq Dq Li \&-\&3
205as an option.
206This practice is wrong, and should not be used in any current development.
207It is provided for backward compatibility
208.Em only .
209The following code fragment works in most cases.
210.Bd -literal -offset indent
211int length;
212char *p;
213
214while ((c = getopt(argc, argv, "0123456789")) != EOF)
215	switch (c) {
216	case '0': case '1': case '2': case '3': case '4':
217	case '5': case '6': case '7': case '8': case '9':
218		p = argv[optind - 1];
219		if (p[0] == '-' && p[1] == ch && !p[2])
220			length = atoi(++p);
221		else
222			length = atoi(argv[optind] + 1);
223		break;
224	}
225}
226.Ed
227