aboutsummaryrefslogtreecommitdiff
path: root/smash/env.c
diff options
context:
space:
mode:
Diffstat (limited to 'smash/env.c')
-rw-r--r--smash/env.c85
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;
+}