|
|
1.1 ! root 1: /* ! 2: ** @(#)getopt.c 2.5 (smail) 9/15/87 ! 3: */ ! 4: ! 5: /* ! 6: * Here's something you've all been waiting for: the AT&T public domain ! 7: * source for getopt(3). It is the code which was given out at the 1985 ! 8: * UNIFORUM conference in Dallas. I obtained it by electronic mail ! 9: * directly from AT&T. The people there assure me that it is indeed ! 10: * in the public domain. ! 11: * ! 12: * There is no manual page. That is because the one they gave out at ! 13: * UNIFORUM was slightly different from the current System V Release 2 ! 14: * manual page. The difference apparently involved a note about the ! 15: * famous rules 5 and 6, recommending using white space between an option ! 16: * and its first argument, and not grouping options that have arguments. ! 17: * Getopt itself is currently lenient about both of these things White ! 18: * space is allowed, but not mandatory, and the last option in a group can ! 19: * have an argument. That particular version of the man page evidently ! 20: * has no official existence, and my source at AT&T did not send a copy. ! 21: * The current SVR2 man page reflects the actual behavor of this getopt. ! 22: * However, I am not about to post a copy of anything licensed by AT&T. ! 23: */ ! 24: ! 25: /* This include is needed only to get "index" defined as "strchr" on Sys V. */ ! 26: #include "defs.h" ! 27: ! 28: /*LINTLIBRARY*/ ! 29: #define NULL 0 ! 30: #define EOF (-1) ! 31: #define ERR(s, c) if(opterr){\ ! 32: extern int write();\ ! 33: char errbuf[2];\ ! 34: errbuf[0] = c; errbuf[1] = '\n';\ ! 35: (void) write(2, argv[0], (unsigned)strlen(argv[0]));\ ! 36: (void) write(2, s, (unsigned)strlen(s));\ ! 37: (void) write(2, errbuf, 2);} ! 38: ! 39: extern char *index(); ! 40: ! 41: int opterr = 1; ! 42: int optind = 1; ! 43: int optopt; ! 44: char *optarg; ! 45: ! 46: int ! 47: getopt(argc, argv, opts) ! 48: int argc; ! 49: char **argv, *opts; ! 50: { ! 51: static int sp = 1; ! 52: register int c; ! 53: register char *cp; ! 54: ! 55: if(sp == 1) ! 56: if(optind >= argc || ! 57: argv[optind][0] != '-' || argv[optind][1] == '\0') ! 58: return(EOF); ! 59: else if(strcmp(argv[optind], "--") == NULL) { ! 60: optind++; ! 61: return(EOF); ! 62: } ! 63: optopt = c = argv[optind][sp]; ! 64: if(c == ':' || (cp=index(opts, c)) == NULL) { ! 65: ERR(": illegal option -- ", c); ! 66: if(argv[optind][++sp] == '\0') { ! 67: optind++; ! 68: sp = 1; ! 69: } ! 70: return('?'); ! 71: } ! 72: if(*++cp == ':') { ! 73: if(argv[optind][sp+1] != '\0') ! 74: optarg = &argv[optind++][sp+1]; ! 75: else if(++optind >= argc) { ! 76: ERR(": option requires an argument -- ", c); ! 77: sp = 1; ! 78: return('?'); ! 79: } else ! 80: optarg = argv[optind++]; ! 81: sp = 1; ! 82: } else { ! 83: if(argv[optind][++sp] == '\0') { ! 84: sp = 1; ! 85: optind++; ! 86: } ! 87: optarg = NULL; ! 88: } ! 89: return(c); ! 90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.