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

Reply via email to