#include "env.h" #include "../malloc/malloc.h" #include "../cstr/cstr.h" char **envp; u64 envsize = 0; #define ENVSIZEINC 16 char **__getenvpair(const char *key); u8 __match_env_key(const char *p, const char *key); const char *getenv(const char *key) { char **p = __getenvpair(key); const char *value; if (p == 0) return ""; value = *p; while (*value != '=') ++value; return ++value; } void setenv(const char *key, const char *value) { char **p = __getenvpair(key); if (p == 0) { p = envp; while (*p) ++p; if (p - envp >= envsize) { if (envsize == 0) { for (; *(envp + envsize); ++envsize); char **nenvp = malloc(sizeof(char *) * (envsize + ENVSIZEINC)); p = nenvp; while (p < nenvp + envsize + ENVSIZEINC) *(p++) = 0; p = nenvp; while (*envp) *(p++) = *(envp++); envp = nenvp; } else { envp = realloc(envp, envsize + ENVSIZEINC); } p = envp + envsize; envsize += ENVSIZEINC; } } *p = malloc((cstr_length(key) + cstr_length(key)) + 2); char *i = *p; while (*key) *(i++) = *(key++); *(i++) = '='; while (*value) *(i++) = *(value++); *i = 0; } char **__getenvpair(const char *key) { char **p = envp; while (*p) { if (__match_env_key(*p, key)) { return p; } ++p; } return 0; } const char **getenvp() { return (const char**)envp; } u8 __match_env_key(const char *p, const char *key) { while (*key && *p) { if (*key != *p) return 0; ++p; ++key; } if (*p != '=') return 0; return 1; } void init_env(int argc, const char **argv, char **envp__) { envp = envp__; } #ifdef ENV_UNIT_TEST #include "../io/io.h" int main(int argc, const char **argv) { wstdf("TEST: %s\n", getenv("TEST")); setenv("TEST", "Hello, World!"); wstdf("TEST: %s\n", getenv("TEST")); } #endif