helly Thu May 29 11:41:52 2003 EDT Modified files: (Branch: PHP_4_3) /php4/sapi/cgi cgi_main.c getopt.c php_getopt.h Log: MFH: --style switches
Index: php4/sapi/cgi/cgi_main.c diff -u php4/sapi/cgi/cgi_main.c:1.190.2.32 php4/sapi/cgi/cgi_main.c:1.190.2.33 --- php4/sapi/cgi/cgi_main.c:1.190.2.32 Mon May 26 19:21:08 2003 +++ php4/sapi/cgi/cgi_main.c Thu May 29 11:41:52 2003 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cgi_main.c,v 1.190.2.32 2003/05/26 23:21:08 sniper Exp $ */ +/* $Id: cgi_main.c,v 1.190.2.33 2003/05/29 15:41:52 helly Exp $ */ #include "php.h" #include "php_globals.h" @@ -117,8 +117,31 @@ #define PHP_MODE_LINT 4 #define PHP_MODE_STRIP 5 -extern char *ap_php_optarg; -extern int ap_php_optind; +static char *optarg = NULL; +static int optind = 1; + +static const opt_struct OPTIONS[] = { + {'a', 0, "interactive"}, + {'C', 0, "no-chdir"}, + {'c', 1, "php-ini"}, + {'d', 1, "define"}, + {'e', 0, "profile-info"}, + {'f', 1, "file"}, + {'g', 1, "global"}, + {'h', 0, "help"}, + {'i', 0, "info"}, + {'l', 0, "syntax-check"}, + {'m', 0, "modules"}, + {'n', 0, "no-php-ini"}, + {'q', 0, "no-header"}, + {'s', 0, "syntax-highlight"}, + {'s', 0, "syntax-highlighting"}, + {'w', 0, "strip"}, + {'?', 0, "usage"},/* help alias (both '?' and 'usage') */ + {'v', 0, "version"}, + {'z', 1, "zend-extension"}, + {'-', 0, NULL} /* end of args */ +}; #if ENABLE_PATHINFO_CHECK /* true global. this is retreived once only, even for fastcgi */ @@ -138,8 +161,6 @@ #define TRANSLATE_SLASHES(path) #endif -#define OPTSTRING "ab:Cc:d:ef:g:hilmnqsw?vz:" - static int print_module_info(zend_module_entry *module, void *arg TSRMLS_DC) { php_printf("%s\n", module->name); @@ -897,8 +918,8 @@ /* temporary locals */ int behavior=PHP_MODE_STANDARD; int no_headers=0; - int orig_optind=ap_php_optind; - char *orig_optarg=ap_php_optarg; + int orig_optind=optind; + char *orig_optarg=optarg; char *script_file=NULL; zend_llist global_vars; int interactive=0; @@ -974,10 +995,10 @@ /* allow ini override for fastcgi */ #endif ) { - while ((c=ap_php_getopt(argc, argv, OPTSTRING))!=-1) { + while ((c=php_getopt(argc, argv, OPTIONS, &optarg, &optind, 0))!=-1) { switch (c) { case 'c': - cgi_sapi_module.php_ini_path_override = strdup(ap_php_optarg); + cgi_sapi_module.php_ini_path_override = strdup(optarg); break; case 'n': cgi_sapi_module.php_ini_ignore = 1; @@ -988,15 +1009,15 @@ server by accepting a bindpath parameter. */ case 'b': if (!fastcgi) { - bindpath = strdup(ap_php_optarg); + bindpath = strdup(optarg); } break; #endif } } - ap_php_optind = orig_optind; - ap_php_optarg = orig_optarg; + optind = orig_optind; + optarg = orig_optarg; } #ifdef ZTS @@ -1190,8 +1211,9 @@ && !fastcgi #endif ) { - while ((c=ap_php_getopt(argc, argv, OPTSTRING))!=-1) { + while ((c=php_getopt(argc, argv, OPTIONS, &optarg, &optind, 1))!=-1) { switch (c) { + case 'h': case '?': no_headers = 1; php_output_startup(); @@ -1203,8 +1225,8 @@ break; } } - ap_php_optind = orig_optind; - ap_php_optarg = orig_optarg; + optind = orig_optind; + optarg = orig_optarg; } #if PHP_FASTCGI @@ -1254,7 +1276,7 @@ exit(1); } - while ((c = ap_php_getopt(argc, argv, OPTSTRING)) != -1) { + while ((c = php_getopt(argc, argv, OPTIONS, &optarg, &optind, 0)) != -1) { switch (c) { case 'a': /* interactive mode */ @@ -1266,7 +1288,7 @@ SG(options) |= SAPI_OPTION_NO_CHDIR; break; case 'd': /* define ini entries on command line */ - define_command_line_ini_entry(ap_php_optarg); + define_command_line_ini_entry(optarg); break; case 'e': /* enable extended info output */ @@ -1274,32 +1296,21 @@ break; case 'f': /* parse file */ - script_file = estrdup(ap_php_optarg); + script_file = estrdup(optarg); no_headers = 1; /* arguments after the file are considered script args */ - SG(request_info).argc = argc - (ap_php_optind-1); - SG(request_info).argv = &argv[ap_php_optind-1]; + SG(request_info).argc = argc - (optind-1); + SG(request_info).argv = &argv[optind-1]; break; case 'g': /* define global variables on command line */ { - char *arg = estrdup(ap_php_optarg); + char *arg = estrdup(optarg); zend_llist_add_element(&global_vars, &arg); } break; - case 'h': /* help & quit */ - case '?': - no_headers = 1; - php_output_startup(); - php_output_activate(TSRMLS_C); - SG(headers_sent) = 1; - php_cgi_usage(argv[0]); - php_end_ob_buffers(1 TSRMLS_CC); - exit(1); - break; - case 'i': /* php info & quit */ if (php_request_startup(TSRMLS_C) == FAILURE) { php_module_shutdown(TSRMLS_C); @@ -1366,7 +1377,7 @@ break; case 'z': /* load extension file */ - zend_load_extension(ap_php_optarg); + zend_load_extension(optarg); break; default: @@ -1384,12 +1395,12 @@ SG(request_info).no_headers = 1; } - if (!SG(request_info).path_translated && argc > ap_php_optind) { + if (!SG(request_info).path_translated && argc > optind) { /* arguments after the file are considered script args */ - SG(request_info).argc = argc - ap_php_optind; - SG(request_info).argv = &argv[ap_php_optind]; + SG(request_info).argc = argc - optind; + SG(request_info).argv = &argv[optind]; /* file is on command line, but not in -f opt */ - SG(request_info).path_translated = estrdup(argv[ap_php_optind++]); + SG(request_info).path_translated = estrdup(argv[optind++]); } /* all remaining arguments are part of the query string @@ -1401,15 +1412,15 @@ test.php "v1=test&v2=hello world!" test.php v1=test "v2=hello world!" */ - if (!SG(request_info).query_string && argc > ap_php_optind) { + if (!SG(request_info).query_string && argc > optind) { len = 0; - for (i = ap_php_optind; i < argc; i++) { + for (i = optind; i < argc; i++) { len += strlen(argv[i]) + 1; } s = malloc(len + 1); /* leak - but only for command line version, so ok */ *s = '\0'; /* we are pretending it came from the environment */ - for (i = ap_php_optind, len = 0; i < argc; i++) { + for (i = optind, len = 0; i < argc; i++) { strcat(s, argv[i]); if (i < (argc - 1)) { strcat(s, "&"); Index: php4/sapi/cgi/getopt.c diff -u php4/sapi/cgi/getopt.c:1.5 php4/sapi/cgi/getopt.c:1.5.8.1 --- php4/sapi/cgi/getopt.c:1.5 Sun Jan 27 02:23:21 2002 +++ php4/sapi/cgi/getopt.c Thu May 29 11:41:52 2003 @@ -1,4 +1,20 @@ -/* Borrowed from Apache NT Port */ +/* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2003 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | [EMAIL PROTECTED] so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Marcus Boerger <[EMAIL PROTECTED]> | + +----------------------------------------------------------------------+ +*/ #include <stdio.h> #include <string.h> @@ -10,166 +26,129 @@ #define OPTERRARG (3) -char *ap_php_optarg; -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) +static int php_opt_error(int argc, char * const *argv, int oint, int optchr, int err, int show_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('?'); + if (show_err) + { + 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; + } + } + return('?'); } - -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] == ':') - { - /* Check for cases where the value of the argument - is in the form -<arg> <val> or in the form -<arg><val> */ - dash = 0; - if(!argv[ap_php_optind][2]) { - 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++]; - } - else - { - ap_php_optarg = &argv[ap_php_optind][2]; - 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); /* never reached */ +int php_getopt(int argc, char* const *argv, const opt_struct opts[], char **optarg, int *optind, int show_err) +{ + static int optchr = 0; + static int dash = 0; /* have already seen the - */ + int arg_start = 2; + + int opts_idx = -1; + + if (*optind >= argc) { + return(EOF); + } + if (!dash) { + if ((argv[*optind][0] != '-')) { + return(EOF); + } else { + if (!argv[*optind][1]) + { + /* + * use to specify stdin. Need to let pgm process this and + * the following args + */ + return(EOF); + } + } + } + if ((argv[*optind][0] == '-') && (argv[*optind][1] == '-')) { + /* '--' indicates end of args if not followed by a known long option name */ + while (1) { + opts_idx++; + if (opts[opts_idx].opt_char == '-') { + (*optind)++; + return(EOF); + } else if (opts[opts_idx].opt_name && !strcmp(&argv[*optind][2], opts[opts_idx].opt_name)) { + break; + } + } + optchr = 0; + dash = 1; + arg_start = 2 + strlen(opts[opts_idx].opt_name); + } + if (!dash) { + dash = 1; + optchr = 1; + } + + /* Check if the guy tries to do a -: kind of flag */ + if (argv[*optind][optchr] == ':') { + dash = 0; + (*optind)++; + return (php_opt_error(argc, argv, *optind-1, optchr, OPTERRCOLON, show_err)); + } + if (opts_idx < 0) { + while (1) { + opts_idx++; + if (opts[opts_idx].opt_char == '-') { + int errind = *optind; + int errchr = optchr; + + if (!argv[*optind][optchr+1]) { + dash = 0; + (*optind)++; + } else { + optchr++; + } + return(php_opt_error(argc, argv, errind, errchr, OPTERRNF, show_err)); + } else if (argv[*optind][optchr] == opts[opts_idx].opt_char) { + break; + } + } + } + if (opts[opts_idx].need_param) { + /* Check for cases where the value of the argument + is in the form -<arg> <val> or in the form -<arg><val> */ + dash = 0; + if(!argv[*optind][arg_start]) { + (*optind)++; + if (*optind == argc) { + return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err)); + } + *optarg = argv[(*optind)++]; + } else { + *optarg = &argv[*optind][arg_start]; + (*optind)++; + } + return opts[opts_idx].opt_char; + } else { + if (arg_start == 2) { + if (!argv[*optind][optchr+1]) + { + dash = 0; + (*optind)++; + } else { + optchr++; + } + } else { + (*optind)++; + } + return opts[opts_idx].opt_char; + } + assert(0); + return(0); /* never reached */ } - -#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 */ Index: php4/sapi/cgi/php_getopt.h diff -u php4/sapi/cgi/php_getopt.h:1.3 php4/sapi/cgi/php_getopt.h:1.3.14.1 --- php4/sapi/cgi/php_getopt.h:1.3 Wed Feb 21 02:41:01 2001 +++ php4/sapi/cgi/php_getopt.h Thu May 29 11:41:52 2003 @@ -1,7 +1,30 @@ -/* Borrowed from Apache NT Port */ +/* + +----------------------------------------------------------------------+ + | PHP Version 4 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2003 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | [EMAIL PROTECTED] so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: Marcus Boerger <[EMAIL PROTECTED]> | + +----------------------------------------------------------------------+ +*/ + #include "php.h" -extern char *ap_php_optarg; -extern int ap_php_optind; +/* Define structure for one recognized option (both single char and long name). + * If short_open is '-' this is the last option. + */ +typedef struct _opt_struct { + const char opt_char; + const int need_param; + const char * opt_name; +} opt_struct; -int ap_php_getopt(int argc, char* const *argv, const char *optstr); +int php_getopt(int argc, char* const *argv, const opt_struct opts[], char **optarg, int *optind, int show_err);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php