aboutsummaryrefslogtreecommitdiff
path: root/lib/std/process.zig
diff options
context:
space:
mode:
authorJohn Benediktsson <mrjbq7@gmail.com>2025-02-04 21:19:02 -0800
committerAlex Rønne Petersen <alex@alexrp.com>2025-02-06 15:00:48 +0100
commit1c07eacc7f26d2545d4c2149e3e3513875951370 (patch)
tree130b8ec167c7fc61cfdd852e0c1907dc553e092e /lib/std/process.zig
parent62e251dcaa366c15e1e591d859738bb0d735dc9a (diff)
downloadzig-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.zig35
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.