fixes #8911
This commit is contained in:
parent
866d6d1891
commit
0330fb2e13
2 changed files with 22 additions and 7 deletions
|
|
@ -1325,7 +1325,7 @@ proc initSkipTable*(a: var SkipTable, sub: string)
|
||||||
for i in 0 ..< m - 1:
|
for i in 0 ..< m - 1:
|
||||||
a[sub[i]] = m - 1 - i
|
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".} =
|
{.noSideEffect, rtl, extern: "nsuFindStrA".} =
|
||||||
## Searches for `sub` in `s` inside range `start`..`last` using preprocessed table `a`.
|
## Searches for `sub` in `s` inside range `start`..`last` using preprocessed table `a`.
|
||||||
## If `last` is unspecified, it defaults to `s.high`.
|
## If `last` is unspecified, it defaults to `s.high`.
|
||||||
|
|
@ -1363,7 +1363,7 @@ when not (defined(js) or defined(nimdoc) or defined(nimscript)):
|
||||||
else:
|
else:
|
||||||
const hasCStringBuiltin = false
|
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".} =
|
rtl, extern: "nsuFindChar".} =
|
||||||
## Searches for `sub` in `s` inside range `start`..`last`.
|
## Searches for `sub` in `s` inside range `start`..`last`.
|
||||||
## If `last` is unspecified, it defaults to `s.high`.
|
## 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.
|
## Searching is case-sensitive. If `sub` is not in `s`, -1 is returned.
|
||||||
let last = if last==0: s.high else: last
|
let last = if last==0: s.high else: last
|
||||||
when nimvm:
|
when nimvm:
|
||||||
for i in start..last:
|
for i in int(start)..last:
|
||||||
if sub == s[i]: return i
|
if sub == s[i]: return i
|
||||||
else:
|
else:
|
||||||
when hasCStringBuiltin:
|
when hasCStringBuiltin:
|
||||||
|
|
@ -1381,11 +1381,11 @@ proc find*(s: string, sub: char, start: Natural = 0, last: Natural = 0): int {.n
|
||||||
if not found.isNil:
|
if not found.isNil:
|
||||||
return cast[ByteAddress](found) -% cast[ByteAddress](s.cstring)
|
return cast[ByteAddress](found) -% cast[ByteAddress](s.cstring)
|
||||||
else:
|
else:
|
||||||
for i in start..last:
|
for i in int(start)..last:
|
||||||
if sub == s[i]: return i
|
if sub == s[i]: return i
|
||||||
return -1
|
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".} =
|
rtl, extern: "nsuFindStr".} =
|
||||||
## Searches for `sub` in `s` inside range `start`..`last`.
|
## Searches for `sub` in `s` inside range `start`..`last`.
|
||||||
## If `last` is unspecified, it defaults to `s.high`.
|
## 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)
|
initSkipTable(a, sub)
|
||||||
result = find(a, s, sub, start, last)
|
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".} =
|
rtl, extern: "nsuFindCharSet".} =
|
||||||
## Searches for `chars` in `s` inside range `start`..`last`.
|
## Searches for `chars` in `s` inside range `start`..`last`.
|
||||||
## If `last` is unspecified, it defaults to `s.high`.
|
## If `last` is unspecified, it defaults to `s.high`.
|
||||||
##
|
##
|
||||||
## If `s` contains none of the characters in `chars`, -1 is returned.
|
## If `s` contains none of the characters in `chars`, -1 is returned.
|
||||||
let last = if last==0: s.high else: last
|
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
|
if s[i] in chars: return i
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -309,5 +309,20 @@ assert(' '.repeat(0) == "")
|
||||||
assert(" ".repeat(0) == "")
|
assert(" ".repeat(0) == "")
|
||||||
assert(spaces(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()
|
main()
|
||||||
#OUT ha/home/a1xyz/usr/bin
|
#OUT ha/home/a1xyz/usr/bin
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue