diff options
| author | Layne Gustafson <lgustaf1@binghamton.edu> | 2019-12-17 09:43:05 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-01-19 20:53:18 -0500 |
| commit | 8ac138a318d5581fa7fb80cc540d14e0a482f59e (patch) | |
| tree | c442852b2ade62b6a2133d699fc8ac9da06fd3e8 /lib/std | |
| parent | 8f191e0166ada745a677e8021dbb54598bcd94ea (diff) | |
| download | zig-8ac138a318d5581fa7fb80cc540d14e0a482f59e.tar.gz zig-8ac138a318d5581fa7fb80cc540d14e0a482f59e.zip | |
Add parseArchTag and fix parseArchSub
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/target.zig | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/std/target.zig b/lib/std/target.zig index 029bf01489..4d5de1fc85 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -499,7 +499,7 @@ pub const Target = union(enum) { pub fn parseArchSub(text: []const u8) ParseArchSubError!Arch { const info = @typeInfo(Arch); inline for (info.Union.fields) |field| { - if (mem.eql(u8, text, field.name)) { + if (text.len >= field.name.len and mem.eql(u8, text[0..field.name.len], field.name)) { if (field.field_type == void) { return @as(Arch, @field(Arch, field.name)); } else { @@ -517,6 +517,31 @@ pub const Target = union(enum) { return error.UnknownArchitecture; } + pub fn parseArchTag(text: []const u8) ParseArchSubError!@TagType(Arch) { + const info = @typeInfo(Arch); + inline for (info.Union.fields) |field| { + if (text.len >= field.name.len and mem.eql(u8, text[0..field.name.len], field.name)) { + if (text.len == field.name.len) return @as(@TagType(Arch), @field(Arch, field.name)); + + if (field.field_type == void) { + return error.UnknownArchitecture; + } + + const sub_info = @typeInfo(field.field_type); + inline for (sub_info.Enum.fields) |sub_field| { + const combined = field.name ++ sub_field.name; + if (mem.eql(u8, text, combined)) { + return @as(@TagType(Arch), @field(Arch, field.name)); + } + } + + return error.UnknownSubArchitecture; + } + } + + return error.UnknownArchitecture; + } + pub fn parseOs(text: []const u8) !Os { const info = @typeInfo(Os); inline for (info.Enum.fields) |field| { |
