Browse Source

Add `gb_get_env`

gingerBill 4 years ago
parent
commit
583fd89fcf
1 changed files with 42 additions and 0 deletions
  1. 42 0
      src/gb/gb.h

+ 42 - 0
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?