diff options
Diffstat (limited to 'redes/preproc.c')
| -rw-r--r-- | redes/preproc.c | 102 |
1 files changed, 59 insertions, 43 deletions
diff --git a/redes/preproc.c b/redes/preproc.c index 428ff69..9448831 100644 --- a/redes/preproc.c +++ b/redes/preproc.c @@ -40,54 +40,70 @@ StrVec process_word(Word word) { return result; } + +typedef struct { + TokenKind kind; + union { + char* word; + SpecialToken spec; + } as; +} ExpandedToken; + +DECLARE_VEC(ExpandedToken, ExpandedTokenVec) + Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) { + + ExpandedTokenVec exp_tokens = make_ExpandedTokenVec(256); + + for (int m = 0; m < tokens.count; m++) { + Token tok = *get_from_TokenVec(&tokens, m); + StrVec strs; + switch (tok.kind) { + case TOK_SPEC: + push_to_ExpandedTokenVec(&exp_tokens, (ExpandedToken){.kind = TOK_SPEC, .as.spec = tok.as.spec}); + break; + case TOK_WORD: + strs = process_word(tok.as.word); + for (int n = 0; n < strs.count; n++) { + push_to_ExpandedTokenVec(&exp_tokens, (ExpandedToken){.kind = TOK_WORD, .as.word = *get_from_StrVec(&strs, n)}); + } + } + } + Pipeline pl = make_Pipeline(256); size_t tok_pos = 0; - while (tok_pos < tokens.count) { - PlCommand pl_cmd = { - .args = make_ArgVec(256), - .redirects = make_RedirectVec(256), - .conn = CONN_EOL, - }; - Token curr_tok; - for (; - ( - curr_tok = *get_from_TokenVec(&tokens, tok_pos), - !(curr_tok.kind == TOK_SPEC && curr_tok.as.spec.kind == SPEC_OP && (curr_tok.as.spec.as.op == OP_PIPE || curr_tok.as.spec.as.op == OP_EOL)) - ); - tok_pos++ - ) { - StrVec exp_word = make_StrVec(256); - switch (curr_tok.kind) { - case TOK_WORD: - exp_word = process_word(curr_tok.as.word); - for (int j = 0; j < exp_word.count; j++) { - char* arg_str = *get_from_StrVec(&exp_word, j); - push_to_ArgVec(&pl_cmd.args, (Arg){.kind = ARG_LIT, .as.lit_str = arg_str}); - } - break; - default: - exit(68); // TODO: the other kinds - } - } - Token delim_tok = *get_from_TokenVec(&tokens, tok_pos++); - assert(delim_tok.kind == TOK_SPEC && delim_tok.as.spec.kind == SPEC_OP); - switch (delim_tok.as.spec.as.op) { - case OP_PIPE: - pl_cmd.conn = CONN_PIPE; - break; - case OP_EOL: - pl_cmd.conn = CONN_EOL; + + PlCommand curr_cmd = {.args = make_ArgVec(256), .redirects = make_RedirectVec(256), .conn = CONN_EOL}; + + PlCommand* root_pl; + for (int i = 0; i < exp_tokens.count; i++) { + ExpandedToken curr_tok = *get_from_ExpandedTokenVec(&exp_tokens, i); + switch (curr_tok.kind) { + case TOK_WORD: + push_to_ArgVec(&curr_cmd.args, (Arg){.kind = ARG_LIT, .as.lit_str = curr_tok.as.word}); break; - default: - exit(69); - } - for (int k = 0; k < pl_cmd.args.count; k++) { - Arg arg = *get_from_ArgVec(&pl_cmd.args, k); + case TOK_SPEC: + switch (curr_tok.as.spec.kind) { + case SPEC_OP: + switch (curr_tok.as.spec.as.op) { + case OP_PIPE: + curr_cmd.conn = CONN_PIPE; + push_to_Pipeline(&pl, curr_cmd); + curr_cmd = (PlCommand){.args = make_ArgVec(256), .redirects = make_RedirectVec(256), .conn = CONN_EOL}; + break; + case OP_EOL: + push_to_Pipeline(&pl, curr_cmd); + break; + default: + exit(63); + } + break; + default: + exit(62); + } } - push_to_Pipeline(&pl, pl_cmd); - } - return push_to_PipelineVec(pl_pool, pl); + } + return push_to_PipelineVec(pl_pool, pl); } |
