diff options
-rw-r--r-- | lib/pure/strutils.nim | 14 | ||||
-rw-r--r-- | tests/stdlib/tstrutil.nim | 15 |
2 files changed, 22 insertions, 7 deletions
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 396f14972..c9a577b13 100644 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -1325,7 +1325,7 @@ proc initSkipTable*(a: var SkipTable, sub: string) for i in 0 ..< m - 1: a[sub[i]] = m - 1 - i -proc find*(a: SkipTable, s, sub: string, start: Natural = 0, last: Natural = 0): int +proc find*(a: SkipTable, s, sub: string, start: Natural = 0, last = 0): int {.noSideEffect, rtl, extern: "nsuFindStrA".} = ## Searches for `sub` in `s` inside range `start`..`last` using preprocessed table `a`. ## If `last` is unspecified, it defaults to `s.high`. @@ -1363,7 +1363,7 @@ when not (defined(js) or defined(nimdoc) or defined(nimscript)): else: const hasCStringBuiltin = false -proc find*(s: string, sub: char, start: Natural = 0, last: Natural = 0): int {.noSideEffect, +proc find*(s: string, sub: char, start: Natural = 0, last = 0): int {.noSideEffect, rtl, extern: "nsuFindChar".} = ## Searches for `sub` in `s` inside range `start`..`last`. ## If `last` is unspecified, it defaults to `s.high`. @@ -1371,7 +1371,7 @@ proc find*(s: string, sub: char, start: Natural = 0, last: Natural = 0): int {.n ## Searching is case-sensitive. If `sub` is not in `s`, -1 is returned. let last = if last==0: s.high else: last when nimvm: - for i in start..last: + for i in int(start)..last: if sub == s[i]: return i else: when hasCStringBuiltin: @@ -1381,11 +1381,11 @@ proc find*(s: string, sub: char, start: Natural = 0, last: Natural = 0): int {.n if not found.isNil: return cast[ByteAddress](found) -% cast[ByteAddress](s.cstring) else: - for i in start..last: + for i in int(start)..last: if sub == s[i]: return i return -1 -proc find*(s, sub: string, start: Natural = 0, last: Natural = 0): int {.noSideEffect, +proc find*(s, sub: string, start: Natural = 0, last = 0): int {.noSideEffect, rtl, extern: "nsuFindStr".} = ## Searches for `sub` in `s` inside range `start`..`last`. ## If `last` is unspecified, it defaults to `s.high`. @@ -1397,14 +1397,14 @@ proc find*(s, sub: string, start: Natural = 0, last: Natural = 0): int {.noSideE initSkipTable(a, sub) result = find(a, s, sub, start, last) -proc find*(s: string, chars: set[char], start: Natural = 0, last: Natural = 0): int {.noSideEffect, +proc find*(s: string, chars: set[char], start: Natural = 0, last = 0): int {.noSideEffect, rtl, extern: "nsuFindCharSet".} = ## Searches for `chars` in `s` inside range `start`..`last`. ## If `last` is unspecified, it defaults to `s.high`. ## ## If `s` contains none of the characters in `chars`, -1 is returned. let last = if last==0: s.high else: last - for i in start..last: + for i in int(start)..last: if s[i] in chars: return i return -1 diff --git a/tests/stdlib/tstrutil.nim b/tests/stdlib/tstrutil.nim index f0ee755f7..64b8f8ecc 100644 --- a/tests/stdlib/tstrutil.nim +++ b/tests/stdlib/tstrutil.nim @@ -309,5 +309,20 @@ assert(' '.repeat(0) == "") assert(" ".repeat(0) == "") assert(spaces(0) == "") +# bug #8911 +when true: + static: + let a = "" + let a2 = a.replace("\n", "\\n") + +when true: + static: + let b = "b" + let b2 = b.replace("\n", "\\n") + +when true: + let c = "" + let c2 = c.replace("\n", "\\n") + main() #OUT ha/home/a1xyz/usr/bin |