summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÁkos Kőrösi <korakos99@gmail.com>2026-05-21 12:37:53 +0200
committerÁkos Kőrösi <korakos99@gmail.com>2026-05-21 12:37:53 +0200
commit2efe642849cf6d45d5413cd77d8cafaf9b32db00 (patch)
tree330566486caf1529061c6bac605ced61fc4bfdb7
parentada233bdfc6cb7a59cd00016cef0b263eb30e6e5 (diff)
make redirects work
-rw-r--r--redes/lexparse.c4
-rw-r--r--redes/preproc.c20
2 files changed, 24 insertions, 0 deletions
diff --git a/redes/lexparse.c b/redes/lexparse.c
index 4b0fffc..3a55b33 100644
--- a/redes/lexparse.c
+++ b/redes/lexparse.c
@@ -162,6 +162,10 @@ TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_po
}
MaybeSpecialToken m_spec = recognize_spec_token(line, pos);
if (m_spec.some) {
+ MaybeToken m_tok = consolidate_buffer(&buf);
+ if (m_tok.some) {
+ push_to_TokenVec(&tokens, m_tok.value);
+ }
push_to_TokenVec(&tokens, (Token){.kind = TOK_SPEC, .as.spec = m_spec.value});
continue;
}
diff --git a/redes/preproc.c b/redes/preproc.c
index 9448831..63e618f 100644
--- a/redes/preproc.c
+++ b/redes/preproc.c
@@ -78,6 +78,8 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
PlCommand* root_pl;
for (int i = 0; i < exp_tokens.count; i++) {
ExpandedToken curr_tok = *get_from_ExpandedTokenVec(&exp_tokens, i);
+ ExpandedToken next_tok;
+ Redirect rd;
switch (curr_tok.kind) {
case TOK_WORD:
push_to_ArgVec(&curr_cmd.args, (Arg){.kind = ARG_LIT, .as.lit_str = curr_tok.as.word});
@@ -94,6 +96,24 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
case OP_EOL:
push_to_Pipeline(&pl, curr_cmd);
break;
+ case OP_REDIR_R:
+ next_tok = *get_from_ExpandedTokenVec(&exp_tokens, ++i);
+ assert(next_tok.kind == TOK_WORD);
+ rd = (Redirect){.kind = REDIR_READ, .as.filename = next_tok.as.word};
+ push_to_RedirectVec(&curr_cmd.redirects, rd);
+ break;
+ case OP_REDIR_W_APPEND:
+ next_tok = *get_from_ExpandedTokenVec(&exp_tokens, ++i);
+ assert(next_tok.kind == TOK_WORD);
+ rd = (Redirect){.kind = REDIR_WRITE_APPEND, .as.filename = next_tok.as.word};
+ push_to_RedirectVec(&curr_cmd.redirects, rd);
+ break;
+ case OP_REDIR_W_TRUNC:
+ next_tok = *get_from_ExpandedTokenVec(&exp_tokens, ++i);
+ assert(next_tok.kind == TOK_WORD);
+ rd = (Redirect){.kind = REDIR_WRITE_TRUNC, .as.filename = next_tok.as.word};
+ push_to_RedirectVec(&curr_cmd.redirects, rd);
+ break;
default:
exit(63);
}