authorgravatar for lgustaf1@binghamton.eduLayne Gustafson <lgustaf1@binghamton.edu> 2019-12-17 09:43:05-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-19 20:53:18-05:00
log8ac138a318d5581fa7fb80cc540d14e0a482f59e
treec442852b2ade62b6a2133d699fc8ac9da06fd3e8
parent8f191e0166ada745a677e8021dbb54598bcd94ea
signature Commit is signed but in an unrecognized format.

Add parseArchTag and fix parseArchSub


1 files changed, 26 insertions(+), 1 deletions(-)

lib/std/target.zig+26-1
......@@ -499,7 +499,7 @@ pub const Target = union(enum) {
499499 pub fn parseArchSub(text: []const u8) ParseArchSubError!Arch {
500500 const info = @typeInfo(Arch);
501501 inline for (info.Union.fields) |field| {
502 if (mem.eql(u8, text, field.name)) {
502 if (text.len >= field.name.len and mem.eql(u8, text[0..field.name.len], field.name)) {
503503 if (field.field_type == void) {
504504 return @as(Arch, @field(Arch, field.name));
505505 } else {
......@@ -517,6 +517,31 @@ pub const Target = union(enum) {
517517 return error.UnknownArchitecture;
518518 }
519519
520 pub fn parseArchTag(text: []const u8) ParseArchSubError!@TagType(Arch) {
521 const info = @typeInfo(Arch);
522 inline for (info.Union.fields) |field| {
523 if (text.len >= field.name.len and mem.eql(u8, text[0..field.name.len], field.name)) {
524 if (text.len == field.name.len) return @as(@TagType(Arch), @field(Arch, field.name));
525
526 if (field.field_type == void) {
527 return error.UnknownArchitecture;
528 }
529
530 const sub_info = @typeInfo(field.field_type);
531 inline for (sub_info.Enum.fields) |sub_field| {
532 const combined = field.name ++ sub_field.name;
533 if (mem.eql(u8, text, combined)) {
534 return @as(@TagType(Arch), @field(Arch, field.name));
535 }
536 }
537
538 return error.UnknownSubArchitecture;
539 }
540 }
541
542 return error.UnknownArchitecture;
543 }
544
520545 pub fn parseOs(text: []const u8) !Os {
521546 const info = @typeInfo(Os);
522547 inline for (info.Enum.fields) |field| {