| ... | @@ -373,6 +373,25 @@ pub fn LinearFifo( | ... | @@ -373,6 +373,25 @@ pub fn LinearFifo( |
| 373 | } | 373 | } |
| 374 | return self.buf[index]; | 374 | return self.buf[index]; |
| 375 | } | 375 | } |
| | 376 | |
| | 377 | /// Pump data from a reader into a writer |
| | 378 | /// stops when reader returns 0 bytes (EOF) |
| | 379 | /// Buffer size must be set before calling; a buffer length of 0 is invalid. |
| | 380 | pub fn pump(self: *Self, src_reader: anytype, dest_writer: anytype) !void { |
| | 381 | assert(self.buf.len > 0); |
| | 382 | while (true) { |
| | 383 | if (self.writableLength() > 0) { |
| | 384 | const n = try src_reader.read(self.writableSlice(0)); |
| | 385 | if (n == 0) break; // EOF |
| | 386 | self.update(n); |
| | 387 | } |
| | 388 | self.discard(try dest_writer.write(self.readableSlice(0))); |
| | 389 | } |
| | 390 | // flush remaining data |
| | 391 | while (self.readableLength() > 0) { |
| | 392 | self.discard(try dest_writer.write(self.readableSlice(0))); |
| | 393 | } |
| | 394 | } |
| 376 | }; | 395 | }; |
| 377 | } | 396 | } |
| 378 | | 397 | |
| ... | @@ -451,6 +470,15 @@ test "LinearFifo(u8, .Dynamic)" { | ... | @@ -451,6 +470,15 @@ test "LinearFifo(u8, .Dynamic)" { |
| 451 | testing.expectEqualSlices(u8, "a", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); | 470 | testing.expectEqualSlices(u8, "a", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); |
| 452 | testing.expectEqualSlices(u8, "test", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); | 471 | testing.expectEqualSlices(u8, "test", (try fifo.reader().readUntilDelimiterOrEof(&result, ' ')).?); |
| 453 | } | 472 | } |
| | 473 | |
| | 474 | { |
| | 475 | try fifo.ensureCapacity(1); |
| | 476 | var in_fbs = std.io.fixedBufferStream("pump test"); |
| | 477 | var out_buf: [50]u8 = undefined; |
| | 478 | var out_fbs = std.io.fixedBufferStream(&out_buf); |
| | 479 | try fifo.pump(in_fbs.reader(), out_fbs.writer()); |
| | 480 | testing.expectEqualSlices(u8, in_fbs.buffer, out_fbs.getWritten()); |
| | 481 | } |
| 454 | } | 482 | } |
| 455 | | 483 | |
| 456 | test "LinearFifo" { | 484 | test "LinearFifo" { |