diff options
| author | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-22 14:09:14 +0200 |
|---|---|---|
| committer | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-22 14:09:14 +0200 |
| commit | 7a106ea8332ed6d95504fd3181f7b5f81a6c3072 (patch) | |
| tree | fcc7eccd435a42f062b87f6cd549658023b9437b /src/preproc.c | |
| parent | 6d36e6517d5fdf02a583fa276d009f462da3ed84 (diff) | |
start work on cmdsub
Diffstat (limited to 'src/preproc.c')
| -rw-r--r-- | src/preproc.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/preproc.c b/src/preproc.c index 8865968..9c26c5f 100644 --- a/src/preproc.c +++ b/src/preproc.c @@ -1,7 +1,11 @@ #include <assert.h> #include <stdio.h> +#include <unistd.h> +#include <stdlib.h> + #include "syntax.h" #include "utils.h" +#include "stages.h" typedef struct { @@ -35,6 +39,28 @@ void split_str_on_space(char* str, StrVec* result) { } +char* get_cmdsub_output(TokenVec sub_region, ShellState* shstate) { + int pipe_fds[2]; + pipe(pipe_fds); + + PipelineTree sub_tree = process_ast(sub_region, shstate); + // TODO: tree cleanup + + execute_pipeline_tree(*sub_tree.root, shstate, STDIN_FILENO, pipe_fds[1]); + + String output_buf = make_String(256); + + char str_buf[256]; + ssize_t len; + while ((len = read(pipe_fds[0], str_buf, sizeof(str_buf))) > 0) { + append_str_to_String(&output_buf, str_buf); + } + close(pipe_fds[0]); + close(pipe_fds[1]); + return inner(&output_buf); +} + + void process_chunk(Chunk chunk, SplitBuilder* builder, ShellState* shstate) { assert(!(chunk.qmode == SINGLE_Q && chunk.kind != CHUNK_LIT)); @@ -46,6 +72,9 @@ void process_chunk(Chunk chunk, SplitBuilder* builder, ShellState* shstate) { case CHUNK_VAR: chunk_str = get_var(chunk.as.varname, shstate); break; + case CHUNK_CMDSUB: + chunk_str = get_cmdsub_output(*(TokenVec*)chunk.as.cmdsub_toks, shstate); + break; default: exit(77); } @@ -146,7 +175,7 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool, ShellSta 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}; + rd = (Redirect){.kind = REDIR_WRITE_TRUNC, .as.filename = next_tok.as.word}; push_to_RedirectVec(&curr_cmd.redirects, rd); break; default: @@ -168,8 +197,9 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool, ShellSta } -PipelineTree process_ast(Ast ast, ShellState* shstate) { +PipelineTree process_ast(TokenVec root, ShellState* shstate) { PipelineVec pls = make_PipelineVec(256); - Pipeline* root_pl = process_token_sequence(*ast.root, &pls, shstate); + Pipeline* root_pl = process_token_sequence(root, &pls, shstate); return (PipelineTree){.pl_pool = pls, root_pl}; + // TODO: ast cleanup } |
