summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exec.c58
-rw-r--r--exec.h19
-rw-r--r--main.c6
3 files changed, 56 insertions, 27 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);
+ }
}
diff --git a/exec.h b/exec.h
new file mode 100644
index 0000000..11a4eb9
--- /dev/null
+++ b/exec.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "typeutils.h"
+#include "parse.h"
+
+typedef struct {
+ char* key;
+ char* val;
+} StrPair;
+
+DECLARE_VEC(StrPair, KeyValMap)
+DECLARE_MAYBE(char*, MaybeStr)
+
+typedef struct {
+ KeyValMap aliases;
+ KeyValMap shell_vars;
+} ShellState;
+
+void run_pipeline(Pipeline pl, ShellState* shstate);
diff --git a/main.c b/main.c
index 70382c4..e2414d5 100644
--- a/main.c
+++ b/main.c
@@ -5,10 +5,11 @@
#include "lex.h"
#include "parse.h"
+#include "exec.h"
void uglyprint_pl(Pipeline pl) {
for (int i = 0; i < pl.count; i++) {
- printf("%d\n");
+ printf("%d\n", i);
TokenVec toks = (*get_from_Pipeline(&pl, i)).cmd.args;
for (int j = 0; j < toks.count; j++) {
Token tok = *get_from_TokenVec(&toks, j);
@@ -30,13 +31,14 @@ void uglyprint_pl(Pipeline pl) {
int main() {
char* line;
+ ShellState shstate = {.shell_vars = make_KeyValMap(1), .aliases = make_KeyValMap(1)};
while (1) {
line = readline("$ ");
if (line[0] == '\0') continue;
if (strcmp(line, "exit") == 0) exit(0);
LexResult res = lex(line);
Pipeline pl = parse_tokstream(res.top_tokens);
- uglyprint_pl(pl);
+ run_pipeline(pl, &shstate);
}
free(line);
}