1 /*
2 * This is an unpublished work copyright (c) 1998 HELIOS Software GmbH
3 * 30827 Garbsen, Germany
4 */
5
6
7 #include <stdio.h>
8 #include <string.h>
9 #ifdef HAS_UNISTD
10 # include <unistd.h>
11 #endif
12
13 char *optarg;
14 int optind = 1;
15 int opterr = 1;
16 int optopt;
17 static int subopt;
18 static int suboptind = 1;
19
getopt(int argc,char * const argv[],const char * optstring)20 int getopt(int argc, char *const argv[], const char * optstring)
21 {
22 char *curopt;
23 char *p;
24 int cursubopt;
25
26 if (suboptind == optind-1 && argv[suboptind][subopt] != '\0') {
27 curopt = (char *)argv[suboptind];
28 } else {
29 curopt = (char *)argv[optind];
30 if (curopt == NULL || curopt[0] != '-' || strcmp(curopt, "-") == 0)
31 return -1;
32 suboptind = optind;
33 subopt = 1;
34 optind++;
35 if (strcmp(curopt, "--") == 0)
36 return -1;
37 }
38 cursubopt = subopt++;
39 if ((p = strchr(optstring, curopt[cursubopt])) == NULL) {
40 optopt = curopt[cursubopt];
41 if (opterr)
42 fprintf(stderr, "%s: illegal option -- %c\n", argv[0], optopt);
43 return '?';
44 }
45 if (p[1] == ':') {
46 if (curopt[cursubopt+1] != '\0') {
47 optarg = curopt+cursubopt+1;
48 suboptind++;
49 return p[0];
50 }
51 if (argv[optind] == NULL) {
52 optopt = p[0];
53 if (opterr)
54 fprintf(stderr, "%s: option requires an argument -- %c\n", argv[0], optopt);
55 if (*optstring == ':')
56 return ':';
57 return '?';
58 }
59 optarg = argv[optind++];
60 }
61 return p[0];
62 }
63