/* file getopt.c */ /* Author: Peter Wilson */ /* Catholic University and NIST */ /* pwilson@cme.nist.gov */ /* */ /* getopt() from Don Libes "Obfuscated C" */ #include #include /* getopt() -- parse command line arguments */ /* Original Author: AT&T */ /* This version from Don Libes "Obfuscated C and Other Mysteries" */ /* John Wiley & Sons, 1993. Chapter 6 */ #define ERR(s, c) if (opterr) {\ char errbuf[3];\ errbuf[0] = c; errbuf[1] = '\n'; errbuf[2] = '\0'; \ fprintf(stderr, "%s", argv[0]);\ fprintf(stderr, "%s", s);\ fprintf(stderr, "%s", errbuf); } int opterr = 1; /* getopt prints errors if this is one */ int optind = 1; /* token pointer */ int optopt; /* option character passed back to user */ char *optarg; /* flag argument (or value) */ /* return option option character, EOF if no more or ? if problem */ int getopt(int argc, char **argv, char *opts) /* opts: option string */ { static int sp = 1; /* character index in current token */ register char *cp; /* pointer into current token */ if (sp == 1) { /* check for more flag-like tokens */ if(optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') return(EOF); else if(strcmp(argv[optind], "--") == 0) { optind++; return(EOF); } } optopt = argv[optind][sp]; if(optopt == ':' || ( cp = strchr(opts, optopt)) == 0) { ERR(": illegal option -- ", optopt); /* if no chars left in this token, move to next token */ if(argv[optind][++sp] == '\0') { optind++; sp = 1; } return('?'); } if(*++cp == ':') {/* if a value is expected, get it */ if(argv[optind][sp+1] != '\0') /* flag value is rest of current token */ optarg = &argv[optind++][sp+1]; else if (++optind >= argc) { ERR(": option requires an argument -- ", optopt); sp = 1; return('?'); } else /* flag value is next token */ optarg = argv[optind++]; sp = 1; } else { /* set up to look at next char in token, next time */ if(argv[optind][++sp] == '\0') { /* no m ore in current token, set up next token */ sp = 1; optind++; } optarg = 0; } return(optopt); /* return current flag character found */ }