This commit is contained in:
Andreas Rumpf
2018-09-16 12:28:32 +02:00
parent 866d6d1891
commit 0330fb2e13
2 changed files with 22 additions and 7 deletions

View File

@@ -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

View File

@@ -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