fixes #21273; io.readLine off by one
This commit is contained in:
parent
d54a7f078d
commit
c4d3d650ba
2 changed files with 22 additions and 3 deletions
|
|
@ -484,11 +484,12 @@ proc readLine*(f: File, line: var string): bool {.tags: [ReadIOEffect],
|
||||||
if last > 0 and line[last-1] == '\c':
|
if last > 0 and line[last-1] == '\c':
|
||||||
line.setLen(last-1)
|
line.setLen(last-1)
|
||||||
return last > 1 or fgetsSuccess
|
return last > 1 or fgetsSuccess
|
||||||
# We have to distinguish between two possible cases:
|
elif last > 0 and line[last-1] == '\0':
|
||||||
|
# We have to distinguish among three possible cases:
|
||||||
# \0\l\0 => line ending in a null character.
|
# \0\l\0 => line ending in a null character.
|
||||||
# \0\l\l => last line without newline, null was put there by fgets.
|
# \0\l\l => last line without newline, null was put there by fgets.
|
||||||
elif last > 0 and line[last-1] == '\0':
|
# \0\l => last line without newline, null was put there by fgets.
|
||||||
if last < pos + sp - 1 and line[last+1] != '\0':
|
if last >= pos + sp - 1 or line[last+1] != '\0': # bug #21273
|
||||||
dec last
|
dec last
|
||||||
line.setLen(last)
|
line.setLen(last)
|
||||||
return last > 0 or fgetsSuccess
|
return last > 0 or fgetsSuccess
|
||||||
|
|
|
||||||
|
|
@ -36,3 +36,21 @@ block: # readChars
|
||||||
break
|
break
|
||||||
doAssert n2s == @[2,2,2,1,0]
|
doAssert n2s == @[2,2,2,1,0]
|
||||||
doAssert s2 == s
|
doAssert s2 == s
|
||||||
|
|
||||||
|
|
||||||
|
import std/strutils
|
||||||
|
|
||||||
|
block: # bug #21273
|
||||||
|
let FILE = buildDir / "D20220119T134305.txt"
|
||||||
|
|
||||||
|
let hex = "313632313920313632343720313632353920313632363020313632393020323035363520323037323120323131353020323239393820323331303520323332313020323332343820323332363820"
|
||||||
|
|
||||||
|
|
||||||
|
writeFile FILE, parseHexStr(hex)
|
||||||
|
|
||||||
|
doAssert readFile(FILE).toHex == hex
|
||||||
|
|
||||||
|
let f = open(FILE)
|
||||||
|
var s = newString(80)
|
||||||
|
while f.readLine(s):
|
||||||
|
doAssert s.toHex == hex
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue