diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-09 18:05:28 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-09 18:05:28 +0100 |
| commit | 799d930c2540933c23a1b6ba28e8e5e4f3bccb64 (patch) | |
| tree | 7a714abcafc48060b832e7b33c64ab8e1b29a559 /smash/env.c | |
| parent | 9153b4062c7b6db6119e035dc5e53184aac9fa3a (diff) | |
add variable system via env
Diffstat (limited to 'smash/env.c')
| -rw-r--r-- | smash/env.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/smash/env.c b/smash/env.c new file mode 100644 index 0000000..1bf7e21 --- /dev/null +++ b/smash/env.c @@ -0,0 +1,85 @@ +#include "../lib/env/env.h" +#include "../lib/cstr/cstr.h" +#include "../lib/malloc/malloc.h" + +#include "../lib/io/io.h" + +#include "env.h" + +void clear_buf(char *buf, u64 size) +{ + for (int i = 0; i < size; ++i) buf[i] = 0; +} + +void init_arg_env(int argc, const char **argv) +{ + char buf[32]; + u64_to_cstr(argc - 1, buf, 32); + setenv("@", buf); + for (int i = 1; i < argc; ++i) { + clear_buf(buf, 32); + u64_to_cstr(i - 1, buf, 32); + setenv(buf, argv[i]); + } +} + + +char* new_line_and_replace_vars(const char *line, u64 n) +{ + char var[64]; + int size; + char *replaced; + + for (int i = 0; i < n && line[i]; ++i) { + if (line[i] == '$') { + clear_buf(var, 64); + ++i; + for (int j = 0; line[i] && line[i] != ' ';) { + var[j] = line[i]; + ++j; + ++i; + } + + if (cstr_length(var) == 0) { + size++; + } else { + const char *e = getenv(var); + if (e) size += cstr_length(e); + } + } else { + size++; + } + } + + replaced = malloc(size + 1); + int line_pos = 0; + + for (int i = 0; i < size && line[line_pos]; ++i) { + + if (line[line_pos] == '$') { + clear_buf(var, 64); + ++line_pos; + + for (int j = 0; line[line_pos] && line[line_pos] != ' ';) { + var[j] = line[line_pos]; + ++j; + ++line_pos; + } + + if (cstr_length(var)) { + const char *e = getenv(var); + while (*e) { + replaced[i++] = *(e++); + } + } + + } else { + replaced[i] = line[line_pos++]; + } + } + + + replaced[size] = 0; + + return replaced; +} |