diff --git a/lib/system.nim b/lib/system.nim index 75014ff269..09d48fd12b 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -3252,19 +3252,18 @@ proc `/`*(x, y: int): float {.inline, noSideEffect.} = template spliceImpl(s, a, L, b: untyped): untyped = # make room for additional elements or cut: - var slen = s.len - var shift = b.len - L - var newLen = slen + shift + var shift = b.len - max(0,L) # ignore negative slice size + var newLen = s.len + shift if shift > 0: # enlarge: setLen(s, newLen) - for i in countdown(newLen-1, a+shift+1): shallowCopy(s[i], s[i-shift]) + for i in countdown(newLen-1, a+b.len): shallowCopy(s[i], s[i-shift]) else: - for i in countup(a+b.len, s.len-1+shift): shallowCopy(s[i], s[i-shift]) + for i in countup(a+b.len, newLen-1): shallowCopy(s[i], s[i-shift]) # cut down: setLen(s, newLen) # fill the hole: - for i in 0 .. len(numbers)": + # replace characters by slice of same length + s = characters + s[1..16] = numbers + doAssert s == "a1234567890rstuvwxyz" + + # test "slice of length == len(numbers)": + # replace characters by slice of same length + s = characters + s[1..10] = numbers + doAssert s == "a1234567890lmnopqrstuvwxyz" + + # test "slice of length < len(numbers)": + # replace slice of length. and insert remaining chars + s = characters + s[1..4] = numbers + doAssert s == "a1234567890fghijklmnopqrstuvwxyz" + + # test "slice of length == 1": + # replace first character. and insert remaining 9 chars + s = characters + s[1..1] = numbers + doAssert s == "a1234567890cdefghijklmnopqrstuvwxyz" + + # test "slice of length == 0": + # insert chars at slice start index + s = characters + s[2..1] = numbers + doAssert s == "ab1234567890cdefghijklmnopqrstuvwxyz" + + # test "slice of negative length": + # same as slice of zero length + s = characters + s[2..0] = numbers + doAssert s == "ab1234567890cdefghijklmnopqrstuvwxyz" + + echo("OK") + +test_string_slice()