From e8d6ac902cfa498d066ddc8c4281d9bf6dee761a Mon Sep 17 00:00:00 2001 From: "william.valenduc" Date: Fri, 9 Jan 2026 13:46:37 +0000 Subject: [PATCH] feat: single quotes expansion --- src/ast/ast.h | 22 +++++++------ src/expansion/expansion.c | 68 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 10 deletions(-) diff --git a/src/ast/ast.h b/src/ast/ast.h index 5bfd8df..b3be544 100644 --- a/src/ast/ast.h +++ b/src/ast/ast.h @@ -1,7 +1,7 @@ #ifndef AST_H #define AST_H -#include "lists.h" +#include "../utils/lists/lists.h" enum ast_type { @@ -10,28 +10,30 @@ enum ast_type AST_CMD }; -union ast_node +struct ast_cmd { - struct ast_if; - struct ast_cmd; + struct list *cmd; }; +union ast_node; + struct ast { enum ast_type type; - union ast_node data; + union ast_node *data; }; struct ast_if { - struct ast* condition; - struct ast* then_clause; - struct ast* else_clause; + struct ast *condition; + struct ast *then_clause; + struct ast *else_clause; }; -struct ast_cmd +union ast_node { - struct list* cmd; + struct ast_if ast_if; + struct ast_cmd ast_cmd; }; #endif /* ! AST_H */ diff --git a/src/expansion/expansion.c b/src/expansion/expansion.c index e69de29..01fa248 100644 --- a/src/expansion/expansion.c +++ b/src/expansion/expansion.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include + +#include "../ast/ast.h" + +struct ast_cmd *expand(struct ast_cmd *cmd) +{ + if (cmd == NULL) + return NULL; + + bool in_quotes = false; + char *str; + size_t len; + struct list *l = cmd->cmd; + + while (l != NULL) + { + in_quotes = false; + str = (char *)l->data; + len = strlen(str); + + for (size_t i = 0; str[i] != '\0'; i++) + { + if (in_quotes) + { + // do nothing + } + else if (str[i] == '\'') + { + in_quotes = !in_quotes; + memmove(&str[i], &str[i + 1], strlen(&str[i + 1]) + 1); + } + // else if (str[i] == '$' && str[i + 1] != '\0' && str[i + 1] != '$' + // && str[i + 1] != ' ') + else if (str[i] == '$' && isalnum(str[i + 1])) + { + // variable expansion + } + } + + if (in_quotes) + { + // error: quote not closed + } + + if (len != strlen(str)) + { + char *new_str = realloc(str, strlen(str) + 1); + if (new_str == NULL) + { + // error: realloc fail + } + l->data = new_str; + } + + l = l->next; + } + return cmd; +} + +int main() +{ + printf("Expansion module test\n"); + return 0; +}