]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/miscellany/mem/getopt.c
The mh-users list at UCI is no longer.
[nmh] / docs / historical / mh-6.8.5 / miscellany / mem / getopt.c
1 #include <stdio.h>
2
3 /*
4 * get option letter from argument vector
5 */
6 int opterr = 1, /* useless, never set or used */
7 optind = 1, /* index into parent argv vector */
8 optopt; /* character checked for validity */
9 char *optarg; /* argument associated with option */
10
11 #define BADCH (int)'?'
12 #define EMSG ""
13 #define tell(s) fputs(*nargv,stderr);fputs(s,stderr); \
14 fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);
15
16 getopt(nargc,nargv,ostr)
17 int nargc;
18 char **nargv,
19 *ostr;
20 {
21 static char *place = EMSG; /* option letter processing */
22 register char *oli; /* option letter list index */
23 char *index();
24
25 if(!*place) { /* update scanning pointer */
26 if(optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) return(EOF);
27 if (*place == '-') { /* found "--" */
28 ++optind;
29 return(EOF);
30 }
31 } /* option letter okay? */
32 if ((optopt = (int)*place++) == (int)':' || !(oli = index(ostr,optopt))) {
33 if(!*place) ++optind;
34 tell(": illegal option -- ");
35 }
36 if (*++oli != ':') { /* don't need argument */
37 optarg = NULL;
38 if (!*place) ++optind;
39 }
40 else { /* need an argument */
41 if (*place) optarg = place; /* no white space */
42 else if (nargc <= ++optind) { /* no arg */
43 place = EMSG;
44 tell(": option requires an argument -- ");
45 }
46 else optarg = nargv[optind]; /* white space */
47 place = EMSG;
48 ++optind;
49 }
50 return(optopt); /* dump back option letter */
51 }