diff options
author | n5m <72841454+n5m@users.noreply.github.com> | 2022-09-26 19:39:22 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-26 15:39:22 -0400 |
commit | 9ca88a18897f5ebc59d6a67dfc7f9a8de8fa35ce (patch) | |
tree | 4315e5f7c17bc7b13982d979cf072d6a7be9e551 | |
parent | b213913dcb767a86a5669c1c24ad5c7b1d5a8de8 (diff) | |
download | Nim-9ca88a18897f5ebc59d6a67dfc7f9a8de8fa35ce.tar.gz |
fix #18128 rfind on empty needle returns rightmost index (#20430)
rfind on empty needle returns haystack len
-rw-r--r-- | lib/pure/strutils.nim | 3 | ||||
-rw-r--r-- | tests/stdlib/tstrutils.nim | 30 |
2 files changed, 19 insertions, 14 deletions
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 3b315e564..3ae953a55 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -2022,7 +2022,8 @@ func rfind*(s, sub: string, start: Natural = 0, last = -1): int {.rtl, ## See also: ## * `find func<#find,string,string,Natural,int>`_ 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: return -1 let last = if last == -1: s.high else: last diff --git a/tests/stdlib/tstrutils.nim b/tests/stdlib/tstrutils.nim index e17277ef2..9ea4d72f2 100644 --- a/tests/stdlib/tstrutils.nim +++ b/tests/stdlib/tstrutils.nim @@ -360,19 +360,23 @@ template main() = doAssert "///".rfind("//", start=3) == -1 # searching for empty string - doAssert "".rfind("") == -1 - doAssert "abc".rfind("") == -1 - doAssert "abc".rfind("", start=1) == -1 - doAssert "abc".rfind("", start=2) == -1 - doAssert "abc".rfind("", start=3) == -1 - doAssert "abc".rfind("", start=4) == -1 - doAssert "abc".rfind("", start=400) == -1 - - doAssert "abc".rfind("", start=1, last=3) == -1 - doAssert "abc".rfind("", start=1, last=2) == -1 - doAssert "abc".rfind("", start=1, last=1) == -1 - doAssert "abc".rfind("", start=1, last=0) == -1 - doAssert "abc".rfind("", start=1, last = -1) == -1 + doAssert "".rfind("") == 0 + doAssert "abc".rfind("") == 3 + doAssert "abc".rfind("", start=1) == 3 + doAssert "abc".rfind("", start=2) == 3 + doAssert "abc".rfind("", start=3) == 3 + doAssert "abc".rfind("", start=4) == 4 + doAssert "abc".rfind("", start=400) == 400 + + doAssert "abc".rfind("", start=1, last=3) == 3 + doAssert "abc".rfind("", start=1, last=2) == 2 + doAssert "abc".rfind("", start=1, last=1) == 1 + # This returns the start index instead of the last index + # 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 block: |