123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /*
- * From: gwyn@brl-tgr.ARPA (Doug Gwyn <gwyn>) Newsgroups: net.sources
- * Subject: getopt library routine Date: 30 Mar 85 04:45:33 GMT
- */
- /*
- * getopt -- public domain version of standard System V routine
- *
- * Strictly enforces the System V Command Syntax Standard; provided by D A
- * Gwyn of BRL for generic ANSI C implementations
- *
- * #define STRICT to prevent acceptance of clustered options with arguments
- * and ommision of whitespace between option and arg.
- */
- /*
- * Modified by Manuel Novoa III on 1/5/01 to use weak symbols.
- * Programs needing long options will link gnu_getopt instead.
- */
- #include <stdio.h>
- #include <string.h>
- extern int opterr; /* error => print message */
- extern int optind; /* next argv[] index */
- extern int optopt; /* Set for unknown arguments */
- extern char *optarg; /* option parameter if any */
- static int Err(name, mess, c) /* returns '?' */
- char *name; /* program name argv[0] */
- char *mess; /* specific message */
- int c; /* defective option letter */
- {
- optopt = c;
- if (opterr) {
- (void) fprintf(stderr, "%s: %s -- %c\n", name, mess, c);
- }
- return '?'; /* erroneous-option marker */
- }
- extern int getopt (int argc, char *const *argv, const char *optstring)
- __attribute__ ((__weak__));
- int getopt (int argc, char *const *argv, const char *optstring)
- {
- static int sp = 1; /* position within argument */
- register int osp; /* saved `sp' for param test */
- #ifndef STRICT
- register int oind; /* saved `optind' for param test */
- #endif
- register int c; /* option letter */
- register char *cp; /* -> option in `optstring' */
- optarg = NULL;
-
- /* initialise getopt vars */
- if (optind == 0)
- {
- optind = 1;
- opterr = 1;
- optopt = 1;
- optarg = NULL;
- }
-
- if (sp == 1) { /* fresh argument */
- if (optind >= argc /* no more arguments */
- || argv[optind][0] != '-' /* no more options */
- || argv[optind][1] == '\0' /* not option; stdin */
- )
- return EOF;
- else if (strcmp(argv[optind], "--") == 0) {
- ++optind; /* skip over "--" */
- return EOF; /* "--" marks end of options */
- }
- }
- c = argv[optind][sp]; /* option letter */
- osp = sp++; /* get ready for next letter */
- #ifndef STRICT
- oind = optind; /* save optind for param test */
- #endif
- if (argv[optind][sp] == '\0') { /* end of argument */
- ++optind; /* get ready for next try */
- sp = 1; /* beginning of next argument */
- }
- if (c == ':' || c == '?' /* optstring syntax conflict */
- || (cp = strchr(optstring, c)) == NULL /* not found */ ) {
- return Err(argv[0], "illegal option", c);
- }
- if (cp[1] == ':') { /* option takes parameter */
- #ifdef STRICT
- if (osp != 1) {
- return Err(argv[0], "option must not be clustered", c);
- }
- /* reset by end of argument */
- if (sp != 1) {
- return Err(argv[0], "option must be followed by white space",
- c);
- }
- #else
- if (oind == optind) { /* argument w/o whitespace */
- optarg = &argv[optind][sp];
- sp = 1; /* beginning of next argument */
- }
- else
- #endif
- if (optind >= argc) {
- return Err(argv[0], "option requires an argument", c);
- }
- else /* argument w/ whitespace */
- optarg = argv[optind];
- ++optind; /* skip over parameter */
- }
- return c;
- }
|