diff options
-rw-r--r-- | lib/system.nim | 4 | ||||
-rw-r--r-- | lib/system/sysio.nim | 4 | ||||
-rw-r--r-- | tests/stdlib/tio.nim | 11 |
3 files changed, 14 insertions, 5 deletions
diff --git a/lib/system.nim b/lib/system.nim index 2e5d5ae19..8654f12a1 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -3127,8 +3127,8 @@ when not defined(JS): #and not defined(nimscript): proc readLine*(f: File, line: var TaintedString): bool {.tags: [ReadIOEffect], benign.} - ## reads a line of text from the file `f` into `line`. `line` must not be - ## ``nil``! May throw an IO exception. + ## reads a line of text from the file `f` into `line`. May throw an IO + ## exception. ## A line of text may be delimited by ``LF`` or ``CRLF``. The newline ## character(s) are not part of the returned string. Returns ``false`` ## if the end of the file has been reached, ``true`` otherwise. If diff --git a/lib/system/sysio.nim b/lib/system/sysio.nim index 40bbf97dc..df13ab628 100644 --- a/lib/system/sysio.nim +++ b/lib/system/sysio.nim @@ -161,7 +161,7 @@ proc readLine(f: File, line: var TaintedString): bool = var last = cast[ByteAddress](m) - cast[ByteAddress](addr line.string[0]) if last > 0 and line.string[last-1] == '\c': line.string.setLen(last-1) - return fgetsSuccess + return last > 1 or fgetsSuccess # We have to distinguish between two possible cases: # \0\l\0 => line ending in a null character. # \0\l\l => last line without newline, null was put there by fgets. @@ -169,7 +169,7 @@ proc readLine(f: File, line: var TaintedString): bool = if last < pos + sp - 1 and line.string[last+1] != '\0': dec last line.string.setLen(last) - return fgetsSuccess + return last > 0 or fgetsSuccess else: # fgets will have inserted a null byte at the end of the string. dec sp diff --git a/tests/stdlib/tio.nim b/tests/stdlib/tio.nim index 28e1881e8..b1057dee2 100644 --- a/tests/stdlib/tio.nim +++ b/tests/stdlib/tio.nim @@ -1,9 +1,12 @@ discard """ output: '''9 -b = false +b = true 123456789 Second readLine raised an exception 123456789 +1 +2aaaaaaaa +3bbbbbbb ''' """ # bug #5349 @@ -38,3 +41,9 @@ echo line f.close() removeFile(fn) + +# bug #8961 +writeFile("test.txt", "1\C\L2aaaaaaaa\C\L3bbbbbbb") + +for line in lines("test.txt"): + echo line |