X-Git-Url: https://jxself.org/git/?p=a56.git;a=blobdiff_plain;f=src%2Fgetopt.c;fp=src%2Fgetopt.c;h=6d74b3997fb2a2b36f768f872d2b19c95fb2f328;hp=0000000000000000000000000000000000000000;hb=34923afb4a618598083726717bf2f20d310f4f6e;hpb=c6db6f4c5cb82f5e09472163bf11be0c165965ee diff --git a/src/getopt.c b/src/getopt.c new file mode 100644 index 0000000..6d74b39 --- /dev/null +++ b/src/getopt.c @@ -0,0 +1,129 @@ +/* + I got this off net.sources from Henry Spencer. + It is a public domain getopt(3) like in System V. + I have made the following modifications: + + index(s,c) was added because too many people could + not compile getopt without it. + + A test main program was added, ifdeffed by GETOPT. + This main program is a public domain implementation + of the getopt(1) program like in System V. The getopt + program can be used to standardize shell option handling. + e.g. cc -DGETOPT getopt.c -o getopt +*/ +#include + +#ifndef lint +static char sccsfid[] = "@(#) getopt.c 5.0 (UTZoo) 1985"; +#endif + +#define ARGCH (int)':' +#define BADCH (int)'?' +#define EMSG "" +#define ENDARGS "--" + +/* this is included because index is not on some UNIX systems */ +static +char * +index (s, c) +register char *s; +register int c; + { + while (*s) + if (c == *s) return (s); + else s++; + return (NULL); + } + +/* + * get option letter from argument vector + */ +int opterr = 1, /* useless, never set or used */ + optind = 1, /* index into parent argv vector */ + optopt; /* character checked for validity */ +char *optarg; /* argument associated with option */ + +#define tell(s) fputs(*nargv,stderr);fputs(s,stderr); \ + fputc(optopt,stderr);fputc('\n',stderr);return(BADCH); + + +getopt(nargc,nargv,ostr) +int nargc; +char **nargv, + *ostr; +{ + static char *place = EMSG; /* option letter processing */ + register char *oli; /* option letter list index */ + char *index(); + + if(!*place) { /* update scanning pointer */ + if(optind >= nargc || *(place = nargv[optind]) != '-' || !*++place) return(EOF); + if (*place == '-') { /* found "--" */ + ++optind; + return(EOF); + } + } /* option letter okay? */ + if ((optopt = (int)*place++) == ARGCH || !(oli = index(ostr,optopt))) { + if(!*place) ++optind; + tell(": illegal option -- "); + } + if (*++oli != ARGCH) { /* don't need argument */ + optarg = NULL; + if (!*place) ++optind; + } + else { /* need an argument */ + if (*place) optarg = place; /* no white space */ + else if (nargc <= ++optind) { /* no arg */ + place = EMSG; + tell(": option requires an argument -- "); + } + else optarg = nargv[optind]; /* white space */ + place = EMSG; + ++optind; + } + return(optopt); /* dump back option letter */ +} + + +#ifdef GETOPT + +#ifndef lint +static char sccspid[] = "@(#) getopt.c 5.1 (WangInst) 6/15/85"; +#endif + +main (argc, argv) char **argv; + { + char *optstring = argv[1]; + char *argv0 = argv[0]; + extern int optind; + extern char *optarg; + int opterr = 0; + int C; + char *opi; + if (argc == 1) + { + fprintf (stderr, "Usage: %s optstring args\n", argv0); + exit (1); + } + argv++; + argc--; + argv[0] = argv0; + while ((C = getopt (argc, argv, optstring)) != EOF) + { + if (C == BADCH) opterr++; + printf ("-%c ", C); + opi = index (optstring, C); + if (opi && opi[1] == ARGCH) + if (optarg) + printf ("\"%s\" ", optarg); + else opterr++; + } + printf ("%s", ENDARGS); + while (optind < argc) + printf (" \"%s\"", argv[optind++]); + putchar ('\n'); + exit (opterr); + } + +#endif