std.posix.getenv
github
revision

std.posix.getenv() with bug

    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 + line_i + 1, 0);
    }
    return null;

std.posix.getenv() with fix

    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;

        // key = "THE_KEY";
        // std.os.environ = "THE_KEY\0deadbeef\0"
        // 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
            ptr[line_i..line_i]
        ;
    }
    return null;

test

test.zig
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 );
}