diff options
| author | John Benediktsson <mrjbq7@gmail.com> | 2025-02-04 21:19:02 -0800 |
|---|---|---|
| committer | Alex Rønne Petersen <alex@alexrp.com> | 2025-02-06 15:00:48 +0100 |
| commit | 1c07eacc7f26d2545d4c2149e3e3513875951370 (patch) | |
| tree | 130b8ec167c7fc61cfdd852e0c1907dc553e092e /lib/std/process.zig | |
| parent | 62e251dcaa366c15e1e591d859738bb0d735dc9a (diff) | |
| download | zig-1c07eacc7f26d2545d4c2149e3e3513875951370.tar.gz zig-1c07eacc7f26d2545d4c2149e3e3513875951370.zip | |
std.process: adding hasNonEmptyEnvVar() and using for NO_COLOR
Diffstat (limited to 'lib/std/process.zig')
| -rw-r--r-- | lib/std/process.zig | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/std/process.zig b/lib/std/process.zig index 34072a4d31..bc798e68e0 100644 --- a/lib/std/process.zig +++ b/lib/std/process.zig @@ -431,6 +431,20 @@ pub fn hasEnvVarConstant(comptime key: []const u8) bool { } } +/// On Windows, `key` must be valid UTF-8. +pub fn hasNonEmptyEnvVarConstant(comptime key: []const u8) bool { + if (native_os == .windows) { + const key_w = comptime unicode.utf8ToUtf16LeStringLiteral(key); + const value = getenvW(key_w) orelse return false; + return value.len != 0; + } else if (native_os == .wasi and !builtin.link_libc) { + @compileError("hasNonEmptyEnvVarConstant is not supported for WASI without libc"); + } else { + const value = posix.getenv(key) orelse return false; + return value.len != 0; + } +} + pub const ParseEnvVarIntError = std.fmt.ParseIntError || error{EnvironmentVariableNotFound}; /// Parses an environment variable as an integer. @@ -477,6 +491,27 @@ pub fn hasEnvVar(allocator: Allocator, key: []const u8) HasEnvVarError!bool { } } +/// On Windows, if `key` is not valid [WTF-8](https://simonsapin.github.io/wtf-8/), +/// then `error.InvalidWtf8` is returned. +pub fn hasNonEmptyEnvVar(allocator: Allocator, key: []const u8) HasEnvVarError!bool { + if (native_os == .windows) { + var stack_alloc = std.heap.stackFallback(256 * @sizeOf(u16), allocator); + const stack_allocator = stack_alloc.get(); + const key_w = try unicode.wtf8ToWtf16LeAllocZ(stack_allocator, key); + defer stack_allocator.free(key_w); + const value = getenvW(key_w) orelse return false; + return value.len != 0; + } else if (native_os == .wasi and !builtin.link_libc) { + var envmap = getEnvMap(allocator) catch return error.OutOfMemory; + defer envmap.deinit(); + const value = envmap.getPtr(key) orelse return false; + return value.len != 0; + } else { + const value = posix.getenv(key) orelse return false; + return value.len != 0; + } +} + /// Windows-only. Get an environment variable with a null-terminated, WTF-16 encoded name. /// /// This function performs a Unicode-aware case-insensitive lookup using RtlEqualUnicodeString. |
