Fix peekLine() for streams

Motivation
----------
peekLine procs use defer to reset position in the stream, but it also
make them always return nil.

Modification
------------
Explicitly set result value in peekLine, and write missing unit test.

Result
------
Tests are green and bug is fixed
This commit is contained in:
Sergey Avseyev
2015-05-26 00:29:58 +03:00
parent f516434283
commit 116347674c

View File

@@ -242,7 +242,7 @@ proc peekLine*(s: Stream, line: var TaintedString): bool =
## otherwise. If ``false`` is returned `line` contains no new data.
let pos = getPosition(s)
defer: setPosition(s, pos)
readLine(s, line)
result = readLine(s, line)
proc readLine*(s: Stream): TaintedString =
## Reads a line from a stream `s`. Note: This is not very efficient. Raises
@@ -263,7 +263,7 @@ proc peekLine*(s: Stream): TaintedString =
## `EIO` if an error occurred.
let pos = getPosition(s)
defer: setPosition(s, pos)
readLine(s)
result = readLine(s)
type
StringStream* = ref StringStreamObj ## a stream that encapsulates a string
@@ -458,3 +458,7 @@ when defined(testing):
assert(ss.getPosition == 5) # did move
assert(ss.peekLine() == "uick brown fox jumped over the lazy dog.")
assert(ss.getPosition == 5) # haven't moved
var str = newString(100)
assert(ss.peekLine(str))
assert(str == "uick brown fox jumped over the lazy dog.")
assert(ss.getPosition == 5) # haven't moved