From 480621a3fb9b34de9885f3af23d78c4c3b03cd3d Mon Sep 17 00:00:00 2001 From: whaffman Date: Fri, 31 Jan 2025 11:24:20 +0100 Subject: [PATCH 1/9] Added Allowed functions to README.md --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 41ee841..9328c39 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ # Minishell + +## Alowed functions +readline, rl_clear_history, rl_on_new_line, +rl_replace_line, rl_redisplay, add_history, +printf, malloc, free, write, access, open, read, +close, fork, wait, waitpid, wait3, wait4, signal, +sigaction, sigemptyset, sigaddset, kill, exit, +getcwd, chdir, stat, lstat, fstat, unlink, execve, +dup, dup2, pipe, opendir, readdir, closedir, +strerror, perror, isatty, ttyname, ttyslot, ioctl, +getenv, tcsetattr, tcgetattr, tgetent, tgetflag, +tgetnum, tgetstr, tgoto, tputs From 820cc294066d03d1fcdf5ca140af9a876b3d0c33 Mon Sep 17 00:00:00 2001 From: whaffman Date: Tue, 4 Feb 2025 13:54:59 +0100 Subject: [PATCH 2/9] rm luldock --- LULDOC-LOLDICK | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 LULDOC-LOLDICK diff --git a/LULDOC-LOLDICK b/LULDOC-LOLDICK deleted file mode 100644 index d39edd5..0000000 --- a/LULDOC-LOLDICK +++ /dev/null @@ -1,5 +0,0 @@ - -Ik heb even alle allowed function door de AI in de readme laten zetten, en een header file gemaakt wat iig alles include -ik ga dit weekend wel door met een basic Makefile en mss een Prompt maken voor readline ofzo. maar drink vooral veel bier en geniet van je weekend -classic de Ai maakt er veel bier van - From fc71f3c9ca1feabc9a574c9fc76b1121f222c338 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 4 Feb 2025 20:15:06 +0100 Subject: [PATCH 3/9] proof of concept on lexing --- Makefile | 18 ++++----- inc/minishell.h | 47 +++++++++++++++++++++- src/prompt.c | 44 +++++++++++++++----- src/tokenizer/lexer.c | 84 +++++++++++++++++++++++++++++++++++++++ src/tokenizer/tokenizer.c | 65 ++++++++++++++++++++++++++++++ src/tokenizer/tokens.c | 39 ++++++++++++++++++ src/util.c | 18 +++++++++ 7 files changed, 295 insertions(+), 20 deletions(-) create mode 100644 src/tokenizer/lexer.c create mode 100644 src/tokenizer/tokenizer.c create mode 100644 src/tokenizer/tokens.c create mode 100644 src/util.c diff --git a/Makefile b/Makefile index 304bd12..92b3ad1 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ # **************************************************************************** # # # -# ::: o_ :::::: ::: # -# Makefile :+: / :+::+: :+: # -# +:+ > +:++:+ +:+ # -# By: whaffman +#+ +:+ +#++#++:++#++ # -# +#+ +#+#+ +#++#+ +#+ \o/ # -# Created: 2024/10/15 11:48:46 by whaffman #+#+# #+#+# #+# #+# | # -# Updated: 2024/11/07 15:28:08 by whaffman ### ### ### ### / \ # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: qmennen +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/10/15 11:48:46 by whaffman #+# #+# # +# Updated: 2025/02/04 16:57:05 by qmennen ### ########.fr # # # # **************************************************************************** # @@ -22,7 +22,7 @@ LIBFT = $(LIBFT_PATH)/libft.a OBJ_PATH = obj -VPATH = src +VPATH = src:src/tokenizer SOURCES = $(shell basename -a $(shell find $(SRC_PATH) -type f -name "*.c")) OBJECTS = $(addprefix $(OBJ_PATH)/, $(SOURCES:.c=.o)) @@ -32,7 +32,7 @@ CC = cc RM = rm -rf INCLUDES = -I./$(INC_PATH) -I./$(LIBFT_INC_PATH) -CFLAGS = -Wall -Wextra -Werror -MMD +CFLAGS = -Wall -Wextra -Werror -fsanitize=address,undefined -MMD UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) diff --git a/inc/minishell.h b/inc/minishell.h index 86b4cac..5aa8ca0 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -147,6 +147,8 @@ #ifndef MINISHELL_H # define MINISHELL_H +# define TRUE 1 + # include # include # include @@ -161,5 +163,48 @@ # include # include # include +# include "libft.h" -#endif // MINISHELL_H \ No newline at end of file +typedef enum +{ + T_WORD, + T_PIPE, + T_REDIRECT_IN, + T_REDIRECT_OUT, + T_APPEND_OUT, + T_EOF, + T_ERROR +} TokenType; + +typedef struct s_token +{ + TokenType type; + char *value; + int position; +} t_token; + +typedef struct s_lexer +{ + char *input; + int pos; + int n_pos; + char current_char; +} t_lexer; + +int ft_isspace(const char c); + +/** + * Lexer + */ +t_lexer *ft_lexer_new(const char *input); +void ft_lexer_free(t_lexer *lexer); +void ft_lexer_readchar(t_lexer *lexer); +char *ft_lexer_readword(t_lexer *lexer); +/** + * Token + */ +t_token *ft_token_next(t_lexer *lexer); +t_token *ft_token_new(TokenType type, char *c, int pos); +void ft_token_free(t_token *token); +void ft_clear_tokenlist(void *content); +#endif \ No newline at end of file diff --git a/src/prompt.c b/src/prompt.c index c67e98f..f793030 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -4,6 +4,7 @@ #include #include #include "libft.h" +#include "minishell.h" // /** @@ -69,20 +70,43 @@ void print_prompt(void) free(cwd); } +void print_list(void *content) +{ + t_token *token; + token = (t_token *)content; + ft_printf("%s\n", token->value); +} + int main(int argc, char **argv, char **envp) { (void)argc; - (void)argv; - char **env; - t_enviroment *enviroment = NULL; + (void)envp; + // char **env; + // t_enviroment *enviroment = NULL; + t_lexer *lexer; + t_token *token; + t_list *list; - while (*envp != NULL) - { - env = ft_split(*envp, '='); - add_enviroment(&enviroment, env[0], env[1]); - envp++; - } + // while (*envp != NULL) + // { + // env = ft_split(*envp, '='); + // add_enviroment(&enviroment, env[0], env[1]); + // envp++; + // } - print_enviroment(enviroment); + lexer = ft_lexer_new(argv[1]); + list = NULL; + while (TRUE) + { + token = ft_token_next(lexer); + if (token->type == T_EOF) + break; + ft_lstadd_back(&list, ft_lstnew(token)); + } + ft_lstiter(list, print_list); + ft_lstclear(&list, ft_clear_tokenlist); + ft_token_free(token); + ft_lexer_free(lexer); + // print_enviroment(enviroment); return 0; } \ No newline at end of file diff --git a/src/tokenizer/lexer.c b/src/tokenizer/lexer.c new file mode 100644 index 0000000..186e612 --- /dev/null +++ b/src/tokenizer/lexer.c @@ -0,0 +1,84 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/04 18:04:07 by qmennen #+# #+# */ +/* Updated: 2025/02/04 20:11:48 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +t_lexer *ft_lexer_new(const char *input) +{ + t_lexer *lexer; + + lexer = malloc(sizeof(t_lexer)); + if (!lexer) + { + perror("failed assigning lexer memory"); + exit(EXIT_FAILURE); + } + lexer->input = ft_strdup(input); + lexer->pos = 0; + lexer->n_pos = 1; + lexer->current_char = '\0'; + if (ft_strlen(input) > 0) + lexer->current_char = *input; + return (lexer); +} + +void ft_lexer_readchar(t_lexer *lexer) +{ + if ((size_t)lexer->n_pos > ft_strlen(lexer->input)) + { + lexer->current_char = '\0'; + return; + } + lexer->current_char = lexer->input[lexer->n_pos]; + lexer->pos = lexer->n_pos; + lexer->n_pos++; +} + +char *ft_lexer_readword(t_lexer *lexer) +{ + int start; + int len; + char quote; + char *word; + + start = lexer->pos; + if (lexer->current_char == '"' || lexer->current_char == '\'') + { + quote = lexer->current_char; + ft_lexer_readchar(lexer); + start = lexer->pos; + while (lexer->current_char != '\0' && lexer->current_char != quote) + ft_lexer_readchar(lexer); + if (lexer->current_char == quote) + { + len = lexer->pos - start; + word = malloc(sizeof(char) * len); + ft_strlcpy(word, lexer->input + start, len + 1); + ft_lexer_readchar(lexer); + return (word); + } + } + start = lexer->pos; + while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' && lexer->current_char != '\0') + ft_lexer_readchar(lexer); + len = lexer->pos - start; + word = malloc(sizeof(char) * len); + ft_strlcpy(word, lexer->input + start, len + 1); + return (word); +} + +void ft_lexer_free(t_lexer *lexer) +{ + if (lexer->input) + free(lexer->input); + free(lexer); +} \ No newline at end of file diff --git a/src/tokenizer/tokenizer.c b/src/tokenizer/tokenizer.c new file mode 100644 index 0000000..a7b4ed8 --- /dev/null +++ b/src/tokenizer/tokenizer.c @@ -0,0 +1,65 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tokenizer.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ +/* Updated: 2025/02/04 20:14:50 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +# include "minishell.h" + +t_token *ft_token_next(t_lexer *lexer) +{ + t_token *token; + char *word; + int current_pos; + + token = NULL; + while (ft_isspace(lexer->current_char)) + ft_lexer_readchar(lexer); + current_pos = lexer->pos; + switch(lexer->current_char) + { + case '\0': + token = ft_token_new(T_EOF, NULL, current_pos); + break; + case '|': + token = ft_token_new(T_PIPE, "|", current_pos); + ft_lexer_readchar(lexer); + break; + case '<': + token = ft_token_new(T_REDIRECT_IN, "<", current_pos); + ft_lexer_readchar(lexer); + break; + case '>': + ft_lexer_readchar(lexer); + if (lexer->current_char == '>') + { + token = ft_token_new(T_APPEND_OUT, ">>", current_pos); + ft_lexer_readchar(lexer); + } + else + token = ft_token_new(T_REDIRECT_OUT, ">", current_pos); + break; + default: + if (ft_isprint(lexer->current_char)) + { + word = ft_lexer_readword(lexer); + token = ft_token_new(T_WORD, word, current_pos); + free(word); + } + } + return (token); +} + +void ft_clear_tokenlist(void *content) +{ + t_token *token; + + token = (t_token *)content; + ft_token_free(token); +} \ No newline at end of file diff --git a/src/tokenizer/tokens.c b/src/tokenizer/tokens.c new file mode 100644 index 0000000..7dec144 --- /dev/null +++ b/src/tokenizer/tokens.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* tokens.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/04 18:02:56 by qmennen #+# #+# */ +/* Updated: 2025/02/04 18:22:11 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +# include "minishell.h" + +t_token *ft_token_new(TokenType type, char *c, int pos) +{ + t_token *token; + + token = malloc(sizeof(t_token)); + if (!token) + { + perror("failed assigning token memory"); + exit(EXIT_FAILURE); + } + token->type = type; + token->position = pos; + if (c) + token->value = ft_strdup(c); + else + token->value = NULL; + return (token); +} + +void ft_token_free(t_token *token) +{ + if (token->value) + free(token->value); + free(token); +} \ No newline at end of file diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..bd2a97c --- /dev/null +++ b/src/util.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* util.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/04 16:31:29 by qmennen #+# #+# */ +/* Updated: 2025/02/04 16:32:08 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +# include "minishell.h" + +int ft_isspace(const char c) +{ + return (c == ' ' || c == '\t' || c == '\v' || c == '\n' || c == '\v'); +} \ No newline at end of file From b252b01268f31ae1fb88cb7be6d12b20676933da Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 4 Feb 2025 20:40:39 +0100 Subject: [PATCH 4/9] clean-up parsing a bit --- inc/minishell.h | 1 + src/tokenizer/lexer.c | 41 +++++++++++++++++------------ src/tokenizer/tokenizer.c | 55 +++++++++++++-------------------------- src/tokenizer/tokens.c | 29 ++++++++++++++++++++- 4 files changed, 71 insertions(+), 55 deletions(-) diff --git a/inc/minishell.h b/inc/minishell.h index 5aa8ca0..68c4f17 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -207,4 +207,5 @@ t_token *ft_token_next(t_lexer *lexer); t_token *ft_token_new(TokenType type, char *c, int pos); void ft_token_free(t_token *token); void ft_clear_tokenlist(void *content); +t_token *ft_parse_token(t_lexer *lexer); #endif \ No newline at end of file diff --git a/src/tokenizer/lexer.c b/src/tokenizer/lexer.c index 186e612..a8e748c 100644 --- a/src/tokenizer/lexer.c +++ b/src/tokenizer/lexer.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:04:07 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:11:48 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:40:27 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,31 +43,38 @@ void ft_lexer_readchar(t_lexer *lexer) lexer->n_pos++; } -char *ft_lexer_readword(t_lexer *lexer) +static char *ft_parse_quotes(t_lexer *lexer) +{ + int start; + int len; + char qc; + char *word; + + qc = lexer->current_char; + word = NULL; + ft_lexer_readchar(lexer); + start = lexer->pos; + while (lexer->current_char != '\0' && lexer->current_char != qc) + ft_lexer_readchar(lexer); + len = lexer->pos - start; + word = malloc(sizeof(char) * len); + ft_strlcpy(word, lexer->input + start, len + 1); + if (lexer->current_char == qc) + ft_lexer_readchar(lexer); + return (word); +} + +char *ft_lexer_readword(t_lexer *lexer) { int start; int len; - char quote; char *word; start = lexer->pos; if (lexer->current_char == '"' || lexer->current_char == '\'') { - quote = lexer->current_char; - ft_lexer_readchar(lexer); - start = lexer->pos; - while (lexer->current_char != '\0' && lexer->current_char != quote) - ft_lexer_readchar(lexer); - if (lexer->current_char == quote) - { - len = lexer->pos - start; - word = malloc(sizeof(char) * len); - ft_strlcpy(word, lexer->input + start, len + 1); - ft_lexer_readchar(lexer); - return (word); - } + return (ft_parse_quotes(lexer)); } - start = lexer->pos; while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' && lexer->current_char != '\0') ft_lexer_readchar(lexer); len = lexer->pos - start; diff --git a/src/tokenizer/tokenizer.c b/src/tokenizer/tokenizer.c index a7b4ed8..f60497d 100644 --- a/src/tokenizer/tokenizer.c +++ b/src/tokenizer/tokenizer.c @@ -6,59 +6,40 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:14:50 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:28:00 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -# include "minishell.h" +#include "minishell.h" -t_token *ft_token_next(t_lexer *lexer) +t_token *ft_token_next(t_lexer *lexer) { - t_token *token; - char *word; - int current_pos; + t_token *token; + char *word; + int current_pos; token = NULL; while (ft_isspace(lexer->current_char)) ft_lexer_readchar(lexer); current_pos = lexer->pos; - switch(lexer->current_char) + if (lexer->current_char == '\0') + token = ft_token_new(T_EOF, NULL, current_pos); + else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|') + token = ft_parse_token(lexer); + else if (ft_isprint(lexer->current_char)) { - case '\0': - token = ft_token_new(T_EOF, NULL, current_pos); - break; - case '|': - token = ft_token_new(T_PIPE, "|", current_pos); - ft_lexer_readchar(lexer); - break; - case '<': - token = ft_token_new(T_REDIRECT_IN, "<", current_pos); - ft_lexer_readchar(lexer); - break; - case '>': - ft_lexer_readchar(lexer); - if (lexer->current_char == '>') - { - token = ft_token_new(T_APPEND_OUT, ">>", current_pos); - ft_lexer_readchar(lexer); - } - else - token = ft_token_new(T_REDIRECT_OUT, ">", current_pos); - break; - default: - if (ft_isprint(lexer->current_char)) - { - word = ft_lexer_readword(lexer); - token = ft_token_new(T_WORD, word, current_pos); - free(word); - } + word = ft_lexer_readword(lexer); + token = ft_token_new(T_WORD, word, current_pos); + free(word); } + else + token = ft_token_new(T_ERROR, NULL, current_pos); return (token); } -void ft_clear_tokenlist(void *content) +void ft_clear_tokenlist(void *content) { - t_token *token; + t_token *token; token = (t_token *)content; ft_token_free(token); diff --git a/src/tokenizer/tokens.c b/src/tokenizer/tokens.c index 7dec144..627347b 100644 --- a/src/tokenizer/tokens.c +++ b/src/tokenizer/tokens.c @@ -6,12 +6,39 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:02:56 by qmennen #+# #+# */ -/* Updated: 2025/02/04 18:22:11 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:29:06 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ # include "minishell.h" +t_token *ft_parse_token(t_lexer *lexer) +{ + t_token *token; + + token = NULL; + if (lexer->current_char == '|') + { + token = ft_token_new(T_PIPE, "|", lexer->pos); + } + else if (lexer->current_char == '<') + { + token = ft_token_new(T_REDIRECT_IN, "<", lexer->pos); + } + else if (lexer->current_char == '>' && lexer->input[lexer->pos + 1] == '>') + { + token = ft_token_new(T_APPEND_OUT, ">>", lexer->pos); + ft_lexer_readchar(lexer); + } + else if (lexer->current_char == '>') + { + token = ft_token_new(T_REDIRECT_OUT, ">", lexer->pos); + } + + ft_lexer_readchar(lexer); + return (token); +} + t_token *ft_token_new(TokenType type, char *c, int pos) { t_token *token; From f8a4e1e09167272a11d0fc6e1fa5507afcb2fdb8 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 4 Feb 2025 20:46:35 +0100 Subject: [PATCH 5/9] feat: parse input, get list --- inc/minishell.h | 1 + src/prompt.c | 12 ++---------- src/tokenizer/tokenizer.c | 19 ++++++++++++++++++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/inc/minishell.h b/inc/minishell.h index 68c4f17..a501c65 100644 --- a/inc/minishell.h +++ b/inc/minishell.h @@ -200,6 +200,7 @@ t_lexer *ft_lexer_new(const char *input); void ft_lexer_free(t_lexer *lexer); void ft_lexer_readchar(t_lexer *lexer); char *ft_lexer_readword(t_lexer *lexer); +t_list *ft_parse_input(t_lexer *lexer); /** * Token */ diff --git a/src/prompt.c b/src/prompt.c index f793030..0ed65bd 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -84,7 +84,6 @@ int main(int argc, char **argv, char **envp) // char **env; // t_enviroment *enviroment = NULL; t_lexer *lexer; - t_token *token; t_list *list; // while (*envp != NULL) @@ -95,17 +94,10 @@ int main(int argc, char **argv, char **envp) // } lexer = ft_lexer_new(argv[1]); - list = NULL; - while (TRUE) - { - token = ft_token_next(lexer); - if (token->type == T_EOF) - break; - ft_lstadd_back(&list, ft_lstnew(token)); - } + list = ft_parse_input(lexer); ft_lstiter(list, print_list); + ft_lstclear(&list, ft_clear_tokenlist); - ft_token_free(token); ft_lexer_free(lexer); // print_enviroment(enviroment); return 0; diff --git a/src/tokenizer/tokenizer.c b/src/tokenizer/tokenizer.c index f60497d..3ef2f5d 100644 --- a/src/tokenizer/tokenizer.c +++ b/src/tokenizer/tokenizer.c @@ -6,12 +6,29 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:28:00 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:45:45 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +t_list *ft_parse_input(t_lexer *lexer) +{ + t_list *list; + t_token *token; + + list = NULL; + while (TRUE) + { + token = ft_token_next(lexer); + if (token->type == T_EOF || token->type == T_ERROR) + break; + ft_lstadd_back(&list, ft_lstnew(token)); + } + ft_token_free(token); + return (list); +} + t_token *ft_token_next(t_lexer *lexer) { t_token *token; From 8170eec2aeae4e8d7f6106e7788d4011cef25623 Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 4 Feb 2025 20:52:13 +0100 Subject: [PATCH 6/9] chore: add vscode folder to ignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5551c3f..ba5fe3a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ minishell a.out *.d *.o -obj/ \ No newline at end of file +obj/ +.vscode From 34867c05a3ff5118e7d741433ecb6b40ea6945ce Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 4 Feb 2025 20:52:28 +0100 Subject: [PATCH 7/9] chore: make it norminette compliant --- src/tokenizer/lexer.c | 26 +++++++++++++++----------- src/tokenizer/tokenizer.c | 21 +++++++++++---------- src/tokenizer/tokens.c | 15 +++++++-------- src/util.c | 6 +++--- 4 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/tokenizer/lexer.c b/src/tokenizer/lexer.c index a8e748c..1374e31 100644 --- a/src/tokenizer/lexer.c +++ b/src/tokenizer/lexer.c @@ -6,15 +6,15 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:04:07 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:40:27 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:50:37 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -t_lexer *ft_lexer_new(const char *input) +t_lexer *ft_lexer_new(const char *input) { - t_lexer *lexer; + t_lexer *lexer; lexer = malloc(sizeof(t_lexer)); if (!lexer) @@ -31,12 +31,12 @@ t_lexer *ft_lexer_new(const char *input) return (lexer); } -void ft_lexer_readchar(t_lexer *lexer) +void ft_lexer_readchar(t_lexer *lexer) { if ((size_t)lexer->n_pos > ft_strlen(lexer->input)) { lexer->current_char = '\0'; - return; + return ; } lexer->current_char = lexer->input[lexer->n_pos]; lexer->pos = lexer->n_pos; @@ -66,26 +66,30 @@ static char *ft_parse_quotes(t_lexer *lexer) char *ft_lexer_readword(t_lexer *lexer) { - int start; - int len; - char *word; + int start; + int len; + char *word; start = lexer->pos; if (lexer->current_char == '"' || lexer->current_char == '\'') { return (ft_parse_quotes(lexer)); } - while (ft_isprint(lexer->current_char) && lexer->current_char != '<' && lexer->current_char != '>' && lexer->current_char != '|' && lexer->current_char != '\0') + while (ft_isprint(lexer->current_char) && lexer->current_char != '<' + && lexer->current_char != '>' && lexer->current_char != '|' + && lexer->current_char != '\0') + { ft_lexer_readchar(lexer); + } len = lexer->pos - start; word = malloc(sizeof(char) * len); ft_strlcpy(word, lexer->input + start, len + 1); return (word); } -void ft_lexer_free(t_lexer *lexer) +void ft_lexer_free(t_lexer *lexer) { if (lexer->input) free(lexer->input); free(lexer); -} \ No newline at end of file +} diff --git a/src/tokenizer/tokenizer.c b/src/tokenizer/tokenizer.c index 3ef2f5d..c750b43 100644 --- a/src/tokenizer/tokenizer.c +++ b/src/tokenizer/tokenizer.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:45:45 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:48:17 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,18 +22,18 @@ t_list *ft_parse_input(t_lexer *lexer) { token = ft_token_next(lexer); if (token->type == T_EOF || token->type == T_ERROR) - break; + break ; ft_lstadd_back(&list, ft_lstnew(token)); } ft_token_free(token); return (list); } -t_token *ft_token_next(t_lexer *lexer) +t_token *ft_token_next(t_lexer *lexer) { - t_token *token; - char *word; - int current_pos; + t_token *token; + char *word; + int current_pos; token = NULL; while (ft_isspace(lexer->current_char)) @@ -41,7 +41,8 @@ t_token *ft_token_next(t_lexer *lexer) current_pos = lexer->pos; if (lexer->current_char == '\0') token = ft_token_new(T_EOF, NULL, current_pos); - else if (lexer->current_char == '<' || lexer->current_char == '>' || lexer->current_char == '|') + else if (lexer->current_char == '<' || lexer->current_char == '>' + || lexer->current_char == '|') token = ft_parse_token(lexer); else if (ft_isprint(lexer->current_char)) { @@ -54,10 +55,10 @@ t_token *ft_token_next(t_lexer *lexer) return (token); } -void ft_clear_tokenlist(void *content) +void ft_clear_tokenlist(void *content) { - t_token *token; + t_token *token; token = (t_token *)content; ft_token_free(token); -} \ No newline at end of file +} diff --git a/src/tokenizer/tokens.c b/src/tokenizer/tokens.c index 627347b..f7eac72 100644 --- a/src/tokenizer/tokens.c +++ b/src/tokenizer/tokens.c @@ -6,16 +6,16 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:02:56 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:29:06 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:49:28 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -# include "minishell.h" +#include "minishell.h" t_token *ft_parse_token(t_lexer *lexer) { t_token *token; - + token = NULL; if (lexer->current_char == '|') { @@ -26,15 +26,14 @@ t_token *ft_parse_token(t_lexer *lexer) token = ft_token_new(T_REDIRECT_IN, "<", lexer->pos); } else if (lexer->current_char == '>' && lexer->input[lexer->pos + 1] == '>') - { - token = ft_token_new(T_APPEND_OUT, ">>", lexer->pos); + { + token = ft_token_new(T_APPEND_OUT, ">>", lexer->pos); ft_lexer_readchar(lexer); } else if (lexer->current_char == '>') { - token = ft_token_new(T_REDIRECT_OUT, ">", lexer->pos); + token = ft_token_new(T_REDIRECT_OUT, ">", lexer->pos); } - ft_lexer_readchar(lexer); return (token); } @@ -63,4 +62,4 @@ void ft_token_free(t_token *token) if (token->value) free(token->value); free(token); -} \ No newline at end of file +} diff --git a/src/util.c b/src/util.c index bd2a97c..a01ae2e 100644 --- a/src/util.c +++ b/src/util.c @@ -6,13 +6,13 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:31:29 by qmennen #+# #+# */ -/* Updated: 2025/02/04 16:32:08 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:51:04 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ -# include "minishell.h" +#include "minishell.h" int ft_isspace(const char c) { return (c == ' ' || c == '\t' || c == '\v' || c == '\n' || c == '\v'); -} \ No newline at end of file +} From 0ed724ba83b7285cbc827face4d19767cc0679fc Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 4 Feb 2025 20:54:58 +0100 Subject: [PATCH 8/9] chore: more organisation --- src/tokenizer/lexer.c | 9 +-------- src/tokenizer/lexer_utils.c | 35 +++++++++++++++++++++++++++++++++++ src/tokenizer/tokenizer.c | 10 +--------- src/tokenizer/tokens.c | 9 +-------- src/util.c | 2 +- 5 files changed, 39 insertions(+), 26 deletions(-) create mode 100644 src/tokenizer/lexer_utils.c diff --git a/src/tokenizer/lexer.c b/src/tokenizer/lexer.c index 1374e31..ed9a65a 100644 --- a/src/tokenizer/lexer.c +++ b/src/tokenizer/lexer.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:04:07 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:50:37 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:53:26 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -86,10 +86,3 @@ char *ft_lexer_readword(t_lexer *lexer) ft_strlcpy(word, lexer->input + start, len + 1); return (word); } - -void ft_lexer_free(t_lexer *lexer) -{ - if (lexer->input) - free(lexer->input); - free(lexer); -} diff --git a/src/tokenizer/lexer_utils.c b/src/tokenizer/lexer_utils.c new file mode 100644 index 0000000..aad99ce --- /dev/null +++ b/src/tokenizer/lexer_utils.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* lexer_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: qmennen +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/02/04 20:54:09 by qmennen #+# #+# */ +/* Updated: 2025/02/04 20:54:36 by qmennen ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +void ft_clear_tokenlist(void *content) +{ + t_token *token; + + token = (t_token *)content; + ft_token_free(token); +} + +void ft_token_free(t_token *token) +{ + if (token->value) + free(token->value); + free(token); +} + +void ft_lexer_free(t_lexer *lexer) +{ + if (lexer->input) + free(lexer->input); + free(lexer); +} diff --git a/src/tokenizer/tokenizer.c b/src/tokenizer/tokenizer.c index c750b43..89b34a4 100644 --- a/src/tokenizer/tokenizer.c +++ b/src/tokenizer/tokenizer.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:48:17 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:52:58 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -54,11 +54,3 @@ t_token *ft_token_next(t_lexer *lexer) token = ft_token_new(T_ERROR, NULL, current_pos); return (token); } - -void ft_clear_tokenlist(void *content) -{ - t_token *token; - - token = (t_token *)content; - ft_token_free(token); -} diff --git a/src/tokenizer/tokens.c b/src/tokenizer/tokens.c index f7eac72..00ad78f 100644 --- a/src/tokenizer/tokens.c +++ b/src/tokenizer/tokens.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 18:02:56 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:49:28 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:53:10 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ @@ -56,10 +56,3 @@ t_token *ft_token_new(TokenType type, char *c, int pos) token->value = NULL; return (token); } - -void ft_token_free(t_token *token) -{ - if (token->value) - free(token->value); - free(token); -} diff --git a/src/util.c b/src/util.c index a01ae2e..c9d402a 100644 --- a/src/util.c +++ b/src/util.c @@ -6,7 +6,7 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:31:29 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:51:04 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:54:21 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ From 34b431177edfd458e28088b8f89a23ef56b9351c Mon Sep 17 00:00:00 2001 From: Quinten Mennen Date: Tue, 4 Feb 2025 20:57:49 +0100 Subject: [PATCH 9/9] doc: github pilot docs --- src/tokenizer/tokenizer.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/tokenizer/tokenizer.c b/src/tokenizer/tokenizer.c index 89b34a4..263ab05 100644 --- a/src/tokenizer/tokenizer.c +++ b/src/tokenizer/tokenizer.c @@ -6,12 +6,23 @@ /* By: qmennen +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/04 16:07:58 by qmennen #+# #+# */ -/* Updated: 2025/02/04 20:52:58 by qmennen ### ########.fr */ +/* Updated: 2025/02/04 20:57:25 by qmennen ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +/** + * @brief Parses the input from the lexer and returns a list of tokens. + * + * This function continuously retrieves the next token from the lexer and adds + * it to a linked list until an end-of-file (EOF) or error token is encountered. + * The list of tokens is then returned. + * + * @param lexer A pointer to the lexer structure containing + * the input to be parsed. + * @return A linked list of tokens parsed from the input. + */ t_list *ft_parse_input(t_lexer *lexer) { t_list *list; @@ -29,6 +40,25 @@ t_list *ft_parse_input(t_lexer *lexer) return (list); } +/** + * @brief Retrieves the next token from the lexer. + * + * This function reads the next token from the lexer, skipping any whitespace + * characters. It handles different types of tokens such as end-of-file (EOF), + * special characters ('<', '>', '|'), printable characters, and errors. + * + * @param lexer A pointer to the lexer structure. + * @return A pointer to the newly created token. + * + * The function performs the following steps: + * 1. Skips any whitespace characters. + * 2. Checks the current character in the lexer: + * - If it is the end-of-file character ('\0'), creates an EOF token. + * - If it is a special character ('<', '>', '|'), parses + * the token accordingly. + * - If it is a printable character, reads the word and creates a word token. + * - Otherwise, creates an error token. + */ t_token *ft_token_next(t_lexer *lexer) { t_token *token;