summaryrefslogtreecommitdiff
path: root/redes
diff options
context:
space:
mode:
Diffstat (limited to 'redes')
-rw-r--r--redes/preproc.c102
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);
}