From f67ef17c65aa5acc27c8bb148c2a0c76987c1f00 Mon Sep 17 00:00:00 2001 From: Ákos Kőrösi Date: Fri, 22 May 2026 01:36:49 +0200 Subject: add more builtins --- src/exec.c | 25 ++++++++++++++++++++++--- src/lexparse.c | 2 +- src/syntax.h | 2 +- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/exec.c b/src/exec.c index a65b442..e3ea28f 100644 --- a/src/exec.c +++ b/src/exec.c @@ -26,9 +26,15 @@ MaybeStrPair parse_assignment(char* token) { bool handle_builtin(ExecutableCommand cmd, ShellState* shstate) { - + MaybeStrPair m_assignment; assert(cmd.args[0] != NULL); // TODO: handle id=value assignments + + m_assignment = parse_assignment(cmd.args[0]); + if (m_assignment.some) { + set_map_pair(&shstate->shell_vars, m_assignment.value); + return true; + } if (strcmp(cmd.args[0], "exit") == 0) { exit(0); @@ -38,16 +44,29 @@ bool handle_builtin(ExecutableCommand cmd, ShellState* shstate) { return true; } else if (strcmp(cmd.args[0], "alias") == 0) { // TODO: if no arg1 -> print alias list - MaybeStrPair m_assignment = parse_assignment(cmd.args[1]); + m_assignment = parse_assignment(cmd.args[1]); assert(m_assignment.some); set_map_pair(&shstate->aliases, m_assignment.value); return true; + } else if (strcmp(cmd.args[0], "export") == 0) { + m_assignment = parse_assignment(cmd.args[1]); + assert(m_assignment.some); + setenv(m_assignment.value.key, m_assignment.value.val, 1); + return true; + } else if (strcmp(cmd.args[0], "unalias") == 0) { + assert(cmd.args[1] != NULL); + unset_map_key(&shstate->aliases, cmd.args[1]); + return true; + } else if (strcmp(cmd.args[0], "unset") == 0) { + assert(cmd.args[1] != NULL); + unset_map_key(&shstate->shell_vars, cmd.args[1]); + return true; } return false; } void execute_cmd(ExecutableCommand cmd, int* pgid) { - + pid_t pid = fork(); if (pid == 0) { diff --git a/src/lexparse.c b/src/lexparse.c index e412759..a4105eb 100644 --- a/src/lexparse.c +++ b/src/lexparse.c @@ -67,7 +67,7 @@ static MaybeChunk handle_dollar_expansion(char* line, size_t* pos, QuotationMode static Chunk collect_un_q_literal(char* line, size_t* pos) { String buf = make_String(256); size_t i; - for (i = *pos; line[i] != '$' && line[i] != '\0' && line[i] == ' '; i++) { + for (i = *pos; line[i] != '$' && line[i] != '\0' && line[i] != ' '; i++) { push_to_String(&buf, line[i]); } *pos = i; diff --git a/src/syntax.h b/src/syntax.h index 12293ae..cf8ce3f 100644 --- a/src/syntax.h +++ b/src/syntax.h @@ -9,7 +9,7 @@ typedef enum { PLUS, MINUS, MULT, -DIV, + DIV, } BinOp; typedef enum { -- cgit v1.2.3