diff options
| author | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-18 18:21:06 +0200 |
|---|---|---|
| committer | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-18 18:21:06 +0200 |
| commit | 5e02368fe8042626bf740ff52980651146b608a4 (patch) | |
| tree | dba8f443faabf591a5d228120286966122897316 | |
| parent | ca675175742174d6bfcd0263583f840e250fc58f (diff) | |
make it work again
| -rw-r--r-- | exec.c | 16 | ||||
| -rw-r--r-- | expand.c | 3 | ||||
| -rw-r--r-- | expand.h | 1 | ||||
| -rw-r--r-- | preproc.c | 18 |
4 files changed, 22 insertions, 16 deletions
@@ -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; } @@ -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}); @@ -1,6 +1,5 @@ # pragma once -#include "exec.h" #include "preproc.h" #include "utils.h" @@ -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 '<': |
