summaryrefslogtreecommitdiff
path: root/redes/preproc.c
diff options
context:
space:
mode:
authorÁkos Kőrösi <korakos99@gmail.com>2026-05-20 23:59:56 +0200
committerÁkos Kőrösi <korakos99@gmail.com>2026-05-20 23:59:56 +0200
commita5a26f986b6d34269c17f45a98625979da3b7136 (patch)
treeb10a5d17c2261952a662b7393edda91bb1ee3b96 /redes/preproc.c
parente7169456fb85d481a703432dc472cd5fc25f849e (diff)
work on redesign
Diffstat (limited to 'redes/preproc.c')
-rw-r--r--redes/preproc.c84
1 files changed, 80 insertions, 4 deletions
diff --git a/redes/preproc.c b/redes/preproc.c
index f29b058..f9c6e9d 100644
--- a/redes/preproc.c
+++ b/redes/preproc.c
@@ -1,11 +1,87 @@
+#include <assert.h>
#include "syntax.h"
+void split_str_on_space(char* str, StrVec* result) {
+ String buf = make_String(256);
+ for (int pos = 0; str[pos] != '\0'; pos++) {
+ if (str[pos] == ' ') {
+ push_to_StrVec(result, inner(&buf));
+ buf = make_String(256);
+ } else {
+ push_to_String(&buf, str[pos]);
+ }
+ }
+}
+
+StrVec process_word(Word word) {
+ 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;
+ }
+ }
+ return result;
+}
-Pipeline process_token_sequence(TokenVec* token_pool, TokenPtrVec ptr_seq) {
-
+Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
+ 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),
+ };
+ Token curr_tok;
+ for (;
+ (
+ curr_tok = *get_from_TokenVec(&tokens, tok_pos),
+ !(curr_tok.kind == TOK_SPEC && (curr_tok.as.spec == SPEC_PIPE && curr_tok.as.spec == SPEC_EOL))
+ );
+ tok_pos++
+ ) {
+ switch (curr_tok.kind) {
+ case TOK_WORD:
+ StrVec 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(67); // TODO: the other kinds
+ }
+ }
+ Token delim_tok = *get_from_TokenVec(&tokens, tok_pos);
+ assert(delim_tok.kind == TOK_SPEC);
+ switch (delim_tok.as.spec) {
+ case SPEC_PIPE:
+ pl_cmd.conn = CONN_PIPE;
+ break;
+ case SPEC_EOL:
+ pl_cmd.conn = CONN_EOL;
+ break;
+ default:
+ exit(67);
+ }
+ }
+ return push_to_PipelineVec(pl_pool, pl);
}
-Pipeline process_into_pipeline(Ast ast) {
- exit(1);
+PipelineTree process_ast(Ast ast) {
+ PipelineVec pls = make_PipelineVec(256);
+ TokenVec root_toks = *ast.root;
+ Pipeline* root_pl = process_token_sequence(root_toks, &pls);
+ return (PipelineTree){.pl_pool = pls, root_pl};
}