1 /*
2 * This file was copied from the following newsgroup posting:
3 *
4 * Newsgroups: mod.std.unix
5 * Subject: public domain AT&T getopt source
6 * Date: 3 Nov 85 19:34:15 GMT
7 *
8 * Here's something you've all been waiting for: the AT&T public domain
9 * source for getopt(3). It is the code which was given out at the 1985
10 * UNIFORUM conference in Dallas. I obtained it by electronic mail
11 * directly from AT&T. The people there assure me that it is indeed
12 * in the public domain.
13 */
14
15 #include <stdio.h>
16 #include <string.h>
17
18 static int optind = 1;
19 static int optopt;
20 static char *optarg;
21
22 static int
getopt(int argc, char *argv[], const char *opts)23 getopt(int argc, char *argv[], const char *opts) {
24 static int sp = 1;
25 int c;
26 char *cp;
27
28 if (sp == 1) {
29 if (optind >= argc ||
30 argv[optind][0] != '-' || argv[optind][1] == '\0')
31 return EOF;
32 else if (!strcmp(argv[optind], "--")) {
33 optind++;
34 return EOF;
35 }
36 }
37 optopt = c = argv[optind][sp];
38 if (c == ':' || !(cp = strchr(opts, c))) {
39 fprintf(stderr, ": illegal option -- %c\n", c);
40 if (argv[optind][++sp] == '\0') {
41 optind++;
42 sp = 1;
43 }
44 return '?';
45 }
46 if (*++cp == ':') {
47 if (argv[optind][sp+1] != '\0')
48 optarg = &argv[optind++][sp+1];
49 else if (++optind >= argc) {
50 fprintf(stderr, ": option requires an argument -- %c\n", c);
51 sp = 1;
52 return '?';
53 } else
54 optarg = argv[optind++];
55 sp = 1;
56 } else {
57 if (argv[optind][++sp] == '\0') {
58 sp = 1;
59 optind++;
60 }
61 optarg = NULL;
62 }
63
64 return c;
65 }
66