diff options
Diffstat (limited to 'src/util/windows/getopt.c')
-rw-r--r-- | src/util/windows/getopt.c | 94 |
1 files changed, 60 insertions, 34 deletions
diff --git a/src/util/windows/getopt.c b/src/util/windows/getopt.c index 081520f559..2b21c7be55 100644 --- a/src/util/windows/getopt.c +++ b/src/util/windows/getopt.c @@ -1,5 +1,7 @@ +/* $NetBSD: getopt.c,v 1.16 1999/12/02 13:15:56 kleink Exp $ */ + /* - * Copyright (c) 1987, 1993 + * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,69 +33,97 @@ * SUCH DAMAGE. */ -/* based on @(#)getopt.c 8.1 (Berkeley) 6/4/93 */ - -#ifndef __STDC__ -#define const +#if 0 +static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; #endif + +#include <assert.h> +#include <errno.h> #include <stdio.h> -#include <stdlib.h> #include <string.h> -/* - * get option letter from argument vector - */ +#define __P(x) x +#define _DIAGASSERT(x) assert(x) + +#ifdef __weak_alias +__weak_alias(getopt,_getopt); +#endif + + int opterr = 1, /* if error message should be printed */ optind = 1, /* index into parent argv vector */ optopt, /* character checked for validity */ optreset; /* reset getopt */ char *optarg; /* argument associated with option */ +static char * _progname __P((char *)); +int getopt_internal __P((int, char * const *, const char *)); + +static char * +_progname(nargv0) + char * nargv0; +{ + char * tmp; + + _DIAGASSERT(nargv0 != NULL); + + tmp = strrchr(nargv0, '/'); + if (tmp) + tmp++; + else + tmp = nargv0; + return(tmp); +} + #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" +/* + * getopt -- + * Parse argc/argv argument vector. + */ int getopt(nargc, nargv, ostr) int nargc; - char * const *nargv; + char * const nargv[]; const char *ostr; { + static char *__progname = 0; static char *place = EMSG; /* option letter processing */ - register char *oli; /* option letter list index */ - char *p; + char *oli; /* option letter list index */ + __progname = __progname?__progname:_progname(*nargv); + + _DIAGASSERT(nargv != NULL); + _DIAGASSERT(ostr != NULL); if (optreset || !*place) { /* update scanning pointer */ optreset = 0; if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; - return(-1); + return (-1); } - if (place[1] && *++place == '-') { /* found "--" */ + if (place[1] && *++place == '-' /* found "--" */ + && place[1] == '\0') { ++optind; place = EMSG; - return(-1); + return (-1); } } /* option letter okay? */ if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { /* * if the user didn't specify '-' as an option, - * assume it means EOF. + * assume it means -1. */ if (optopt == (int)'-') - return(-1); + return (-1); if (!*place) ++optind; - if (opterr && *ostr != ':') { - if (!(p = strrchr(*nargv, '/'))) - p = *nargv; - else - ++p; - (void)fprintf(stderr, "%s: illegal option -- %c\n", - p, optopt); - } - return(BADCH); + if (opterr && *ostr != ':') + (void)fprintf(stderr, + "%s: illegal option -- %c\n", __progname, optopt); + return (BADCH); } if (*++oli != ':') { /* don't need argument */ optarg = NULL; @@ -105,22 +135,18 @@ getopt(nargc, nargv, ostr) optarg = place; else if (nargc <= ++optind) { /* no arg */ place = EMSG; - if (!(p = strrchr(*nargv, '/'))) - p = *nargv; - else - ++p; if (*ostr == ':') - return(BADARG); + return (BADARG); if (opterr) (void)fprintf(stderr, "%s: option requires an argument -- %c\n", - p, optopt); - return(BADCH); + __progname, optopt); + return (BADCH); } else /* white space */ optarg = nargv[optind]; place = EMSG; ++optind; } - return(optopt); /* dump back option letter */ + return (optopt); /* dump back option letter */ } |