diff options
| -rw-r--r-- | main.c | 11 | ||||
| -rw-r--r-- | parse.c | 32 | ||||
| -rw-r--r-- | parse.h | 2 |
3 files changed, 22 insertions, 23 deletions
@@ -21,11 +21,16 @@ int main() { .chunks = make_ChunkVec(256), .regions = make_RegionVec(256), }; - TokenPtrVec line_toks = lex(line, &arena); - /* - Pipeline pl = parse_tokstream(res.top_tokens); + TokenPtrVec line_tok_ptrs = lex(line, &arena); + Token* tokstream = malloc(sizeof(Token) * line_tok_ptrs.count); + for (int i = 0; i < line_tok_ptrs.count; i++) { + tokstream[i] = **get_from_TokenPtrVec(&line_tok_ptrs, i); + } + Pipeline pl = parse_tokstream(tokstream); + /* run_pipeline(pl, &shstate); */ + free(tokstream); } free(line); } @@ -5,40 +5,34 @@ #include "parse.h" -typedef struct { - TokenVec vec; - size_t pos; -} TokStream; - - -Connector parse_connector(TokStream* toks) { - Token tok = *get_from_TokenVec(&toks->vec, toks->pos); +Connector parse_connector(Token* toks, size_t* tok_pos) { + Token tok = toks[*tok_pos]; if (tok.kind != TOK_SPECIAL) exit(67); switch (tok.as.spec) { case PIPE: - toks->pos++; + (*tok_pos)++; return CONN_PIPE; case EOL: - toks->pos++; + (*tok_pos)++; return CONN_EOL; default: exit(76); } } -Command parse_command(TokStream* toks) { +Command parse_command(Token* toks, size_t* tok_pos) { TokenVec args = make_TokenVec(256); RedirectVec redirects = make_RedirectVec(256); while (true) { - Token curr_tok = *get_from_TokenVec(&toks->vec, toks->pos); + Token curr_tok = toks[*tok_pos]; if (curr_tok.kind == TOK_SPECIAL &&(curr_tok.as.spec == PIPE || curr_tok.as.spec == EOL)) { break; } switch (curr_tok.kind) { case TOK_SPECIAL: - toks->pos++; - Token name_tok = *get_from_TokenVec(&toks->vec, toks->pos); + (*tok_pos)++; + Token name_tok = toks[*tok_pos]; switch (curr_tok.as.spec) { case WRITE_REDIR_TRUNC: if(name_tok.kind != TOK_WORD) exit(1); @@ -59,18 +53,18 @@ Command parse_command(TokStream* toks) { default: push_to_TokenVec(&args, curr_tok); } - toks->pos++; + (*tok_pos)++; } return (Command){.args = args, .redirects = redirects}; } -Pipeline parse_tokstream(TokenVec tok_vec) { - TokStream tokstream = {.vec = tok_vec, .pos = 0}; +Pipeline parse_tokstream(Token* toks) { + size_t tok_pos = 0; Pipeline result = make_Pipeline(256); while (true) { - Command cmd = parse_command(&tokstream); - Connector conn = parse_connector(&tokstream); + Command cmd = parse_command(toks, &tok_pos); + Connector conn = parse_connector(toks, &tok_pos); push_to_Pipeline(&result, (PipelineElement){.cmd = cmd, .conn = conn}); if (conn == CONN_EOL) break; } @@ -46,7 +46,7 @@ typedef struct { DECLARE_VEC(PipelineElement, Pipeline) -Pipeline parse_tokstream(TokenVec toks); +Pipeline parse_tokstream(Token* tokstream); |
