summaryrefslogtreecommitdiff
path: root/ext/mbstring/mbstring.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-03-23 23:38:32 +0800
committerXinchen Hui <laruence@gmail.com>2014-03-23 23:38:32 +0800
commit9011a70c7f83ce5fc70ac9b6aef523ddda9e84fa (patch)
tree8209a24e9c6f1bc4fd55689335d174769863e6f5 /ext/mbstring/mbstring.c
parent946269e48e52b5a7678b74773d5c2f3eea870b35 (diff)
downloadphp-git-9011a70c7f83ce5fc70ac9b6aef523ddda9e84fa.tar.gz
Refactor mbstring (incompleted)
Diffstat (limited to 'ext/mbstring/mbstring.c')
-rw-r--r--ext/mbstring/mbstring.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index a7a39155e7..0b963f9f99 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -898,7 +898,7 @@ static const zend_encoding *php_mb_zend_encoding_detector(const unsigned char *a
return (const zend_encoding *) mbfl_identify_encoding2(&string, (const mbfl_encoding **)list, list_size, 0);
}
-static size_t php_mb_zend_encoding_converter(unsigned char **to, size_t *to_length, const unsigned char *from, size_t from_length, const zend_encoding *encoding_to, const zend_encoding *encoding_from TSRMLS_DC)
+static size_t php_mb_zend_encoding_converter(zend_string **to, zend_string *from, const zend_encoding *encoding_to, const zend_encoding *encoding_from TSRMLS_DC)
{
mbfl_string string, result;
mbfl_buffer_converter *convd;
@@ -910,8 +910,8 @@ static size_t php_mb_zend_encoding_converter(unsigned char **to, size_t *to_leng
mbfl_string_init(&result);
string.no_encoding = ((const mbfl_encoding*)encoding_from)->no_encoding;
string.no_language = MBSTRG(language);
- string.val = (unsigned char*)from;
- string.len = from_length;
+ string.val = (unsigned char*)from->val;
+ string.len = from->len;
/* initialize converter */
convd = mbfl_buffer_converter_new2((const mbfl_encoding *)encoding_from, (const mbfl_encoding *)encoding_to, string.len);
@@ -934,8 +934,7 @@ static size_t php_mb_zend_encoding_converter(unsigned char **to, size_t *to_leng
return (size_t)-1;
}
- *to = result.val;
- *to_length = result.len;
+ *to = STR_INIT(result.val, result.len, 0);
mbfl_buffer_converter_delete(convd);
@@ -2173,6 +2172,7 @@ PHP_FUNCTION(mb_output_handler)
mbfl_buffer_converter_result(MBSTRG(outconv), &result);
//????
RETVAL_STRINGL((char *)result.val, result.len); /* the string is already strdup()'ed */
+ efree(result.val);
/* delete the converter if it is the last feed. */
if (last_feed) {
@@ -2476,6 +2476,7 @@ PHP_FUNCTION(mb_strstr)
if (ret != NULL) {
//???
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2485,6 +2486,7 @@ PHP_FUNCTION(mb_strstr)
if (ret != NULL) {
//????
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2538,6 +2540,7 @@ PHP_FUNCTION(mb_strrchr)
if (ret != NULL) {
//????
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2547,6 +2550,7 @@ PHP_FUNCTION(mb_strrchr)
if (ret != NULL) {
//????
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2602,6 +2606,7 @@ PHP_FUNCTION(mb_stristr)
if (ret != NULL) {
//????
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2611,6 +2616,7 @@ PHP_FUNCTION(mb_stristr)
if (ret != NULL) {
//????
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2657,6 +2663,7 @@ PHP_FUNCTION(mb_strrichr)
if (ret != NULL) {
//???
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2666,6 +2673,7 @@ PHP_FUNCTION(mb_strrichr)
if (ret != NULL) {
//????
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}
@@ -2789,7 +2797,8 @@ PHP_FUNCTION(mb_substr)
}
//????
- RETURN_STRINGL((char *)ret->val, ret->len); /* the string is already strdup()'ed */
+ RETVAL_STRINGL((char *)ret->val, ret->len); /* the string is already strdup()'ed */
+ efree(ret->val);
}
/* }}} */
@@ -2857,7 +2866,8 @@ PHP_FUNCTION(mb_strcut)
}
//????
- RETURN_STRINGL((char *)ret->val, ret->len); /* the string is already strdup()'ed */
+ RETVAL_STRINGL((char *)ret->val, ret->len); /* the string is already strdup()'ed */
+ efree(ret->val);
}
/* }}} */
@@ -2951,6 +2961,7 @@ PHP_FUNCTION(mb_strimwidth)
}
//????
RETVAL_STRINGL((char *)ret->val, ret->len); /* the string is already strdup()'ed */
+ efree(ret->val);
}
/* }}} */
@@ -3567,6 +3578,7 @@ PHP_FUNCTION(mb_convert_variables)
while (n < argc || stack_level > 0) {
if (stack_level <= 0) {
var = &args[n++];
+ ZVAL_DEREF(var);
if (Z_TYPE_P(var) == IS_ARRAY || Z_TYPE_P(var) == IS_OBJECT) {
target_hash = HASH_OF(var);
if (target_hash != NULL) {
@@ -3648,6 +3660,7 @@ detect_end:
while (n < argc || stack_level > 0) {
if (stack_level <= 0) {
var = &args[n++];
+ ZVAL_DEREF(var);
if (Z_TYPE_P(var) == IS_ARRAY || Z_TYPE_P(var) == IS_OBJECT) {
target_hash = HASH_OF(var);
if (target_hash != NULL) {
@@ -3686,6 +3699,7 @@ detect_end:
zval_ptr_dtor(hash_entry);
//???
ZVAL_STRINGL(hash_entry, (char *)ret->val, ret->len);
+ efree(ret->val);
}
}
}
@@ -3698,6 +3712,7 @@ detect_end:
zval_ptr_dtor(var);
//????
ZVAL_STRINGL(var, (char *)ret->val, ret->len);
+ efree(ret->val);
}
}
}
@@ -3788,6 +3803,7 @@ php_mb_numericentity_exec(INTERNAL_FUNCTION_PARAMETERS, int type)
if (ret != NULL) {
//???
RETVAL_STRINGL((char *)ret->val, ret->len);
+ efree(ret->val);
} else {
RETVAL_FALSE;
}