diff options
author | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2014-07-31 18:18:18 +0200 |
---|---|---|
committer | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2014-07-31 18:18:18 +0200 |
commit | 680a012532e2d962a55c1a588900c3b52c0d6b69 (patch) | |
tree | 613b0399000e5c72290efa2497cf008fbccb12df /win32/getopt | |
parent | 3c97ca53d8279f0f16ca2f82a703bafa517e39f3 (diff) | |
parent | ee0ffcb7bcb46d3d129bd262781d54afa736ffbb (diff) |
Merge branch 'master' of /pub/repo.git/Balau
Diffstat (limited to 'win32/getopt')
-rw-r--r-- | win32/getopt/getopt.c | 129 | ||||
-rw-r--r-- | win32/getopt/getopt.h | 17 |
2 files changed, 146 insertions, 0 deletions
diff --git a/win32/getopt/getopt.c b/win32/getopt/getopt.c new file mode 100644 index 0000000..6d74b39 --- /dev/null +++ b/win32/getopt/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 <stdio.h> + +#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 diff --git a/win32/getopt/getopt.h b/win32/getopt/getopt.h new file mode 100644 index 0000000..f77cb17 --- /dev/null +++ b/win32/getopt/getopt.h @@ -0,0 +1,17 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +int getopt(int nargc, char ** nargv, char * ostr); + +#ifdef __cplusplus +} +#endif + + +extern int opterr = 1; +extern int optind = 1; +extern int optopt; +extern char * optarg; |