xref: /PHP-5.5/sapi/isapi/stresstest/getopt.c (revision 14de816e)
1 /* Borrowed from Apache NT Port */
2 
3 #include <stdio.h>
4 #include <string.h>
5 #include <assert.h>
6 #include <stdlib.h>
7 #include "getopt.h"
8 #define OPTERRCOLON (1)
9 #define OPTERRNF (2)
10 #define OPTERRARG (3)
11 
12 
13 char *ap_optarg;
14 int ap_optind = 1;
15 static int ap_opterr = 1;
16 static int ap_optopt;
17 
18 static int
ap_optiserr(int argc,char * const * argv,int oint,const char * optstr,int optchr,int err)19 ap_optiserr(int argc, char * const *argv, int oint, const char *optstr,
20          int optchr, int err)
21 {
22     if (ap_opterr)
23     {
24         fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1);
25         switch(err)
26         {
27         case OPTERRCOLON:
28             fprintf(stderr, ": in flags\n");
29             break;
30         case OPTERRNF:
31             fprintf(stderr, "option not found %c\n", argv[oint][optchr]);
32             break;
33         case OPTERRARG:
34             fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]);
35             break;
36         default:
37             fprintf(stderr, "unknown\n");
38             break;
39         }
40     }
41     ap_optopt = argv[oint][optchr];
42     return('?');
43 }
44 
ap_getopt(int argc,char * const * argv,const char * optstr)45 int ap_getopt(int argc, char* const *argv, const char *optstr)
46 {
47     static int optchr = 0;
48     static int dash = 0; /* have already seen the - */
49 
50     char *cp;
51 
52     if (ap_optind >= argc)
53         return(EOF);
54     if (!dash && (argv[ap_optind][0] !=  '-'))
55         return(EOF);
56     if (!dash && (argv[ap_optind][0] ==  '-') && !argv[ap_optind][1])
57     {
58         /*
59          * use to specify stdin. Need to let pgm process this and
60          * the following args
61          */
62         return(EOF);
63     }
64     if ((argv[ap_optind][0] == '-') && (argv[ap_optind][1] == '-'))
65     {
66         /* -- indicates end of args */
67         ap_optind++;
68         return(EOF);
69     }
70     if (!dash)
71     {
72         assert((argv[ap_optind][0] == '-') && argv[ap_optind][1]);
73         dash = 1;
74         optchr = 1;
75     }
76 
77     /* Check if the guy tries to do a -: kind of flag */
78     assert(dash);
79     if (argv[ap_optind][optchr] == ':')
80     {
81         dash = 0;
82         ap_optind++;
83         return(ap_optiserr(argc, argv, ap_optind-1, optstr, optchr, OPTERRCOLON));
84     }
85     if (!(cp = strchr(optstr, argv[ap_optind][optchr])))
86     {
87         int errind = ap_optind;
88         int errchr = optchr;
89 
90         if (!argv[ap_optind][optchr+1])
91         {
92             dash = 0;
93             ap_optind++;
94         }
95         else
96             optchr++;
97         return(ap_optiserr(argc, argv, errind, optstr, errchr, OPTERRNF));
98     }
99     if (cp[1] == ':')
100     {
101         /* Check for cases where the value of the argument
102            is in the form -<arg> <val> or in the form -<arg><val> */
103         dash = 0;
104         if(!argv[ap_optind][2]) {
105             ap_optind++;
106             if (ap_optind == argc)
107                 return(ap_optiserr(argc, argv, ap_optind-1, optstr, optchr, OPTERRARG));
108             ap_optarg = argv[ap_optind++];
109         }
110         else
111         {
112             ap_optarg = &argv[ap_optind][2];
113             ap_optind++;
114         }
115         return(*cp);
116     }
117     else
118     {
119         if (!argv[ap_optind][optchr+1])
120         {
121             dash = 0;
122             ap_optind++;
123         }
124         else
125             optchr++;
126         return(*cp);
127     }
128     assert(0);
129     return(0);
130 }
131 
132 #ifdef TESTGETOPT
133 int
main(int argc,char ** argv)134  main (int argc, char **argv)
135  {
136       int c;
137       extern char *ap_optarg;
138       extern int ap_optind;
139       int aflg = 0;
140       int bflg = 0;
141       int errflg = 0;
142       char *ofile = NULL;
143 
144       while ((c = ap_getopt(argc, argv, "abo:")) != EOF)
145            switch (c) {
146            case 'a':
147                 if (bflg)
148                      errflg++;
149                 else
150                      aflg++;
151                 break;
152            case 'b':
153                 if (aflg)
154                      errflg++;
155                 else
156                      bflg++;
157                 break;
158            case 'o':
159                 ofile = ap_optarg;
160                 (void)printf("ofile = %s\n", ofile);
161                 break;
162            case '?':
163                 errflg++;
164            }
165       if (errflg) {
166            (void)fprintf(stderr,
167                 "usage: cmd [-a|-b] [-o <filename>] files...\n");
168            exit (2);
169       }
170       for ( ; ap_optind < argc; ap_optind++)
171            (void)printf("%s\n", argv[ap_optind]);
172       return 0;
173  }
174 
175 #endif /* TESTGETOPT */
176