diff options
| author | Zeev Suraski <zeev@php.net> | 2000-02-10 16:27:28 +0000 |
|---|---|---|
| committer | Zeev Suraski <zeev@php.net> | 2000-02-10 16:27:28 +0000 |
| commit | 59b53ea2c8f1dbb4797ffac2a31caad392927b48 (patch) | |
| tree | 66286d9cfa99c17393acb03c91467bff32fcfdf3 /sapi/cgi/getopt.c | |
| parent | 404bbe1f265772bf495581d5914f866aaa5f4337 (diff) | |
| download | php-git-59b53ea2c8f1dbb4797ffac2a31caad392927b48.tar.gz | |
Always use getopt with CGI, never use it for anything else
Diffstat (limited to 'sapi/cgi/getopt.c')
| -rw-r--r-- | sapi/cgi/getopt.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/sapi/cgi/getopt.c b/sapi/cgi/getopt.c new file mode 100644 index 0000000000..e34356a6b0 --- /dev/null +++ b/sapi/cgi/getopt.c @@ -0,0 +1,166 @@ +/* Borrowed from Apache NT Port */ + +#include <stdio.h> +#include <string.h> +#include <assert.h> +#include <stdlib.h> +#include "php_getopt.h" +#define OPTERRCOLON (1) +#define OPTERRNF (2) +#define OPTERRARG (3) + + +PHPAPI char *ap_php_optarg; +PHPAPI int ap_php_optind = 1; +static int ap_php_opterr = 1; +static int ap_php_optopt; + +static int +ap_php_optiserr(int argc, char * const *argv, int oint, const char *optstr, + int optchr, int err) +{ + if (ap_php_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_php_optopt = argv[oint][optchr]; + return('?'); +} + +PHPAPI int ap_php_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_php_optind >= argc) + return(EOF); + if (!dash && (argv[ap_php_optind][0] != '-')) + return(EOF); + if (!dash && (argv[ap_php_optind][0] == '-') && !argv[ap_php_optind][1]) + { + /* + * use to specify stdin. Need to let pgm process this and + * the following args + */ + return(EOF); + } + if ((argv[ap_php_optind][0] == '-') && (argv[ap_php_optind][1] == '-')) + { + /* -- indicates end of args */ + ap_php_optind++; + return(EOF); + } + if (!dash) + { + assert((argv[ap_php_optind][0] == '-') && argv[ap_php_optind][1]); + dash = 1; + optchr = 1; + } + + /* Check if the guy tries to do a -: kind of flag */ + assert(dash); + if (argv[ap_php_optind][optchr] == ':') + { + dash = 0; + ap_php_optind++; + return(ap_php_optiserr(argc, argv, ap_php_optind-1, optstr, optchr, OPTERRCOLON)); + } + if (!(cp = strchr(optstr, argv[ap_php_optind][optchr]))) + { + int errind = ap_php_optind; + int errchr = optchr; + + if (!argv[ap_php_optind][optchr+1]) + { + dash = 0; + ap_php_optind++; + } + else + optchr++; + return(ap_php_optiserr(argc, argv, errind, optstr, errchr, OPTERRNF)); + } + if (cp[1] == ':') + { + dash = 0; + ap_php_optind++; + if (ap_php_optind == argc) + return(ap_php_optiserr(argc, argv, ap_php_optind-1, optstr, optchr, OPTERRARG)); + ap_php_optarg = argv[ap_php_optind++]; + return(*cp); + } + else + { + if (!argv[ap_php_optind][optchr+1]) + { + dash = 0; + ap_php_optind++; + } + else + optchr++; + return(*cp); + } + assert(0); + return(0); +} + +#ifdef TESTGETOPT +int + main (int argc, char **argv) + { + int c; + extern char *ap_php_optarg; + extern int ap_php_optind; + int aflg = 0; + int bflg = 0; + int errflg = 0; + char *ofile = NULL; + + while ((c = ap_php_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_php_optarg; + (void)printf("ofile = %s\n", ofile); + break; + case '?': + errflg++; + } + if (errflg) { + (void)fprintf(stderr, + "usage: cmd [-a|-b] [-o <filename>] files...\n"); + exit (2); + } + for ( ; ap_php_optind < argc; ap_php_optind++) + (void)printf("%s\n", argv[ap_php_optind]); + return 0; + } + +#endif /* TESTGETOPT */ |
