@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 104 lines 3.1 kB view raw
1/* 2 * * @(#)getopt.c 2.3 (smail) 5/30/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 directly 9 * from AT&T. The people there assure me that it is indeed in the public 10 * domain. 11 * 12 * There is no manual page. That is because the one they gave out at UNIFORUM 13 * was slightly different from the current System V Release 2 manual page. 14 * The difference apparently involved a note about the famous rules 5 and 6, 15 * recommending using white space between an option and its first argument, 16 * and not grouping options that have arguments. Getopt itself is currently 17 * lenient about both of these things White space is allowed, but not 18 * mandatory, and the last option in a group can have an argument. That 19 * particular version of the man page evidently has no official existence, 20 * and my source at AT&T did not send a copy. The current SVR2 man page 21 * reflects the actual behavior of this getopt. However, I am not about to 22 * post a copy of anything licensed by AT&T. 23 */ 24 25#ifdef BSD 26 #include <strings.h> 27#else 28 #define index strchr 29 #include <string.h> 30#endif 31 32/* LINTLIBRARY */ 33#ifndef NULL 34#define NULL 0 35#endif 36 37#define EOF (-1) 38#define ERR(s, c) if(opterr){\ 39 extern int write(int, void *, unsigned);\ 40 char errbuf[2];\ 41 errbuf[0] = (char)c; errbuf[1] = '\n';\ 42 (void) write(2, strlwr(argv[0]), (unsigned)strlen(argv[0]));\ 43 (void) write(2, s, (unsigned)strlen(s));\ 44 (void) write(2, errbuf, 2);} 45 46extern char *index(); 47 48int opterr = 1; 49int optind = 1; 50int optopt; 51char *optarg; 52 53int getopt(int argc, char *argv[], char *opts) 54{ 55 static int sp = 1; 56 register int c; 57 register char *cp; 58 59 if (sp == 1) 60 { 61 if (optind >= argc || argv[optind][0] != '-' || 62 argv[optind][1] == '\0') 63 return (EOF); 64 else if (strcmp(argv[optind], "--") == 0) 65 { 66 optind++; 67 return (EOF); 68 } 69 } 70 optopt = c = argv[optind][sp]; 71 if (c == ':' || (cp = index(opts, c)) == NULL) 72 { 73 ERR(": illegal option -- ", c); 74 if (argv[optind][++sp] == '\0') 75 { 76 optind++; 77 sp = 1; 78 } 79 return ('?'); 80 } 81 if (*++cp == ':') 82 { 83 if (argv[optind][sp + 1] != '\0') 84 optarg = &argv[optind++][sp + 1]; 85 else if (++optind >= argc) 86 { 87 ERR(": option requires an argument -- ", c); 88 sp = 1; 89 return ('?'); 90 } 91 else optarg = argv[optind++]; 92 sp = 1; 93 } 94 else 95 { 96 if (argv[optind][++sp] == '\0') 97 { 98 sp = 1; 99 optind++; 100 } 101 optarg = NULL; 102 } 103 return (c); 104}