diff options
| author | r00ster91 <r00ster91@proton.me> | 2023-02-21 18:39:22 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2023-06-17 13:17:34 -0700 |
| commit | 6e84f469904a24615a6721265a88ad8dcb4ed83a (patch) | |
| tree | d390e7738b996686749adbbd9a1c18f647058b3b /lib/std/builtin.zig | |
| parent | 96acc204b2c6080f0169ca3721c3b95a433c185b (diff) | |
| download | zig-6e84f469904a24615a6721265a88ad8dcb4ed83a.tar.gz zig-6e84f469904a24615a6721265a88ad8dcb4ed83a.zip | |
std: replace builtin.Version with SemanticVersion
Diffstat (limited to 'lib/std/builtin.zig')
| -rw-r--r-- | lib/std/builtin.zig | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index b449080e86..54781e4465 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -485,139 +485,6 @@ pub const WasiExecModel = enum { /// This data structure is used by the Zig language code generation and /// therefore must be kept in sync with the compiler implementation. -pub const Version = struct { - major: u32, - minor: u32, - patch: u32 = 0, - - pub const Range = struct { - min: Version, - max: Version, - - pub fn includesVersion(self: Range, ver: Version) bool { - if (self.min.order(ver) == .gt) return false; - if (self.max.order(ver) == .lt) return false; - return true; - } - - /// Checks if system is guaranteed to be at least `version` or older than `version`. - /// Returns `null` if a runtime check is required. - pub fn isAtLeast(self: Range, ver: Version) ?bool { - if (self.min.order(ver) != .lt) return true; - if (self.max.order(ver) == .lt) return false; - return null; - } - }; - - pub fn order(lhs: Version, rhs: Version) std.math.Order { - if (lhs.major < rhs.major) return .lt; - if (lhs.major > rhs.major) return .gt; - if (lhs.minor < rhs.minor) return .lt; - if (lhs.minor > rhs.minor) return .gt; - if (lhs.patch < rhs.patch) return .lt; - if (lhs.patch > rhs.patch) return .gt; - return .eq; - } - - pub fn parse(text: []const u8) !Version { - var end: usize = 0; - while (end < text.len) : (end += 1) { - const c = text[end]; - if (!std.ascii.isDigit(c) and c != '.') break; - } - // found no digits or '.' before unexpected character - if (end == 0) return error.InvalidVersion; - - var it = std.mem.splitScalar(u8, text[0..end], '.'); - // substring is not empty, first call will succeed - const major = it.first(); - if (major.len == 0) return error.InvalidVersion; - const minor = it.next() orelse "0"; - // ignore 'patch' if 'minor' is invalid - const patch = if (minor.len == 0) "0" else (it.next() orelse "0"); - - return Version{ - .major = try std.fmt.parseUnsigned(u32, major, 10), - .minor = try std.fmt.parseUnsigned(u32, if (minor.len == 0) "0" else minor, 10), - .patch = try std.fmt.parseUnsigned(u32, if (patch.len == 0) "0" else patch, 10), - }; - } - - pub fn format( - self: Version, - comptime fmt: []const u8, - options: std.fmt.FormatOptions, - out_stream: anytype, - ) !void { - _ = options; - if (fmt.len == 0) { - if (self.patch == 0) { - if (self.minor == 0) { - return std.fmt.format(out_stream, "{d}", .{self.major}); - } else { - return std.fmt.format(out_stream, "{d}.{d}", .{ self.major, self.minor }); - } - } else { - return std.fmt.format(out_stream, "{d}.{d}.{d}", .{ self.major, self.minor, self.patch }); - } - } else { - std.fmt.invalidFmtError(fmt, self); - } - } -}; - -test "Version.parse" { - @setEvalBranchQuota(3000); - try testVersionParse(); - comptime (try testVersionParse()); -} - -fn testVersionParse() !void { - const f = struct { - fn eql(text: []const u8, v1: u32, v2: u32, v3: u32) !void { - const v = try Version.parse(text); - try std.testing.expect(v.major == v1 and v.minor == v2 and v.patch == v3); - } - - fn err(text: []const u8, expected_err: anyerror) !void { - _ = Version.parse(text) catch |actual_err| { - if (actual_err == expected_err) return; - return actual_err; - }; - return error.Unreachable; - } - }; - - try f.eql("2.6.32.11-svn21605", 2, 6, 32); // Debian PPC - try f.eql("2.11.2(0.329/5/3)", 2, 11, 2); // MinGW - try f.eql("5.4.0-1018-raspi", 5, 4, 0); // Ubuntu - try f.eql("5.7.12_3", 5, 7, 12); // Void - try f.eql("2.13-DEVELOPMENT", 2, 13, 0); // DragonFly - try f.eql("2.3-35", 2, 3, 0); - try f.eql("1a.4", 1, 0, 0); - try f.eql("3.b1.0", 3, 0, 0); - try f.eql("1.4beta", 1, 4, 0); - try f.eql("2.7.pre", 2, 7, 0); - try f.eql("0..3", 0, 0, 0); - try f.eql("8.008.", 8, 8, 0); - try f.eql("01...", 1, 0, 0); - try f.eql("55", 55, 0, 0); - try f.eql("4294967295.0.1", 4294967295, 0, 1); - try f.eql("429496729_6", 429496729, 0, 0); - - try f.err("foobar", error.InvalidVersion); - try f.err("", error.InvalidVersion); - try f.err("-1", error.InvalidVersion); - try f.err("+4", error.InvalidVersion); - try f.err(".", error.InvalidVersion); - try f.err("....3", error.InvalidVersion); - try f.err("4294967296", error.Overflow); - try f.err("5000877755", error.Overflow); - // error.InvalidCharacter is not possible anymore -} - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. pub const CallModifier = enum { /// Equivalent to function call syntax. auto, |
