authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-16 13:08:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-16 13:08:33-07:00
loga98dcbfbb913e19212d4093bdbb2221b2778e134
treeebbd7f83e0b2bdc0a142cfa2a1a2683765f68cb6
parentd772c062720c96cc4e1c601814f422dfa1efb5a5

std.Io.Writer: fix writeStruct


1 files changed, 28 insertions(+), 4 deletions(-)

lib/std/Io/Writer.zig+28-4
...@@ -483,7 +483,7 @@ pub fn writeSplatAll(w: *Writer, data: [][]const u8, splat: usize) Error!void {...@@ -483,7 +483,7 @@ pub fn writeSplatAll(w: *Writer, data: [][]const u8, splat: usize) Error!void {
483483
484 // Deal with any left over splats484 // Deal with any left over splats
485 if (data.len != 0 and truncate < data[index].len * splat) {485 if (data.len != 0 and truncate < data[index].len * splat) {
486 std.debug.assert(index == data.len - 1);486 assert(index == data.len - 1);
487 var remaining_splat = splat;487 var remaining_splat = splat;
488 while (true) {488 while (true) {
489 remaining_splat -= truncate / data[index].len;489 remaining_splat -= truncate / data[index].len;
...@@ -840,11 +840,11 @@ pub inline fn writeStruct(w: *Writer, value: anytype, endian: std.builtin.Endian...@@ -840,11 +840,11 @@ pub inline fn writeStruct(w: *Writer, value: anytype, endian: std.builtin.Endian
840 .auto => @compileError("ill-defined memory layout"),840 .auto => @compileError("ill-defined memory layout"),
841 .@"extern" => {841 .@"extern" => {
842 if (native_endian == endian) {842 if (native_endian == endian) {
843 return w.writeStruct(value);843 return w.writeAll(@ptrCast((&value)[0..1]));
844 } else {844 } else {
845 var copy = value;845 var copy = value;
846 std.mem.byteSwapAllFields(@TypeOf(value), &copy);846 std.mem.byteSwapAllFields(@TypeOf(value), &copy);
847 return w.writeStruct(copy);847 return w.writeAll(@ptrCast((&copy)[0..1]));
848 }848 }
849 },849 },
850 .@"packed" => {850 .@"packed" => {
...@@ -2594,8 +2594,32 @@ test "allocating sendFile" {...@@ -2594,8 +2594,32 @@ test "allocating sendFile" {
2594 var file_reader = file_writer.moveToReader();2594 var file_reader = file_writer.moveToReader();
2595 try file_reader.seekTo(0);2595 try file_reader.seekTo(0);
25962596
2597 var allocating: std.io.Writer.Allocating = .init(std.testing.allocator);2597 var allocating: std.io.Writer.Allocating = .init(testing.allocator);
2598 defer allocating.deinit();2598 defer allocating.deinit();
25992599
2600 _ = try file_reader.interface.streamRemaining(&allocating.writer);2600 _ = try file_reader.interface.streamRemaining(&allocating.writer);
2601}2601}
2602
2603test writeStruct {
2604 var buffer: [16]u8 = undefined;
2605 const S = extern struct { a: u64, b: u32, c: u32 };
2606 const s: S = .{ .a = 1, .b = 2, .c = 3 };
2607 {
2608 var w: Writer = .fixed(&buffer);
2609 try w.writeStruct(s, .little);
2610 try testing.expectEqualSlices(u8, &.{
2611 1, 0, 0, 0, 0, 0, 0, 0, //
2612 2, 0, 0, 0, //
2613 3, 0, 0, 0, //
2614 }, &buffer);
2615 }
2616 {
2617 var w: Writer = .fixed(&buffer);
2618 try w.writeStruct(s, .big);
2619 try testing.expectEqualSlices(u8, &.{
2620 0, 0, 0, 0, 0, 0, 0, 1, //
2621 0, 0, 0, 2, //
2622 0, 0, 0, 3, //
2623 }, &buffer);
2624 }
2625}