authorgravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-12-28 22:19:34 -08:00
committergravatar for hello@nektro.netMeghan Denny <hello@nektro.net> 2025-12-28 22:19:34 -08:00
log8ac20b7e0ae57e4f93931dc0de5b08c2cd92a66a
tree4c8d84eed6e5c98e1c033c6203f7490143676522
parentc9b47dd116ee7627b1914dc9374d5dde829c9f7e

store nul-terminated slices instead


1 files changed, 8 insertions(+), 12 deletions(-)

src/lib.zig+8-12
...@@ -1,15 +1,15 @@...@@ -1,15 +1,15 @@
1const std = @import("std");1const std = @import("std");
2const string = []const u8;2const string = [:0]const u8;
3const List = std.ArrayList(string);3const List = std.ArrayList(string);
4const extras = @import("extras");4const extras = @import("extras");
5const linux = @import("sys-linux");5const linux = @import("sys-linux");
66
7var singles: std.StringArrayHashMap(string) = undefined;7var singles: std.ArrayHashMap(string, string, std.array_hash_map.StringContext, true) = undefined;
8var multis: std.StringArrayHashMap(List) = undefined;8var multis: std.ArrayHashMap(string, List, std.array_hash_map.StringContext, true) = undefined;
99
10pub fn init(alloc: std.mem.Allocator) void {10pub fn init(alloc: std.mem.Allocator) void {
11 singles = std.StringArrayHashMap(string).init(alloc);11 singles = std.ArrayHashMap(string, string, std.array_hash_map.StringContext, true).init(alloc);
12 multis = std.StringArrayHashMap(List).init(alloc);12 multis = std.ArrayHashMap(string, List, std.array_hash_map.StringContext, true).init(alloc);
13}13}
1414
15pub fn deinit() void {15pub fn deinit() void {
...@@ -48,7 +48,7 @@ pub fn parse(k: FlagDashKind) !std.process.ArgIterator {...@@ -48,7 +48,7 @@ pub fn parse(k: FlagDashKind) !std.process.ArgIterator {
48 blk: while (argiter.next()) |item| : (argi += 1) {48 blk: while (argiter.next()) |item| : (argi += 1) {
49 const data = item;49 const data = item;
50 if (argi == 0) continue;50 if (argi == 0) continue;
51 const name = extras.trimPrefix(data, dash);51 const name: string = @ptrCast(extras.trimPrefix(data, dash));
52 if (data.len == name.len) return error.BadFlag;52 if (data.len == name.len) return error.BadFlag;
5353
54 for (singles.keys()) |jtem| {54 for (singles.keys()) |jtem| {
...@@ -77,18 +77,14 @@ pub fn parseEnv() !void {...@@ -77,18 +77,14 @@ pub fn parseEnv() !void {
77 const alloc = singles.allocator;77 const alloc = singles.allocator;
7878
79 for (singles.keys(), singles.values()) |k, *v| {79 for (singles.keys(), singles.values()) |k, *v| {
80 const u = try fixNameForEnv(alloc, k);80 if (linux.getenv(k)) |value| {
81 defer alloc.free(u);
82 if (linux.getenv(u)) |value| {
83 v.* = value;81 v.* = value;
84 }82 }
85 }83 }
86 for (multis.keys(), multis.values()) |k, *v| {84 for (multis.keys(), multis.values()) |k, *v| {
87 var n: usize = 1;85 var n: usize = 1;
88 while (true) : (n += 1) {86 while (true) : (n += 1) {
89 const u = try fixNameForEnv(alloc, k);87 const w = try std.fmt.allocPrintZ(alloc, "{s}_{d}", .{ k, n });
90 defer alloc.free(u);
91 const w = try std.fmt.allocPrintZ(alloc, "{s}_{d}", .{ u, n });
92 defer alloc.free(w);88 defer alloc.free(w);
93 if (linux.getenv(w)) |value| {89 if (linux.getenv(w)) |value| {
94 try v.append(value);90 try v.append(value);