diff options
Diffstat (limited to 'lib/libc/stdlib/getopt.3')
| -rw-r--r-- | lib/libc/stdlib/getopt.3 | 164 |
1 files changed, 117 insertions, 47 deletions
diff --git a/lib/libc/stdlib/getopt.3 b/lib/libc/stdlib/getopt.3 index c21a0a725faf..c028465b992f 100644 --- a/lib/libc/stdlib/getopt.3 +++ b/lib/libc/stdlib/getopt.3 @@ -29,7 +29,8 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)getopt.3 6.16 (Berkeley) 4/19/91 +.\" from: @(#)getopt.3 6.16 (Berkeley) 4/19/91 +.\" $Id: getopt.3,v 1.2 1993/11/23 00:08:36 jtc Exp $ .\" .Dd April 19, 1991 .Dt GETOPT 3 @@ -38,12 +39,13 @@ .Nm getopt .Nd get option letter from argv .Sh SYNOPSIS -.Fd #include <stdlib.h> -.Vt extern char *optarg -.Vt extern int optind -.Vt extern int opterr +.Fd #include <unistd.h> .Ft int .Fn getopt "int argc" "char * const *argv" "const char *optstring" +.Vt extern char *optarg; +.Vt extern int optind; +.Vt extern int opterr; +.Vt extern int optopt; .Sh DESCRIPTION The .Fn getopt @@ -93,68 +95,137 @@ evaluation. The .Fn getopt function -returns an -.Dv EOF -when the argument list is exhausted, or a non-recognized -option is encountered. +returns \-1 +when the argument list is exhausted. The interpretation of options in the argument list may be cancelled by the option .Ql -- (double dash) which causes .Fn getopt -to signal the end of argument processing and return an -.Dv EOF . +to signal the end of argument processing and return \-1. When all options have been processed (i.e., up to the first non-option argument), .Fn getopt -returns -.Dv EOF . +returns \-1. .Sh DIAGNOSTICS -If the +If the .Fn getopt -function encounters a character not found in the string -.Va optarg -or detects -a missing option argument -it writes error message -.Ql ? -to the -.Em stderr . -Setting +function encounters an option character that is not contained in +.Fa optstring , +it returns a question mark +.Pq ? +character. +If it detects a missing option argument, it returns a colon +.Pq \: +character if the first character of +.Fa optstring +is a colon, otherwise it returns a question mark. +In either case, a diagnostic message is written to +.Em stderr +unless the application has set .Va opterr -to a zero will disable these error messages. +to zero or the first character of +.Fa optstring +is a colon. .Sh EXAMPLE +.\" The following example comes from section E.9.7 of the IEEE 1003.2-90 +.\" standard (POSIX.2). +The following code fragment shows how one might process the arguments for +a utility that can take the mutually exclusive options +.Em a +and +.Em b +and the options +.Em f +and +.Em o , +both of which require arguments: +.Pp .Bd -literal -compact -extern char *optarg; -extern int optind; -int bflag, ch, fd; +#include <unistd.h> -bflag = 0; -while ((ch = getopt(argc, argv, "bf:")) != EOF) - switch(ch) { - case 'b': - bflag = 1; - break; - case 'f': - if ((fd = open(optarg, O_RDONLY, 0)) < 0) { - (void)fprintf(stderr, - "myname: unable to read file %s.\en", optarg); - exit(1) ; +int +main (argc, argv) + int argc; + char *argv[]; +{ + int c, bflg, aflg, errflg = 0; + char *ifile, *ofile; + extern char *optarg; + extern int optind, optopt; + + . . . + + while ((c = getopt(argc, argv, ":abf:o:")) != -1) { + switch(ch) { + case 'a': + if (bflg) + errflg = 1; + else + aflg = 1; + break; + case 'b': + if (aflg) + errflg = 1; + else + bflg = 1; + break; + case 'f': + ifile = optarg; + break; + case 'o': + ofile = optarg; + break; + case ':': /* -f or -o without option-arg */ + fprintf (stderr, + "Option -%c requires an option-argument\\n", + optopt); + errflg = 1; + break; + case '?': + fprintf (stderr, + "Unrecognized option: -%c\\n", + optopt); + errflg = 1; + break; } - break; - case '?': - default: - usage(); + } + + if (errflg) { + fprintf (stderr, "usage: . . .\\n"); + exit (2); + } + + argc -= optind; + argv += optind; + + . . . + } -argc -= optind; -argv += optind; .Ed +.Sh STANDARDS +The +.Fn getopt +function conforms to +.St -p1003.2-92 . .Sh HISTORY The .Fn getopt function appeared .Bx 4.3 . .Sh BUGS +The +.Fn getopt +function was once specified to return +.Dv EOF +instead of \-1. +This was changed by +.St -p1003.2-92 +to decouple +.Fn getopt +from +.Pa <stdio.h> . +.Pp Option arguments are allowed to begin with .Dq Li \- ; this is reasonable but @@ -177,8 +248,7 @@ It is provided for backward compatibility .Em only . By default, a single dash causes .Fn getopt -to return -.Dv EOF . +to returns \-1. This is, we believe, compatible with System V. .Pp It is also possible to handle digits as option letters. @@ -195,7 +265,7 @@ The following code fragment works fairly well. int length; char *p; -while ((c = getopt(argc, argv, "0123456789")) != EOF) +while ((c = getopt(argc, argv, "0123456789")) != -1) switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': |
