#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] == '$' && line[i + 1] == '[') { clear_buf(var, 64); i += 2; for (int j = 0; line[i] && line[i] != ']';) { var[j] = line[i]; ++j; ++i; } ++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] == '$' && line[line_pos + 1] == '[') { clear_buf(var, 64); line_pos += 2; for (int j = 0; line[line_pos] && line[line_pos] != ']';) { var[j] = line[line_pos]; ++j; ++line_pos; } ++line_pos; if (cstr_length(var)) { const char *e = getenv(var); while (*e) { replaced[i++] = *(e++); } --i; } } else { replaced[i] = line[line_pos++]; } } replaced[size] = 0; return replaced; }