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.
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);
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;
}
}
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);
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;
}
}
} 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;
}
} 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;
}
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)
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) {
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++;
}
}
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);