diff options
author | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-09-06 19:50:11 +0100 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@googlemail.com> | 2014-09-06 19:50:11 +0100 |
commit | cb8a25b3d1ed5ca873b4b19f157b84e7289ccf9b (patch) | |
tree | 1e2ba492cf60fb2df02a986868da8265567dc30d /lib/pure | |
parent | bd542ebea3ec01eb269fe6fa118a8648d63f7097 (diff) | |
download | Nim-cb8a25b3d1ed5ca873b4b19f157b84e7289ccf9b.tar.gz |
Added asyncfile.readLine and async stdin/out/err. Ref #1487.
Diffstat (limited to 'lib/pure')
-rw-r--r-- | lib/pure/asyncfile.nim | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/pure/asyncfile.nim b/lib/pure/asyncfile.nim index 009485ed9..6c8a87184 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 |