bjori Tue Nov 20 22:42:47 2007 UTC Added files: /php-src/ext/standard/tests/general_functions getopt_004.phpt getopt_005.phpt
Modified files: /php-src/ext/standard basic_functions.c /php-src/main getopt.c Log: - Add support for optional values - Add support for = as seperator http://cvs.php.net/viewvc.cgi/php-src/ext/standard/basic_functions.c?r1=1.884&r2=1.885&diff_format=u Index: php-src/ext/standard/basic_functions.c diff -u php-src/ext/standard/basic_functions.c:1.884 php-src/ext/standard/basic_functions.c:1.885 --- php-src/ext/standard/basic_functions.c:1.884 Tue Nov 20 22:16:20 2007 +++ php-src/ext/standard/basic_functions.c Tue Nov 20 22:42:47 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: basic_functions.c,v 1.884 2007/11/20 22:16:20 johannes Exp $ */ +/* $Id: basic_functions.c,v 1.885 2007/11/20 22:42:47 bjori Exp $ */ #include "php.h" #include "php_streams.h" @@ -4496,6 +4496,10 @@ paras->opt_name = NULL; if (paras->need_param == 1) { opts++; + if (*opts == ':') { + paras->need_param++; + opts++; + } } paras++; } http://cvs.php.net/viewvc.cgi/php-src/main/getopt.c?r1=1.1&r2=1.2&diff_format=u Index: php-src/main/getopt.c diff -u php-src/main/getopt.c:1.1 php-src/main/getopt.c:1.2 --- php-src/main/getopt.c:1.1 Mon Oct 1 12:32:39 2007 +++ php-src/main/getopt.c Tue Nov 20 22:42:47 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: getopt.c,v 1.1 2007/10/01 12:32:39 jani Exp $ */ +/* $Id: getopt.c,v 1.2 2007/11/20 22:42:47 bjori Exp $ */ #include <stdio.h> #include <string.h> @@ -80,24 +80,36 @@ } } if ((argv[*optind][0] == '-') && (argv[*optind][1] == '-')) { + char *pos; + int arg_end = strlen(argv[*optind])-1; + /* '--' indicates end of args if not followed by a known long option name */ if (argv[*optind][2] == '\0') { (*optind)++; return(EOF); } + arg_start = 2; + + /* Check for <arg>=<val> */ + if ((pos = php_memnstr(&argv[*optind][arg_start], "=", 1, argv[*optind]+arg_end)) != NULL) { + arg_end = pos-&argv[*optind][arg_start]; + arg_start++; + } + + while (1) { php_optidx++; if (opts[php_optidx].opt_char == '-') { (*optind)++; return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err)); - } else if (opts[php_optidx].opt_name && !strcmp(&argv[*optind][2], opts[php_optidx].opt_name)) { + } else if (opts[php_optidx].opt_name && !strncmp(&argv[*optind][2], opts[php_optidx].opt_name, arg_end)) { break; } } optchr = 0; dash = 0; - arg_start = 2 + strlen(opts[php_optidx].opt_name); + arg_start += strlen(opts[php_optidx].opt_name); } else { if (!dash) { dash = 1; @@ -133,14 +145,23 @@ } if (opts[php_optidx].need_param) { /* Check for cases where the value of the argument - is in the form -<arg> <val> or in the form -<arg><val> */ + is in the form -<arg> <val>, -<arg>=<varl> or -<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)++]; + /* Was the value required or is it optional? */ + if (opts[php_optidx].need_param == 1) { + return(php_opt_error(argc, argv, *optind-1, optchr, OPTERRARG, show_err)); + } + /* Optional value is not supported with -<arg> <val> style */ + } else if (opts[php_optidx].need_param == 1) { + *optarg = argv[(*optind)++]; + } + } else if (argv[*optind][arg_start] == '=') { + arg_start++; + *optarg = &argv[*optind][arg_start]; + (*optind)++; } else { *optarg = &argv[*optind][arg_start]; (*optind)++; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/getopt_004.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/general_functions/getopt_004.phpt +++ php-src/ext/standard/tests/general_functions/getopt_004.phpt --TEST-- getopt#004 (Optional values) --ARGS-- -v -v1 -v=10 --v --v=100 --INI-- register_argc_argv=On variables_order=GPS --FILE-- <?php var_dump(getopt("v::", array("v::"))); ?> --EXPECT-- array(1) { ["v"]=> array(5) { [0]=> bool(false) [1]=> string(1) "1" [2]=> string(2) "10" [3]=> bool(false) [4]=> string(3) "100" } } http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/general_functions/getopt_005.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/general_functions/getopt_005.phpt +++ php-src/ext/standard/tests/general_functions/getopt_005.phpt --TEST-- getopt#005 (Required values) --ARGS-- --arg value --arg=value -avalue -a=value -a value --INI-- register_argc_argv=On variables_order=GPS --FILE-- <?php var_dump(getopt("a:", array("arg:"))); ?> --EXPECT-- array(2) { ["arg"]=> array(2) { [0]=> string(5) "value" [1]=> string(5) "value" } ["a"]=> array(3) { [0]=> string(5) "value" [1]=> string(5) "value" [2]=> string(5) "value" } } -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php