]> granicus.if.org Git - php/commitdiff
Scan through all the modifiers at once, setting flags.
authorAndrei Zmievski <andrei@php.net>
Fri, 4 Aug 2006 17:02:17 +0000 (17:02 +0000)
committerAndrei Zmievski <andrei@php.net>
Fri, 4 Aug 2006 17:02:17 +0000 (17:02 +0000)
Zend/zend_API.c

index 9354ae44de72a180c31a59997b06f02ea9abe74b..2801b049a36a01c40071db90d4381aee09ac91e7 100644 (file)
@@ -315,12 +315,20 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
        char *spec_walk = *spec;
        char c = *spec_walk++;
        int return_null = 0;
+       int alternate_form = 0;
 
-       while (*spec_walk == '/' || *spec_walk == '!') {
+       /* scan through modifiers */
+       while (1) {
                if (*spec_walk == '/') {
                        SEPARATE_ZVAL_IF_NOT_REF(arg);
-               } else if (*spec_walk == '!' && Z_TYPE_PP(arg) == IS_NULL) {
-                       return_null = 1;
+               } else if (*spec_walk == '&') {
+                       alternate_form = 1;
+               } else if (*spec_walk == '!') {
+                       if (Z_TYPE_PP(arg) == IS_NULL) {
+                               return_null = 1;
+                       }
+               } else {
+                       break;
                }
                spec_walk++;
        }
@@ -427,7 +435,7 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
                                int *pl = va_arg(*va, int *);
                                UConverter *conv = NULL;
 
-                               if (c == 's' && *spec_walk == '&') {
+                               if (c == 's' && alternate_form) {
                                        conv = va_arg(*va, UConverter *);
                                        spec_walk++;
                                }