]> granicus.if.org Git - php/commitdiff
- Add ^ specifier that returns original string type before conversion.
authorAndrei Zmievski <andrei@php.net>
Fri, 2 Feb 2007 21:49:38 +0000 (21:49 +0000)
committerAndrei Zmievski <andrei@php.net>
Fri, 2 Feb 2007 21:49:38 +0000 (21:49 +0000)
- Add ZVAL_ENC_STRING[L] macro that allows returning either a binary
  string or an encoded strings as Unicode based on type, instead of
  UG(unicode)

README.PARAMETER_PARSING_API
Zend/zend_API.c
Zend/zend_API.h

index 9ea59bb402aa5168d1bb0331e06cae77eba9ffc0..06558ff03b61c39a5c76248b34a101e6b16f5fe7 100644 (file)
@@ -74,6 +74,8 @@ Type specifiers
         pointer is set to NULL as well.
     & - alternate format (currently used for 's' only to specify a converter to
         use when converting from Unicode strings)
+       ^ - returns original string type before conversion (only for 's' and 'u'
+           specifiers)
 
 Examples
 --------
index 199d1d50dc3109727c1c5cc943bdfd3c06a4c12a..2783354ed1f480cf05fcc8510dfb4a45a13fd777 100644 (file)
@@ -316,6 +316,8 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
        char c = *spec_walk++;
        int return_null = 0;
        int alternate_form = 0;
+       int return_orig_type = 0;
+       zend_uchar orig_type;
 
        /* scan through modifiers */
        while (1) {
@@ -327,6 +329,9 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
                        if (Z_TYPE_PP(arg) == IS_NULL) {
                                return_null = 1;
                        }
+               } else if (*spec_walk == '^') {
+                       return_orig_type = 1;
+                       orig_type = Z_TYPE_PP(arg);
                } else {
                        break;
                }
@@ -443,6 +448,11 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
                                        conv = va_arg(*va, UConverter *);
                                }
 
+                               if (return_orig_type) {
+                                       zend_uchar *type = va_arg(*va, zend_uchar *);
+                                       *type = orig_type;
+                               }
+
                                switch (Z_TYPE_PP(arg)) {
                                        case IS_NULL:
                                                if (return_null) {
@@ -497,6 +507,12 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
                        {
                                UChar **p = va_arg(*va, UChar **);
                                int *pl = va_arg(*va, int *);
+
+                               if (return_orig_type) {
+                                       zend_uchar *type = va_arg(*va, zend_uchar *);
+                                       *type = orig_type;
+                               }
+
                                switch (Z_TYPE_PP(arg)) {
                                        case IS_NULL:
                                                if (return_null) {
@@ -882,7 +898,7 @@ static int zend_parse_va_args(int num_args, char *type_spec, va_list *va, int fl
                                break;
 
                        case '/': case '!':
-                       case '&':
+                       case '&': case '^':
                                /* Pass */
                                break;
 
index 112657802c40957d9fc28a23fe786891d2fff82c..b3e774b46bd63bf83a45e919c756cc58dbe39ea0 100644 (file)
@@ -1796,6 +1796,46 @@ END_EXTERN_C()
                        ZVAL_EMPTY_STRING(z); \
                }
 
+#define ZVAL_ENC_STRINGL(z, t, conv, s, l, flags) \
+               if (t == IS_UNICODE) { \
+                       char *__s = (char *)(s); \
+                       int __s_len = (l); \
+                       UChar *u_str; \
+                       int u_len; \
+                       if (zend_string_to_unicode(conv, &u_str, &u_len, __s, __s_len TSRMLS_CC) == SUCCESS) { \
+                               ZVAL_UNICODEL(z, u_str, u_len, 0); \
+                       } \
+                       if ((flags) & ZSTR_AUTOFREE) { \
+                               efree(__s); \
+                       } \
+               } else { \
+                       char *__s=(char *)(s); int __l=l; \
+                       Z_STRLEN_P(z) = __l;        \
+                       Z_STRVAL_P(z) = (((flags) & ZSTR_DUPLICATE) ? estrndup(__s, __l) : __s); \
+                       Z_TYPE_P(z) = IS_STRING; \
+               } \
+       }
+
+#define ZVAL_ENC_STRING(z, t, conv, s, flags) \
+               if (t == IS_UNICODE) { \
+                       char *__s = (char *)(s); \
+                       int __s_len = strlen(__s); \
+                       UChar *u_str; \
+                       int u_len; \
+                       if (zend_string_to_unicode(conv, &u_str, &u_len, __s, __s_len TSRMLS_CC) == SUCCESS) { \
+                               ZVAL_UNICODEL(z, u_str, u_len, 0); \
+                       } \
+                       if ((flags) & ZSTR_AUTOFREE) { \
+                               efree(__s); \
+                       } \
+               } else { \
+                       char *__s=(char *)(s); \
+                       Z_STRLEN_P(z) = strlen(__s); \
+                       Z_STRVAL_P(z) = (((flags) & ZSTR_DUPLICATE) ? estrndup(__s, Z_STRLEN_P(z)) : __s); \
+                       Z_TYPE_P(z) = IS_STRING; \
+               } \
+       }
+
 #define ZVAL_FALSE(z)                                          ZVAL_BOOL(z, 0)
 #define ZVAL_TRUE(z)                                   ZVAL_BOOL(z, 1)
 
@@ -1827,6 +1867,8 @@ END_EXTERN_C()
 #define RETVAL_EMPTY_TEXT()                    ZVAL_EMPTY_TEXT(return_value)
 #define RETVAL_ZSTR(type, s, duplicate) ZVAL_ZSTR(return_value, type, s, duplicate)
 #define RETVAL_ZSTRL(type, s, l, duplicate) ZVAL_ZSTRL(return_value, type, s, l, duplicate)
+#define RETVAL_ENC_STRINGL(type, conv, s, l, flags) ZVAL_ENC_STRINGL(return_value, t, conv, s, l, flags)
+#define RETVAL_ENC_STRING(type, conv, s, flags) ZVAL_ENC_STRING(return_value, t, conv, s, flags)
 
 #define RETURN_RESOURCE(l)                             { RETVAL_RESOURCE(l); return; }
 #define RETURN_BOOL(b)                                         { RETVAL_BOOL(b); return; }
@@ -1856,6 +1898,8 @@ END_EXTERN_C()
 #define RETURN_UTF8_STRINGL(t, l, flags)       { RETVAL_UTF8_STRINGL(t, l, flags); return; }
 #define RETURN_ZSTR(type, s, duplicate)        { RETVAL_ZSTR(type, s, duplicate); return; }
 #define RETURN_ZSTRL(type, s, l, duplicate) { RETVAL_ZSTRL(type, s, l, duplicate); return; }
+#define RETURN_ENC_STRINGL(type, conv, s, l, flags) { RETVAL_ENC_STRINGL(type, conv, s, l, flags); return; }
+#define RETURN_ENC_STRING(type, conv, s, flags) { RETVAL_ENC_STRING(type, conv, s, flags); return; }
 
 #define SET_VAR_STRING(n, v) {                                                                                                                                                         \
                                                                {                                                                                                                                                       \