diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-08 13:19:56 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-08 13:19:56 +0100 |
| commit | d7229970f8910aa756d299f8bdceee7f4d1fbfbc (patch) | |
| tree | a95ff2e6bd50578d34d6449c9fde173acc0ef59c /lib/env/env.c | |
| parent | e947b1459f93f11ad91f3e920676fe1b828281e7 (diff) | |
add env and make smash be able to parse files with comments
Diffstat (limited to 'lib/env/env.c')
| -rw-r--r-- | lib/env/env.c | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/lib/env/env.c b/lib/env/env.c index d52c3f3..7ceaa15 100644 --- a/lib/env/env.c +++ b/lib/env/env.c @@ -1,16 +1,19 @@ #include "env.h" #include "../malloc/malloc.h" +#include "../cstr/cstr.h" -const char **envp; +char **envp; +u64 envsize = 0; +#define ENVSIZEINC 16 -const char **__getenvpair(const char *key); +char **__getenvpair(const char *key); u8 __match_env_key(const char *p, const char *key); const char *getenv(const char *key) { - const char **p = __getenvpair(key); + char **p = __getenvpair(key); const char *value; if (p == 0) @@ -25,14 +28,44 @@ const char *getenv(const char *key) void setenv(const char *key, const char *value) { - const char **p = __getenvpair(key); - *p = 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; } -const char **__getenvpair(const char *key) +char **__getenvpair(const char *key) { - const char **p = envp; + char **p = envp; while (*p) { if (__match_env_key(*p, key)) { @@ -48,7 +81,7 @@ const char **__getenvpair(const char *key) const char **getenvp() { - return envp; + return (const char**)envp; } @@ -69,7 +102,7 @@ u8 __match_env_key(const char *p, const char *key) return 1; } -void init_env(int argc, const char **argv, const char **envp__) +void init_env(int argc, const char **argv, char **envp__) { envp = envp__; } @@ -80,7 +113,9 @@ void init_env(int argc, const char **argv, const char **envp__) int main(int argc, const char **argv) { - wstdf("HOME: %s\n", getenv("HOSTNAME")); + wstdf("TEST: %s\n", getenv("TEST")); + setenv("TEST", "Hello, World!"); + wstdf("TEST: %s\n", getenv("TEST")); } #endif |