Skip to content

Commit 90b8119

Browse files
authored
add support for negative offset in strpos and stripos (#1441)
* fix tests.. * fix tests... * del unused include
1 parent 29eab39 commit 90b8119

2 files changed

Lines changed: 27 additions & 6 deletions

File tree

runtime-common/stdlib/string/string-functions.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,12 +1241,12 @@ string f$stripslashes(const string& str) noexcept {
12411241

12421242
Optional<int64_t> f$stripos(const string& haystack, const string& needle, int64_t offset) noexcept {
12431243
if (offset < 0) {
1244-
php_warning("Wrong offset = %" PRIi64 " in function stripos", offset);
1245-
return false;
1244+
offset += haystack.size();
12461245
}
1247-
if (offset >= haystack.size()) {
1246+
if (offset < 0 || offset >= haystack.size()) {
12481247
return false;
12491248
}
1249+
12501250
if (needle.size() == 0) {
12511251
php_warning("Parameter needle is empty in function stripos");
12521252
return false;
@@ -1726,12 +1726,12 @@ int64_t f$strnatcmp(const string& lhs, const string& rhs) noexcept {
17261726

17271727
Optional<int64_t> f$strpos(const string& haystack, const string& needle, int64_t offset) noexcept {
17281728
if (offset < 0) {
1729-
php_warning("Wrong offset = %" PRIi64 " in function strpos", offset);
1730-
return false;
1729+
offset += haystack.size();
17311730
}
1732-
if (offset > int64_t{haystack.size()}) {
1731+
if (offset < 0 || offset >= haystack.size()) {
17331732
return false;
17341733
}
1734+
17351735
if (needle.size() <= 1) {
17361736
if (needle.size() == 0) {
17371737
php_warning("Parameter needle is empty in function strpos");

tests/phpt/dl/491_strpos.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,27 @@
5252
var_dump (mb_strtoupper($str, 'UTF-8'));
5353
// var_dump(strtolower ("ÈÔÛÛÀÏÂÀ¨"));
5454

55+
var_dump(strpos("abcdABCDefghEFGHefgh", "efgh", -10));
56+
var_dump(strpos("abcdABCDefghEFGHefgh", "efgh", -16));
57+
var_dump(strpos("abcdABCDefghEFGh_H", "h", -10));
58+
var_dump(strpos("abcdABCDefghEFGh_H", "h", -5));
59+
var_dump(strpos("abcdABCDefghEFGh_H", "h", -2));
60+
var_dump(strpos("0123456789a123456789b123456789c", "7", -5));
61+
var_dump(strpos("0123456789a123456789b123456789c", "7", -25));
62+
var_dump(strpos("0123456789a123456789b123456789c", "c", -1));
63+
var_dump(strpos("0123456789a123456789b123456789c", "9", -1));
64+
65+
var_dump(stripos("abcdABCDefghEFGHefgh", "efgh", -10));
66+
var_dump(stripos("abcdABCDefghEFGHefgh", "efgh", -16));
67+
var_dump(stripos("abcdABCDefghEFGh_H", "h", -10));
68+
var_dump(stripos("abcdABCDefghEFGh_H", "h", -5));
69+
var_dump(stripos("abcdABCDefghEFGh_H", "h", -2));
70+
var_dump(stripos("0123456789a123456789b123456789c", "7", -5));
71+
var_dump(stripos("0123456789a123456789b123456789c", "7", -25));
72+
var_dump(stripos("0123456789a123456789b123456789c", "c", -1));
73+
var_dump(stripos("0123456789a123456789b123456789c", "9", -1));
74+
75+
5576
$a = array (" ", "The quick brown fox jumped over the lazy dog.", "A very long woooooooooooord.", "A very long wooooooooooooord.", "A very long woooooooooooord.", "", "A very long wooooooooooooord.", "A very long wooooooooooooord 234234234 e r we we r we rwe f w ew r wer we wer wer we r wer .");
5677
foreach ($a as $str) {
5778
var_dump (nl2br (wordwrap ($str, 1, "\n", true)));

0 commit comments

Comments
 (0)