]> granicus.if.org Git - php/commitdiff
Refactor php_addcslashes using zend_string
authorXinchen Hui <laruence@gmail.com>
Sat, 22 Feb 2014 12:51:26 +0000 (20:51 +0800)
committerXinchen Hui <laruence@gmail.com>
Sat, 22 Feb 2014 12:51:26 +0000 (20:51 +0800)
ext/standard/php_string.h
ext/standard/string.c
ext/standard/var.c

index 2396d40461673a1fcd66c020ebc59f74ad520a46..197b0950a8e657a0b78a4a87b19d307e4b4faa05 100644 (file)
@@ -121,8 +121,8 @@ PHPAPI struct lconv *localeconv_r(struct lconv *out);
 PHPAPI char *php_strtoupper(char *s, size_t len);
 PHPAPI char *php_strtolower(char *s, size_t len);
 PHPAPI char *php_strtr(char *str, int len, char *str_from, char *str_to, int trlen);
-PHPAPI char *php_addslashes(char *str, int length, int *new_length, int freeit TSRMLS_DC);
-PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int freeit, char *what, int wlength TSRMLS_DC);
+PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_free TSRMLS_DC);
+PHPAPI zend_string *php_addcslashes(const char *str, int length, int freeit, char *what, int wlength TSRMLS_DC);
 PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC);
 PHPAPI void php_stripcslashes(char *str, int *len);
 PHPAPI void php_basename(const char *s, size_t len, char *suffix, size_t sufflen, char **p_ret, size_t *p_len TSRMLS_DC);
index 759839433d9666a81101e2fae9ad2622b8f8b88d..6af765fe2b34f2a4ef625635f003c17a4ea5a17e 100644 (file)
@@ -3309,8 +3309,7 @@ PHP_FUNCTION(addcslashes)
                RETURN_STRINGL(str, str_len);
        }
 
-//???  Z_STRVAL_P(return_value) = php_addcslashes(str, str_len, &Z_STRLEN_P(return_value), 0, what, what_len TSRMLS_CC);
-//???  RETURN_STRINGL(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value), 0);
+       RETURN_STR(php_addcslashes(str, str_len, 0, what, what_len TSRMLS_CC));
 }
 /* }}} */
 
@@ -3455,14 +3454,14 @@ PHPAPI void php_stripcslashes(char *str, int *len)
 
 /* {{{ php_addcslashes
  */
-PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int should_free, char *what, int wlength TSRMLS_DC)
+PHPAPI zend_string *php_addcslashes(const char *str, int length, int should_free, char *what, int wlength TSRMLS_DC)
 {
        char flags[256];
-       char *new_str = safe_emalloc(4, (length?length:(length=strlen(str))), 1);
        char *source, *target;
        char *end;
        char c;
        int  newlen;
+       zend_string *new_str = STR_ALLOC(4 * (length? length : (length = strlen(str))) + 1, 0);
 
        if (!wlength) {
                wlength = strlen(what);
@@ -3470,7 +3469,7 @@ PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int s
 
        php_charmask((unsigned char *)what, wlength, flags TSRMLS_CC);
 
-       for (source = (char*)str, end = source + length, target = new_str; source < end; source++) {
+       for (source = (char*)str, end = source + length, target = new_str->val; source < end; source++) {
                c = *source;
                if (flags[(unsigned char)c]) {
                        if ((unsigned char) c < 32 || (unsigned char) c > 126) {
@@ -3492,12 +3491,9 @@ PHPAPI char *php_addcslashes(const char *str, int length, int *new_length, int s
                *target++ = c;
        }
        *target = 0;
-       newlen = target - new_str;
-       if (target - new_str < length * 4) {
-               new_str = erealloc(new_str, newlen + 1);
-       }
-       if (new_length) {
-               *new_length = newlen;
+       newlen = target - new_str->val;
+       if (newlen < length * 4) {
+               new_str = STR_REALLOC(new_str, newlen, 0);
        }
        if (should_free) {
 //???          STR_FREE((char*)str);
index e6ea7064c75e5b95921b8e14fa63de737399eb6b..1e2555135612248eba7f0583063e8875cc0f56a8 100644 (file)
@@ -365,10 +365,10 @@ static int php_array_element_export(zval *zv TSRMLS_DC, int num_args, va_list ar
                smart_str_appendl(buf, " => ", 4);
 
        } else { /* string key */
-               char *key, *tmp_str;
-               int key_len, tmp_len;
-               key = php_addcslashes(hash_key->key->val, hash_key->key->len, &key_len, 0, "'\\", 2 TSRMLS_CC);
-               tmp_str = php_str_to_str_ex(key, key_len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL);
+               char *tmp_str;
+               int tmp_len;
+               zend_string *key = php_addcslashes(hash_key->key->val, hash_key->key->len, 0, "'\\", 2 TSRMLS_CC);
+               tmp_str = php_str_to_str_ex(key->val, key->len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL);
 
                buffer_append_spaces(buf, level + 1);
 
@@ -376,7 +376,7 @@ static int php_array_element_export(zval *zv TSRMLS_DC, int num_args, va_list ar
                smart_str_appendl(buf, tmp_str, tmp_len);
                smart_str_appendl(buf, "' => ", 5);
 
-               efree(key);
+               STR_RELEASE(key);
                efree(tmp_str);
        }
        php_var_export_ex(zv, level + 2, buf TSRMLS_CC);
@@ -400,18 +400,16 @@ static int php_object_element_export(zval *zv TSRMLS_DC, int num_args, va_list a
        if (hash_key->key != NULL) {
                const char *class_name; /* ignored, but must be passed to unmangle */
                const char *pname;
-               char *pname_esc;
-               int  pname_esc_len;
+               zend_string *pname_esc;
                
                zend_unmangle_property_name(hash_key->key->val, hash_key->key->len,
                                &class_name, &pname);
-               pname_esc = php_addcslashes(pname, strlen(pname), &pname_esc_len, 0,
-                       "'\\", 2 TSRMLS_CC);
+               pname_esc = php_addcslashes(pname, strlen(pname), 0, "'\\", 2 TSRMLS_CC);
 
                smart_str_appendc(buf, '\'');
-               smart_str_appendl(buf, pname_esc, pname_esc_len);
+               smart_str_appendl(buf, pname_esc->val, pname_esc->len);
                smart_str_appendc(buf, '\'');
-               efree(pname_esc);
+               STR_RELEASE(pname_esc);
        } else {
                smart_str_append_long(buf, (long) hash_key->h);
        }
@@ -426,9 +424,10 @@ static int php_object_element_export(zval *zv TSRMLS_DC, int num_args, va_list a
 PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf TSRMLS_DC) /* {{{ */
 {
        HashTable *myht;
-       char *tmp_str, *tmp_str2;
-       int tmp_len, tmp_len2;
+       char *tmp_str;
+       int tmp_len;
        zend_string *class_name;
+       zend_string *ztmp;
 
        switch (Z_TYPE_P(struc)) {
        case IS_BOOL:
@@ -450,14 +449,14 @@ PHPAPI void php_var_export_ex(zval *struc, int level, smart_str *buf TSRMLS_DC)
                efree(tmp_str);
                break;
        case IS_STRING:
-               tmp_str = php_addcslashes(Z_STRVAL_P(struc), Z_STRLEN_P(struc), &tmp_len, 0, "'\\", 2 TSRMLS_CC);
-               tmp_str2 = php_str_to_str_ex(tmp_str, tmp_len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len2, 0, NULL);
+               ztmp = php_addcslashes(Z_STRVAL_P(struc), Z_STRLEN_P(struc), 0, "'\\", 2 TSRMLS_CC);
+               tmp_str = php_str_to_str_ex(ztmp->val, ztmp->len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL);
 
                smart_str_appendc(buf, '\'');
-               smart_str_appendl(buf, tmp_str2, tmp_len2);
+               smart_str_appendl(buf, tmp_str, tmp_len);
                smart_str_appendc(buf, '\'');
 
-               efree(tmp_str2);
+               STR_RELEASE(ztmp);
                efree(tmp_str);
                break;
        case IS_ARRAY:
@@ -682,7 +681,6 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, zval *retval_pt
                                ce = zend_get_class_entry(struc TSRMLS_CC);
                                if (ce) {
                                        zend_string *prot_name, *priv_name;
-                                       int prop_name_length;
 
                                        do {
                                                priv_name = zend_mangle_property_name(ce->name->val, ce->name->len, Z_STRVAL_P(name), Z_STRLEN_P(name), ce->type & ZEND_INTERNAL_CLASS);