Added all of the MH sources, including RCS files, in
[mmh] / 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 }