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