Skip to content

Commit 9ca88a1

Browse files
authored
fix #18128 rfind on empty needle returns rightmost index (#20430)
rfind on empty needle returns haystack len
1 parent b213913 commit 9ca88a1

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed

lib/pure/strutils.nim

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2022,7 +2022,8 @@ func rfind*(s, sub: string, start: Natural = 0, last = -1): int {.rtl,
20222022
## See also:
20232023
## * `find func<#find,string,string,Natural,int>`_
20242024
if sub.len == 0:
2025-
return -1
2025+
let rightIndex: Natural = if last < 0: s.len else: last
2026+
return max(start, rightIndex)
20262027
if sub.len > s.len - start:
20272028
return -1
20282029
let last = if last == -1: s.high else: last

tests/stdlib/tstrutils.nim

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -360,19 +360,23 @@ template main() =
360360
doAssert "///".rfind("//", start=3) == -1
361361

362362
# searching for empty string
363-
doAssert "".rfind("") == -1
364-
doAssert "abc".rfind("") == -1
365-
doAssert "abc".rfind("", start=1) == -1
366-
doAssert "abc".rfind("", start=2) == -1
367-
doAssert "abc".rfind("", start=3) == -1
368-
doAssert "abc".rfind("", start=4) == -1
369-
doAssert "abc".rfind("", start=400) == -1
370-
371-
doAssert "abc".rfind("", start=1, last=3) == -1
372-
doAssert "abc".rfind("", start=1, last=2) == -1
373-
doAssert "abc".rfind("", start=1, last=1) == -1
374-
doAssert "abc".rfind("", start=1, last=0) == -1
375-
doAssert "abc".rfind("", start=1, last = -1) == -1
363+
doAssert "".rfind("") == 0
364+
doAssert "abc".rfind("") == 3
365+
doAssert "abc".rfind("", start=1) == 3
366+
doAssert "abc".rfind("", start=2) == 3
367+
doAssert "abc".rfind("", start=3) == 3
368+
doAssert "abc".rfind("", start=4) == 4
369+
doAssert "abc".rfind("", start=400) == 400
370+
371+
doAssert "abc".rfind("", start=1, last=3) == 3
372+
doAssert "abc".rfind("", start=1, last=2) == 2
373+
doAssert "abc".rfind("", start=1, last=1) == 1
374+
# This returns the start index instead of the last index
375+
# because start > last
376+
doAssert "abc".rfind("", start=1, last=0) == 1
377+
doAssert "abc".rfind("", start=1, last = -1) == 3
378+
379+
doAssert "abc".rfind("", start=0, last=0) == 0
376380

377381
# when last <= start, searching for non-empty string
378382
block:

0 commit comments

Comments
 (0)