diff options
Diffstat (limited to 'src/preproc.c')
| -rw-r--r-- | src/preproc.c | 53 |
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}; } |
