Let pipe() return the number of bytes written.

This commit is contained in:
Sönke Ludwig 2017-10-30 22:55:54 +01:00
parent 710c996666
commit 340357d455
No known key found for this signature in database
GPG key ID: D95E8DB493EE314C

View file

@ -30,8 +30,12 @@ public import eventcore.driver : IOMode;
The number of bytes written is either the whole input stream when `nbytes == 0`, or exactly The number of bytes written is either the whole input stream when `nbytes == 0`, or exactly
`nbytes` for `nbytes > 0`. If the input stream contains less than `nbytes` of data, an `nbytes` for `nbytes > 0`. If the input stream contains less than `nbytes` of data, an
exception is thrown. exception is thrown.
Returns:
The actual number of bytes written is returned. If `nbytes` is given
and not equal to `ulong.max`, íts value will be returned.
*/ */
void pipe(InputStream, OutputStream)(InputStream source, OutputStream sink, ulong nbytes) ulong pipe(InputStream, OutputStream)(InputStream source, OutputStream sink, ulong nbytes)
@blocking @trusted @blocking @trusted
if (isOutputStream!OutputStream && isInputStream!InputStream) if (isOutputStream!OutputStream && isInputStream!InputStream)
{ {
@ -43,6 +47,7 @@ void pipe(InputStream, OutputStream)(InputStream source, OutputStream sink, ulon
auto buffer = bufferobj.bytes; auto buffer = bufferobj.bytes;
//logTrace("default write %d bytes, empty=%s", nbytes, stream.empty); //logTrace("default write %d bytes, empty=%s", nbytes, stream.empty);
ulong ret = 0;
if (nbytes == ulong.max) { if (nbytes == ulong.max) {
while (!source.empty) { while (!source.empty) {
size_t chunk = min(source.leastSize, buffer.length); size_t chunk = min(source.leastSize, buffer.length);
@ -50,6 +55,7 @@ void pipe(InputStream, OutputStream)(InputStream source, OutputStream sink, ulon
//logTrace("read pipe chunk %d", chunk); //logTrace("read pipe chunk %d", chunk);
source.read(buffer[0 .. chunk]); source.read(buffer[0 .. chunk]);
sink.write(buffer[0 .. chunk]); sink.write(buffer[0 .. chunk]);
ret += chunk;
} }
} else { } else {
while (nbytes > 0) { while (nbytes > 0) {
@ -58,15 +64,17 @@ void pipe(InputStream, OutputStream)(InputStream source, OutputStream sink, ulon
source.read(buffer[0 .. chunk]); source.read(buffer[0 .. chunk]);
sink.write(buffer[0 .. chunk]); sink.write(buffer[0 .. chunk]);
nbytes -= chunk; nbytes -= chunk;
ret += chunk;
} }
} }
return ret;
} }
/// ditto /// ditto
void pipe(InputStream, OutputStream)(InputStream source, OutputStream sink) ulong pipe(InputStream, OutputStream)(InputStream source, OutputStream sink)
@blocking @blocking
if (isOutputStream!OutputStream && isInputStream!InputStream) if (isOutputStream!OutputStream && isInputStream!InputStream)
{ {
pipe(source, sink, ulong.max); return pipe(source, sink, ulong.max);
} }