File:
[ELWIX - Embedded LightWeight unIX -] /
embedaddon /
php /
sapi /
isapi /
stresstest /
getopt.c
Revision
1.1.1.1 (vendor branch):
download - view:
text,
annotated -
select for diffs -
revision graph
Tue Feb 21 23:48:06 2012 UTC (12 years, 5 months ago) by
misho
Branches:
php,
MAIN
CVS tags:
v5_4_3elwix,
v5_4_29p0,
v5_4_29,
v5_4_20p0,
v5_4_20,
v5_4_17p0,
v5_4_17,
v5_3_10,
HEAD
php
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 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>