]> granicus.if.org Git - php/commitdiff
mb_ereg_search_setpos(): Add support for negative position
authorFrancois Laupretre <francois@tekwire.net>
Mon, 4 Jan 2016 15:31:52 +0000 (16:31 +0100)
committerNikita Popov <nikic@php.net>
Wed, 9 Mar 2016 13:41:38 +0000 (14:41 +0100)
Also add missing test for this function

ext/mbstring/php_mbregex.c
ext/mbstring/tests/mb_ereg_search_setpos.phpt [new file with mode: 0644]

index 1bd26d7334b3d8837031697a73994f65618cb568..6a9ab193afbdf69183cf66350b7f8df6bb54fa7f 100644 (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;
diff --git a/ext/mbstring/tests/mb_ereg_search_setpos.phpt b/ext/mbstring/tests/mb_ereg_search_setpos.phpt
new file mode 100644 (file)
index 0000000..ec35430
--- /dev/null
@@ -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==
+
+