diff options
author | ktamp <ktamp@users.noreply.github.com> | 2020-06-26 00:31:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-26 00:31:06 +0300 |
commit | 41c97e4b70d8d3b67f9080939790c6b9a64a7e74 (patch) | |
tree | 6453c0debfbc79374afe0ffd7414033a691dc028 /lib | |
parent | c6e09e335a63f2a0e3108d40e56b72a3214a045f (diff) | |
download | Nim-41c97e4b70d8d3b67f9080939790c6b9a64a7e74.tar.gz |
readLine: Fix issues with --gc:arc
**--gc:arc** defines **nimv2**. This changes the definition of **WideCStringObj**. Also an empty string should be returned in case of EOF.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system/io.nim | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/system/io.nim b/lib/system/io.nim index b550b6b7b..9f12a1767 100644 --- a/lib/system/io.nim +++ b/lib/system/io.nim @@ -354,8 +354,8 @@ proc readLine*(f: File, line: var TaintedString): bool {.tags: [ReadIOEffect], when defined(windows) and not defined(useWinAnsi): proc readConsole(hConsoleInput: FileHandle, lpBuffer: pointer, - nNumberOfCharsToRead: uint32, - lpNumberOfCharsRead: ptr uint32, + nNumberOfCharsToRead: int32, + lpNumberOfCharsRead: ptr int32, pInputControl: pointer): int32 {. importc: "ReadConsoleW", stdcall, dynlib: "kernel32".} @@ -383,7 +383,7 @@ proc readLine*(f: File, line: var TaintedString): bool {.tags: [ReadIOEffect], # this implies the file is open if f.isatty: const numberOfCharsToRead = 2048 - var numberOfCharsRead = 0'u32 + var numberOfCharsRead = 0'i32 var buffer = newWideCString("", numberOfCharsToRead) if readConsole(getOsFileHandle(f), addr(buffer[0]), numberOfCharsToRead, addr(numberOfCharsRead), nil) == 0: @@ -393,20 +393,25 @@ proc readLine*(f: File, line: var TaintedString): bool {.tags: [ReadIOEffect], if formatMessageW(0x00000100 or 0x00001000 or 0x00000200, nil, error, 0, addr(msgbuf), 0, nil) != 0'i32: errorMsg = $msgbuf - if msgbuf != nil: localFree(cast[pointer](msgbuf)) + if msgbuf != nil: + localFree(cast[pointer](msgbuf)) raiseEIO("error: " & $error & " `" & errorMsg & "`") # input always ends with "\r\n" numberOfCharsRead -= 2 # handle Ctrl+Z as EOF - for i in 0'u32..<numberOfCharsRead: + for i in 0..<numberOfCharsRead: if buffer[i].uint16 == 26: #Ctrl+Z close(f) #has the same effect as setting EOF if i == 0: + line = TaintedString("") return false numberOfCharsRead = i break buffer[numberOfCharsRead] = 0.Utf16Char - line = TaintedString($buffer) + when defined(nimv2): + line = TaintedString($toWideCString(buffer)) + else: + line = TaintedString($buffer) return(true) var pos = 0 |