fix #18128 rfind on empty needle returns rightmost index (#20430)

rfind on empty needle returns haystack len
This commit is contained in:
n5m 2022-09-26 19:39:22 +00:00 • committed by GitHub
commit 9ca88a1889
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 13 deletions

View file

@ -2022,7 +2022,8 @@ func rfind*(s, sub: string, start: Natural = 0, last = -1): int {.rtl,
## See also: ## See also:
## * `find func<#find,string,string,Natural,int>`_ ## * `find func<#find,string,string,Natural,int>`_
if sub.len == 0: if sub.len == 0:
return -1 let rightIndex: Natural = if last < 0: s.len else: last
return max(start, rightIndex)
if sub.len > s.len - start: if sub.len > s.len - start:
return -1 return -1
let last = if last == -1: s.high else: last let last = if last == -1: s.high else: last

View file

@ -360,19 +360,23 @@ template main() =
doAssert "///".rfind("//", start=3) == -1 doAssert "///".rfind("//", start=3) == -1
# searching for empty string # searching for empty string
doAssert "".rfind("") == -1 doAssert "".rfind("") == 0
doAssert "abc".rfind("") == -1 doAssert "abc".rfind("") == 3
doAssert "abc".rfind("", start=1) == -1 doAssert "abc".rfind("", start=1) == 3
doAssert "abc".rfind("", start=2) == -1 doAssert "abc".rfind("", start=2) == 3
doAssert "abc".rfind("", start=3) == -1 doAssert "abc".rfind("", start=3) == 3
doAssert "abc".rfind("", start=4) == -1 doAssert "abc".rfind("", start=4) == 4
doAssert "abc".rfind("", start=400) == -1 doAssert "abc".rfind("", start=400) == 400
doAssert "abc".rfind("", start=1, last=3) == -1 doAssert "abc".rfind("", start=1, last=3) == 3
doAssert "abc".rfind("", start=1, last=2) == -1 doAssert "abc".rfind("", start=1, last=2) == 2
doAssert "abc".rfind("", start=1, last=1) == -1 doAssert "abc".rfind("", start=1, last=1) == 1
doAssert "abc".rfind("", start=1, last=0) == -1 # This returns the start index instead of the last index
doAssert "abc".rfind("", start=1, last = -1) == -1 # because start > last
doAssert "abc".rfind("", start=1, last=0) == 1
doAssert "abc".rfind("", start=1, last = -1) == 3
doAssert "abc".rfind("", start=0, last=0) == 0
# when last <= start, searching for non-empty string # when last <= start, searching for non-empty string
block: block: