From 7eac0afff24d4883c5c32c4444be21b1b86c4b10 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 29 Sep 2022 14:45:37 -0700 Subject: [PATCH] cli args can parse null-terminated strings --- src/cli_args.zig | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/cli_args.zig b/src/cli_args.zig index 75cbfb5be..502cfcf3f 100644 --- a/src/cli_args.zig +++ b/src/cli_args.zig @@ -117,6 +117,14 @@ fn parseIntoField( break :value buf; }, + [:0]const u8 => value: { + const slice = value orelse return error.ValueRequired; + const buf = try alloc.allocSentinel(u8, slice.len, 0); + mem.copy(u8, buf, slice); + buf[slice.len] = 0; + break :value buf; + }, + bool => try parseBool(value orelse "t"), u8 => try std.fmt.parseInt( @@ -199,6 +207,21 @@ test "parseIntoField: string" { try testing.expectEqualStrings("42", data.a); } +test "parseIntoField: sentinel string" { + const testing = std.testing; + var arena = ArenaAllocator.init(testing.allocator); + defer arena.deinit(); + const alloc = arena.allocator(); + + var data: struct { + a: [:0]const u8, + } = undefined; + + try parseIntoField(@TypeOf(data), alloc, &data, "a", "42"); + try testing.expectEqualStrings("42", data.a); + try testing.expectEqual(@as(u8, 0), data.a[data.a.len]); +} + test "parseIntoField: bool" { const testing = std.testing; var arena = ArenaAllocator.init(testing.allocator);