From cb8a25b3d1ed5ca873b4b19f157b84e7289ccf9b Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Sat, 6 Sep 2014 19:50:11 +0100 Subject: [PATCH] Added asyncfile.readLine and async stdin/out/err. Ref #1487. --- lib/pure/asyncfile.nim | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/lib/pure/asyncfile.nim b/lib/pure/asyncfile.nim index 009485ed91..6c8a871841 100644 --- a/lib/pure/asyncfile.nim +++ b/lib/pure/asyncfile.nim @@ -34,7 +34,26 @@ type fd: TAsyncFd offset: int64 +# TODO: These will be nil in other threads? +var + asyncStdin* {.threadvar.}: AsyncFile ## Asynchronous stdin handle + asyncStdout* {.threadvar.}: AsyncFile ## Asynchronous stdout handle + asyncStderr* {.threadvar.}: AsyncFile ## Asynchronous stderr handle + when defined(windows): + asyncStdin = AsyncFile( + fd: getStdHandle(STD_INPUT_HANDLE).TAsyncFd, + offset: 0 + ) + asyncStdout = AsyncFile( + fd: getStdHandle(STD_OUTPUT_HANDLE).TAsyncFd, + offset: 0 + ) + asyncStderr = AsyncFile( + fd: getStdHandle(STD_ERROR_HANDLE).TAsyncFd, + offset: 0 + ) + proc getDesiredAccess(mode: TFileMode): int32 = case mode of fmRead: @@ -54,6 +73,19 @@ when defined(windows): else: CREATE_NEW else: + asyncStdin = AsyncFile( + fd: STDIN_FILENO.TAsyncFd, + offset: 0 + ) + asyncStdout = AsyncFile( + fd: STDOUT_FILENO.TAsyncFd, + offset: 0 + ) + asyncStderr = AsyncFile( + fd: STDERR_FILENO.TAsyncFd, + offset: 0 + ) + proc getPosixFlags(mode: TFileMode): cint = case mode of fmRead: @@ -201,6 +233,19 @@ proc read*(f: AsyncFile, size: int): Future[string] = return retFuture +proc readLine*(f: AsyncFile): Future[string] {.async.} = + ## Reads a single line from the specified file asynchronously. + result = "" + while true: + var c = await read(f, 1) + if c[0] == '\c': + c = await read(f, 1) + break + if c[0] == '\L' or c == "": + break + else: + result.add(c) + proc getFilePos*(f: AsyncFile): int64 = ## Retrieves the current position of the file pointer that is ## used to read from the specified file. The file's first byte has the