summaryrefslogtreecommitdiff
path: root/src/preproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/preproc.c')
-rw-r--r--src/preproc.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/src/preproc.c b/src/preproc.c
index d64f4c3..6aa7748 100644
--- a/src/preproc.c
+++ b/src/preproc.c
@@ -1,6 +1,7 @@
#include <assert.h>
#include <stdio.h>
#include "syntax.h"
+#include "utils.h"
void split_str_on_space(char* str, StrVec* result) {
String buf = make_String(256);
@@ -19,23 +20,34 @@ void split_str_on_space(char* str, StrVec* result) {
}
}
-StrVec process_word(Word word) {
+
+void process_chunk(Chunk chunk, StrVec* result, ShellState* shstate) {
+ assert(!(chunk.qmode == SINGLE_Q && chunk.kind != CHUNK_LIT));
+
+ char* chunk_val;
+ switch (chunk.kind) {
+ case CHUNK_LIT:
+ chunk_val = chunk.as.lit_str;
+ break;
+ case CHUNK_VAR:
+ chunk_val = get_var(chunk.as.varname, shstate);
+ break;
+ default:
+ exit(77);
+ }
+
+ if (chunk.qmode == UN_Q) {
+ split_str_on_space(chunk_val, result);
+ } else {
+ push_to_StrVec(result, chunk_val);
+ }
+}
+
+StrVec process_word(Word word, ShellState* shstate) {
StrVec result = make_StrVec(256);
for (int i = 0; i < word.count; i++) {
Chunk chunk = *get_from_Word(&word, i);
- switch (chunk.qmode) {
- case SINGLE_Q:
- push_to_StrVec(&result, chunk.as.lit_str);
- break;
- case DOUBLE_Q:
- // TODO
- exit(67);
- break;
- case UN_Q:
- // TODO: this only does literals, implement the rest
- split_str_on_space(chunk.as.lit_str, &result);
- break;
- }
+ process_chunk(chunk, &result, shstate);
}
return result;
}
@@ -51,7 +63,8 @@ typedef struct {
DECLARE_VEC(ExpandedToken, ExpandedTokenVec)
-Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
+
+Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool, ShellState* shstate) {
ExpandedTokenVec exp_tokens = make_ExpandedTokenVec(256);
@@ -63,7 +76,7 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
push_to_ExpandedTokenVec(&exp_tokens, (ExpandedToken){.kind = TOK_SPEC, .as.spec = tok.as.spec});
break;
case TOK_WORD:
- strs = process_word(tok.as.word);
+ strs = process_word(tok.as.word, shstate);
for (int n = 0; n < strs.count; n++) {
push_to_ExpandedTokenVec(&exp_tokens, (ExpandedToken){.kind = TOK_WORD, .as.word = *get_from_StrVec(&strs, n)});
}
@@ -120,11 +133,11 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
}
break;
case SPEC_SUB_IN:
- sub_pl = process_token_sequence(*(TokenVec*)curr_tok.as.spec.as.proc_sub_region, pl_pool);
+ sub_pl = process_token_sequence(*(TokenVec*)curr_tok.as.spec.as.proc_sub_region, pl_pool, shstate);
push_to_ArgVec(&curr_cmd.args, (Arg){.kind = ARG_PS_IN, .as.sub_pipeline = sub_pl});
break;
case SPEC_SUB_OUT:
- sub_pl = process_token_sequence(*(TokenVec*)curr_tok.as.spec.as.proc_sub_region, pl_pool);
+ sub_pl = process_token_sequence(*(TokenVec*)curr_tok.as.spec.as.proc_sub_region, pl_pool, shstate);
push_to_ArgVec(&curr_cmd.args, (Arg){.kind = ARG_PS_OUT, .as.sub_pipeline = sub_pl});
break;
}
@@ -134,8 +147,8 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
}
-PipelineTree process_ast(Ast ast) {
+PipelineTree process_ast(Ast ast, ShellState* shstate) {
PipelineVec pls = make_PipelineVec(256);
- Pipeline* root_pl = process_token_sequence(*ast.root, &pls);
+ Pipeline* root_pl = process_token_sequence(*ast.root, &pls, shstate);
return (PipelineTree){.pl_pool = pls, root_pl};
}