diff options
author | bptato <nincsnevem662@gmail.com> | 2022-12-10 19:05:38 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2022-12-10 19:05:38 +0100 |
commit | 1e858c874804444bc4b95b6e89eb96a0deb8473c (patch) | |
tree | 3151b498e19c6d6eed3d90827483eb270314f3da /src/io/teestream.nim | |
parent | d963385cd9fd77f0a950c5b92be7774bbf76d661 (diff) | |
download | chawan-1e858c874804444bc4b95b6e89eb96a0deb8473c.tar.gz |
Add support for the encoding standard, fix parseLegacyColor
Also, fix a bug in the
Diffstat (limited to 'src/io/teestream.nim')
-rw-r--r-- | src/io/teestream.nim | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/io/teestream.nim b/src/io/teestream.nim new file mode 100644 index 00000000..81c9e2f0 --- /dev/null +++ b/src/io/teestream.nim @@ -0,0 +1,44 @@ +import streams + +type TeeStream = ref object of Stream + source: Stream + dest: Stream + closedest: bool + +proc tsClose(s: Stream) = + let s = cast[TeeStream](s) + s.source.close() + if s.closedest: + s.dest.close() + +proc tsReadData(s: Stream, buffer: pointer, bufLen: int): int = + let s = cast[TeeStream](s) + result = s.source.readData(buffer, bufLen) + s.dest.writeData(buffer, result) + +proc tsReadDataStr(s: Stream, buffer: var string, slice: Slice[int]): int = + let s = cast[TeeStream](s) + result = s.source.readDataStr(buffer, slice) + if result <= 0: return + s.dest.writeData(addr buffer[0], result) + +proc tsAtEnd(s: Stream): bool = + let s = cast[TeeStream](s) + return s.source.atEnd + +proc newTeeStream*(source, dest: Stream, closedest = true): TeeStream = + return TeeStream( + source: source, + dest: dest, + closedest: closedest, + closeImpl: tsClose, + readDataImpl: + cast[proc(s: Stream, buffer: pointer, len: int): int + {.nimcall, raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.} + ](tsReadData), + readDataStrImpl: + cast[proc(s: Stream, buffer: var string, slice: Slice[int]): int + {.nimcall, raises: [Defect, IOError, OSError], tags: [ReadIOEffect], gcsafe.} + ](tsReadDataStr), + atEndImpl: tsAtEnd + ) |