blob: aa1988f8d81a869d4c0b9bd2fc43371ade6f812f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
#include <string.h>
#include <getopt.h>
static void getopterror(int which) {
static char error1[]="Unknown option `-x'.\n";
static char error2[]="Missing argument for `-x'.\n";
if (opterr) {
if (which) {
error2[23]=optopt;
write(2,error2,28);
} else {
error1[17]=optopt;
write(2,error1,22);
}
}
}
int getopt(int argc, char * const argv[], const char *optstring) {
static int lastidx=0,lastofs=0;
char *tmp;
if (optind==0) optind=1; /* whoever started setting optind to 0 should be shot */
again:
if (optind>argc || !argv[optind] || *argv[optind]!='-' || argv[optind][1]==0)
return -1;
if (argv[optind][1]=='-' && argv[optind][2]==0) {
++optind;
return -1;
}
if (lastidx!=optind) {
lastidx=optind; lastofs=0;
}
optopt=argv[optind][lastofs+1];
if ((tmp=strchr(optstring,optopt))) {
if (*tmp==0) { /* apparently, we looked for \0, i.e. end of argument */
++optind;
goto again;
}
if (tmp[1]==':') { /* argument expected */
if (tmp[2]==':' || argv[optind][lastofs+2]) { /* "-foo", return "oo" as optarg */
if (!*(optarg=argv[optind]+lastofs+2)) optarg=0;
goto found;
}
optarg=argv[optind+1];
if (!optarg) { /* missing argument */
++optind;
if (*optstring==':') return ':';
getopterror(1);
return ':';
}
++optind;
} else {
++lastofs;
return optopt;
}
found:
++optind;
return optopt;
} else { /* not found */
getopterror(0);
++optind;
return '?';
}
}
|