mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
std.Io.Writer: fix writeStruct
This commit is contained in:
parent
d772c06272
commit
a98dcbfbb9
1 changed files with 28 additions and 4 deletions
|
|
@ -483,7 +483,7 @@ pub fn writeSplatAll(w: *Writer, data: [][]const u8, splat: usize) Error!void {
|
||||||
|
|
||||||
// Deal with any left over splats
|
// Deal with any left over splats
|
||||||
if (data.len != 0 and truncate < data[index].len * splat) {
|
if (data.len != 0 and truncate < data[index].len * splat) {
|
||||||
std.debug.assert(index == data.len - 1);
|
assert(index == data.len - 1);
|
||||||
var remaining_splat = splat;
|
var remaining_splat = splat;
|
||||||
while (true) {
|
while (true) {
|
||||||
remaining_splat -= truncate / data[index].len;
|
remaining_splat -= truncate / data[index].len;
|
||||||
|
|
@ -840,11 +840,11 @@ pub inline fn writeStruct(w: *Writer, value: anytype, endian: std.builtin.Endian
|
||||||
.auto => @compileError("ill-defined memory layout"),
|
.auto => @compileError("ill-defined memory layout"),
|
||||||
.@"extern" => {
|
.@"extern" => {
|
||||||
if (native_endian == endian) {
|
if (native_endian == endian) {
|
||||||
return w.writeStruct(value);
|
return w.writeAll(@ptrCast((&value)[0..1]));
|
||||||
} else {
|
} else {
|
||||||
var copy = value;
|
var copy = value;
|
||||||
std.mem.byteSwapAllFields(@TypeOf(value), ©);
|
std.mem.byteSwapAllFields(@TypeOf(value), ©);
|
||||||
return w.writeStruct(copy);
|
return w.writeAll(@ptrCast((©)[0..1]));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.@"packed" => {
|
.@"packed" => {
|
||||||
|
|
@ -2594,8 +2594,32 @@ test "allocating sendFile" {
|
||||||
var file_reader = file_writer.moveToReader();
|
var file_reader = file_writer.moveToReader();
|
||||||
try file_reader.seekTo(0);
|
try file_reader.seekTo(0);
|
||||||
|
|
||||||
var allocating: std.io.Writer.Allocating = .init(std.testing.allocator);
|
var allocating: std.io.Writer.Allocating = .init(testing.allocator);
|
||||||
defer allocating.deinit();
|
defer allocating.deinit();
|
||||||
|
|
||||||
_ = try file_reader.interface.streamRemaining(&allocating.writer);
|
_ = try file_reader.interface.streamRemaining(&allocating.writer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test writeStruct {
|
||||||
|
var buffer: [16]u8 = undefined;
|
||||||
|
const S = extern struct { a: u64, b: u32, c: u32 };
|
||||||
|
const s: S = .{ .a = 1, .b = 2, .c = 3 };
|
||||||
|
{
|
||||||
|
var w: Writer = .fixed(&buffer);
|
||||||
|
try w.writeStruct(s, .little);
|
||||||
|
try testing.expectEqualSlices(u8, &.{
|
||||||
|
1, 0, 0, 0, 0, 0, 0, 0, //
|
||||||
|
2, 0, 0, 0, //
|
||||||
|
3, 0, 0, 0, //
|
||||||
|
}, &buffer);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var w: Writer = .fixed(&buffer);
|
||||||
|
try w.writeStruct(s, .big);
|
||||||
|
try testing.expectEqualSlices(u8, &.{
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 1, //
|
||||||
|
0, 0, 0, 2, //
|
||||||
|
0, 0, 0, 3, //
|
||||||
|
}, &buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue