From 68be2299172f6d87ed5db2ad2a7fcbdef2085725 Mon Sep 17 00:00:00 2001 From: emekoi Date: Sat, 11 Apr 2020 22:30:55 -0500 Subject: [PATCH] added custom format method for WindowsVersion --- lib/std/target.zig | 30 ++++++++++++++++++++++++++++++ lib/std/zig/cross_target.zig | 4 ++-- src-self-hosted/stage2.zig | 25 ++++--------------------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/std/target.zig b/lib/std/target.zig index 9df3e21e52..8edc4acea8 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -101,6 +101,36 @@ pub const Target = struct { return @enumToInt(ver) >= @enumToInt(self.min) and @enumToInt(ver) <= @enumToInt(self.max); } }; + + pub fn format( + self: WindowsVersion, + comptime fmt: []const u8, + options: std.fmt.FormatOptions, + out_stream: var, + ) !void { + if (fmt.len > 0 and fmt[0] == 's') { + if ( + @enumToInt(self) >= @enumToInt(WindowsVersion.nt4) and @enumToInt(self) <= @enumToInt(WindowsVersion.win10_19h1) + ) { + try std.fmt.format(out_stream, ".{}", .{@tagName(self)}); + } else { + try std.fmt.format(out_stream, + "@intToEnum(Target.Os.WindowsVersion, {})", + .{ @enumToInt(self) } + ); + } + } else { + if ( + @enumToInt(self) >= @enumToInt(WindowsVersion.nt4) and @enumToInt(self) <= @enumToInt(WindowsVersion.win10_19h1) + ) { + try std.fmt.format(out_stream, "WindowsVersion.{}", .{@tagName(self)}); + } else { + try std.fmt.format(out_stream, "WindowsVersion(", .{@typeName(@This())}); + try std.fmt.format(out_stream, "{}", .{@enumToInt(self)}); + try out_stream.writeAll(")"); + } + } + } }; pub const LinuxVersionRange = struct { diff --git a/lib/std/zig/cross_target.zig b/lib/std/zig/cross_target.zig index 910d263c6a..5466b39f0b 100644 --- a/lib/std/zig/cross_target.zig +++ b/lib/std/zig/cross_target.zig @@ -514,14 +514,14 @@ pub const CrossTarget = struct { switch (self.getOsVersionMin()) { .none => {}, .semver => |v| try result.outStream().print(".{}", .{v}), - .windows => |v| try result.outStream().print(".{}", .{@tagName(v)}), + .windows => |v| try result.outStream().print("{s}", .{v}), } } if (self.os_version_max) |max| { switch (max) { .none => {}, .semver => |v| try result.outStream().print("...{}", .{v}), - .windows => |v| try result.outStream().print("...{}", .{@tagName(v)}), + .windows => |v| try result.outStream().print("..{s}", .{v}), } } diff --git a/src-self-hosted/stage2.zig b/src-self-hosted/stage2.zig index bd24ffb399..91524d7396 100644 --- a/src-self-hosted/stage2.zig +++ b/src-self-hosted/stage2.zig @@ -653,23 +653,6 @@ export fn stage2_libc_render(stage1_libc: *Stage2LibCInstallation, output_file: return .None; } -fn enumToString(value: var, type_name: []const u8) ![]const u8 { - switch (@typeInfo(@TypeOf(value))) { - .Enum => |e| { - if (e.is_exhaustive) { - return std.fmt.allocPrint(std.heap.c_allocator, ".{}", .{@tagName(value)}); - } else { - return std.fmt.allocPrint( - std.heap.c_allocator, - "@intToEnum({}, {})", - .{ type_name, @enumToInt(value) }, - ); - } - }, - else => unreachable, - } -} - // ABI warning const Stage2Target = extern struct { arch: c_int, @@ -887,13 +870,13 @@ const Stage2Target = extern struct { .windows => try os_builtin_str_buffer.outStream().print( \\ .windows = .{{ - \\ .min = {}, - \\ .max = {}, + \\ .min = {s}, + \\ .max = {s}, \\ }}}}, \\ , .{ - try enumToString(target.os.version_range.windows.min, "Target.Os.WindowsVersion"), - try enumToString(target.os.version_range.windows.max, "Target.Os.WindowsVersion"), + target.os.version_range.windows.min, + target.os.version_range.windows.max, }), } try os_builtin_str_buffer.appendSlice("};\n");