diff options
Diffstat (limited to 'ext/mbstring/php_mbregex.c')
-rw-r--r-- | ext/mbstring/php_mbregex.c | 346 |
1 files changed, 177 insertions, 169 deletions
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index b1b634ea5e..2337926740 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2016 The PHP Group | +----------------------------------------------------------------------+ @@ -28,11 +28,11 @@ #if HAVE_MBREGEX -#include "ext/standard/php_smart_str.h" +#include "zend_smart_str.h" #include "ext/standard/info.h" #include "php_mbregex.h" #include "mbstring.h" - + #include "php_onig_compat.h" /* must come prior to the oniguruma header */ #include <oniguruma.h> #undef UChar @@ -43,7 +43,7 @@ struct _zend_mb_regex_globals { OnigEncoding default_mbctype; OnigEncoding current_mbctype; HashTable ht_rc; - zval *search_str; + zval search_str; zval *search_str_val; unsigned int search_pos; php_mb_regex_t *search_re; @@ -55,19 +55,18 @@ struct _zend_mb_regex_globals { #define MBREX(g) (MBSTRG(mb_regex_globals)->g) /* {{{ static void php_mb_regex_free_cache() */ -static void php_mb_regex_free_cache(php_mb_regex_t **pre) -{ - onig_free(*pre); +static void php_mb_regex_free_cache(zval *el) { + onig_free((php_mb_regex_t *)Z_PTR_P(el)); } /* }}} */ /* {{{ _php_mb_regex_globals_ctor */ -static int _php_mb_regex_globals_ctor(zend_mb_regex_globals *pglobals TSRMLS_DC) +static int _php_mb_regex_globals_ctor(zend_mb_regex_globals *pglobals) { pglobals->default_mbctype = ONIG_ENCODING_UTF8; pglobals->current_mbctype = ONIG_ENCODING_UTF8; - zend_hash_init(&(pglobals->ht_rc), 0, NULL, (void (*)(void *)) php_mb_regex_free_cache, 1); - pglobals->search_str = (zval*) NULL; + zend_hash_init(&(pglobals->ht_rc), 0, NULL, php_mb_regex_free_cache, 1); + ZVAL_UNDEF(&pglobals->search_str); pglobals->search_re = (php_mb_regex_t*)NULL; pglobals->search_pos = 0; pglobals->search_regs = (OnigRegion*)NULL; @@ -78,21 +77,21 @@ static int _php_mb_regex_globals_ctor(zend_mb_regex_globals *pglobals TSRMLS_DC) /* }}} */ /* {{{ _php_mb_regex_globals_dtor */ -static void _php_mb_regex_globals_dtor(zend_mb_regex_globals *pglobals TSRMLS_DC) +static void _php_mb_regex_globals_dtor(zend_mb_regex_globals *pglobals) { zend_hash_destroy(&pglobals->ht_rc); } /* }}} */ /* {{{ php_mb_regex_globals_alloc */ -zend_mb_regex_globals *php_mb_regex_globals_alloc(TSRMLS_D) +zend_mb_regex_globals *php_mb_regex_globals_alloc(void) { zend_mb_regex_globals *pglobals = pemalloc( sizeof(zend_mb_regex_globals), 1); if (!pglobals) { return NULL; } - if (SUCCESS != _php_mb_regex_globals_ctor(pglobals TSRMLS_CC)) { + if (SUCCESS != _php_mb_regex_globals_ctor(pglobals)) { pefree(pglobals, 1); return NULL; } @@ -101,12 +100,12 @@ zend_mb_regex_globals *php_mb_regex_globals_alloc(TSRMLS_D) /* }}} */ /* {{{ php_mb_regex_globals_free */ -void php_mb_regex_globals_free(zend_mb_regex_globals *pglobals TSRMLS_DC) +void php_mb_regex_globals_free(zend_mb_regex_globals *pglobals) { if (!pglobals) { return; } - _php_mb_regex_globals_dtor(pglobals TSRMLS_CC); + _php_mb_regex_globals_dtor(pglobals); pefree(pglobals, 1); } /* }}} */ @@ -139,9 +138,9 @@ PHP_RSHUTDOWN_FUNCTION(mb_regex) { MBREX(current_mbctype) = MBREX(default_mbctype); - if (MBREX(search_str) != NULL) { + if (!Z_ISUNDEF(MBREX(search_str))) { zval_ptr_dtor(&MBREX(search_str)); - MBREX(search_str) = (zval *)NULL; + ZVAL_UNDEF(&MBREX(search_str)); } MBREX(search_pos) = 0; @@ -404,7 +403,7 @@ static const char *_php_mb_regex_mbctype2name(OnigEncoding mbctype) /* }}} */ /* {{{ php_mb_regex_set_mbctype */ -int php_mb_regex_set_mbctype(const char *encname TSRMLS_DC) +int php_mb_regex_set_mbctype(const char *encname) { OnigEncoding mbctype = _php_mb_regex_name2mbctype(encname); if (mbctype == ONIG_ENCODING_UNDEF) { @@ -416,7 +415,7 @@ int php_mb_regex_set_mbctype(const char *encname TSRMLS_DC) /* }}} */ /* {{{ php_mb_regex_set_default_mbctype */ -int php_mb_regex_set_default_mbctype(const char *encname TSRMLS_DC) +int php_mb_regex_set_default_mbctype(const char *encname) { OnigEncoding mbctype = _php_mb_regex_name2mbctype(encname); if (mbctype == ONIG_ENCODING_UNDEF) { @@ -428,14 +427,14 @@ int php_mb_regex_set_default_mbctype(const char *encname TSRMLS_DC) /* }}} */ /* {{{ php_mb_regex_get_mbctype */ -const char *php_mb_regex_get_mbctype(TSRMLS_D) +const char *php_mb_regex_get_mbctype(void) { return _php_mb_regex_mbctype2name(MBREX(current_mbctype)); } /* }}} */ /* {{{ php_mb_regex_get_default_mbctype */ -const char *php_mb_regex_get_default_mbctype(TSRMLS_D) +const char *php_mb_regex_get_default_mbctype(void) { return _php_mb_regex_mbctype2name(MBREX(default_mbctype)); } @@ -445,28 +444,31 @@ const char *php_mb_regex_get_default_mbctype(TSRMLS_D) * regex cache */ /* {{{ php_mbregex_compile_pattern */ -static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patlen, OnigOptionType options, OnigEncoding enc, OnigSyntaxType *syntax TSRMLS_DC) +static php_mb_regex_t *php_mbregex_compile_pattern(const char *pattern, int patlen, OnigOptionType options, OnigEncoding enc, OnigSyntaxType *syntax) { int err_code = 0; - int found = 0; - php_mb_regex_t *retval = NULL, **rc = NULL; + php_mb_regex_t *retval = NULL, *rc = NULL; OnigErrorInfo err_info; OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN]; - found = zend_hash_find(&MBREX(ht_rc), (char *)pattern, patlen+1, (void **) &rc); - if (found == FAILURE || (*rc)->options != options || (*rc)->enc != enc || (*rc)->syntax != syntax) { + rc = zend_hash_str_find_ptr(&MBREX(ht_rc), (char *)pattern, patlen); + if (!rc || rc->options != options || rc->enc != enc || rc->syntax != syntax) { if ((err_code = onig_new(&retval, (OnigUChar *)pattern, (OnigUChar *)(pattern + patlen), options, enc, syntax, &err_info)) != ONIG_NORMAL) { onig_error_code_to_str(err_str, err_code, err_info); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex compile err: %s", err_str); + php_error_docref(NULL, E_WARNING, "mbregex compile err: %s", err_str); retval = NULL; goto out; } - zend_hash_update(&MBREX(ht_rc), (char *) pattern, patlen + 1, (void *) &retval, sizeof(retval), NULL); - } else if (found == SUCCESS) { - retval = *rc; + if (rc == MBREX(search_re)) { + /* reuse the new rc? see bug #72399 */ + MBREX(search_re) = NULL; + } + zend_hash_str_update_ptr(&MBREX(ht_rc), (char *)pattern, patlen, retval); + } else { + retval = rc; } out: - return retval; + return retval; } /* }}} */ @@ -483,7 +485,7 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT --len_left; *(p++) = 'i'; } - ++len_req; + ++len_req; } if ((option & ONIG_OPTION_EXTEND) != 0) { @@ -491,7 +493,7 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT --len_left; *(p++) = 'x'; } - ++len_req; + ++len_req; } if ((option & (ONIG_OPTION_MULTILINE | ONIG_OPTION_SINGLELINE)) == @@ -500,14 +502,14 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT --len_left; *(p++) = 'p'; } - ++len_req; + ++len_req; } else { if ((option & ONIG_OPTION_MULTILINE) != 0) { if (len_left > 0) { --len_left; *(p++) = 'm'; } - ++len_req; + ++len_req; } if ((option & ONIG_OPTION_SINGLELINE) != 0) { @@ -515,22 +517,22 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT --len_left; *(p++) = 's'; } - ++len_req; + ++len_req; } - } + } if ((option & ONIG_OPTION_FIND_LONGEST) != 0) { if (len_left > 0) { --len_left; *(p++) = 'l'; } - ++len_req; + ++len_req; } if ((option & ONIG_OPTION_FIND_NOT_EMPTY) != 0) { if (len_left > 0) { --len_left; *(p++) = 'n'; } - ++len_req; + ++len_req; } c = 0; @@ -566,7 +568,7 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT --len_left; *(p++) = '\0'; } - ++len_req; + ++len_req; if (len < len_req) { return len_req; } @@ -577,11 +579,11 @@ static size_t _php_mb_regex_get_option_string(char *str, size_t len, OnigOptionT /* {{{ _php_mb_regex_init_options */ static void -_php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, OnigSyntaxType **syntax, int *eval) +_php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, OnigSyntaxType **syntax, int *eval) { int n; char c; - int optm = 0; + int optm = 0; *syntax = ONIG_SYNTAX_RUBY; @@ -636,13 +638,13 @@ _php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, O *syntax = ONIG_SYNTAX_POSIX_EXTENDED; break; case 'e': - if (eval != NULL) *eval = 1; + if (eval != NULL) *eval = 1; break; default: break; } } - if (option != NULL) *option|=optm; + if (option != NULL) *option|=optm; } } /* }}} */ @@ -655,28 +657,27 @@ _php_mb_regex_init_options(const char *parg, int narg, OnigOptionType *option, O Returns the current encoding for regex as a string. */ PHP_FUNCTION(mb_regex_encoding) { - size_t argc = ZEND_NUM_ARGS(); - char *encoding; - int encoding_len; + char *encoding = NULL; + size_t encoding_len; OnigEncoding mbctype; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &encoding, &encoding_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &encoding, &encoding_len) == FAILURE) { return; } - if (argc == 0) { + if (!encoding) { const char *retval = _php_mb_regex_mbctype2name(MBREX(current_mbctype)); if (retval == NULL) { RETURN_FALSE; } - RETURN_STRING((char *)retval, 1); - } else if (argc == 1) { + RETURN_STRING((char *)retval); + } else { mbctype = _php_mb_regex_name2mbctype(encoding); if (mbctype == ONIG_ENCODING_UNDEF) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", encoding); + php_error_docref(NULL, E_WARNING, "Unknown encoding \"%s\"", encoding); RETURN_FALSE; } @@ -689,18 +690,16 @@ PHP_FUNCTION(mb_regex_encoding) /* {{{ _php_mb_regex_ereg_exec */ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) { - zval **arg_pattern, *array; + zval *arg_pattern, *array = NULL; char *string; - int string_len; + size_t string_len; php_mb_regex_t *re; OnigRegion *regs = NULL; int i, match_len, beg, end; OnigOptionType options; char *str; - array = NULL; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zs|z", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z/", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } @@ -710,22 +709,22 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) } /* compile the regular expression from the supplied regex */ - if (Z_TYPE_PP(arg_pattern) != IS_STRING) { + if (Z_TYPE_P(arg_pattern) != IS_STRING) { /* we convert numbers to integers and treat them as a string */ - if (Z_TYPE_PP(arg_pattern) == IS_DOUBLE) { + if (Z_TYPE_P(arg_pattern) == IS_DOUBLE) { convert_to_long_ex(arg_pattern); /* get rid of decimal places */ } convert_to_string_ex(arg_pattern); /* don't bother doing an extended regex with just a number */ } - if (!Z_STRVAL_PP(arg_pattern) || Z_STRLEN_PP(arg_pattern) == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "empty pattern"); + if (Z_STRLEN_P(arg_pattern) == 0) { + php_error_docref(NULL, E_WARNING, "empty pattern"); RETVAL_FALSE; goto out; } - re = php_mbregex_compile_pattern(Z_STRVAL_PP(arg_pattern), Z_STRLEN_PP(arg_pattern), options, MBREX(current_mbctype), MBREX(regex_default_syntax) TSRMLS_CC); + re = php_mbregex_compile_pattern(Z_STRVAL_P(arg_pattern), Z_STRLEN_P(arg_pattern), options, MBREX(current_mbctype), MBREX(regex_default_syntax)); if (re == NULL) { RETVAL_FALSE; goto out; @@ -742,14 +741,15 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) match_len = 1; str = string; if (array != NULL) { - match_len = regs->end[0] - regs->beg[0]; zval_dtor(array); array_init(array); + + match_len = regs->end[0] - regs->beg[0]; for (i = 0; i < regs->num_regs; i++) { beg = regs->beg[i]; end = regs->end[i]; if (beg >= 0 && beg < end && end <= string_len) { - add_index_stringl(array, i, (char *)&str[beg], end - beg, 1); + add_index_stringl(array, i, (char *)&str[beg], end - beg); } else { add_index_bool(array, i, 0); } @@ -786,32 +786,32 @@ PHP_FUNCTION(mb_eregi) /* {{{ _php_mb_regex_ereg_replace_exec */ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOptionType options, int is_callable) { - zval **arg_pattern_zval; + zval *arg_pattern_zval; char *arg_pattern; - int arg_pattern_len; + size_t arg_pattern_len; char *replace; - int replace_len; + size_t replace_len; zend_fcall_info arg_replace_fci; zend_fcall_info_cache arg_replace_fci_cache; char *string; - int string_len; + size_t string_len; char *p; php_mb_regex_t *re; OnigSyntaxType *syntax; OnigRegion *regs = NULL; - smart_str out_buf = { 0 }; - smart_str eval_buf = { 0 }; + smart_str out_buf = {0}; + smart_str eval_buf = {0}; smart_str *pbuf; int i, err, eval, n; OnigUChar *pos; OnigUChar *string_lim; char *description = NULL; - char pat_buf[2]; + char pat_buf[6]; const mbfl_encoding *enc; @@ -820,17 +820,17 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp current_enc_name = _php_mb_regex_mbctype2name(MBREX(current_mbctype)); if (current_enc_name == NULL || (enc = mbfl_name2encoding(current_enc_name)) == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error"); + php_error_docref(NULL, E_WARNING, "Unknown error"); RETURN_FALSE; } } eval = 0; { char *option_str = NULL; - int option_str_len = 0; + size_t option_str_len = 0; if (!is_callable) { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zss|s", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zss|s", &arg_pattern_zval, &replace, &replace_len, &string, &string_len, @@ -838,7 +838,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp RETURN_FALSE; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zfs|s", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zfs|s", &arg_pattern_zval, &arg_replace_fci, &arg_replace_fci_cache, &string, &string_len, @@ -854,27 +854,31 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp syntax = MBREX(regex_default_syntax); } } - if (Z_TYPE_PP(arg_pattern_zval) == IS_STRING) { - arg_pattern = Z_STRVAL_PP(arg_pattern_zval); - arg_pattern_len = Z_STRLEN_PP(arg_pattern_zval); + if (Z_TYPE_P(arg_pattern_zval) == IS_STRING) { + arg_pattern = Z_STRVAL_P(arg_pattern_zval); + arg_pattern_len = Z_STRLEN_P(arg_pattern_zval); } else { /* FIXME: this code is not multibyte aware! */ convert_to_long_ex(arg_pattern_zval); - pat_buf[0] = (char)Z_LVAL_PP(arg_pattern_zval); + pat_buf[0] = (char)Z_LVAL_P(arg_pattern_zval); pat_buf[1] = '\0'; + pat_buf[2] = '\0'; + pat_buf[3] = '\0'; + pat_buf[4] = '\0'; + pat_buf[5] = '\0'; arg_pattern = pat_buf; - arg_pattern_len = 1; + arg_pattern_len = 1; } /* create regex pattern buffer */ - re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, options, MBREX(current_mbctype), syntax TSRMLS_CC); + re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, options, MBREX(current_mbctype), syntax); if (re == NULL) { RETURN_FALSE; } if (eval || is_callable) { pbuf = &eval_buf; - description = zend_make_compiled_string_description("mbregex replace" TSRMLS_CC); + description = zend_make_compiled_string_description("mbregex replace"); } else { pbuf = &out_buf; description = NULL; @@ -882,7 +886,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp if (is_callable) { if (eval) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Option 'e' cannot be used with replacement callback"); + php_error_docref(NULL, E_WARNING, "Option 'e' cannot be used with replacement callback"); RETURN_FALSE; } } @@ -897,18 +901,18 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp if (err <= -2) { OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(err_str, err); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex search failure in php_mbereg_replace_exec(): %s", err_str); + php_error_docref(NULL, E_WARNING, "mbregex search failure in php_mbereg_replace_exec(): %s", err_str); break; } if (err >= 0) { #if moriyoshi_0 if (regs->beg[0] == regs->end[0]) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty regular expression"); + php_error_docref(NULL, E_WARNING, "Empty regular expression"); break; } #endif /* copy the part of the string before the match */ - smart_str_appendl(&out_buf, pos, (size_t)((OnigUChar *)(string + regs->beg[0]) - pos)); + smart_str_appendl(&out_buf, (char *)pos, (size_t)((OnigUChar *)(string + regs->beg[0]) - pos)); if (!is_callable) { /* copy replacement and backrefs */ @@ -934,15 +938,23 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp } } } - + if (eval) { zval v; + zend_string *eval_str; /* null terminate buffer */ smart_str_0(&eval_buf); + + if (eval_buf.s) { + eval_str = eval_buf.s; + } else { + eval_str = ZSTR_EMPTY_ALLOC(); + } + /* do eval */ - if (zend_eval_stringl(eval_buf.c, eval_buf.len, &v, description TSRMLS_CC) == FAILURE) { + if (zend_eval_stringl(ZSTR_VAL(eval_str), ZSTR_LEN(eval_str), &v, description) == FAILURE) { efree(description); - php_error_docref(NULL TSRMLS_CC,E_ERROR, "Failed evaluating code: %s%s", PHP_EOL, eval_buf.c); + php_error_docref(NULL,E_ERROR, "Failed evaluating code: %s%s", PHP_EOL, ZSTR_VAL(eval_str)); /* zend_error() does not return in this case */ } @@ -950,37 +962,35 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp convert_to_string(&v); smart_str_appendl(&out_buf, Z_STRVAL(v), Z_STRLEN(v)); /* Clean up */ - eval_buf.len = 0; + smart_str_free(&eval_buf); zval_dtor(&v); } else if (is_callable) { - zval *retval_ptr; - zval **args[1]; - zval *subpats; + zval args[1]; + zval subpats, retval; int i; - - MAKE_STD_ZVAL(subpats); - array_init(subpats); - + + array_init(&subpats); for (i = 0; i < regs->num_regs; i++) { - add_next_index_stringl(subpats, string + regs->beg[i], regs->end[i] - regs->beg[i], 1); - } - - args[0] = &subpats; + add_next_index_stringl(&subpats, string + regs->beg[i], regs->end[i] - regs->beg[i]); + } + + ZVAL_COPY_VALUE(&args[0], &subpats); /* null terminate buffer */ smart_str_0(&eval_buf); - + arg_replace_fci.param_count = 1; arg_replace_fci.params = args; - arg_replace_fci.retval_ptr_ptr = &retval_ptr; - if (zend_call_function(&arg_replace_fci, &arg_replace_fci_cache TSRMLS_CC) == SUCCESS && arg_replace_fci.retval_ptr_ptr) { - convert_to_string_ex(&retval_ptr); - smart_str_appendl(&out_buf, Z_STRVAL_P(retval_ptr), Z_STRLEN_P(retval_ptr)); - eval_buf.len = 0; - zval_ptr_dtor(&retval_ptr); + arg_replace_fci.retval = &retval; + if (zend_call_function(&arg_replace_fci, &arg_replace_fci_cache) == SUCCESS && + !Z_ISUNDEF(retval)) { + convert_to_string_ex(&retval); + smart_str_appendl(&out_buf, Z_STRVAL(retval), Z_STRLEN(retval)); + smart_str_free(&eval_buf); + zval_ptr_dtor(&retval); } else { efree(description); if (!EG(exception)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to call custom replacement function"); + php_error_docref(NULL, E_WARNING, "Unable to call custom replacement function"); } } zval_ptr_dtor(&subpats); @@ -991,14 +1001,14 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp pos = (OnigUChar *)string + n; } else { if (pos < string_lim) { - smart_str_appendl(&out_buf, pos, 1); + smart_str_appendl(&out_buf, (char *)pos, 1); } pos++; } } else { /* nomatch */ /* stick that last bit of string on our output */ if (string_lim - pos > 0) { - smart_str_appendl(&out_buf, pos, string_lim - pos); + smart_str_appendl(&out_buf, (char *)pos, string_lim - pos); } } onig_region_free(regs, 0); @@ -1013,11 +1023,13 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp smart_str_free(&eval_buf); if (err <= -2) { - smart_str_free(&out_buf); + smart_str_free(&out_buf); RETVAL_FALSE; + } else if (out_buf.s) { + smart_str_0(&out_buf); + RETVAL_STR(out_buf.s); } else { - smart_str_appendc(&out_buf, '\0'); - RETVAL_STRINGL((char *)out_buf.c, out_buf.len - 1, 0); + RETVAL_EMPTY_STRING(); } } /* }}} */ @@ -1051,26 +1063,26 @@ PHP_FUNCTION(mb_ereg_replace_callback) PHP_FUNCTION(mb_split) { char *arg_pattern; - int arg_pattern_len; + size_t arg_pattern_len; php_mb_regex_t *re; OnigRegion *regs = NULL; char *string; OnigUChar *pos, *chunk_pos; - int string_len; + size_t string_len; int n, err; - long count = -1; + zend_long count = -1; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|l", &arg_pattern, &arg_pattern_len, &string, &string_len, &count) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|l", &arg_pattern, &arg_pattern_len, &string, &string_len, &count) == FAILURE) { RETURN_FALSE; - } + } if (count > 0) { count--; } /* create regex pattern buffer */ - if ((re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, MBREX(regex_default_options), MBREX(current_mbctype), MBREX(regex_default_syntax) TSRMLS_CC)) == NULL) { + if ((re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, MBREX(regex_default_options), MBREX(current_mbctype), MBREX(regex_default_syntax))) == NULL) { RETURN_FALSE; } @@ -1080,7 +1092,7 @@ PHP_FUNCTION(mb_split) err = 0; regs = onig_region_new(); /* churn through str, generating array entries as we go */ - while (count != 0 && (pos - (OnigUChar *)string) < string_len) { + while (count != 0 && (pos - (OnigUChar *)string) < (ptrdiff_t)string_len) { int beg, end; err = onig_search(re, (OnigUChar *)string, (OnigUChar *)(string + string_len), pos, (OnigUChar *)(string + string_len), regs, 0); if (err < 0) { @@ -1090,7 +1102,7 @@ PHP_FUNCTION(mb_split) /* add it to the array */ if ((pos - (OnigUChar *)string) < end) { if (beg < string_len && beg >= (chunk_pos - (OnigUChar *)string)) { - add_next_index_stringl(return_value, (char *)chunk_pos, ((OnigUChar *)(string + beg) - chunk_pos), 1); + add_next_index_stringl(return_value, (char *)chunk_pos, ((OnigUChar *)(string + beg) - chunk_pos)); --count; } else { err = -2; @@ -1110,7 +1122,7 @@ PHP_FUNCTION(mb_split) if (err <= -2) { OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(err_str, err); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex search failure in mbsplit(): %s", err_str); + php_error_docref(NULL, E_WARNING, "mbregex search failure in mbsplit(): %s", err_str); zval_dtor(return_value); RETURN_FALSE; } @@ -1118,9 +1130,9 @@ PHP_FUNCTION(mb_split) /* otherwise we just have one last element to add to the array */ n = ((OnigUChar *)(string + string_len) - chunk_pos); if (n > 0) { - add_next_index_stringl(return_value, (char *)chunk_pos, n, 1); + add_next_index_stringl(return_value, (char *)chunk_pos, n); } else { - add_next_index_stringl(return_value, "", 0, 1); + add_next_index_stringl(return_value, "", 0); } } /* }}} */ @@ -1130,10 +1142,10 @@ PHP_FUNCTION(mb_split) PHP_FUNCTION(mb_ereg_match) { char *arg_pattern; - int arg_pattern_len; + size_t arg_pattern_len; char *string; - int string_len; + size_t string_len; php_mb_regex_t *re; OnigSyntaxType *syntax; @@ -1142,9 +1154,9 @@ PHP_FUNCTION(mb_ereg_match) { char *option_str = NULL; - int option_str_len = 0; + size_t option_str_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|s", &arg_pattern, &arg_pattern_len, &string, &string_len, &option_str, &option_str_len)==FAILURE) { RETURN_FALSE; @@ -1158,7 +1170,7 @@ PHP_FUNCTION(mb_ereg_match) } } - if ((re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), syntax TSRMLS_CC)) == NULL) { + if ((re = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), syntax)) == NULL) { RETURN_FALSE; } @@ -1177,28 +1189,27 @@ PHP_FUNCTION(mb_ereg_match) static void _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode) { - size_t argc = ZEND_NUM_ARGS(); - char *arg_pattern, *arg_options; - int arg_pattern_len, arg_options_len; + char *arg_pattern = NULL, *arg_options = NULL; + size_t arg_pattern_len, arg_options_len; int n, i, err, pos, len, beg, end; OnigOptionType option; OnigUChar *str; OnigSyntaxType *syntax; - if (zend_parse_parameters(argc TSRMLS_CC, "|ss", &arg_pattern, &arg_pattern_len, &arg_options, &arg_options_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ss", &arg_pattern, &arg_pattern_len, &arg_options, &arg_options_len) == FAILURE) { return; } option = MBREX(regex_default_options); - if (argc == 2) { + if (arg_options) { option = 0; _php_mb_regex_init_options(arg_options, arg_options_len, &option, &syntax, NULL); } - if (argc > 0) { + if (arg_pattern) { /* create regex pattern buffer */ - if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), MBREX(regex_default_syntax) TSRMLS_CC)) == NULL) { + if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), MBREX(regex_default_syntax))) == NULL) { RETURN_FALSE; } } @@ -1206,18 +1217,18 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode) pos = MBREX(search_pos); str = NULL; len = 0; - if (MBREX(search_str) != NULL && Z_TYPE_P(MBREX(search_str)) == IS_STRING){ - str = (OnigUChar *)Z_STRVAL_P(MBREX(search_str)); - len = Z_STRLEN_P(MBREX(search_str)); + if (!Z_ISUNDEF(MBREX(search_str)) && Z_TYPE(MBREX(search_str)) == IS_STRING){ + str = (OnigUChar *)Z_STRVAL(MBREX(search_str)); + len = Z_STRLEN(MBREX(search_str)); } if (MBREX(search_re) == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "No regex given"); + php_error_docref(NULL, E_WARNING, "No regex given"); RETURN_FALSE; } if (str == NULL) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "No string given"); + php_error_docref(NULL, E_WARNING, "No string given"); RETURN_FALSE; } @@ -1233,11 +1244,11 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode) } else if (err <= -2) { OnigUChar err_str[ONIG_MAX_ERROR_MESSAGE_LEN]; onig_error_code_to_str(err_str, err); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "mbregex search failure in mbregex_search(): %s", err_str); + php_error_docref(NULL, E_WARNING, "mbregex search failure in mbregex_search(): %s", err_str); RETVAL_FALSE; } else { if (MBREX(search_regs)->beg[0] == MBREX(search_regs)->end[0]) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty regular expression"); + php_error_docref(NULL, E_WARNING, "Empty regular expression"); } switch (mode) { case 1: @@ -1254,7 +1265,7 @@ _php_mb_regex_ereg_search_exec(INTERNAL_FUNCTION_PARAMETERS, int mode) beg = MBREX(search_regs)->beg[i]; end = MBREX(search_regs)->end[i]; if (beg >= 0 && beg <= end && end <= len) { - add_index_stringl(return_value, i, (char *)&str[beg], end - beg, 1); + add_index_stringl(return_value, i, (char *)&str[beg], end - beg); } else { add_index_bool(return_value, i, 0); } @@ -1310,16 +1321,16 @@ PHP_FUNCTION(mb_ereg_search_init) size_t argc = ZEND_NUM_ARGS(); zval *arg_str; char *arg_pattern = NULL, *arg_options = NULL; - int arg_pattern_len = 0, arg_options_len = 0; + size_t arg_pattern_len = 0, arg_options_len = 0; OnigSyntaxType *syntax = NULL; OnigOptionType option; - if (zend_parse_parameters(argc TSRMLS_CC, "z|ss", &arg_str, &arg_pattern, &arg_pattern_len, &arg_options, &arg_options_len) == FAILURE) { + if (zend_parse_parameters(argc, "z|ss", &arg_str, &arg_pattern, &arg_pattern_len, &arg_options, &arg_options_len) == FAILURE) { return; } - + if (argc > 1 && arg_pattern_len == 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty pattern"); + php_error_docref(NULL, E_WARNING, "Empty pattern"); RETURN_FALSE; } @@ -1333,25 +1344,22 @@ PHP_FUNCTION(mb_ereg_search_init) if (argc > 1) { /* create regex pattern buffer */ - if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), syntax TSRMLS_CC)) == NULL) { + if ((MBREX(search_re) = php_mbregex_compile_pattern(arg_pattern, arg_pattern_len, option, MBREX(current_mbctype), syntax)) == NULL) { RETURN_FALSE; } } - if (MBREX(search_str) != NULL) { + if (!Z_ISNULL(MBREX(search_str))) { zval_ptr_dtor(&MBREX(search_str)); - MBREX(search_str) = (zval *)NULL; } - MBREX(search_str) = arg_str; - Z_ADDREF_P(MBREX(search_str)); - SEPARATE_ZVAL_IF_NOT_REF(&MBREX(search_str)); + ZVAL_DUP(&MBREX(search_str), arg_str); MBREX(search_pos) = 0; if (MBREX(search_regs) != NULL) { onig_region_free(MBREX(search_regs), 1); - MBREX(search_regs) = (OnigRegion *) NULL; + MBREX(search_regs) = NULL; } RETURN_TRUE; @@ -1365,17 +1373,17 @@ PHP_FUNCTION(mb_ereg_search_getregs) int n, i, len, beg, end; OnigUChar *str; - if (MBREX(search_regs) != NULL && Z_TYPE_P(MBREX(search_str)) == IS_STRING && Z_STRVAL_P(MBREX(search_str)) != NULL) { + if (MBREX(search_regs) != NULL && Z_TYPE(MBREX(search_str)) == IS_STRING) { array_init(return_value); - str = (OnigUChar *)Z_STRVAL_P(MBREX(search_str)); - len = Z_STRLEN_P(MBREX(search_str)); + str = (OnigUChar *)Z_STRVAL(MBREX(search_str)); + len = Z_STRLEN(MBREX(search_str)); n = MBREX(search_regs)->num_regs; for (i = 0; i < n; i++) { beg = MBREX(search_regs)->beg[i]; end = MBREX(search_regs)->end[i]; if (beg >= 0 && beg <= end && end <= len) { - add_index_stringl(return_value, i, (char *)&str[beg], end - beg, 1); + add_index_stringl(return_value, i, (char *)&str[beg], end - beg); } else { add_index_bool(return_value, i, 0); } @@ -1398,14 +1406,14 @@ PHP_FUNCTION(mb_ereg_search_getpos) Set search start position */ PHP_FUNCTION(mb_ereg_search_setpos) { - long position; + zend_long position; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &position) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &position) == FAILURE) { return; } - if (position < 0 || (MBREX(search_str) != NULL && Z_TYPE_P(MBREX(search_str)) == IS_STRING && position >= Z_STRLEN_P(MBREX(search_str)))) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Position is out of range"); + if (position < 0 || (!Z_ISUNDEF(MBREX(search_str)) && Z_TYPE(MBREX(search_str)) == IS_STRING && (size_t)position >= Z_STRLEN(MBREX(search_str)))) { + php_error_docref(NULL, E_WARNING, "Position is out of range"); MBREX(search_pos) = 0; RETURN_FALSE; } @@ -1416,7 +1424,7 @@ PHP_FUNCTION(mb_ereg_search_setpos) /* }}} */ /* {{{ php_mb_regex_set_options */ -static void _php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType *prev_options, OnigSyntaxType **prev_syntax TSRMLS_DC) +static void _php_mb_regex_set_options(OnigOptionType options, OnigSyntaxType *syntax, OnigOptionType *prev_options, OnigSyntaxType **prev_syntax) { if (prev_options != NULL) { *prev_options = MBREX(regex_default_options); @@ -1436,10 +1444,10 @@ PHP_FUNCTION(mb_regex_set_options) OnigOptionType opt; OnigSyntaxType *syntax; char *string = NULL; - int string_len; + size_t string_len; char buf[16]; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &string, &string_len) == FAILURE) { RETURN_FALSE; } @@ -1447,14 +1455,14 @@ PHP_FUNCTION(mb_regex_set_options) opt = 0; syntax = NULL; _php_mb_regex_init_options(string, string_len, &opt, &syntax, NULL); - _php_mb_regex_set_options(opt, syntax, NULL, NULL TSRMLS_CC); + _php_mb_regex_set_options(opt, syntax, NULL, NULL); } else { opt = MBREX(regex_default_options); syntax = MBREX(regex_default_syntax); } _php_mb_regex_get_option_string(buf, sizeof(buf), opt, syntax); - RETVAL_STRING(buf, 1); + RETVAL_STRING(buf); } /* }}} */ |