// https://github.com/ziglang/zig/blob/master/lib/std/posix.zig#L1986 // https://github.com/ziglang/zig/blob/7ff42eff914e2e501f570bb8c530719bb3a2521a/lib/std/posix.zig#L1986 // https://dirtand.rocks/zig/bug.std-posix-getenv.html const std = @import( "std" ); const mem = std.mem; const zero_slice = [1]u8 { 0 }; // thought '\0' was an escape sequence.. hmm var trigger = ( "THE_KEY" ++ zero_slice ++ "deadbeef" ).*; test "env key empty" { var trigger_environ = [_][*:0]u8 { &trigger }; // override and set back const tmp = std.os.environ; std.os.environ = &trigger_environ; defer { std.os.environ = tmp; } const val = std.posix.getenv( "THE_KEY" ) orelse return error.fail; try std.testing.expectEqualSlices( u8, "", val ); } fn my_getenv( key :[]const u8 ) ?[:0]const u8 { for (std.os.environ) |ptr| { var line_i: usize = 0; while (ptr[line_i] != 0 and ptr[line_i] != '=') : (line_i += 1) {} const this_key = ptr[0..line_i]; if (!mem.eql(u8, key, this_key)) continue; // return mem.sliceTo(ptr + if( ptr[line_i]=='=') 1 else 0, 0); return if( ptr[line_i] == '=' ) mem.sliceTo(ptr + line_i + 1, 0) else @ptrCast( ptr[line_i..line_i] ) ; } return null; } test "env key empty - my_getenv" { var trigger_environ = [_][*:0]u8 { &trigger }; // override and set back const tmp = std.os.environ; std.os.environ = &trigger_environ; defer { std.os.environ = tmp; } const val = my_getenv( "THE_KEY" ) orelse return error.fail; try std.testing.expectEqualSlices( u8, "", val ); }