aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorLayne Gustafson <lgustaf1@binghamton.edu>2019-12-17 09:43:05 -0500
committerAndrew Kelley <andrew@ziglang.org>2020-01-19 20:53:18 -0500
commit8ac138a318d5581fa7fb80cc540d14e0a482f59e (patch)
treec442852b2ade62b6a2133d699fc8ac9da06fd3e8 /lib/std
parent8f191e0166ada745a677e8021dbb54598bcd94ea (diff)
downloadzig-8ac138a318d5581fa7fb80cc540d14e0a482f59e.tar.gz
zig-8ac138a318d5581fa7fb80cc540d14e0a482f59e.zip
Add parseArchTag and fix parseArchSub
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/target.zig27
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| {