mb_ereg_search_setpos(): Add support for negative position

Also add missing test for this function
This commit is contained in:
Francois Laupretre 2016-01-04 16:31:52 +01:00 committed by Nikita Popov
parent 70187267b4
commit 882f97042b
2 changed files with 75 additions and 0 deletions

View File

@ -1400,6 +1400,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;

View File

@ -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 = 'Iñtërnâtiônàlizætiøn'; // 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==