summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exec.c16
-rw-r--r--expand.c3
-rw-r--r--expand.h1
-rw-r--r--preproc.c18
4 files changed, 22 insertions, 16 deletions
diff --git a/exec.c b/exec.c
index d683099..e58a89b 100644
--- a/exec.c
+++ b/exec.c
@@ -13,6 +13,7 @@
void execute_command(Command cmd, int* pgid) {
+
pid_t pid = fork();
if (pid == 0) {
@@ -52,18 +53,20 @@ void execute_command(Command cmd, int* pgid) {
}
}
-Command make_command(SlotVec cmd_slots) {
+Command make_command(ExpandedPipelineElement elem) {
Command cmd = {
.child_close_fds = make_IntVec(64),
.parent_close_fds = make_IntVec(64),
- .redirs = make_FdRedirectVec(32)
+ .redirs = make_FdRedirectVec(32),
+ .term = elem.conn,
};
StrVec arg_strs = make_StrVec(256);
- for (int i = 0; i < cmd_slots.count; i++) {
- Slot slot = *get_from_SlotVec(&cmd_slots, i);
+ for (int i = 0; i < elem.cmd_slots.count; i++) {
+ Slot slot = *get_from_SlotVec(&elem.cmd_slots, i);
switch (slot.kind) {
case SLOT_STR:
push_to_StrVec(&arg_strs, slot.as.str);
+ break;
default:
exit(67);
// TODO: other slot kinds
@@ -94,7 +97,7 @@ void run_cmds(CommandVec cmds) {
}
cmd.stdout_fd = STDOUT_FILENO;
- if (cmd.term = CONN_PIPE) {
+ if (cmd.term == CONN_PIPE) {
int pipe_fds[2];
pipe(pipe_fds);
cmd.stdout_fd = pipe_fds[1];
@@ -120,9 +123,10 @@ CommandVec make_cmd_vec_pl(ExpandedPipeline pl) {
CommandVec cmds = make_CommandVec(256);
for (int i = 0; i < pl.count; i++) {
ExpandedPipelineElement elem = *get_from_ExpandedPipeline(&pl, i);
- Command cmd = make_command(elem.cmd_slots);
+ Command cmd = make_command(elem);
push_to_CommandVec(&cmds, cmd);
}
+ return cmds;
}
diff --git a/expand.c b/expand.c
index e88ec6c..11764f9 100644
--- a/expand.c
+++ b/expand.c
@@ -62,6 +62,9 @@ void expand_word(Word word, SlotVec* target, ShellState* shstate) {
break;
}
}
+ if (curr_res.active_str.count > 0) {
+ push_to_StrVec(&curr_res.complete_strs, inner(&curr_res.active_str));
+ }
for (int j = 0; j < curr_res.complete_strs.count; j++) {
char* str = *get_from_StrVec(&curr_res.complete_strs, j);
push_to_SlotVec(target, (Slot){.kind = SLOT_STR, .as.str = str});
diff --git a/expand.h b/expand.h
index 8d00a72..b353f39 100644
--- a/expand.h
+++ b/expand.h
@@ -1,6 +1,5 @@
# pragma once
-#include "exec.h"
#include "preproc.h"
#include "utils.h"
diff --git a/preproc.c b/preproc.c
index 1d9e921..4cd1c5b 100644
--- a/preproc.c
+++ b/preproc.c
@@ -206,11 +206,11 @@ TokenPtrVec lex_level(RawLine* line, char until, PreprocArena* arena) {
continue;
}
+ Token* tok_ptr;
+
switch (line->str[line->pos]) {
case '\'':
- Chunk sqchunk = collect_single_quoted_section(line);
- Chunk* sqptr = push_to_ChunkVec(&arena->chunks, sqchunk);
- push_to_Word(&state.word_germ, sqptr);
+ push_to_Word(&state.word_germ, push_to_ChunkVec(&arena->chunks, collect_single_quoted_section(line)));
break;
case '\"':
lex_double_quoted_section(line, &state.word_germ, arena);
@@ -218,7 +218,7 @@ TokenPtrVec lex_level(RawLine* line, char until, PreprocArena* arena) {
case '|':
line->pos++;
close_word_and_lit_germs(&state, &line_toks, arena);
- Token* tok_ptr = push_to_TokenVec(&arena->tokens, (Token){.kind = TOK_SPECIAL, .as.spec = PIPE});
+ tok_ptr = push_to_TokenVec(&arena->tokens, (Token){.kind = TOK_SPECIAL, .as.spec = PIPE});
push_to_TokenPtrVec(&line_toks, tok_ptr);
break;
case '$':
@@ -245,17 +245,17 @@ TokenPtrVec lex_level(RawLine* line, char until, PreprocArena* arena) {
Region subreg = {.mode = CMDS, .tokens = sub_regtoks};
Region* subreg_ptr = push_to_RegionVec(&arena->regions, subreg);
Token tok = {.kind = TOK_PROCSUB_OUT, .as.procsub_region = subreg_ptr};
- Token* tok_ptr = push_to_TokenVec(&arena->tokens, tok);
+ tok_ptr = push_to_TokenVec(&arena->tokens, tok);
push_to_TokenPtrVec(&line_toks, tok_ptr);
break;
case '>':
line->pos++;
- Token* tok_ptr2 = push_to_TokenVec(&arena->tokens, (Token){.kind = TOK_SPECIAL, .as.spec = WRITE_REDIR_APPEND});
- push_to_TokenPtrVec(&line_toks, tok_ptr2);
+ tok_ptr = push_to_TokenVec(&arena->tokens, (Token){.kind = TOK_SPECIAL, .as.spec = WRITE_REDIR_APPEND});
+ push_to_TokenPtrVec(&line_toks, tok_ptr);
break;
default:
- Token* tok_ptr3 = push_to_TokenVec(&arena->tokens, (Token){.kind = TOK_SPECIAL, .as.spec = WRITE_REDIR_TRUNC});
- push_to_TokenPtrVec(&line_toks, tok_ptr3);
+ tok_ptr = push_to_TokenVec(&arena->tokens, (Token){.kind = TOK_SPECIAL, .as.spec = WRITE_REDIR_TRUNC});
+ push_to_TokenPtrVec(&line_toks, tok_ptr);
}
break;
case '<':