X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..a28bf75d63c6a64e4c3b417c6052e45f42c6cedd:/stdlib/FreeBSD/getopt.c?ds=sidebyside diff --git a/stdlib/FreeBSD/getopt.c b/stdlib/FreeBSD/getopt.c index 871db61..c45494c 100644 --- a/stdlib/FreeBSD/getopt.c +++ b/stdlib/FreeBSD/getopt.c @@ -1,3 +1,5 @@ +/* $NetBSD: getopt.c,v 1.26 2003/08/07 16:43:40 agc Exp $ */ + /* * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. @@ -10,10 +12,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -35,26 +33,35 @@ static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95"; #endif /* LIBC_SCCS and not lint */ #include -__FBSDID("$FreeBSD: src/lib/libc/stdlib/getopt.c,v 1.6 2002/03/29 22:43:42 markm Exp $"); +__FBSDID("$FreeBSD: src/lib/libc/stdlib/getopt.c,v 1.8 2007/01/09 00:28:10 imp Exp $"); #include "namespace.h" #include #include #include +#include #include "un-namespace.h" #include "libc_private.h" +#ifndef BUILDING_VARIANT 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 */ +#endif /* !BUILDING_VARIANT */ #define BADCH (int)'?' #define BADARG (int)':' #define EMSG "" +#if __DARWIN_UNIX03 +#define PROGNAME nargv[0] +#else +#define PROGNAME _getprogname() +#endif + /* * getopt -- * Parse argc/argv argument vector. @@ -62,61 +69,81 @@ char *optarg; /* argument associated with option */ int getopt(nargc, nargv, ostr) int nargc; - char * const *nargv; + char * const nargv[]; const char *ostr; { static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ - if (optreset || !*place) { /* update scanning pointer */ + if (optreset || *place == 0) { /* update scanning pointer */ optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { + place = nargv[optind]; + if (optind >= nargc || *place++ != '-') { + /* Argument is absent or is not an option */ place = EMSG; return (-1); } - if (place[1] && *++place == '-') { /* found "--" */ + optopt = *place++; + if (optopt == '-' && *place == 0) { + /* "--" => end of options */ ++optind; place = EMSG; 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 -1. - */ - if (optopt == (int)'-') - return (-1); - if (!*place) + if (optopt == 0) { + /* Solitary '-', treat as a '-' option + if the program (eg su) is looking for it. */ + place = EMSG; + if (strchr(ostr, '-') == NULL) + return (-1); + optopt = '-'; + } + } else + optopt = *place++; + + /* See if option letter is one the caller wanted... */ + if (optopt == ':' || (oli = strchr(ostr, optopt)) == NULL) { + if (*place == 0) ++optind; - if (opterr && *ostr != ':' && optopt != BADCH) - (void)fprintf(stderr, "%s: illegal option -- %c\n", - _getprogname(), optopt); + if (opterr && *ostr != ':') + (void)fprintf(stderr, + "%s: illegal option -- %c\n", + PROGNAME, optopt); return (BADCH); } - if (*++oli != ':') { /* don't need argument */ + + /* Does this option need an argument? */ + if (oli[1] != ':') { + /* don't need argument */ optarg = NULL; - if (!*place) + if (*place == 0) ++optind; - } - else { /* need an argument */ - if (*place) /* no white space */ + } else { + /* Option-argument is either the rest of this argument or the + entire next argument. */ + if (*place) optarg = place; - else if (nargc <= ++optind) { /* no arg */ + else if (nargc > ++optind) + optarg = nargv[optind]; + else { + /* option-argument absent */ +#if __DARWIN_UNIX03 + /* Yes, the standard will put optind past the last + argument */ + ++optind; + optarg = NULL; +#endif /* __DARWIN_UNIX03 */ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) (void)fprintf(stderr, "%s: option requires an argument -- %c\n", - _getprogname(), optopt); + PROGNAME, optopt); return (BADCH); } - else /* white space */ - optarg = nargv[optind]; place = EMSG; ++optind; } - return (optopt); /* dump back option letter */ + return (optopt); /* return option letter */ }