summaryrefslogtreecommitdiff
path: root/exec.c
diff options
context:
space:
mode:
Diffstat (limited to 'exec.c')
-rw-r--r--exec.c58
1 files changed, 33 insertions, 25 deletions
diff --git a/exec.c b/exec.c
index 7c2b8b5..aefe7e2 100644
--- a/exec.c
+++ b/exec.c
@@ -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);
+ }
}