Also using the **Windows API** :
    
    
    #console2.nim
    
    when defined(windows):
      import system/widestrs
      import terminal
      
      proc readConsoleW(
        hConsoleInput: FileHandle,
        lpBuffer: WideCString,
        nNumberOfCharsToRead: uint32,
        lpNumberOfCharsRead: ptr uint32,
        pInputControl: pointer
      ): bool {.stdcall, dynlib: "kernel32", importc: "ReadConsoleW".}
      
      proc consoleReadLine*(line: var string): bool =
        if stdin.isatty:
          const bufferSize = 256
          var buffer = newWideCString("", bufferSize + 1)
          var numberOfCharsRead: uint32
          result = readConsoleW(stdin.getOsFileHandle, buffer, bufferSize, 
numberOfCharsRead.addr, nil)
          if numberOfCharsRead == bufferSize and buffer[bufferSize - 1].int == 
13:  #'\r' was read, '\n' was left out
            buffer[bufferSize - 1] = Utf16Char(0)
            var numberOfCharsDiscarded: uint32
            discard readConsoleW(stdin.getOsFileHandle, newWideCString("", 1), 
1, numberOfCharsDiscarded.addr, nil)
          elif numberOfCharsRead > 1 and buffer[numberOfCharsRead - 2].int == 
13:   #"\r\n" was read
            buffer[numberOfCharsRead - 2] = Utf16Char(0)
          else:  #"\r\n" was left out
            buffer[numberOfCharsRead] = Utf16Char(0)
          line = $buffer
        else:
          result = stdin.readLine(line)
      
      proc consoleReadLine*(): string =
        discard consoleReadLine(result)
    
    else:
      proc consoleReadLine*(line: var string): bool =
        result = stdin.readLine(line)
      
      proc consoleReadLine*(): string =
        result = stdin.readLine
    
    Run

Reply via email to