From: Andrei Zmievski Date: Fri, 2 Feb 2007 21:49:38 +0000 (+0000) Subject: - Add ^ specifier that returns original string type before conversion. X-Git-Tag: RELEASE_1_0_0RC1~39 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=135c947f8d9999551a19f833c0066fdab6397c81;p=php - Add ^ specifier that returns original string type before conversion. - 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) --- diff --git a/README.PARAMETER_PARSING_API b/README.PARAMETER_PARSING_API index 9ea59bb402..06558ff03b 100644 --- a/README.PARAMETER_PARSING_API +++ b/README.PARAMETER_PARSING_API @@ -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 -------- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 199d1d50dc..2783354ed1 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -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; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 112657802c..b3e774b46b 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -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) { \ { \