Skip to content

Commit 14de816

Browse files
author
Shane Caraveo
committed
now needs getopt
1 parent 3b81b97 commit 14de816

File tree

2 files changed

+187
-0
lines changed

2 files changed

+187
-0
lines changed

sapi/isapi/stresstest/getopt.c

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
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
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+
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
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 */

sapi/isapi/stresstest/getopt.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* Borrowed from Apache NT Port */
2+
#ifdef __cplusplus
3+
extern "C" {
4+
#endif
5+
extern char *ap_optarg;
6+
extern int ap_optind;
7+
8+
int ap_getopt(int argc, char* const *argv, const char *optstr);
9+
10+
#ifdef __cplusplus
11+
}
12+
#endif

0 commit comments

Comments
 (0)