diff options
Diffstat (limited to 'exec.c')
| -rw-r--r-- | exec.c | 58 |
1 files changed, 33 insertions, 25 deletions
@@ -1,18 +1,11 @@ #include "lex.h" #include "parse.h" -#include "typeutils.h" +#include "exec.h" + +#include <stdio.h> #include <stdlib.h> #include <string.h> -typedef struct { - char* key; - char* val; -} StrPair; - -DECLARE_VEC(StrPair, KeyValMap) - -DECLARE_MAYBE(char*, MaybeStr) - void set_map_pair(KeyValMap* map, char* key, char* val) { for (int i = 0; i < map->count; i++) { char* key_i = get_from_KeyValMap(map, i)->key; @@ -54,11 +47,6 @@ void unset_map_key(KeyValMap* map, char* key) { } -typedef struct { - KeyValMap aliases; - KeyValMap shell_vars; -} ShellState; - char* get_var(char* varname, ShellState* shstate) { MaybeStr maybe_varval = get_map_value(&shstate->shell_vars, varname); @@ -136,20 +124,40 @@ StrVec expand_word(Word word, ShellState* state) { */ } -char** expand_token(Token token, ShellState* shstate) { - // TODO: alias expansion - - - // TODO: make some kind of extractor for the Vec-s that returns a regular T*-type NULL-term array - // TODO: we need to split strs on spaces - exit(1); +void merge_strvecs(StrVec* target, StrVec* source) { + for (int i = 0; i < source->count; i++) { + push_to_StrVec(target, *get_from_StrVec(source, i)); + } } -void command_thing(Command command, ShellState* shtate) { - char** +void command_thing(Command command, ShellState* shstate) { + StrVec arg_str_vec = make_StrVec(256); + for (int i = 0; i < command.args.count; i++) { + Token arg_i = *get_from_TokenVec(&command.args, i); + StrVec expanded_i; + switch (arg_i.kind) { + case TOK_WORD: + expanded_i = expand_word(arg_i.as.word, shstate); + merge_strvecs(&arg_str_vec, &expanded_i); + break; + default: + exit(67); + } + } + int argcount = arg_str_vec.count; + char** arg_str_arr = malloc(sizeof(char*) * argcount); + for (int j = 0; j < argcount; j++) { + arg_str_arr[j] = *get_from_StrVec(&arg_str_vec, j); + } + for (int k = 0; k < argcount; k++) { + printf("\t\tArg%d: %s\n", k, arg_str_arr[k]); + } } void run_pipeline(Pipeline pl, ShellState* shstate) { - + for (int i = 0; i < pl.count; i++) { + printf("\tCommand %d:\n", i); + command_thing(get_from_Pipeline(&pl, i)->cmd, shstate); + } } |
