diff options
Diffstat (limited to 'ext/mbstring')
-rw-r--r-- | ext/mbstring/mb_gpc.c | 2 | ||||
-rw-r--r-- | ext/mbstring/mbstring.c | 100 | ||||
-rw-r--r-- | ext/mbstring/mbstring.h | 1 | ||||
-rw-r--r-- | ext/mbstring/php_mbregex.c | 56 | ||||
-rw-r--r-- | ext/mbstring/tests/bug43301.phpt | 15 | ||||
-rw-r--r-- | ext/mbstring/tests/bug45923.phpt | 234 | ||||
-rw-r--r-- | ext/mbstring/tests/bug69151.phpt | 21 | ||||
-rw-r--r-- | ext/mbstring/tests/bug72164.phpt | 3 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_ereg_search_setpos.phpt | 70 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_strimwidth.phpt | 36 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_stripos.phpt | 122 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_stripos_variation3.phpt | 67 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt | 22 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_strpos.phpt | 97 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_strpos_variation3.phpt | 62 | ||||
-rw-r--r-- | ext/mbstring/tests/mb_strpos_variation5.phpt | 16 |
16 files changed, 642 insertions, 282 deletions
diff --git a/ext/mbstring/mb_gpc.c b/ext/mbstring/mb_gpc.c index aea4baf6a3..88eb2b7e0c 100644 --- a/ext/mbstring/mb_gpc.c +++ b/ext/mbstring/mb_gpc.c @@ -254,7 +254,7 @@ const mbfl_encoding *_php_mb_encoding_handler_ex(const php_mb_encoding_handler_i } if (n > (PG(max_input_vars) * 2)) { - php_error_docref(NULL, E_WARNING, "Input variables exceeded %pd. To increase the limit change max_input_vars in php.ini.", PG(max_input_vars)); + php_error_docref(NULL, E_WARNING, "Input variables exceeded " ZEND_LONG_FMT ". To increase the limit change max_input_vars in php.ini.", PG(max_input_vars)); goto out; } diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 9968a1dc51..a44a9dade1 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -687,8 +687,8 @@ static sapi_post_entry mbstr_post_entries[] = { static int php_mb_parse_encoding_list(const char *value, size_t value_length, const mbfl_encoding ***return_list, size_t *return_size, int persistent) { - int size, bauto, ret = SUCCESS; - size_t n; + int bauto, ret = SUCCESS; + size_t n, size; char *p, *p1, *p2, *endp, *tmpstr; const mbfl_encoding **entry, **list; @@ -1594,6 +1594,8 @@ PHP_MSHUTDOWN_FUNCTION(mbstring) { UNREGISTER_INI_ENTRIES(); + zend_multibyte_restore_functions(); + #if HAVE_MBREGEX PHP_MSHUTDOWN(mb_regex) (INIT_FUNC_ARGS_PASSTHRU); #endif @@ -2097,8 +2099,13 @@ PHP_FUNCTION(mb_parse_str) detected = _php_mb_encoding_handler_ex(&info, track_vars_array, encstr); } else { zval tmp; - zend_array *symbol_table = zend_rebuild_symbol_table(); + zend_array *symbol_table; + if (zend_forbid_dynamic_call("mb_parse_str() with a single argument") == FAILURE) { + efree(encstr); + return; + } + symbol_table = zend_rebuild_symbol_table(); ZVAL_ARR(&tmp, symbol_table); detected = _php_mb_encoding_handler_ex(&info, &tmp, encstr); } @@ -2262,7 +2269,7 @@ PHP_FUNCTION(mb_strlen) PHP_FUNCTION(mb_strpos) { int n, reverse = 0; - zend_long offset = 0; + zend_long offset = 0, slen; mbfl_string haystack, needle; char *enc_name = NULL; size_t enc_name_len, haystack_len, needle_len; @@ -2297,7 +2304,11 @@ PHP_FUNCTION(mb_strpos) } } - if (offset < 0 || offset > mbfl_strlen(&haystack)) { + slen = mbfl_strlen(&haystack); + if (offset < 0) { + offset += slen; + } + if (offset < 0 || offset > slen) { php_error_docref(NULL, E_WARNING, "Offset not contained in string"); RETURN_FALSE; } @@ -3053,7 +3064,7 @@ PHP_FUNCTION(mb_strwidth) PHP_FUNCTION(mb_strimwidth) { char *str, *trimmarker = NULL, *encoding = NULL; - zend_long from, width; + zend_long from, width, swidth; size_t str_len, trimmarker_len, encoding_len; mbfl_string string, result, marker, *ret; @@ -3081,13 +3092,25 @@ PHP_FUNCTION(mb_strimwidth) string.val = (unsigned char *)str; string.len = str_len; + if ((from < 0) || (width < 0)) { + swidth = mbfl_strwidth(&string); + } + + if (from < 0) { + from += swidth; + } + if (from < 0 || (size_t)from > str_len) { php_error_docref(NULL, E_WARNING, "Start position is out of range"); RETURN_FALSE; } if (width < 0) { - php_error_docref(NULL, E_WARNING, "Width is negative value"); + width = swidth + width - from; + } + + if (width < 0) { + php_error_docref(NULL, E_WARNING, "Width is out of range"); RETURN_FALSE; } @@ -3427,6 +3450,10 @@ PHP_FUNCTION(mb_list_encodings) const mbfl_encoding *encoding; int i; + if (zend_parse_parameters_none() == FAILURE) { + return; + } + array_init(return_value); i = 0; encodings = mbfl_get_supported_encodings(); @@ -4645,40 +4672,32 @@ PHP_FUNCTION(mb_get_info) } /* }}} */ -/* {{{ proto bool mb_check_encoding([string var[, string encoding]]) - Check if the string is valid for the specified encoding */ -PHP_FUNCTION(mb_check_encoding) +MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const char *enc) { - char *var = NULL; - size_t var_len; - char *enc = NULL; - size_t enc_len; - mbfl_buffer_converter *convd; const mbfl_encoding *encoding = MBSTRG(current_internal_encoding); + mbfl_buffer_converter *convd; mbfl_string string, result, *ret = NULL; long illegalchars = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ss", &var, &var_len, &enc, &enc_len) == FAILURE) { - return; - } - - if (var == NULL) { - RETURN_BOOL(MBSTRG(illegalchars) == 0); + if (input == NULL) { + return MBSTRG(illegalchars) == 0; } if (enc != NULL) { encoding = mbfl_name2encoding(enc); if (!encoding || encoding == &mbfl_encoding_pass) { php_error_docref(NULL, E_WARNING, "Invalid encoding \"%s\"", enc); - RETURN_FALSE; + return 0; } } convd = mbfl_buffer_converter_new2(encoding, encoding, 0); + if (convd == NULL) { php_error_docref(NULL, E_WARNING, "Unable to create converter"); - RETURN_FALSE; + return 0; } + mbfl_buffer_converter_illegal_mode(convd, MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE); mbfl_buffer_converter_illegal_substchar(convd, 0); @@ -4686,19 +4705,43 @@ PHP_FUNCTION(mb_check_encoding) mbfl_string_init_set(&string, mbfl_no_language_neutral, encoding->no_encoding); mbfl_string_init(&result); - string.val = (unsigned char *)var; - string.len = var_len; + string.val = (unsigned char *) input; + string.len = length; + ret = mbfl_buffer_converter_feed_result(convd, &string, &result); illegalchars = mbfl_buffer_illegalchars(convd); mbfl_buffer_converter_delete(convd); - RETVAL_FALSE; if (ret != NULL) { if (illegalchars == 0 && string.len == result.len && memcmp(string.val, result.val, string.len) == 0) { - RETVAL_TRUE; + mbfl_string_clear(&result); + return 1; } + mbfl_string_clear(&result); } + + return 0; +} + +/* {{{ proto bool mb_check_encoding([string var[, string encoding]]) + Check if the string is valid for the specified encoding */ +PHP_FUNCTION(mb_check_encoding) +{ + char *var = NULL; + size_t var_len; + char *enc = NULL; + size_t enc_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ss", &var, &var_len, &enc, &enc_len) == FAILURE) { + return; + } + + RETVAL_FALSE; + + if (php_mb_check_encoding(var, var_len, enc)) { + RETVAL_TRUE; + } } /* }}} */ @@ -4865,6 +4908,9 @@ MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int break; } } else { + if (offset < 0) { + offset += (long)haystack_char_len; + } if (offset < 0 || offset > haystack_char_len) { php_error_docref(NULL, E_WARNING, "Offset not contained in string"); break; diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 71d63b13de..1283598cfb 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -152,6 +152,7 @@ MBSTRING_API int php_mb_encoding_detector_ex(const char *arg_string, int arg_len MBSTRING_API int php_mb_encoding_converter_ex(char **str, int *len, const char *encoding_to, const char *encoding_from); MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int old_haystack_len, const char *old_needle, unsigned int old_needle_len, long offset, const char *from_encoding); +MBSTRING_API int php_mb_check_encoding(const char *input, size_t length, const char *enc); /* internal use only */ int _php_mb_ini_mbstring_internal_encoding_set(const char *new_value, uint new_value_length); diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index 573a5e9b9c..a012ee2f35 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -703,6 +703,16 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) RETURN_FALSE; } + if (!php_mb_check_encoding( + string, + string_len, + _php_mb_regex_mbctype2name(MBREX(current_mbctype)) + )) { + zval_dtor(array); + array_init(array); + RETURN_FALSE; + } + options = MBREX(regex_default_options); if (icase) { options |= ONIG_OPTION_IGNORECASE; @@ -748,7 +758,7 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) for (i = 0; i < regs->num_regs; i++) { beg = regs->beg[i]; end = regs->end[i]; - if (beg >= 0 && beg < end && end <= string_len) { + if (beg >= 0 && beg < end && (size_t)end <= string_len) { add_index_stringl(array, i, (char *)&str[beg], end - beg); } else { add_index_bool(array, i, 0); @@ -807,7 +817,8 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp smart_str out_buf = {0}; smart_str eval_buf = {0}; smart_str *pbuf; - int i, err, eval, n; + size_t i; + int err, eval, n; OnigUChar *pos; OnigUChar *string_lim; char *description = NULL; @@ -847,6 +858,14 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp } } + if (!php_mb_check_encoding( + string, + string_len, + _php_mb_regex_mbctype2name(MBREX(current_mbctype)) + )) { + RETURN_NULL(); + } + if (option_str != NULL) { _php_mb_regex_init_options(option_str, option_str_len, &options, &syntax, &eval); } else { @@ -854,6 +873,9 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp syntax = MBREX(regex_default_syntax); } } + if (eval && !is_callable) { + php_error_docref(NULL, E_DEPRECATED, "The 'e' option is deprecated, use mb_ereg_replace_callback instead"); + } 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); @@ -926,7 +948,7 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp n = p[1] - '0'; } if (n >= 0 && n < regs->num_regs) { - if (regs->beg[n] >= 0 && regs->beg[n] < regs->end[n] && regs->end[n] <= string_len) { + if (regs->beg[n] >= 0 && regs->beg[n] < regs->end[n] && (size_t)regs->end[n] <= string_len) { smart_str_appendl(pbuf, string + regs->beg[n], regs->end[n] - regs->beg[n]); } p += 2; @@ -954,8 +976,11 @@ static void _php_mb_regex_ereg_replace_exec(INTERNAL_FUNCTION_PARAMETERS, OnigOp /* do eval */ if (zend_eval_stringl(ZSTR_VAL(eval_str), ZSTR_LEN(eval_str), &v, description) == FAILURE) { efree(description); - 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 */ + zend_throw_error(NULL, "Failed evaluating code: %s%s", PHP_EOL, ZSTR_VAL(eval_str)); + onig_region_free(regs, 0); + smart_str_free(&out_buf); + smart_str_free(&eval_buf); + RETURN_FALSE; } /* result of eval */ @@ -1100,7 +1125,7 @@ PHP_FUNCTION(mb_split) beg = regs->beg[0], end = regs->end[0]; /* add it to the array */ if ((pos - (OnigUChar *)string) < end) { - if (beg < string_len && beg >= (chunk_pos - (OnigUChar *)string)) { + if ((size_t)beg < string_len && beg >= (chunk_pos - (OnigUChar *)string)) { add_next_index_stringl(return_value, (char *)chunk_pos, ((OnigUChar *)(string + beg) - chunk_pos)); --count; } else { @@ -1354,14 +1379,22 @@ PHP_FUNCTION(mb_ereg_search_init) ZVAL_DUP(&MBREX(search_str), arg_str); - MBREX(search_pos) = 0; + if (php_mb_check_encoding( + Z_STRVAL_P(arg_str), + Z_STRLEN_P(arg_str), + _php_mb_regex_mbctype2name(MBREX(current_mbctype)) + )) { + MBREX(search_pos) = 0; + RETVAL_TRUE; + } else { + MBREX(search_pos) = Z_STRLEN_P(arg_str); + RETVAL_FALSE; + } if (MBREX(search_regs) != NULL) { onig_region_free(MBREX(search_regs), 1); MBREX(search_regs) = NULL; } - - RETURN_TRUE; } /* }}} */ @@ -1411,6 +1444,11 @@ PHP_FUNCTION(mb_ereg_search_setpos) return; } + /* Accept negative position if length of search string can be determined */ + if ((position < 0) && (!Z_ISUNDEF(MBREX(search_str))) && (Z_TYPE(MBREX(search_str)) == IS_STRING)) { + position += Z_STRLEN(MBREX(search_str)); + } + 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; diff --git a/ext/mbstring/tests/bug43301.phpt b/ext/mbstring/tests/bug43301.phpt index 2a5f748c5b..f209bd7554 100644 --- a/ext/mbstring/tests/bug43301.phpt +++ b/ext/mbstring/tests/bug43301.phpt @@ -15,7 +15,16 @@ echo mb_ereg_replace($ptr,'$1',$txt,'e'); ?> --EXPECTF-- -Parse error: syntax error, unexpected %s, expecting %s or '$' in %sbug43301.php(%d) : mbregex replace on line %d +Deprecated: mb_ereg_replace(): The 'e' option is deprecated, use mb_ereg_replace_callback instead in %s%ebug43301.php on line %d -Fatal error: mb_ereg_replace(): Failed evaluating code: -$1 in %sbug43301.php on line %d +Fatal error: Uncaught ParseError: syntax error, unexpected '1' (T_LNUMBER), expecting variable (T_VARIABLE) or '{' or '$' in %sbug43301.php(%d) : mbregex replace:1 +Stack trace: +#0 %sbug43301.php(%d): mb_ereg_replace('hello', '$1', 'hello, I have g...', 'e') +#1 {main} + +Next Error: Failed evaluating code: +$1 in %sbug43301.php:%d +Stack trace: +#0 %sbug43301.php(%d): mb_ereg_replace('hello', '$1', 'hello, I have g...', 'e') +#1 {main} + thrown in %sbug43301.php on line %d diff --git a/ext/mbstring/tests/bug45923.phpt b/ext/mbstring/tests/bug45923.phpt index 2d184ab019..41ffd70924 100644 --- a/ext/mbstring/tests/bug45923.phpt +++ b/ext/mbstring/tests/bug45923.phpt @@ -6,197 +6,241 @@ Bug #45923 (mb_st[r]ripos() offset not handled correctly) mbstring.internal_encoding=UTF-8 --FILE-- <?php -var_dump(strpos("abc abc abc", "abc", 0)); -var_dump(strpos("abc abc abc", "abc", 3)); -var_dump(strpos("abc abc abc", "abc", 6)); -var_dump(strpos("abc abc abc", "abc", 9)); -var_dump(strpos("abc abc abc", "abc", 11)); -var_dump(strpos("abc abc abc", "abc", 12)); -var_dump(strpos("abc abc abc", "abc", -1)); -var_dump(strpos("abc abc abc", "abc", -3)); -var_dump(strpos("abc abc abc", "abc", -6)); - -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 0)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 3)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 6)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 9)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 11)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", 12)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", -1)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", -3)); -var_dump(mb_strpos("●○◆ ●○◆ ●○◆", "●○◆", -6)); - -var_dump(stripos("abc abc abc", "abc", 0)); -var_dump(stripos("abc abc abc", "abc", 3)); -var_dump(stripos("abc abc abc", "abc", 6)); -var_dump(stripos("abc abc abc", "abc", 9)); -var_dump(stripos("abc abc abc", "abc", 11)); -var_dump(stripos("abc abc abc", "abc", 12)); -var_dump(stripos("abc abc abc", "abc", -1)); -var_dump(stripos("abc abc abc", "abc", -3)); -var_dump(stripos("abc abc abc", "abc", -6)); - -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 0)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 3)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 6)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 9)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 11)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", 12)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", -1)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", -3)); -var_dump(mb_stripos("●○◆ ●○◆ ●○◆", "●○◆", -6)); - -var_dump(strrpos("abc abc abc", "abc", 0)); -var_dump(strrpos("abc abc abc", "abc", 3)); -var_dump(strrpos("abc abc abc", "abc", 6)); -var_dump(strrpos("abc abc abc", "abc", 9)); -var_dump(strrpos("abc abc abc", "abc", 11)); -var_dump(strrpos("abc abc abc", "abc", 12)); -var_dump(strrpos("abc abc abc", "abc", -1)); -var_dump(strrpos("abc abc abc", "abc", -3)); -var_dump(strrpos("abc abc abc", "abc", -6)); - -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 0)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 3)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 6)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 9)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 11)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", 12)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", -1)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", -3)); -var_dump(mb_strrpos("●○◆ ●○◆ ●○◆", "●○◆", -6)); - -var_dump(strripos("abc abc abc", "abc", 0)); -var_dump(strripos("abc abc abc", "abc", 3)); -var_dump(strripos("abc abc abc", "abc", 6)); -var_dump(strripos("abc abc abc", "abc", 9)); -var_dump(strripos("abc abc abc", "abc", 11)); -var_dump(strripos("abc abc abc", "abc", 12)); -var_dump(strripos("abc abc abc", "abc", -1)); -var_dump(strripos("abc abc abc", "abc", -3)); -var_dump(strripos("abc abc abc", "abc", -6)); - -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 0)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 3)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 6)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 9)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 11)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", 12)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", -1)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", -3)); -var_dump(mb_strripos("●○◆ ●○◆ ●○◆", "●○◆", -6)); +function section($func, $haystack, $needle) +{ + echo "\n------- $func -----------\n\n"; + foreach(array(0, 3, 6, 9, 11, 12, -1, -3, -6, -20) as $offset) { + echo "> Offset: $offset\n"; + var_dump($func($haystack,$needle,$offset)); + } +} + +section('strpos' , "abc abc abc" , "abc"); +section('mb_strpos' , "●○◆ ●○◆ ●○◆", "●○◆"); + +section('stripos' , "abc abc abc" , "abc"); +section('mb_stripos' , "●○◆ ●○◆ ●○◆", "●○◆"); + +section('strrpos' , "abc abc abc" , "abc"); +section('mb_strrpos' , "●○◆ ●○◆ ●○◆", "●○◆"); + +section('strripos' , "abc abc abc" , "abc"); +section('mb_strripos', "●○◆ ●○◆ ●○◆", "●○◆"); ?> --EXPECTF-- +------- strpos ----------- + +> Offset: 0 int(0) +> Offset: 3 int(4) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: strpos(): Offset not contained in string in %s on line %d bool(false) - -Warning: strpos(): Offset not contained in string in %s on line %d +> Offset: -1 bool(false) +> Offset: -3 +int(8) +> Offset: -6 +int(8) +> Offset: -20 Warning: strpos(): Offset not contained in string in %s on line %d bool(false) -Warning: strpos(): Offset not contained in string in %s on line %d -bool(false) +------- mb_strpos ----------- + +> Offset: 0 int(0) +> Offset: 3 int(4) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: mb_strpos(): Offset not contained in string in %s on line %d bool(false) - -Warning: mb_strpos(): Offset not contained in string in %s on line %d +> Offset: -1 bool(false) +> Offset: -3 +int(8) +> Offset: -6 +int(8) +> Offset: -20 Warning: mb_strpos(): Offset not contained in string in %s on line %d bool(false) -Warning: mb_strpos(): Offset not contained in string in %s on line %d -bool(false) +------- stripos ----------- + +> Offset: 0 int(0) +> Offset: 3 int(4) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: stripos(): Offset not contained in string in %s on line %d bool(false) - -Warning: stripos(): Offset not contained in string in %s on line %d +> Offset: -1 bool(false) +> Offset: -3 +int(8) +> Offset: -6 +int(8) +> Offset: -20 Warning: stripos(): Offset not contained in string in %s on line %d bool(false) -Warning: stripos(): Offset not contained in string in %s on line %d -bool(false) +------- mb_stripos ----------- + +> Offset: 0 int(0) +> Offset: 3 int(4) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) - -Warning: mb_stripos(): Offset not contained in string in %s on line %d +> Offset: -1 bool(false) +> Offset: -3 +int(8) +> Offset: -6 +int(8) +> Offset: -20 Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) -Warning: mb_stripos(): Offset not contained in string in %s on line %d -bool(false) +------- strrpos ----------- + +> Offset: 0 int(8) +> Offset: 3 int(8) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d bool(false) +> Offset: -1 int(8) +> Offset: -3 int(8) +> Offset: -6 int(4) +> Offset: -20 + +Warning: strrpos(): Offset is greater than the length of haystack string in %s on line %d +bool(false) + +------- mb_strrpos ----------- + +> Offset: 0 int(8) +> Offset: 3 int(8) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d bool(false) +> Offset: -1 int(8) +> Offset: -3 int(8) +> Offset: -6 int(4) +> Offset: -20 + +Warning: mb_strrpos(): Offset is greater than the length of haystack string in %s on line %d +bool(false) + +------- strripos ----------- + +> Offset: 0 int(8) +> Offset: 3 int(8) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: strripos(): Offset is greater than the length of haystack string in %s on line %d bool(false) +> Offset: -1 int(8) +> Offset: -3 int(8) +> Offset: -6 int(4) +> Offset: -20 + +Warning: strripos(): Offset is greater than the length of haystack string in %s on line %d +bool(false) + +------- mb_strripos ----------- + +> Offset: 0 int(8) +> Offset: 3 int(8) +> Offset: 6 int(8) +> Offset: 9 bool(false) +> Offset: 11 bool(false) +> Offset: 12 Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d bool(false) +> Offset: -1 int(8) +> Offset: -3 int(8) +> Offset: -6 int(4) +> Offset: -20 + +Warning: mb_strripos(): Offset is greater than the length of haystack string in %s on line %d +bool(false)
\ No newline at end of file diff --git a/ext/mbstring/tests/bug69151.phpt b/ext/mbstring/tests/bug69151.phpt new file mode 100644 index 0000000000..801f27e4a7 --- /dev/null +++ b/ext/mbstring/tests/bug69151.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #69151 (mb_ereg should reject ill-formed byte sequence) +--SKIPIF-- +<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> +--FILE-- +<?php +$str = "\x80"; +var_dump( + false === mb_eregi('.', $str, $matches), + [] === $matches, + NULL === mb_ereg_replace('.', "\\0", $str), + false === mb_ereg_search_init("\x80", '.'), + false === mb_ereg_search() +); +?> +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) diff --git a/ext/mbstring/tests/bug72164.phpt b/ext/mbstring/tests/bug72164.phpt index bd58f7e5a5..8666447e7a 100644 --- a/ext/mbstring/tests/bug72164.phpt +++ b/ext/mbstring/tests/bug72164.phpt @@ -10,5 +10,6 @@ $var3 = NULL; $var8 = mbereg_replace($var2,$var3,$var3,$var0); var_dump($var8); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: mbereg_replace(): The 'e' option is deprecated, use mb_ereg_replace_callback instead in %s%ebug72164.php on line %d string(0) "" diff --git a/ext/mbstring/tests/mb_ereg_search_setpos.phpt b/ext/mbstring/tests/mb_ereg_search_setpos.phpt new file mode 100644 index 0000000000..ec354309f3 --- /dev/null +++ b/ext/mbstring/tests/mb_ereg_search_setpos.phpt @@ -0,0 +1,70 @@ +--TEST-- +mb_ereg_search_setpos() function +--SKIPIF-- +<?php +if (!extension_loaded('mbstring')) die('skip mbstring not enabled'); +?> +--FILE-- +<?php +mb_regex_encoding('iso-8859-1'); +$test_str = 'Itrntinliztin'; // Length = 20 + +var_dump(mb_ereg_search_setpos(50)); // OK +var_dump(mb_ereg_search_setpos(-1)); // Error + +mb_ereg_search_init($test_str); + +$positions = array( 5, 19, 20, 25, 0, -5, -20, -30); +foreach($positions as $pos) { + echo("\n* Position: $pos :\n"); + var_dump(mb_ereg_search_setpos($pos)); + var_dump(mb_ereg_search_getpos()); +} +?> +==DONE== +--EXPECTF-- +bool(true) + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) + +* Position: 5 : +bool(true) +int(5) + +* Position: 19 : +bool(true) +int(19) + +* Position: 20 : + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) +int(0) + +* Position: 25 : + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) +int(0) + +* Position: 0 : +bool(true) +int(0) + +* Position: -5 : +bool(true) +int(15) + +* Position: -20 : +bool(true) +int(0) + +* Position: -30 : + +Warning: mb_ereg_search_setpos(): Position is out of range in %s on line %d +bool(false) +int(0) +==DONE== + + diff --git a/ext/mbstring/tests/mb_strimwidth.phpt b/ext/mbstring/tests/mb_strimwidth.phpt index 82780d6756..f257604c6b 100644 --- a/ext/mbstring/tests/mb_strimwidth.phpt +++ b/ext/mbstring/tests/mb_strimwidth.phpt @@ -14,30 +14,44 @@ include_once('common.inc'); // EUC-JP $euc_jp = '0123ʸܸǤEUC-JPȤäƤޤܸݽ'; +print "String width: ".mb_strwidth($euc_jp,'EUC-JP')."\n"; + print "1: ". mb_strimwidth($euc_jp, 0, 15,'...','EUC-JP') . "\n"; print "2: ". mb_strimwidth($euc_jp, 0, 100,'...','EUC-JP') . "\n"; print "3: ". mb_strimwidth($euc_jp, 15, 100,'...','EUC-JP') . "\n"; -// Note: Did not start form -22 offset. Staring from 0. -$str = mb_strimwidth($euc_jp,-22, 100,'...','EUC-JP'); -($str === FALSE) ? print "4 OK\n" : print "NG: $str\n"; +print "4: ". mb_strimwidth($euc_jp, -30, 5,'...','EUC-JP') . "\n"; +print "5: ". mb_strimwidth($euc_jp, 38, 5,'...','EUC-JP') . "\n"; +print "6: ". mb_strimwidth($euc_jp, 38, -25,'...','EUC-JP') . "\n"; +print "7: ". mb_strimwidth($euc_jp, -30, -25,'...','EUC-JP') . "\n"; + +$str = mb_strimwidth($euc_jp, 0, -100,'...','EUC-JP'); +($str === FALSE) ? print "10 OK\n" : print "NG: $str\n"; -$str = mb_strimwidth($euc_jp, 100, -10,'...','EUC-JP'); -($str === FALSE) ? print "5 OK\n" : print "NG: $str\n"; +$str = mb_strimwidth($euc_jp, 100, 10,'...','EUC-JP'); +($str === FALSE) ? print "11 OK\n" : print "NG: $str\n"; $str = mb_strimwidth($euc_jp, -100, 10,'...','EUC-JP'); -($str === FALSE) ? print "6 OK\n" : print "NG: $str\n"; +($str === FALSE) ? print "12 OK\n" : print "NG: $str\n"; + +$str = mb_strimwidth($euc_jp, -10, -12,'...','EUC-JP'); +($str === FALSE) ? print "13 OK\n" : print "NG: $str\n"; ?> --EXPECT-- +String width: 68 1: 0123ʸ... 2: 0123ʸܸǤEUC-JPȤäƤޤܸݽ 3: EUC-JPȤäƤޤܸݽ +4: +5: +6: +7: ERR: Warning -4 OK +10 OK ERR: Warning -5 OK +11 OK ERR: Warning -6 OK - - +12 OK +ERR: Warning +13 OK diff --git a/ext/mbstring/tests/mb_stripos.phpt b/ext/mbstring/tests/mb_stripos.phpt index 4ea8cfa6d6..8268872223 100644 --- a/ext/mbstring/tests/mb_stripos.phpt +++ b/ext/mbstring/tests/mb_stripos.phpt @@ -1,10 +1,7 @@ --TEST-- mb_stripos() --SKIPIF-- -<?php -extension_loaded('mbstring') or die('skip'); -function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build"); -?> +<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?> --FILE-- <?php // TODO: Add more encodings @@ -17,43 +14,62 @@ include_once('common.inc'); // Test string $euc_jp = b'0123ʸܸǤEUC-JPȤäƤޤ0123ܸݽ'; +$slen = mb_strlen($euc_jp, 'EUC-JP'); +echo "String len: $slen\n"; + // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); echo "== POSITIVE OFFSET ==\n"; -print mb_stripos($euc_jp,b'ܸ', 0, 'EUC-JP') . "\n"; + +print mb_stripos($euc_jp, b'ܸ', 0, 'EUC-JP') . "\n"; print mb_stripos($euc_jp, b'0', 0, 'EUC-JP') . "\n"; print mb_stripos($euc_jp, 3, 0, 'EUC-JP') . "\n"; print mb_stripos($euc_jp, 0, 0, 'EUC-JP') . "\n"; -print mb_stripos($euc_jp,b'ܸ', 15, 'EUC-JP') . "\n"; +print mb_stripos($euc_jp, b'ܸ', 15, 'EUC-JP') . "\n"; print mb_stripos($euc_jp, b'0', 15, 'EUC-JP') . "\n"; print mb_stripos($euc_jp, 3, 15, 'EUC-JP') . "\n"; print mb_stripos($euc_jp, 0, 15, 'EUC-JP') . "\n"; + // Negative offset -// Note: PHP Warning - offset is negative. -// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50) echo "== NEGATIVE OFFSET ==\n"; -$r = mb_stripos($euc_jp,b'ܸ', -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; -$r = mb_stripos($euc_jp, b'0', -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; -$r = mb_stripos($euc_jp, 3, -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; -$r = mb_stripos($euc_jp, 0, -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; -$r = mb_stripos($euc_jp,b'ܸ', -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; + +print mb_stripos($euc_jp, b'ܸ', -15, 'EUC-JP') . "\n"; +print mb_stripos($euc_jp, b'0', -15, 'EUC-JP') . "\n"; +print mb_stripos($euc_jp, 3, -15, 'EUC-JP') . "\n"; +print mb_stripos($euc_jp, 0, -15, 'EUC-JP') . "\n"; +print mb_stripos($euc_jp, 0, -43, 'EUC-JP') . "\n"; + + +// Invalid offset - should return false with warning +print ("== INVALID OFFSET ==\n"); + +$r = mb_stripos($euc_jp, b'ܸ', 44, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_stripos($euc_jp, b'ܸ', 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_stripos($euc_jp, b'0', 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_stripos($euc_jp, 3, 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_stripos($euc_jp, 0, 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_stripos($euc_jp, b'ܸ', -50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; $r = mb_stripos($euc_jp, b'0', -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; $r = mb_stripos($euc_jp, 3, -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; $r = mb_stripos($euc_jp, 0, -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_stripos($euc_jp, 0, -44, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; // Out of range - should return false print ("== OUT OF RANGE ==\n"); -$r = mb_stripos($euc_jp,b'ܸ', 40, 'EUC-JP'); + +$r = mb_stripos($euc_jp, b'ܸ', 40, 'EUC-JP'); ($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; $r = mb_stripos($euc_jp, b'0', 40, 'EUC-JP'); ($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; @@ -61,12 +77,19 @@ $r = mb_stripos($euc_jp, 3, 40, 'EUC-JP'); ($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; $r = mb_stripos($euc_jp, 0, 40, 'EUC-JP'); ($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; -// Note: Returned NULL string -// echo gettype($r). ' val '. $r ."\n"; +$r = mb_stripos($euc_jp, b'ܸ', -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; +$r = mb_stripos($euc_jp, b'0', -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; +$r = mb_stripos($euc_jp, 3, -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; +$r = mb_stripos($euc_jp, 0, -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; // Non-existent echo "== NON-EXISTENT ==\n"; + $r = mb_stripos($euc_jp, b'ڹ', 0, 'EUC-JP'); ($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n"; $r = mb_stripos($euc_jp, b"\n", 0, 'EUC-JP'); @@ -75,30 +98,32 @@ $r = mb_stripos($euc_jp, b"\n", 0, 'EUC-JP'); // EUC-JP - No encoding parameter echo "== NO ENCODING PARAMETER ==\n"; + mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); -print mb_stripos($euc_jp,b'ܸ', 0) . "\n"; +print mb_stripos($euc_jp, b'ܸ', 0) . "\n"; print mb_stripos($euc_jp, b'0', 0) . "\n"; print mb_stripos($euc_jp, 3, 0) . "\n"; print mb_stripos($euc_jp, 0, 0) . "\n"; -$r = mb_stripos($euc_jp,b'ڹ', 0); +$r = mb_stripos($euc_jp, b'ڹ', 0); ($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n"; -$r = mb_stripos($euc_jp,b"\n", 0); +$r = mb_stripos($euc_jp, b"\n", 0); ($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n"; // EUC-JP - No offset and encoding parameter echo "== NO OFFSET AND ENCODING PARAMETER ==\n"; + mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); -print mb_stripos($euc_jp,b'ܸ') . "\n"; +print mb_stripos($euc_jp, b'ܸ') . "\n"; print mb_stripos($euc_jp, b'0') . "\n"; print mb_stripos($euc_jp, 3) . "\n"; print mb_stripos($euc_jp, 0) . "\n"; -$r = mb_stripos($euc_jp,b'ڹ'); +$r = mb_stripos($euc_jp, b'ڹ'); ($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n"; -$r = mb_stripos($euc_jp,b"\n"); +$r = mb_stripos($euc_jp, b"\n"); ($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n"; @@ -113,11 +138,10 @@ $r = mb_stripos($euc_jp, $t_obj, 'EUC-JP'); ($r === NULL) ? print("OK_OBJECT\n") : print("NG_OBJECT\n"); $r = mb_stripos($euc_jp, $t_obj, 'BAD_ENCODING'); ($r === NULL) ? print("OK_BAD_ENCODING\n") : print("NG_BAD_ENCODING\n"); - - ?> - +==DONE== --EXPECT-- +String len: 43 == POSITIVE OFFSET == 10 0 @@ -128,27 +152,41 @@ $r = mb_stripos($euc_jp, $t_obj, 'BAD_ENCODING'); 33 30 == NEGATIVE OFFSET == +34 +30 +33 +30 +0 +== INVALID OFFSET == ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET +ERR: Warning +OK_INVALID_OFFSET +ERR: Warning +OK_INVALID_OFFSET == OUT OF RANGE == OK_OUT_RANGE OK_OUT_RANGE OK_OUT_RANGE OK_OUT_RANGE +OK_OUT_RANGE +OK_OUT_RANGE +OK_OUT_RANGE +OK_OUT_RANGE == NON-EXISTENT == OK_STR OK_NEWLINE @@ -175,4 +213,4 @@ ERR: Warning OK_OBJECT ERR: Warning OK_BAD_ENCODING - +==DONE== diff --git a/ext/mbstring/tests/mb_stripos_variation3.phpt b/ext/mbstring/tests/mb_stripos_variation3.phpt index 21a1293786..69c4a9e53b 100644 --- a/ext/mbstring/tests/mb_stripos_variation3.phpt +++ b/ext/mbstring/tests/mb_stripos_variation3.phpt @@ -8,10 +8,9 @@ if (PHP_INT_SIZE != 8) die('skip 64-bit only'); ?> --FILE-- <?php -/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]]) - * Description: Finds position of first occurrence of a string within another, case insensitive +/* Prototype : int mb_stripos(string $haystack, string $needle [, int $offset [, string $encoding]]) + * Description: Find position of first occurrence of a string within another, case insensitive * Source code: ext/mbstring/mbstring.c - * Alias to functions: */ /* @@ -52,45 +51,47 @@ $inputs = array( /*1*/ 0, 1, 12345, + -5, -2345, // float data -/*5*/ 10.5, - -10.5, +/*6*/ 10.5, + -5.5, + -100.5, 12.3456789000e10, 12.3456789000E-10, .5, // null data -/*10*/ NULL, +/*12*/ NULL, null, // boolean data -/*12*/ true, +/*14*/ true, false, TRUE, FALSE, // empty data -/*16*/ "", +/*18*/ "", '', // string data -/*18*/ "string", +/*20*/ "string", 'string', $heredoc, // object data -/*21*/ new classA(), +/*23*/ new classA(), // undefined data -/*22*/ @$undefined_var, +/*24*/ @$undefined_var, // unset data -/*23*/ @$unset_var, +/*25*/ @$unset_var, // resource variable -/*24*/ $fp +/*26*/ $fp ); // loop through each element of $inputs to check the behavior of mb_stripos() @@ -120,28 +121,28 @@ Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) -- Iteration 4 -- - -Warning: mb_stripos(): Offset not contained in string in %s on line %d -bool(false) +int(8) -- Iteration 5 -- + +Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) -- Iteration 6 -- - -Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) -- Iteration 7 -- +int(8) + +-- Iteration 8 -- Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) --- Iteration 8 -- -int(8) - -- Iteration 9 -- -int(8) + +Warning: mb_stripos(): Offset not contained in string in %s on line %d +bool(false) -- Iteration 10 -- int(8) @@ -162,42 +163,48 @@ int(8) int(8) -- Iteration 16 -- +int(8) + +-- Iteration 17 -- +int(8) + +-- Iteration 18 -- Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 17 -- +-- Iteration 19 -- Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 18 -- +-- Iteration 20 -- Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 19 -- +-- Iteration 21 -- Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 20 -- +-- Iteration 22 -- Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 21 -- +-- Iteration 23 -- Warning: mb_stripos() expects parameter 3 to be integer, object given in %s on line %d NULL --- Iteration 22 -- +-- Iteration 24 -- int(8) --- Iteration 23 -- +-- Iteration 25 -- int(8) --- Iteration 24 -- +-- Iteration 26 -- Warning: mb_stripos() expects parameter 3 to be integer, resource given in %s on line %d NULL diff --git a/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt b/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt index fbe4937ac2..8ffcae5c0f 100644 --- a/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt +++ b/ext/mbstring/tests/mb_stripos_variation5_Bug45923.phpt @@ -7,10 +7,9 @@ function_exists('mb_stripos') or die("skip mb_stripos() is not available in this ?> --FILE-- <?php -/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]]) - * Description: Finds position of first occurrence of a string within another, case insensitive +/* Prototype : int mb_stripos(string $haystack, string $needle [, int $offset [, string $encoding]]) + * Description: Find position of first occurrence of a string within another, case insensitive * Source code: ext/mbstring/mbstring.c - * Alias to functions: */ /* @@ -34,7 +33,7 @@ $needle_mb = base64_decode('44CC'); * mb_stripos should not be able to accept negative values as $offset. * 60 is larger than *BYTE* count for $string_mb */ -for ($i = -10; $i <= 60; $i += 10) { +for ($i = -30; $i <= 60; $i += 10) { echo "\n**-- Offset is: $i --**\n"; echo "-- ASCII String --\n"; var_dump(mb_stripos($string_ascii, $needle_ascii, $i)); @@ -48,7 +47,7 @@ echo "Done"; --EXPECTF-- *** Testing mb_stripos() : usage variations *** -**-- Offset is: -10 --** +**-- Offset is: -30 --** -- ASCII String -- Warning: mb_stripos(): Offset not contained in string in %s on line %d @@ -58,6 +57,18 @@ bool(false) Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) +**-- Offset is: -20 --** +-- ASCII String -- +int(9) +--Multibyte String -- +int(9) + +**-- Offset is: -10 --** +-- ASCII String -- +int(20) +--Multibyte String -- +int(20) + **-- Offset is: 0 --** -- ASCII String -- int(9) @@ -116,4 +127,3 @@ bool(false) Warning: mb_stripos(): Offset not contained in string in %s on line %d bool(false) Done - diff --git a/ext/mbstring/tests/mb_strpos.phpt b/ext/mbstring/tests/mb_strpos.phpt index e1222ca6dd..364bc7cc1a 100644 --- a/ext/mbstring/tests/mb_strpos.phpt +++ b/ext/mbstring/tests/mb_strpos.phpt @@ -14,10 +14,14 @@ include_once('common.inc'); // Test string $euc_jp = b'0123ʸܸǤEUC-JPȤäƤޤ0123ܸݽ'; +$slen = mb_strlen($euc_jp, 'EUC-JP'); +echo "String len: $slen\n"; + // EUC-JP - With encoding parameter mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n"); echo "== POSITIVE OFFSET ==\n"; + print mb_strpos($euc_jp, b'ܸ', 0, 'EUC-JP') . "\n"; print mb_strpos($euc_jp, b'0', 0, 'EUC-JP') . "\n"; print mb_strpos($euc_jp, 3, 0, 'EUC-JP') . "\n"; @@ -27,29 +31,44 @@ print mb_strpos($euc_jp, b'0', 15, 'EUC-JP') . "\n"; print mb_strpos($euc_jp, 3, 15, 'EUC-JP') . "\n"; print mb_strpos($euc_jp, 0, 15, 'EUC-JP') . "\n"; + // Negative offset -// Note: PHP Warning - offset is negative. -// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50) echo "== NEGATIVE OFFSET ==\n"; -$r = mb_strpos($euc_jp, b'ܸ', -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; -$r = mb_strpos($euc_jp, b'0', -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; -$r = mb_strpos($euc_jp, 3, -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; -$r = mb_strpos($euc_jp, 0, -15, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; + +print mb_strpos($euc_jp, b'ܸ', -15, 'EUC-JP') . "\n"; +print mb_strpos($euc_jp, b'0', -15, 'EUC-JP') . "\n"; +print mb_strpos($euc_jp, 3, -15, 'EUC-JP') . "\n"; +print mb_strpos($euc_jp, 0, -15, 'EUC-JP') . "\n"; +print mb_strpos($euc_jp, 0, -43, 'EUC-JP') . "\n"; + + +// Invalid offset - should return false with warning +print ("== INVALID OFFSET ==\n"); + +$r = mb_strpos($euc_jp, b'ܸ', 44, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_strpos($euc_jp, b'ܸ', 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_strpos($euc_jp, b'0', 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_strpos($euc_jp, 3, 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_strpos($euc_jp, 0, 50, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; $r = mb_strpos($euc_jp, b'ܸ', -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; $r = mb_strpos($euc_jp, b'0', -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; $r = mb_strpos($euc_jp, 3, -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; $r = mb_strpos($euc_jp, 0, -50, 'EUC-JP'); -($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n"; +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; +$r = mb_strpos($euc_jp, 0, -44, 'EUC-JP'); +($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n"; // Out of range - should return false print ("== OUT OF RANGE ==\n"); + $r = mb_strpos($euc_jp, b'ܸ', 40, 'EUC-JP'); ($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; $r = mb_strpos($euc_jp, b'0', 40, 'EUC-JP'); @@ -58,12 +77,19 @@ $r = mb_strpos($euc_jp, 3, 40, 'EUC-JP'); ($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; $r = mb_strpos($euc_jp, 0, 40, 'EUC-JP'); ($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; -// Note: Returned NULL string -// echo gettype($r). ' val '. $r ."\n"; +$r = mb_strpos($euc_jp, b'ܸ', -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; +$r = mb_strpos($euc_jp, b'0', -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; +$r = mb_strpos($euc_jp, 3, -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; +$r = mb_strpos($euc_jp, 0, -3, 'EUC-JP'); +($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n"; // Non-existent echo "== NON-EXISTENT ==\n"; + $r = mb_strpos($euc_jp, b'ڹ', 0, 'EUC-JP'); ($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n"; $r = mb_strpos($euc_jp, b"\n", 0, 'EUC-JP'); @@ -72,6 +98,7 @@ $r = mb_strpos($euc_jp, b"\n", 0, 'EUC-JP'); // EUC-JP - No encoding parameter echo "== NO ENCODING PARAMETER ==\n"; + mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); print mb_strpos($euc_jp, b'ܸ', 0) . "\n"; @@ -86,6 +113,7 @@ $r = mb_strpos($euc_jp, b"\n", 0); // EUC-JP - No offset and encoding parameter echo "== NO OFFSET AND ENCODING PARAMETER ==\n"; + mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n"); print mb_strpos($euc_jp, b'ܸ') . "\n"; @@ -110,11 +138,10 @@ $r = mb_strpos($euc_jp, $t_obj, 'EUC-JP'); ($r === NULL) ? print("OK_OBJECT\n") : print("NG_OBJECT\n"); $r = mb_strpos($euc_jp, $t_obj, 'BAD_ENCODING'); ($r === NULL) ? print("OK_BAD_ENCODING\n") : print("NG_BAD_ENCODING\n"); - - ?> - +==DONE== --EXPECT-- +String len: 43 == POSITIVE OFFSET == 10 0 @@ -125,27 +152,41 @@ $r = mb_strpos($euc_jp, $t_obj, 'BAD_ENCODING'); 33 30 == NEGATIVE OFFSET == +34 +30 +33 +30 +0 +== INVALID OFFSET == +ERR: Warning +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET ERR: Warning -OK_NEGATIVE_OFFSET +OK_INVALID_OFFSET +ERR: Warning +OK_INVALID_OFFSET == OUT OF RANGE == OK_OUT_RANGE OK_OUT_RANGE OK_OUT_RANGE OK_OUT_RANGE +OK_OUT_RANGE +OK_OUT_RANGE +OK_OUT_RANGE +OK_OUT_RANGE == NON-EXISTENT == OK_STR OK_NEWLINE @@ -172,4 +213,4 @@ ERR: Warning OK_OBJECT ERR: Warning OK_BAD_ENCODING - +==DONE== diff --git a/ext/mbstring/tests/mb_strpos_variation3.phpt b/ext/mbstring/tests/mb_strpos_variation3.phpt index 8079a19021..f30b708183 100644 --- a/ext/mbstring/tests/mb_strpos_variation3.phpt +++ b/ext/mbstring/tests/mb_strpos_variation3.phpt @@ -51,45 +51,47 @@ $inputs = array( /*1*/ 0, 1, 12345, + -5, -2345, // float data -/*5*/ 10.5, - -10.5, +/*6*/ 10.5, + -5.5, + -100.5, 12.3456789000e10, 12.3456789000E-10, .5, // null data -/*10*/ NULL, +/*12*/ NULL, null, // boolean data -/*12*/ true, +/*14*/ true, false, TRUE, FALSE, // empty data -/*16*/ "", +/*18*/ "", '', // string data -/*18*/ "string", +/*20*/ "string", 'string', $heredoc, // object data -/*21*/ new classA(), +/*23*/ new classA(), // undefined data -/*22*/ @$undefined_var, +/*24*/ @$undefined_var, // unset data -/*23*/ @$unset_var, +/*25*/ @$unset_var, // resource variable -/*24*/ $fp +/*26*/ $fp ); // loop through each element of $inputs to check the behavior of mb_strpos() @@ -119,28 +121,28 @@ Warning: mb_strpos(): Offset not contained in string in %s on line %d bool(false) -- Iteration 4 -- - -Warning: mb_strpos(): Offset not contained in string in %s on line %d -bool(false) +int(8) -- Iteration 5 -- + +Warning: mb_strpos(): Offset not contained in string in %s on line %d bool(false) -- Iteration 6 -- - -Warning: mb_strpos(): Offset not contained in string in %s on line %d bool(false) -- Iteration 7 -- +int(8) + +-- Iteration 8 -- Warning: mb_strpos(): Offset not contained in string in %s on line %d bool(false) --- Iteration 8 -- -int(8) - -- Iteration 9 -- -int(8) + +Warning: mb_strpos(): Offset not contained in string in %s on line %d +bool(false) -- Iteration 10 -- int(8) @@ -161,42 +163,48 @@ int(8) int(8) -- Iteration 16 -- +int(8) + +-- Iteration 17 -- +int(8) + +-- Iteration 18 -- Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 17 -- +-- Iteration 19 -- Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 18 -- +-- Iteration 20 -- Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 19 -- +-- Iteration 21 -- Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 20 -- +-- Iteration 22 -- Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d NULL --- Iteration 21 -- +-- Iteration 23 -- Warning: mb_strpos() expects parameter 3 to be integer, object given in %s on line %d NULL --- Iteration 22 -- +-- Iteration 24 -- int(8) --- Iteration 23 -- +-- Iteration 25 -- int(8) --- Iteration 24 -- +-- Iteration 26 -- Warning: mb_strpos() expects parameter 3 to be integer, resource given in %s on line %d NULL diff --git a/ext/mbstring/tests/mb_strpos_variation5.phpt b/ext/mbstring/tests/mb_strpos_variation5.phpt index 7a9604abef..23bfa22b61 100644 --- a/ext/mbstring/tests/mb_strpos_variation5.phpt +++ b/ext/mbstring/tests/mb_strpos_variation5.phpt @@ -33,7 +33,7 @@ $needle_mb = base64_decode('44CC'); * mb_strpos should not be able to accept negative values as $offset. * 60 is larger than *BYTE* count for $string_mb */ -for ($i = -10; $i <= 60; $i += 10) { +for ($i = -30; $i <= 60; $i += 10) { echo "\n**-- Offset is: $i --**\n"; echo "-- ASCII String --\n"; var_dump(mb_strpos($string_ascii, $needle_ascii, $i)); @@ -47,7 +47,7 @@ echo "Done"; --EXPECTF-- *** Testing mb_strpos() : usage variations *** -**-- Offset is: -10 --** +**-- Offset is: -30 --** -- ASCII String -- Warning: mb_strpos(): Offset not contained in string in %s on line %d @@ -57,6 +57,18 @@ bool(false) Warning: mb_strpos(): Offset not contained in string in %s on line %d bool(false) +**-- Offset is: -20 --** +-- ASCII String -- +int(9) +--Multibyte String -- +int(9) + +**-- Offset is: -10 --** +-- ASCII String -- +int(20) +--Multibyte String -- +int(20) + **-- Offset is: 0 --** -- ASCII String -- int(9) |