authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-06-22 00:58:32-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-01 16:35:29-07:00
log52b3275eb2cc11a9d81510f465458208eddfd796
tree9fec2cae59198233cc7becc6a5f5a6f58ebdd9fa
parenta249cc1c7e5d9ac580d8f0cace9c7e3bfffffe57

readable -> reader / writable -> writer


10 files changed, 53 insertions(+), 80 deletions(-)

lib/std/compress/flate/Compress.zig+3-11
......@@ -70,12 +70,10 @@ hasher: Container.Hasher,
7070prev_match: ?Token = null,
7171prev_literal: ?u8 = null,
7272
73pub fn readable(c: *Compress, buffer: []u8) std.io.Reader {
73pub fn reader(c: *Compress, buffer: []u8) std.io.Reader {
7474 return .{
75 .unbuffered_reader = .{
76 .context = c,
77 .vtable = .{ .read = read },
78 },
75 .context = c,
76 .vtable = .{ .read = read },
7977 .buffer = buffer,
8078 };
8179}
......@@ -337,12 +335,6 @@ pub const Huffman = SimpleCompressor(.huffman, .raw);
337335/// store blocks. That adds 9 bytes of header for each block. Max stored block
338336/// size is 64K. Block is emitted when flush is called on on finish.
339337pub const store = struct {
340 pub fn compress(comptime container: Container, reader: anytype, writer: anytype) !void {
341 var c = try store.compressor(container, writer);
342 try c.compress(reader);
343 try c.finish();
344 }
345
346338 pub fn Compressor(comptime container: Container, comptime WriterType: type) type {
347339 return SimpleCompressor(.store, container, WriterType);
348340 }
lib/std/compress/flate/Decompress.zig+2-5
......@@ -355,17 +355,14 @@ fn writeMatch(bw: *Writer, length: u16, distance: u16) !void {
355355 @panic("TODO");
356356}
357357
358pub fn reader(self: *Decompress) std.io.Reader {
358pub fn reader(self: *Decompress, buffer: []u8) std.io.Reader {
359359 return .{
360360 .context = self,
361361 .vtable = &.{ .read = read },
362 .buffer = buffer,
362363 };
363364}
364365
365pub fn readable(self: *Decompress, buffer: []u8) std.io.Reader {
366 return reader(self).buffered(buffer);
367}
368
369366fn takeBits(d: *Decompress, comptime T: type) !T {
370367 _ = d;
371368 @panic("TODO");
lib/std/crypto/Sha1.zig+1-1
......@@ -413,7 +413,7 @@ test "splat" {
413413 };
414414 const stream_result = r: {
415415 var sha1: Sha1 = .init(.{});
416 var bw = sha1.writable(&.{});
416 var bw = sha1.writer(&.{});
417417 try bw.writeSplatAll(&vecs, splat_len);
418418 try std.testing.expectEqual(vecs[0].len + vecs[1].len + vecs[2].len * splat_len, sha1.total_len);
419419 break :r sha1.finalResult();
lib/std/elf.zig+4-8
......@@ -594,8 +594,7 @@ pub const ProgramHeaderIterator = struct {
594594 var phdr: Elf64_Phdr = undefined;
595595 const offset = it.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * it.index;
596596 try it.file_reader.seekTo(offset);
597 var br = it.file_reader.readable(&.{});
598 try br.readSlice(@ptrCast(&phdr));
597 try it.file_reader.interface.readSlice(@ptrCast(&phdr));
599598 if (it.elf_header.endian != native_endian)
600599 mem.byteSwapAllFields(Elf64_Phdr, &phdr);
601600 return phdr;
......@@ -604,8 +603,7 @@ pub const ProgramHeaderIterator = struct {
604603 var phdr: Elf32_Phdr = undefined;
605604 const offset = it.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * it.index;
606605 try it.file_reader.seekTo(offset);
607 var br = it.file_reader.readable(&.{});
608 try br.readSlice(@ptrCast(&phdr));
606 try it.file_reader.interface.readSlice(@ptrCast(&phdr));
609607 if (it.elf_header.endian != native_endian)
610608 mem.byteSwapAllFields(Elf32_Phdr, &phdr);
611609 return .{
......@@ -634,8 +632,7 @@ pub const SectionHeaderIterator = struct {
634632 var shdr: Elf64_Shdr = undefined;
635633 const offset = it.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * it.index;
636634 try it.file_reader.seekTo(offset);
637 var br = it.file_reader.readable(&.{});
638 try br.readSlice(@ptrCast(&shdr));
635 try it.file_reader.interface.readSlice(@ptrCast(&shdr));
639636 if (it.elf_header.endian != native_endian)
640637 mem.byteSwapAllFields(Elf64_Shdr, &shdr);
641638 return shdr;
......@@ -644,8 +641,7 @@ pub const SectionHeaderIterator = struct {
644641 var shdr: Elf32_Shdr = undefined;
645642 const offset = it.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * it.index;
646643 try it.file_reader.seekTo(offset);
647 var br = it.file_reader.readable(&.{});
648 try br.readSlice(@ptrCast(&shdr));
644 try it.file_reader.interface.readSlice(@ptrCast(&shdr));
649645 if (it.elf_header.endian != native_endian)
650646 mem.byteSwapAllFields(Elf32_Shdr, &shdr);
651647 return .{
lib/std/fs/Dir.zig+1-1
......@@ -2617,7 +2617,7 @@ pub fn updateFile(
26172617 .size = src_stat.size,
26182618 };
26192619 var buffer: [2000]u8 = undefined;
2620 var dest_writer = atomic_file.file_writer.writable(&buffer);
2620 var dest_writer = atomic_file.file_writer.writer(&buffer);
26212621
26222622 dest_writer.writeFileAll(&src_reader, .{}) catch |err| switch (err) {
26232623 error.ReadFailed => return src_reader.err.?,
lib/std/io/Reader.zig+1-1
......@@ -1448,7 +1448,7 @@ pub fn Hashed(comptime Hasher: type) type {
14481448
14491449 fn discard(r: *Reader, limit: Limit) Error!usize {
14501450 const this: *@This() = @alignCast(@fieldParentPtr("interface", r));
1451 var w = this.hasher.writable(&.{});
1451 var w = this.hasher.writer(&.{});
14521452 const n = this.in.read(&w, limit) catch |err| switch (err) {
14531453 error.WriteFailed => unreachable,
14541454 else => |e| return e,
lib/std/zip.zig+2-2
......@@ -571,7 +571,7 @@ pub const Iterator = struct {
571571 };
572572 defer out_file.close();
573573 var file_writer = out_file.writer();
574 var file_bw = file_writer.writable(&.{});
574 var file_bw = file_writer.writer(&.{});
575575 const local_data_file_offset: u64 =
576576 @as(u64, self.file_offset) +
577577 @as(u64, @sizeOf(LocalFileHeader)) +
......@@ -585,7 +585,7 @@ pub const Iterator = struct {
585585 var decompress_br = decompress.readable(&limited_br, self.compression_method, &decompress_read_buffer);
586586 const start_out = file_bw.count;
587587 var hash_writer = file_bw.hashed(std.hash.Crc32.init());
588 var hash_bw = hash_writer.writable(&.{});
588 var hash_bw = hash_writer.writer(&.{});
589589 decompress_br.readAll(&hash_bw, .limited(self.uncompressed_size)) catch |err| switch (err) {
590590 error.ReadFailed => return stream.err.?,
591591 error.WriteFailed => return file_writer.err.?,
lib/std/zip/test.zig+14-15
......@@ -34,10 +34,9 @@ fn expectFiles(
3434 std.mem.replaceScalar(u8, normalized_sub_path, '\\', '/');
3535 var file = try dir.openFile(normalized_sub_path, .{});
3636 defer file.close();
37 var file_reader = file.reader();
38 var file_br = file_reader.readable(&.{});
3937 var content_buf: [4096]u8 = undefined;
40 const n = try file_br.readSliceShort(&content_buf);
38 var file_reader = file.reader(&content_buf);
39 const n = try file_reader.interface.readSliceShort(&content_buf);
4140 try testing.expectEqualStrings(test_file.content, content_buf[0..n]);
4241 }
4342}
......@@ -65,7 +64,7 @@ fn makeZipWithStore(
6564 store: []FileStore,
6665) !void {
6766 var buffer: [200]u8 = undefined;
68 var bw = file_writer.writable(&buffer);
67 var bw = file_writer.writer(&buffer);
6968 try writeZip(&bw, files, store, options);
7069}
7170
......@@ -201,7 +200,7 @@ const Zipper = struct {
201200 const offset = writer.count;
202201 var br: std.io.Reader = .fixed(opt.content);
203202 var compress: std.compress.flate.Compress = .init(&br, .{});
204 var compress_br = compress.readable(&.{});
203 var compress_br = compress.reader(&.{});
205204 const n = try compress_br.readRemaining(writer);
206205 assert(br.seek == opt.content.len);
207206 try testing.expectEqual(n, writer.count - offset);
......@@ -431,7 +430,7 @@ test "bad zip files" {
431430 {
432431 const tmp_file = tmp.createFile();
433432 defer tmp_file.close();
434 var file_writer = tmp_file.writable(&buffer);
433 var file_writer = tmp_file.writer(&buffer);
435434 try makeZip(&file_writer, &.{}, .{ .end = .{ .sig = [_]u8{ 1, 2, 3, 4 } } });
436435 var file_reader = file_writer.moveToReader();
437436 try testing.expectError(error.ZipNoEndRecord, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -439,7 +438,7 @@ test "bad zip files" {
439438 {
440439 const tmp_file = tmp.createFile();
441440 defer tmp_file.close();
442 var file_writer = tmp_file.writable(&buffer);
441 var file_writer = tmp_file.writer(&buffer);
443442 try makeZip(&file_writer, &.{}, .{ .end = .{ .comment_len = 1 } });
444443 var file_reader = file_writer.moveToReader();
445444 try testing.expectError(error.ZipNoEndRecord, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -447,7 +446,7 @@ test "bad zip files" {
447446 {
448447 const tmp_file = tmp.createFile();
449448 defer tmp_file.close();
450 var file_writer = tmp_file.writable(&buffer);
449 var file_writer = tmp_file.writer(&buffer);
451450 try makeZip(&file_writer, &.{}, .{ .end = .{ .comment = "a", .comment_len = 0 } });
452451 var file_reader = file_writer.moveToReader();
453452 try testing.expectError(error.ZipNoEndRecord, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -455,7 +454,7 @@ test "bad zip files" {
455454 {
456455 const tmp_file = tmp.createFile();
457456 defer tmp_file.close();
458 var file_writer = tmp_file.writable(&buffer);
457 var file_writer = tmp_file.writer(&buffer);
459458 try makeZip(&file_writer, &.{}, .{ .end = .{ .disk_number = 1 } });
460459 var file_reader = file_writer.moveToReader();
461460 try testing.expectError(error.ZipMultiDiskUnsupported, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -463,7 +462,7 @@ test "bad zip files" {
463462 {
464463 const tmp_file = tmp.createFile();
465464 defer tmp_file.close();
466 var file_writer = tmp_file.writable(&buffer);
465 var file_writer = tmp_file.writer(&buffer);
467466 try makeZip(&file_writer, &.{}, .{ .end = .{ .central_directory_disk_number = 1 } });
468467 var file_reader = file_writer.moveToReader();
469468 try testing.expectError(error.ZipMultiDiskUnsupported, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -471,7 +470,7 @@ test "bad zip files" {
471470 {
472471 const tmp_file = tmp.createFile();
473472 defer tmp_file.close();
474 var file_writer = tmp_file.writable(&buffer);
473 var file_writer = tmp_file.writer(&buffer);
475474 try makeZip(&file_writer, &.{}, .{ .end = .{ .record_count_disk = 1 } });
476475 var file_reader = file_writer.moveToReader();
477476 try testing.expectError(error.ZipDiskRecordCountTooLarge, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -479,7 +478,7 @@ test "bad zip files" {
479478 {
480479 const tmp_file = tmp.createFile();
481480 defer tmp_file.close();
482 var file_writer = tmp_file.writable(&buffer);
481 var file_writer = tmp_file.writer(&buffer);
483482 try makeZip(&file_writer, &.{}, .{ .end = .{ .central_directory_size = 1 } });
484483 var file_reader = file_writer.moveToReader();
485484 try testing.expectError(error.ZipCdOversized, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -487,7 +486,7 @@ test "bad zip files" {
487486 {
488487 const tmp_file = tmp.createFile();
489488 defer tmp_file.close();
490 var file_writer = tmp_file.writable(&buffer);
489 var file_writer = tmp_file.writer(&buffer);
491490 try makeZip(&file_writer, &file_a, .{ .end = .{ .central_directory_size = 0 } });
492491 var file_reader = file_writer.moveToReader();
493492 try testing.expectError(error.ZipCdUndersized, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -495,7 +494,7 @@ test "bad zip files" {
495494 {
496495 const tmp_file = tmp.createFile();
497496 defer tmp_file.close();
498 var file_writer = tmp_file.writable(&buffer);
497 var file_writer = tmp_file.writer(&buffer);
499498 try makeZip(&file_writer, &file_a, .{ .end = .{ .central_directory_offset = 0 } });
500499 var file_reader = file_writer.moveToReader();
501500 try testing.expectError(error.ZipBadCdOffset, zip.extract(tmp.dir, &file_reader, .{}));
......@@ -503,7 +502,7 @@ test "bad zip files" {
503502 {
504503 const tmp_file = tmp.createFile();
505504 defer tmp_file.close();
506 var file_writer = tmp_file.writable(&buffer);
505 var file_writer = tmp_file.writer(&buffer);
507506 try makeZip(&file_writer, &file_a, .{
508507 .end = .{
509508 .zip64 = .{ .locator_sig = [_]u8{ 1, 2, 3, 4 } },
src/Package/Fetch/git.zig+22-32
......@@ -68,7 +68,7 @@ pub const Oid = union(Format) {
6868
6969 pub fn writer(hasher: *Hasher, buffer: []u8) Writer {
7070 return switch (hasher.*) {
71 inline else => |*inner| inner.writable(buffer),
71 inline else => |*inner| inner.writer(buffer),
7272 };
7373 }
7474 };
......@@ -383,9 +383,7 @@ const Odb = struct {
383383 .index_file = index_file,
384384 .allocator = allocator,
385385 };
386 var buffer: [1032]u8 = undefined;
387 var index_file_br = index_file.readable(&buffer);
388 try odb.index_header.read(&index_file_br);
386 try odb.index_header.read(&index_file.interface);
389387 }
390388
391389 fn deinit(odb: *Odb) void {
......@@ -395,22 +393,20 @@ const Odb = struct {
395393
396394 /// Reads the object at the current position in the database.
397395 fn readObject(odb: *Odb) !Object {
398 var pack_read_buffer: [64]u8 = undefined;
399396 var base_offset = odb.pack_file.pos;
400 var pack_br = odb.pack_file.readable(&pack_read_buffer);
397 const pack_br = &odb.pack_file.interface;
401398 var base_header: EntryHeader = undefined;
402399 var delta_offsets: std.ArrayListUnmanaged(u64) = .empty;
403400 defer delta_offsets.deinit(odb.allocator);
404401 const base_object = while (true) {
405402 if (odb.cache.get(base_offset)) |base_object| break base_object;
406403
407 base_header = try EntryHeader.read(odb.format, &pack_br);
404 base_header = try EntryHeader.read(odb.format, pack_br);
408405 switch (base_header) {
409406 .ofs_delta => |ofs_delta| {
410407 try delta_offsets.append(odb.allocator, base_offset);
411408 base_offset = std.math.sub(u64, base_offset, ofs_delta.offset) catch return error.InvalidFormat;
412409 try odb.pack_file.seekTo(base_offset);
413 pack_br = odb.pack_file.readable(&pack_read_buffer);
414410 },
415411 .ref_delta => |ref_delta| {
416412 try delta_offsets.append(odb.allocator, base_offset);
......@@ -418,7 +414,7 @@ const Odb = struct {
418414 base_offset = odb.pack_file.pos - pack_br.bufferedLen();
419415 },
420416 else => {
421 const base_data = try readObjectRaw(odb.allocator, &pack_br, base_header.uncompressedLength());
417 const base_data = try readObjectRaw(odb.allocator, pack_br, base_header.uncompressedLength());
422418 errdefer odb.allocator.free(base_data);
423419 const base_object: Object = .{ .type = base_header.objectType(), .data = base_data };
424420 try odb.cache.put(odb.allocator, base_offset, base_object);
......@@ -1294,10 +1290,10 @@ pub fn indexPack(
12941290 }
12951291 @memset(fan_out_table[fan_out_index..], count);
12961292
1297 var index_writer_bw = index_writer.writable(&.{});
1293 var index_writer_bw = index_writer.writer(&.{});
12981294 var index_hashed_writer = index_writer_bw.hashed(Oid.Hasher.init(format));
12991295 var write_buffer: [256]u8 = undefined;
1300 var writer = index_hashed_writer.writable(&write_buffer);
1296 var writer = index_hashed_writer.writer(&write_buffer);
13011297 try writer.writeAll(IndexHeader.signature);
13021298 try writer.writeInt(u32, IndexHeader.supported_version, .big);
13031299 for (fan_out_table) |fan_out_entry| {
......@@ -1345,27 +1341,25 @@ fn indexPackFirstPass(
13451341 index_entries: *std.AutoHashMapUnmanaged(Oid, IndexEntry),
13461342 pending_deltas: *std.ArrayListUnmanaged(IndexEntry),
13471343) !Oid {
1348 var pack_br = pack.readable(&.{});
1349 var pack_hashed_reader = pack_br.hashed(Oid.Hasher.init(format));
13501344 var pack_buffer: [2048]u8 = undefined; // Reasonably large buffer for file system.
1351 var pack_hashed_br = pack_hashed_reader.readable(&pack_buffer);
1345 var pack_hashed = pack.interface.hashed(Oid.Hasher.init(format), &pack_buffer);
13521346
1353 const pack_header = try PackHeader.read(&pack_hashed_br);
1347 const pack_header = try PackHeader.read(&pack_hashed.interface);
13541348
13551349 for (0..pack_header.total_objects) |_| {
1356 const entry_offset = pack.pos - pack_hashed_br.bufferContents().len;
1357 var entry_crc32_reader = pack_hashed_br.hashed(std.hash.Crc32.init());
1350 const entry_offset = pack.pos - pack_hashed.interface.bufferContents().len;
13581351 var entry_buffer: [64]u8 = undefined; // Buffer only needed for loading EntryHeader.
1359 var entry_crc32_br = entry_crc32_reader.readable(&entry_buffer);
1352 var entry_crc32_reader = pack_hashed.interface.hashed(std.hash.Crc32.init(), &entry_buffer);
1353 const entry_crc32_br = &entry_crc32_reader.interface;
13601354 const entry_header = try EntryHeader.read(format, &entry_crc32_br);
13611355 var entry_decompress_stream: zlib.Decompressor = .init(&entry_crc32_br);
13621356 // Decompress uses large output buffer; no input buffer needed.
1363 var entry_decompress_br = entry_decompress_stream.readable(&.{});
1357 var entry_decompress_br = entry_decompress_stream.reader(&.{});
13641358 switch (entry_header) {
13651359 .commit, .tree, .blob, .tag => |object| {
13661360 var oid_hasher = Oid.Hasher.init(format);
13671361 var oid_hasher_buffer: [zlib.max_window_len]u8 = undefined;
1368 var oid_hasher_bw = oid_hasher.writable(&oid_hasher_buffer);
1362 var oid_hasher_bw = oid_hasher.writer(&oid_hasher_buffer);
13691363 // The object header is not included in the pack data but is
13701364 // part of the object's ID.
13711365 try oid_hasher_bw.print("{s} {d}\x00", .{ @tagName(entry_header), object.uncompressed_length });
......@@ -1389,8 +1383,8 @@ fn indexPackFirstPass(
13891383 }
13901384 }
13911385
1392 const pack_checksum = pack_hashed_reader.hasher.finalResult();
1393 const recorded_checksum = try Oid.readBytes(format, &pack_br);
1386 const pack_checksum = pack_hashed.hasher.finalResult();
1387 const recorded_checksum = try Oid.readBytes(format, &pack.interface);
13941388 if (!mem.eql(u8, pack_checksum.slice(), recorded_checksum.slice())) {
13951389 return error.CorruptedPack;
13961390 }
......@@ -1417,9 +1411,7 @@ fn indexPackHashDelta(
14171411 if (cache.get(base_offset)) |base_object| break base_object;
14181412
14191413 try pack.seekTo(base_offset);
1420 var pack_read_buffer: [64]u8 = undefined;
1421 var pack_br = pack.readable(&pack_read_buffer);
1422 base_header = try EntryHeader.read(format, &pack_br);
1414 base_header = try EntryHeader.read(format, &pack.interface);
14231415 switch (base_header) {
14241416 .ofs_delta => |ofs_delta| {
14251417 try delta_offsets.append(allocator, base_offset);
......@@ -1430,7 +1422,7 @@ fn indexPackHashDelta(
14301422 base_offset = (index_entries.get(ref_delta.base_object) orelse return null).offset;
14311423 },
14321424 else => {
1433 const base_data = try readObjectRaw(allocator, &pack_br, base_header.uncompressedLength());
1425 const base_data = try readObjectRaw(allocator, &pack.interface, base_header.uncompressedLength());
14341426 errdefer allocator.free(base_data);
14351427 const base_object: Object = .{ .type = base_header.objectType(), .data = base_data };
14361428 try cache.put(allocator, base_offset, base_object);
......@@ -1443,7 +1435,7 @@ fn indexPackHashDelta(
14431435
14441436 var entry_hasher: Oid.Hasher = .init(format);
14451437 var entry_hasher_buffer: [64]u8 = undefined;
1446 var entry_hasher_bw = entry_hasher.writable(&entry_hasher_buffer);
1438 var entry_hasher_bw = entry_hasher.writer(&entry_hasher_buffer);
14471439 // Writes to hashers cannot fail.
14481440 entry_hasher_bw.print("{s} {d}\x00", .{ @tagName(base_object.type), base_data.len }) catch unreachable;
14491441 entry_hasher_bw.writeAll(base_data) catch unreachable;
......@@ -1470,13 +1462,11 @@ fn resolveDeltaChain(
14701462
14711463 const delta_offset = delta_offsets[i];
14721464 try pack.seekTo(delta_offset);
1473 var pack_read_buffer: [64]u8 = undefined;
1474 var pack_br = pack.readable(&pack_read_buffer);
1475 const delta_header = try EntryHeader.read(format, &pack_br);
1465 const delta_header = try EntryHeader.read(format, &pack.interface);
14761466 _ = delta_header;
1477 var delta_decompress: zlib.Decompressor = .init(&pack_br);
1467 var delta_decompress: zlib.Decompressor = .init(&pack.interface);
14781468 var delta_decompress_buffer: [zlib.max_window_len]u8 = undefined;
1479 var delta_reader = delta_decompress.readable(&delta_decompress_buffer);
1469 var delta_reader = delta_decompress.reader(&delta_decompress_buffer);
14801470 _ = try readSizeVarInt(&delta_reader); // base object size
14811471 const expanded_size = try readSizeVarInt(&delta_reader);
14821472 const expanded_alloc_size = std.math.cast(usize, expanded_size) orelse return error.ObjectTooLarge;
src/main.zig+3-4
......@@ -3330,11 +3330,10 @@ fn buildOutputType(
33303330 // for the hashing algorithm here and in the cache are the same.
33313331 // We are providing our own cache key, because this file has nothing
33323332 // to do with the cache manifest.
3333 var file_writer = f.writer();
3334 var file_writer_bw = file_writer.writable(&.{});
3335 var hasher_writer = file_writer_bw.hashed(Cache.Hasher.init("0123456789abcdef"));
3333 var file_writer = f.writer(&.{});
3334 var hasher_writer = file_writer.interface.hashed(Cache.Hasher.init("0123456789abcdef"));
33363335 var buffer: [1000]u8 = undefined;
3337 var bw = hasher_writer.writable(&buffer);
3336 var bw = hasher_writer.writer(&buffer);
33383337 bw.writeFileAll(.stdin(), .{}) catch |err| switch (err) {
33393338 error.WriteFailed => fatal("failed to write {s}: {s}", .{ dump_path, file_writer.err.? }),
33403339 else => fatal("failed to pipe stdin to {s}: {s}", .{ dump_path, err }),