From 583fd89fcf20e4efb0f15f65d29445b874ce980b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 25 Apr 2021 21:22:15 +0100 Subject: [PATCH] Add `gb_get_env` --- src/gb/gb.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/gb/gb.h b/src/gb/gb.h index 60e7b8e64..876078cc8 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -2169,6 +2169,7 @@ GB_DEF f64 gb_random_range_f64 (gbRandom *r, f64 lower_inc, f64 higher_inc GB_DEF void gb_exit (u32 code); GB_DEF void gb_yield (void); +GB_DEF char const *gb_get_env (char const *name, gbAllocator allocator); GB_DEF void gb_set_env (char const *name, char const *value); GB_DEF void gb_unset_env(char const *name); @@ -9174,6 +9175,47 @@ gb_inline void gb_yield(void) { #endif } +char const *gb_get_env(char const *name, gbAllocator allocator) { + #if defined(GB_SYSTEM_WINDOWS) + if (!name || *name) { + return NULL; + } else { + // TODO(bill): Should this be a Wide version? + DWORD cap = 100; + char *buf = gb_alloc_array(allocator, char, cap); + for (;;) { + DWORD n = GetEnvironmentVariableA(name, buf, cap-1); + if (n == 0) { + DWORD err = GetLastError(); + if (err == ERROR_ENVVAR_NOT_FOUND) { + return NULL; + } + } + + if (n <= cap) { + buf[n] = 0; + return buf; + } + + + buf = cast(char *)gb_resize(allocator, buf, gb_size_of(char)*cap, gb_size_of(char)*cap*2); + cap = cap*2; + } + } + #else + if (!name || *name) { + return NULL; + } else { + char const *res = getenv(name); + if (!res) { + return NULL; + } + return gb_alloc_str(allocator, res); + } + #endif +} + + gb_inline void gb_set_env(char const *name, char const *value) { #if defined(GB_SYSTEM_WINDOWS) // TODO(bill): Should this be a Wide version?