1 /*
2 ** @(#)getopt.c 2.5 (smail) 9/15/87
3 */
4
5 #if !defined(UNIX) && !defined(DJGPP)
6
7 #include <stdio.h>
8 #include <io.h>
9 #include <string.h>
10
11 /*
12 * Here's something you've all been waiting for: the AT&T public domain
13 * source for getopt(3). It is the code which was given out at the 1985
14 * UNIFORUM conference in Dallas. I obtained it by electronic mail
15 * directly from AT&T. The people there assure me that it is indeed
16 * in the public domain.
17 *
18 * There is no manual page. That is because the one they gave out at
19 * UNIFORUM was slightly different from the current System V Release 2
20 * manual page. The difference apparently involved a note about the
21 * famous rules 5 and 6, recommending using white space between an option
22 * and its first argument, and not grouping options that have arguments.
23 * Getopt itself is currently lenient about both of these things. White
24 * space is allowed, but not mandatory, and the last option in a group can
25 * have an argument. That particular version of the man page evidently
26 * has no official existence, and my source at AT&T did not send a copy.
27 * The current SVR2 man page reflects the actual behavor of this getopt.
28 * However, I am not about to post a copy of anything licensed by AT&T.
29 */
30
31 #define ERR(s, c)\
32 if(opterr){\
33 char errbuf[2];\
34 errbuf[0] = (char)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
40 int opterr = 1;
41 int optind = 1;
42 int optopt;
43 char *optarg;
44
45 int
getopt(argc,argv,opts)46 getopt(argc, argv, opts)
47 int argc;
48 char **argv, *opts;
49 {
50 static int sp = 1;
51 register int c;
52 register char *cp;
53
54 if(sp == 1)
55 if(optind >= argc ||
56 argv[optind][0] != '-' /* && argv[optind][0] != '/' */ ||
57 argv[optind][1] == '\0')
58 return(EOF);
59 else if(strcmp(argv[optind], "--") == 0) {
60 optind++;
61 return(EOF);
62 }
63 optopt = c = argv[optind][sp];
64 if(c == ':' || (cp=strchr(opts, c)) == 0) {
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 }
91
92 #endif /* !UNIX && !DJGPP */
93