From: Marcus Boerger Date: Wed, 21 May 2003 21:59:40 +0000 (+0000) Subject: Make zend_str_tolower_copy() a copy function (like stccpy). X-Git-Tag: RELEASE_1_0_2~642 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7af8eadd57b198c7fc91698cdfe68300d3aeec19;p=php Make zend_str_tolower_copy() a copy function (like stccpy). Supply a dup version (like estrdup). Fix tolower() handling. # Havin copy and dup allows to use the faster version even with # memory not allocated by emalloc. --- diff --git a/Zend/zend_API.c b/Zend/zend_API.c index dff717fb3d..73313cdfed 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1541,7 +1541,7 @@ zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callabl if (syntax_only) return 1; - lcname = zend_str_tolower_copy(Z_STRVAL_P(callable), Z_STRLEN_P(callable)); + lcname = zend_str_tolower_dup(Z_STRVAL_P(callable), Z_STRLEN_P(callable)); if (zend_hash_exists(EG(function_table), lcname, Z_STRLEN_P(callable)+1)) retval = 1; efree(lcname); @@ -1576,7 +1576,7 @@ zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callabl if (syntax_only) return 1; - lcname = zend_str_tolower_copy(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj)); + lcname = zend_str_tolower_dup(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj)); if (zend_lookup_class(lcname, Z_STRLEN_PP(obj), &pce TSRMLS_CC) == SUCCESS) { ce = *pce; } @@ -1602,7 +1602,7 @@ zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callabl } if (ce) { - lcname = zend_str_tolower_copy(Z_STRVAL_PP(method), Z_STRLEN_PP(method)); + lcname = zend_str_tolower_dup(Z_STRVAL_PP(method), Z_STRLEN_PP(method)); if (zend_hash_exists(&ce->function_table, lcname, Z_STRLEN_PP(method)+1)) retval = 1; efree(lcname); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index ad38c9af27..97701d49b9 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2365,7 +2365,7 @@ int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS) if (class_name->type == IS_OBJECT) { ce = Z_OBJCE_P(class_name); } else { - class_name_strval = zend_str_tolower_copy(class_name->value.str.val, class_name->value.str.len); + class_name_strval = zend_str_tolower_dup(class_name->value.str.val, class_name->value.str.len); class_name_strlen = class_name->value.str.len; } } @@ -2518,7 +2518,7 @@ int zend_init_static_method_call_handler(ZEND_OPCODE_HANDLER_ARGS) } else { function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); - function_name_strval = zend_str_tolower_copy(function_name->value.str.val, function_name->value.str.len); + function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len); function_name_strlen = function_name->value.str.len; } @@ -2566,7 +2566,7 @@ int zend_init_fcall_by_name_handler(ZEND_OPCODE_HANDLER_ARGS) } else { function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); - function_name_strval = zend_str_tolower_copy(function_name->value.str.val, function_name->value.str.len); + function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len); function_name_strlen = function_name->value.str.len; } diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 3d04fe7747..3a001eee1c 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -595,7 +595,7 @@ int fast_call_user_function(HashTable *function_table, zval **object_pp, zval *f char *lc_class; int found; - lc_class = zend_str_tolower_copy(Z_STRVAL_PP(object_pp), Z_STRLEN_PP(object_pp)); + lc_class = zend_str_tolower_dup(Z_STRVAL_PP(object_pp), Z_STRLEN_PP(object_pp)); found = zend_lookup_class(lc_class, Z_STRLEN_PP(object_pp), &ce TSRMLS_CC); efree(lc_class); if (found == FAILURE) @@ -612,7 +612,7 @@ int fast_call_user_function(HashTable *function_table, zval **object_pp, zval *f return FAILURE; } - function_name_lc = zend_str_tolower_copy(function_name->value.str.val, function_name->value.str.len); + function_name_lc = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len); original_function_state_ptr = EG(function_state_ptr); if (zend_hash_find(function_table, function_name_lc, function_name->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) { diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index f89d119fc5..65ce8fcf47 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1581,30 +1581,27 @@ ZEND_API int zval_is_true(zval *op) return (op->value.lval ? 1 : 0); } -ZEND_API char *zend_str_tolower_copy(char *p, unsigned int length) +ZEND_API char *zend_str_tolower_copy(char *source, char *dest, unsigned int length) { - register char *result; - register char *end = p + length; - char *start; + register unsigned char *str = (unsigned char*)source; + register unsigned char *result = dest; + register unsigned char *end = str + length; - result = emalloc(length+1); - start = result; - - while (p < end) { - *result++ = tolower(*p++); + while (str < end) { + *result++ = tolower((int)*str++); } *result = *end; - return start; + return dest; } ZEND_API void zend_str_tolower(char *str, unsigned int length) { - register char *p=str; - register char *end = str + length; + register unsigned char *p = (unsigned char*)str; + register unsigned char *end = p + length; while (p < end) { - *p = tolower(*p); + *p = tolower((int)*p); p++; } } diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 368426e952..28c1c2a36d 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -197,7 +197,14 @@ ZEND_API int numeric_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_ ZEND_API int string_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC); ZEND_API void zend_str_tolower(char *str, unsigned int length); -ZEND_API char *zend_str_tolower_copy(char *str, unsigned int length); +ZEND_API char *zend_str_tolower_copy(char *source, char *dest, unsigned int length); + +static inline char * +zend_str_tolower_dup(char *source, unsigned int length) +{ + return zend_str_tolower_copy(source, emalloc(length+1), length); +} + ZEND_API int zend_binary_zval_strcmp(zval *s1, zval *s2); ZEND_API int zend_binary_zval_strncmp(zval *s1, zval *s2, zval *s3); ZEND_API int zend_binary_zval_strcasecmp(zval *s1, zval *s2);