diff options
Diffstat (limited to 'src/common/getopt.c')
-rw-r--r-- | src/common/getopt.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/common/getopt.c b/src/common/getopt.c new file mode 100644 index 0000000..9b02f12 --- /dev/null +++ b/src/common/getopt.c @@ -0,0 +1,57 @@ +/* + * getopt.c -- get command-line options. + */ + +#include "../h/gsupport.h" + +#ifndef SysOpt +extern char* progname; + +/* + * Based on a public domain implementation of System V + * getopt(3) by Keith Bostic (keith@seismo), Aug 24, 1984. + */ + +#define BadCh (int)'?' +#define EMSG "" +#define tell(m) fprintf(stderr,"%s: %s -- %c\n",progname,m,optopt);return BadCh; + +int optind = 1; /* index into parent argv vector */ +int optopt; /* character checked for validity */ +char *optarg; /* argument associated with option */ + +int getopt(int nargc, char *const nargv[], const char *ostr) + { + static char *place = EMSG; /* option letter processing */ + register char *oli; /* option letter list 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++) == (int)':') || (oli=strchr(ostr,optopt)) == 0) { + if(!*place) ++optind; + tell("illegal option"); + } + if (*++oli != ':') { /* 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 */ + } +#endif /* SysOpt */ |