summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorktamp <ktamp@users.noreply.github.com>2020-06-26 00:31:06 +0300
committerGitHub <noreply@github.com>2020-06-26 00:31:06 +0300
commit41c97e4b70d8d3b67f9080939790c6b9a64a7e74 (patch)
tree6453c0debfbc79374afe0ffd7414033a691dc028 /lib
parentc6e09e335a63f2a0e3108d40e56b72a3214a045f (diff)
downloadNim-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.nim17
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