From 3d8b32a0e326ab639cc458ec54ee22c55cacba59 Mon Sep 17 00:00:00 2001 From: Andrei Zmievski Date: Wed, 17 Aug 2005 17:30:02 +0000 Subject: [PATCH] - Introduce 'y' specifier for functions expecting binary data. - convert_to_binary() now uses convert_to_string() in non-Unicode mode. --- Zend/zend_API.c | 65 +++++++++++++++++++++++++++++++++++++------ Zend/zend_operators.c | 5 ++++ 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f4bba745fe..d8ce0f62c2 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -227,7 +227,7 @@ ZEND_API char *zend_zval_type_name(zval *arg) return "double"; case IS_STRING: - return "string"; + return "native string"; case IS_ARRAY: return "array"; @@ -437,7 +437,7 @@ static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec, char T_ar *p = Z_STRVAL_PP(arg); break; } else { - return "string"; + return "native string"; } } } @@ -445,7 +445,56 @@ static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec, char T_ar case IS_ARRAY: case IS_RESOURCE: default: - return "string"; + return "native string"; + } + } + break; + + case 'y': + { + char **p = va_arg(*va, char **); + int *pl = va_arg(*va, int *); + switch (Z_TYPE_PP(arg)) { + case IS_NULL: + if (return_null) { + *p = NULL; + *pl = 0; + break; + } + /* break omitted intentionally */ + + case IS_STRING: + case IS_LONG: + case IS_DOUBLE: + case IS_BOOL: + case IS_UNICODE: + convert_to_binary_ex(arg); + *p = Z_BINVAL_PP(arg); + *pl = Z_BINLEN_PP(arg); + break; + + case IS_BINARY: + *p = Z_BINVAL_PP(arg); + *pl = Z_BINLEN_PP(arg); + break; + + case IS_OBJECT: { + if (Z_OBJ_HANDLER_PP(arg, cast_object)) { + SEPARATE_ZVAL_IF_NOT_REF(arg); + if (Z_OBJ_HANDLER_PP(arg, cast_object)(*arg, *arg, IS_BINARY, 0 TSRMLS_CC) == SUCCESS) { + *pl = Z_BINLEN_PP(arg); + *p = Z_BINVAL_PP(arg); + break; + } else { + return "binary data"; + } + } + } + + case IS_ARRAY: + case IS_RESOURCE: + default: + return "binary data"; } } break; @@ -481,7 +530,7 @@ static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec, char T_ar *p = Z_USTRVAL_PP(arg); break; } else { - return "string"; + return "Unicode string"; } } } @@ -489,7 +538,7 @@ static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec, char T_ar case IS_ARRAY: case IS_RESOURCE: default: - return "string"; + return "Unicode string"; } } break; @@ -544,7 +593,7 @@ static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec, char T_ar case IS_ARRAY: case IS_RESOURCE: default: - return "string (legacy, Unicode, or binary)"; + return "string (native, Unicode, or binary)"; } break; @@ -614,7 +663,7 @@ static char *zend_parse_arg_impl(zval **arg, va_list *va, char **spec, char T_ar case IS_ARRAY: case IS_RESOURCE: default: - return "string (legacy, Unicode, or binary)"; + return "string (native, Unicode, or binary)"; } } break; @@ -774,7 +823,7 @@ static int zend_parse_va_args(int num_args, char *type_spec, va_list *va, int fl case 'r': case 'a': case 'o': case 'O': case 'z': case 'Z': - case 't': + case 't': case 'y': case 'u': max_num_args++; break; diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 1de3975a20..8ec744bd7d 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -774,6 +774,11 @@ ZEND_API void _convert_to_string_with_converter(zval *op, UConverter *conv TSRML ZEND_API void convert_to_binary(zval *op) { + if (!UG(unicode)) { + convert_to_string(op); + return; + } + switch (op->type) { case IS_BINARY: break; -- 2.40.0