parser: parse into 0-terminated strings
This was kind of an annoying change to make since 0.11.0 has issues where it will point to the wrong srcloc on compile errors in generic code (which this 100% is) fortunately fixed in master. The motivation for this change is that the arg vector already contains 0-terminated strings, so we can avoid a lot of copies. This makes forwarding command-line arguments to C-functions that expect zero-terminated strings much more straightforward, and they also automatically decay to normal slices. Unfortunately, environment variable values are NOT zero-terminated, so they are currently copied with zero-termination. This seems to be the fault of Windows/WASI, both of which already are performing allocations (Windows to convert from UTF-16 to UTF-8, and WASI to get a copy of the environment). By duplicating the std EnvMap implementation, we could make a version that generates 0-terminated env vars without extra copies, but I'll skip on doing that for now.
This commit is contained in:
@@ -30,6 +30,13 @@ const cli = cmd: {
|
||||
.description = "enum choice option",
|
||||
.nice_type_name = "choice",
|
||||
});
|
||||
cmd.stringOption(.{
|
||||
.name = "string",
|
||||
.short_tag = "-s",
|
||||
.long_tag = "--string",
|
||||
.env_var = "NOCLIP_STRING",
|
||||
.description = "A string value option",
|
||||
});
|
||||
cmd.addOption(.{ .OutputType = u32 }, .{
|
||||
.name = "default",
|
||||
.short_tag = "-d",
|
||||
@@ -80,8 +87,8 @@ const subcommand = cmd: {
|
||||
.falsy = .{ .long_tag = "--no-flag" },
|
||||
.env_var = "NOCLIP_SUBFLAG",
|
||||
});
|
||||
cmd.addArgument(.{ .OutputType = []const u8 }, .{ .name = "argument" });
|
||||
cmd.addArgument(.{ .OutputType = []const u8 }, .{
|
||||
cmd.stringArgument(.{ .name = "argument" });
|
||||
cmd.stringArgument(.{
|
||||
.name = "arg",
|
||||
.description = "This is an argument that doesn't really do anything, but it's very important.",
|
||||
});
|
||||
@@ -95,6 +102,7 @@ fn subHandler(context: []const u8, result: subcommand.Output()) !void {
|
||||
|
||||
fn cliHandler(context: *u32, result: cli.Output()) !void {
|
||||
std.debug.print("context: {d}\n", .{context.*});
|
||||
std.debug.print("callback is working {s}\n", .{result.string orelse "null"});
|
||||
std.debug.print("callback is working {any}\n", .{result.choice});
|
||||
std.debug.print("callback is working {d}\n", .{result.default});
|
||||
context.* += 1;
|
||||
|
Reference in New Issue
Block a user