summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-05-21 21:59:40 +0000
committerMarcus Boerger <helly@php.net>2003-05-21 21:59:40 +0000
commit7af8eadd57b198c7fc91698cdfe68300d3aeec19 (patch)
tree83a864335a1c61be756464bca9ae1bc6238c8cfd
parentbbe87059fb660fa771c0a6d323eb3a0ee06ca0e7 (diff)
downloadphp-git-7af8eadd57b198c7fc91698cdfe68300d3aeec19.tar.gz
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.
-rw-r--r--Zend/zend_API.c6
-rw-r--r--Zend/zend_execute.c6
-rw-r--r--Zend/zend_execute_API.c4
-rw-r--r--Zend/zend_operators.c23
-rw-r--r--Zend/zend_operators.h9
5 files changed, 26 insertions, 22 deletions
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);