diff options
| author | Dmitry Stogov <dmitry@zend.com> | 2014-08-13 14:51:48 +0400 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@zend.com> | 2014-08-13 14:51:48 +0400 |
| commit | 5a06ac88da693623fb471494a3759f04582f966e (patch) | |
| tree | 110dfad2a5c8462d4b354c99f369c2e62dc95d12 /ext/standard/string.c | |
| parent | b8517e410ce4209d05f911d35d9ec77a2cc191c9 (diff) | |
| download | php-git-5a06ac88da693623fb471494a3759f04582f966e.tar.gz | |
cleanup (use zend_string* instead of char*)
Diffstat (limited to 'ext/standard/string.c')
| -rw-r--r-- | ext/standard/string.c | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c index 5f4f360ca6..0b7cef3da8 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -146,41 +146,42 @@ static zend_string *php_bin2hex(const unsigned char *old, const size_t oldlen) /* {{{ php_hex2bin */ -static char *php_hex2bin(const unsigned char *old, const size_t oldlen, size_t *newlen) +static zend_string *php_hex2bin(const unsigned char *old, const size_t oldlen) { size_t target_length = oldlen >> 1; - register unsigned char *str = (unsigned char *)safe_emalloc(target_length, sizeof(char), 1); + zend_string *str = STR_ALLOC(target_length, 0); + unsigned char *ret = (unsigned char *)str->val; size_t i, j; + for (i = j = 0; i < target_length; i++) { - char c = old[j++]; + unsigned char c = old[j++]; + unsigned char d; + if (c >= '0' && c <= '9') { - str[i] = (c - '0') << 4; + d = (c - '0') << 4; } else if (c >= 'a' && c <= 'f') { - str[i] = (c - 'a' + 10) << 4; + d = (c - 'a' + 10) << 4; } else if (c >= 'A' && c <= 'F') { - str[i] = (c - 'A' + 10) << 4; + d = (c - 'A' + 10) << 4; } else { - efree(str); + STR_FREE(str); return NULL; } c = old[j++]; if (c >= '0' && c <= '9') { - str[i] |= c - '0'; + d |= c - '0'; } else if (c >= 'a' && c <= 'f') { - str[i] |= c - 'a' + 10; + d |= c - 'a' + 10; } else if (c >= 'A' && c <= 'F') { - str[i] |= c - 'A' + 10; + d |= c - 'A' + 10; } else { - efree(str); + STR_FREE(str); return NULL; } + ret[i] = d; } - str[target_length] = '\0'; - - if (newlen) - *newlen = target_length; - return (char *)str; + return str; } /* }}} */ @@ -256,29 +257,25 @@ PHP_FUNCTION(bin2hex) Converts the hex representation of data to binary */ PHP_FUNCTION(hex2bin) { - char *result, *data; - size_t newlen; - int datalen; + zend_string *result, *data; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &datalen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &data) == FAILURE) { return; } - if (datalen % 2 != 0) { + if (data->len % 2 != 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hexadecimal input string must have an even length"); RETURN_FALSE; } - result = php_hex2bin((unsigned char *)data, datalen, &newlen); + result = php_hex2bin((unsigned char *)data->val, data->len); if (!result) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input string must be hexadecimal string"); RETURN_FALSE; } - // TODO: avoid reallocation ??? - RETVAL_STRINGL(result, newlen); - efree(result); + RETVAL_STR(result); } /* }}} */ @@ -2457,7 +2454,7 @@ PHP_FUNCTION(substr_replace) orig_str = tmp_str; } - /* + /*??? refcount = Z_REFCOUNT_P(orig_str); */ @@ -2528,7 +2525,7 @@ PHP_FUNCTION(substr_replace) } else { repl_str = tmp_repl; } - /* + /*??? if (Z_REFCOUNT_P(orig_str) != refcount) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument was modified while replacing"); if (Z_TYPE_P(tmp_repl) != IS_STRING) { |
