From: Shane Caraveo Date: Sat, 2 Feb 2002 23:17:10 +0000 (+0000) Subject: now needs getopt X-Git-Tag: PRE_ISSET_PATCH~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=14de816ecf2f9300e38979c17318889a8ac1d05a;p=php now needs getopt --- diff --git a/sapi/isapi/stresstest/getopt.c b/sapi/isapi/stresstest/getopt.c new file mode 100644 index 0000000000..57faa0f890 --- /dev/null +++ b/sapi/isapi/stresstest/getopt.c @@ -0,0 +1,175 @@ +/* Borrowed from Apache NT Port */ + +#include +#include +#include +#include +#include "getopt.h" +#define OPTERRCOLON (1) +#define OPTERRNF (2) +#define OPTERRARG (3) + + +char *ap_optarg; +int ap_optind = 1; +static int ap_opterr = 1; +static int ap_optopt; + +static int +ap_optiserr(int argc, char * const *argv, int oint, const char *optstr, + int optchr, int err) +{ + if (ap_opterr) + { + fprintf(stderr, "Error in argument %d, char %d: ", oint, optchr+1); + switch(err) + { + case OPTERRCOLON: + fprintf(stderr, ": in flags\n"); + break; + case OPTERRNF: + fprintf(stderr, "option not found %c\n", argv[oint][optchr]); + break; + case OPTERRARG: + fprintf(stderr, "no argument for option %c\n", argv[oint][optchr]); + break; + default: + fprintf(stderr, "unknown\n"); + break; + } + } + ap_optopt = argv[oint][optchr]; + return('?'); +} + +int ap_getopt(int argc, char* const *argv, const char *optstr) +{ + static int optchr = 0; + static int dash = 0; /* have already seen the - */ + + char *cp; + + if (ap_optind >= argc) + return(EOF); + if (!dash && (argv[ap_optind][0] != '-')) + return(EOF); + if (!dash && (argv[ap_optind][0] == '-') && !argv[ap_optind][1]) + { + /* + * use to specify stdin. Need to let pgm process this and + * the following args + */ + return(EOF); + } + if ((argv[ap_optind][0] == '-') && (argv[ap_optind][1] == '-')) + { + /* -- indicates end of args */ + ap_optind++; + return(EOF); + } + if (!dash) + { + assert((argv[ap_optind][0] == '-') && argv[ap_optind][1]); + dash = 1; + optchr = 1; + } + + /* Check if the guy tries to do a -: kind of flag */ + assert(dash); + if (argv[ap_optind][optchr] == ':') + { + dash = 0; + ap_optind++; + return(ap_optiserr(argc, argv, ap_optind-1, optstr, optchr, OPTERRCOLON)); + } + if (!(cp = strchr(optstr, argv[ap_optind][optchr]))) + { + int errind = ap_optind; + int errchr = optchr; + + if (!argv[ap_optind][optchr+1]) + { + dash = 0; + ap_optind++; + } + else + optchr++; + return(ap_optiserr(argc, argv, errind, optstr, errchr, OPTERRNF)); + } + if (cp[1] == ':') + { + /* Check for cases where the value of the argument + is in the form - or in the form - */ + dash = 0; + if(!argv[ap_optind][2]) { + ap_optind++; + if (ap_optind == argc) + return(ap_optiserr(argc, argv, ap_optind-1, optstr, optchr, OPTERRARG)); + ap_optarg = argv[ap_optind++]; + } + else + { + ap_optarg = &argv[ap_optind][2]; + ap_optind++; + } + return(*cp); + } + else + { + if (!argv[ap_optind][optchr+1]) + { + dash = 0; + ap_optind++; + } + else + optchr++; + return(*cp); + } + assert(0); + return(0); +} + +#ifdef TESTGETOPT +int + main (int argc, char **argv) + { + int c; + extern char *ap_optarg; + extern int ap_optind; + int aflg = 0; + int bflg = 0; + int errflg = 0; + char *ofile = NULL; + + while ((c = ap_getopt(argc, argv, "abo:")) != EOF) + switch (c) { + case 'a': + if (bflg) + errflg++; + else + aflg++; + break; + case 'b': + if (aflg) + errflg++; + else + bflg++; + break; + case 'o': + ofile = ap_optarg; + (void)printf("ofile = %s\n", ofile); + break; + case '?': + errflg++; + } + if (errflg) { + (void)fprintf(stderr, + "usage: cmd [-a|-b] [-o ] files...\n"); + exit (2); + } + for ( ; ap_optind < argc; ap_optind++) + (void)printf("%s\n", argv[ap_optind]); + return 0; + } + +#endif /* TESTGETOPT */ diff --git a/sapi/isapi/stresstest/getopt.h b/sapi/isapi/stresstest/getopt.h new file mode 100644 index 0000000000..a3e278e3a6 --- /dev/null +++ b/sapi/isapi/stresstest/getopt.h @@ -0,0 +1,12 @@ +/* Borrowed from Apache NT Port */ +#ifdef __cplusplus +extern "C" { +#endif +extern char *ap_optarg; +extern int ap_optind; + +int ap_getopt(int argc, char* const *argv, const char *optstr); + +#ifdef __cplusplus +} +#endif \ No newline at end of file