diff --git a/vendor/getopt/README.txt b/vendor/getopt/README.txt index 6c6a9d45..6c85968e 100644 --- a/vendor/getopt/README.txt +++ b/vendor/getopt/README.txt @@ -1 +1 @@ -This source comes from: https://gist.github.com/superwills/5815344 \ No newline at end of file +This source comes from: https://github.com/Stichting-MINIX-Research-Foundation/minix diff --git a/vendor/getopt/getopt.c b/vendor/getopt/getopt.c index 6b3c735a..2d6c05df 100644 --- a/vendor/getopt/getopt.c +++ b/vendor/getopt/getopt.c @@ -1,8 +1,8 @@ -#include "getopt.h" +/* $NetBSD: getopt.c,v 1.29 2014/06/05 22:00:22 christos Exp $ */ /* * Copyright (c) 1987, 1993, 1994 -* The Regents of the University of California. All rights reserved. +* The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -12,11 +12,7 @@ * 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 +* 3. 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. * @@ -33,74 +29,101 @@ * SUCH DAMAGE. */ -#include #include +#include +#include -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 */ +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 */ -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG "" +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" - /* - * getopt -- - * Parse argc/argv argument vector. - */ -int getopt(int nargc, char * const nargv[], const char *ostr) + /* + * getopt -- + * Parse argc/argv argument vector. + */ +int +getopt(int nargc, char * const nargv[], const char *ostr) { - static char *place = EMSG; /* option letter processing */ - const char *oli; /* option letter list index */ + 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 != ':') - (void)printf("illegal option -- %c\n", optopt); + (void)fprintf(stderr, + "unknown option -- %c\n", + 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 (oli[2] == ':') + /* + * GNU Extension, for optional arguments if the rest of + * the argument is empty, we return NULL + */ + optarg = NULL; + else if (nargc > ++optind) + optarg = nargv[optind]; + else { + /* option-argument absent */ place = EMSG; if (*ostr == ':') return (BADARG); if (opterr) - (void)printf("option requires an argument -- %c\n", optopt); + (void)fprintf(stderr, + "option requires an argument -- %c\n", + optopt); return (BADCH); } - else /* white space */ - optarg = nargv[optind]; place = EMSG; ++optind; } - return (optopt); /* dump back option letter */ -} + return (optopt); /* return option letter */ +} \ No newline at end of file