Skip to content

Commit 64d017d

Browse files
marler8997joeltg
authored andcommitted
add std.zip and support zip files in build.zig.zon
fixes ziglang#17408 Improved by helpful reviews from Josh Wolfe and Auguste Rame and Andrew Kelley. Co-authored-by: Joel Gustafson <[email protected]>
1 parent e8dd79c commit 64d017d

File tree

7 files changed

+1109
-1
lines changed

7 files changed

+1109
-1
lines changed

lib/std/io.zig

+4
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,10 @@ pub fn GenericWriter(
344344
return @errorCast(self.any().writeStruct(value));
345345
}
346346

347+
pub inline fn writeStructEndian(self: Self, value: anytype, endian: std.builtin.Endian) Error!void {
348+
return @errorCast(self.any().writeStructEndian(value, endian));
349+
}
350+
347351
pub inline fn any(self: *const Self) AnyWriter {
348352
return .{
349353
.context = @ptrCast(&self.context),

lib/std/io/Writer.zig

+12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const std = @import("../std.zig");
22
const assert = std.debug.assert;
33
const mem = std.mem;
4+
const native_endian = @import("builtin").target.cpu.arch.endian();
45

56
context: *const anyopaque,
67
writeFn: *const fn (context: *const anyopaque, bytes: []const u8) anyerror!usize,
@@ -59,6 +60,17 @@ pub fn writeStruct(self: Self, value: anytype) anyerror!void {
5960
return self.writeAll(mem.asBytes(&value));
6061
}
6162

63+
pub fn writeStructEndian(self: Self, value: anytype, endian: std.builtin.Endian) anyerror!void {
64+
// TODO: make sure this value is not a reference type
65+
if (native_endian == endian) {
66+
return self.writeStruct(value);
67+
} else {
68+
var copy = value;
69+
mem.byteSwapAllFields(@TypeOf(value), &copy);
70+
return self.writeStruct(copy);
71+
}
72+
}
73+
6274
pub fn writeFile(self: Self, file: std.fs.File) anyerror!void {
6375
// TODO: figure out how to adjust std lib abstractions so that this ends up
6476
// doing sendfile or maybe even copy_file_range under the right conditions.

lib/std/mem.zig

+6-1
Original file line numberDiff line numberDiff line change
@@ -2008,7 +2008,12 @@ pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {
20082008
.Struct => {
20092009
inline for (std.meta.fields(S)) |f| {
20102010
switch (@typeInfo(f.type)) {
2011-
.Struct, .Array => byteSwapAllFields(f.type, &@field(ptr, f.name)),
2011+
.Struct => |struct_info| if (struct_info.backing_integer) |Int| {
2012+
@field(ptr, f.name) = @bitCast(@byteSwap(@as(Int, @bitCast(@field(ptr, f.name)))));
2013+
} else {
2014+
byteSwapAllFields(f.type, &@field(ptr, f.name));
2015+
},
2016+
.Array => byteSwapAllFields(f.type, &@field(ptr, f.name)),
20122017
.Enum => {
20132018
@field(ptr, f.name) = @enumFromInt(@byteSwap(@intFromEnum(@field(ptr, f.name))));
20142019
},

lib/std/std.zig

+1
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ pub const unicode = @import("unicode.zig");
104104
pub const valgrind = @import("valgrind.zig");
105105
pub const wasm = @import("wasm.zig");
106106
pub const zig = @import("zig.zig");
107+
pub const zip = @import("zip.zig");
107108
pub const start = @import("start.zig");
108109

109110
const root = @import("root");

0 commit comments

Comments
 (0)