From f6e474d27a1398c6d4f2e88c7f2d3797b85217da Mon Sep 17 00:00:00 2001 From: Christopher Uhlig Date: Wed, 22 Jan 2025 02:40:27 +0100 Subject: [PATCH] kinda fix for pipe error and again.vs for you db just chnage workfolder gn --- .vscode/c_cpp_properties.json | 18 + .vscode/launch copy.json | 13 + .vscode/launch.json | 13 + .vscode/settings.json | 65 ++ .vscode/tasks copy.json | 29 + .vscode/tasks.json | 29 + Makefile | 20 +- include/ast.h | 16 +- include/debug_tools.h | 7 +- include/env.h | 11 +- include/minishell.h | 36 +- include/token.h | 6 +- lib/libft/_obj/ft_atoi.o | Bin 0 -> 1336 bytes lib/libft/_obj/ft_atol.o | Bin 0 -> 1352 bytes lib/libft/_obj/ft_bzero.o | Bin 0 -> 1144 bytes lib/libft/_obj/ft_calloc.o | Bin 0 -> 1352 bytes lib/libft/_obj/ft_isalnum.o | Bin 0 -> 1160 bytes lib/libft/_obj/ft_isalpha.o | Bin 0 -> 1144 bytes lib/libft/_obj/ft_isascii.o | Bin 0 -> 1136 bytes lib/libft/_obj/ft_isdigit.o | Bin 0 -> 1136 bytes lib/libft/_obj/ft_isprint.o | Bin 0 -> 1136 bytes lib/libft/_obj/ft_isspace.o | Bin 0 -> 1136 bytes lib/libft/_obj/ft_itoa.o | Bin 0 -> 1728 bytes lib/libft/_obj/ft_lstadd_back_bonus.o | Bin 0 -> 1200 bytes lib/libft/_obj/ft_lstadd_front_bonus.o | Bin 0 -> 1160 bytes lib/libft/_obj/ft_lstclear_bonus.o | Bin 0 -> 1384 bytes lib/libft/_obj/ft_lstdelone_bonus.o | Bin 0 -> 1272 bytes lib/libft/_obj/ft_lstiter_bonus.o | Bin 0 -> 1184 bytes lib/libft/_obj/ft_lstlast_bonus.o | Bin 0 -> 1152 bytes lib/libft/_obj/ft_lstmap_bonus.o | Bin 0 -> 1544 bytes lib/libft/_obj/ft_lstnew_bonus.o | Bin 0 -> 1296 bytes lib/libft/_obj/ft_lstsize_bonus.o | Bin 0 -> 1168 bytes lib/libft/_obj/ft_memchr.o | Bin 0 -> 1176 bytes lib/libft/_obj/ft_memcmp.o | Bin 0 -> 1192 bytes lib/libft/_obj/ft_memcpy.o | Bin 0 -> 1192 bytes lib/libft/_obj/ft_memmove.o | Bin 0 -> 1256 bytes lib/libft/_obj/ft_memset.o | Bin 0 -> 1152 bytes lib/libft/_obj/ft_printaddr.o | Bin 0 -> 1712 bytes lib/libft/_obj/ft_printf.o | Bin 0 -> 3024 bytes lib/libft/_obj/ft_printhex.o | Bin 0 -> 1552 bytes lib/libft/_obj/ft_printnbr.o | Bin 0 -> 2312 bytes lib/libft/_obj/ft_putchar_fd.o | Bin 0 -> 1272 bytes lib/libft/_obj/ft_putendl_fd.o | Bin 0 -> 1504 bytes lib/libft/_obj/ft_putnbr_fd.o | Bin 0 -> 1760 bytes lib/libft/_obj/ft_putstr_fd.o | Bin 0 -> 1336 bytes lib/libft/_obj/ft_split.o | Bin 0 -> 2392 bytes lib/libft/_obj/ft_strcat.o | Bin 0 -> 1232 bytes lib/libft/_obj/ft_strchr.o | Bin 0 -> 1200 bytes lib/libft/_obj/ft_strcmp.o | Bin 0 -> 1216 bytes lib/libft/_obj/ft_strcpy.o | Bin 0 -> 1192 bytes lib/libft/_obj/ft_strdup.o | Bin 0 -> 1408 bytes lib/libft/_obj/ft_striteri.o | Bin 0 -> 1176 bytes lib/libft/_obj/ft_strjoin.o | Bin 0 -> 1568 bytes lib/libft/_obj/ft_strlcat.o | Bin 0 -> 1320 bytes lib/libft/_obj/ft_strlcpy.o | Bin 0 -> 1264 bytes lib/libft/_obj/ft_strlen.o | Bin 0 -> 1136 bytes lib/libft/_obj/ft_strmapi.o | Bin 0 -> 1456 bytes lib/libft/_obj/ft_strncmp.o | Bin 0 -> 1224 bytes lib/libft/_obj/ft_strncpy.o | Bin 0 -> 1192 bytes lib/libft/_obj/ft_strnstr.o | Bin 0 -> 1360 bytes lib/libft/_obj/ft_strrchr.o | Bin 0 -> 1224 bytes lib/libft/_obj/ft_strtrim.o | Bin 0 -> 1688 bytes lib/libft/_obj/ft_substr.o | Bin 0 -> 1464 bytes lib/libft/_obj/ft_tolower.o | Bin 0 -> 1128 bytes lib/libft/_obj/ft_toupper.o | Bin 0 -> 1128 bytes lib/libft/_obj/get_next_line.o | Bin 0 -> 2448 bytes lib/libft/_obj/get_next_line_utils.o | Bin 0 -> 1880 bytes lib/libft/ft_split.c | 4 +- lib/libft/ft_strcat.c | 4 +- lib/libft/ft_strcmp.c | 4 +- lib/libft/ft_strcpy.c | 4 +- lib/libft/ft_strjoin.c | 58 +- lib/libft/libft.a | Bin 0 -> 81400 bytes src/builtins_part_one.c | 153 ++-- src/builtins_part_three.c | 85 ++ src/builtins_part_two.c | 39 +- src/collect_redirs.c | 147 ++-- src/create_files.c | 65 ++ src/debug_tools.c | 6 +- src/env.c | 25 +- src/env_to_strlst.c | 28 +- src/env_tools.c | 21 + src/error.c | 30 + src/execute_cmd.c | 110 ++- src/format_string.c | 118 +-- src/free_node.c | 79 +- src/free_token.c | 36 +- src/get_cmd_path.c | 148 +++- src/handle_redir.c | 103 +++ src/init.c | 4 +- src/interpreter.c | 137 +--- src/main.c | 11 +- src/new_node.c | 9 +- src/new_token.c | 7 +- src/parse_cmd.c | 16 +- src/parser.c | 8 +- src/praise_the_norme.c | 30 + src/read_heredoc.c | 76 ++ src/repl.c | 46 +- src/signal_handling.c | 4 +- src/tokenizer.c | 25 +- valgrind_out.txt | 1040 ++++++++++++++++++++++++ 102 files changed, 2358 insertions(+), 585 deletions(-) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 .vscode/launch copy.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks copy.json create mode 100644 .vscode/tasks.json create mode 100644 lib/libft/_obj/ft_atoi.o create mode 100644 lib/libft/_obj/ft_atol.o create mode 100644 lib/libft/_obj/ft_bzero.o create mode 100644 lib/libft/_obj/ft_calloc.o create mode 100644 lib/libft/_obj/ft_isalnum.o create mode 100644 lib/libft/_obj/ft_isalpha.o create mode 100644 lib/libft/_obj/ft_isascii.o create mode 100644 lib/libft/_obj/ft_isdigit.o create mode 100644 lib/libft/_obj/ft_isprint.o create mode 100644 lib/libft/_obj/ft_isspace.o create mode 100644 lib/libft/_obj/ft_itoa.o create mode 100644 lib/libft/_obj/ft_lstadd_back_bonus.o create mode 100644 lib/libft/_obj/ft_lstadd_front_bonus.o create mode 100644 lib/libft/_obj/ft_lstclear_bonus.o create mode 100644 lib/libft/_obj/ft_lstdelone_bonus.o create mode 100644 lib/libft/_obj/ft_lstiter_bonus.o create mode 100644 lib/libft/_obj/ft_lstlast_bonus.o create mode 100644 lib/libft/_obj/ft_lstmap_bonus.o create mode 100644 lib/libft/_obj/ft_lstnew_bonus.o create mode 100644 lib/libft/_obj/ft_lstsize_bonus.o create mode 100644 lib/libft/_obj/ft_memchr.o create mode 100644 lib/libft/_obj/ft_memcmp.o create mode 100644 lib/libft/_obj/ft_memcpy.o create mode 100644 lib/libft/_obj/ft_memmove.o create mode 100644 lib/libft/_obj/ft_memset.o create mode 100644 lib/libft/_obj/ft_printaddr.o create mode 100644 lib/libft/_obj/ft_printf.o create mode 100644 lib/libft/_obj/ft_printhex.o create mode 100644 lib/libft/_obj/ft_printnbr.o create mode 100644 lib/libft/_obj/ft_putchar_fd.o create mode 100644 lib/libft/_obj/ft_putendl_fd.o create mode 100644 lib/libft/_obj/ft_putnbr_fd.o create mode 100644 lib/libft/_obj/ft_putstr_fd.o create mode 100644 lib/libft/_obj/ft_split.o create mode 100644 lib/libft/_obj/ft_strcat.o create mode 100644 lib/libft/_obj/ft_strchr.o create mode 100644 lib/libft/_obj/ft_strcmp.o create mode 100644 lib/libft/_obj/ft_strcpy.o create mode 100644 lib/libft/_obj/ft_strdup.o create mode 100644 lib/libft/_obj/ft_striteri.o create mode 100644 lib/libft/_obj/ft_strjoin.o create mode 100644 lib/libft/_obj/ft_strlcat.o create mode 100644 lib/libft/_obj/ft_strlcpy.o create mode 100644 lib/libft/_obj/ft_strlen.o create mode 100644 lib/libft/_obj/ft_strmapi.o create mode 100644 lib/libft/_obj/ft_strncmp.o create mode 100644 lib/libft/_obj/ft_strncpy.o create mode 100644 lib/libft/_obj/ft_strnstr.o create mode 100644 lib/libft/_obj/ft_strrchr.o create mode 100644 lib/libft/_obj/ft_strtrim.o create mode 100644 lib/libft/_obj/ft_substr.o create mode 100644 lib/libft/_obj/ft_tolower.o create mode 100644 lib/libft/_obj/ft_toupper.o create mode 100644 lib/libft/_obj/get_next_line.o create mode 100644 lib/libft/_obj/get_next_line_utils.o create mode 100644 lib/libft/libft.a create mode 100644 src/builtins_part_three.c create mode 100644 src/create_files.c create mode 100644 src/env_tools.c create mode 100644 src/error.c create mode 100644 src/handle_redir.c create mode 100644 src/praise_the_norme.c create mode 100644 src/read_heredoc.c create mode 100644 valgrind_out.txt diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..94b2ae4 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "macos-clang-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "/usr/bin/clang", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "macos-clang-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 + } \ No newline at end of file diff --git a/.vscode/launch copy.json b/.vscode/launch copy.json new file mode 100644 index 0000000..6dcd55f --- /dev/null +++ b/.vscode/launch copy.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "lldb", + "request": "launch", + "args": [], + "cwd": "/Users/chuhlig/Documents/", + "program": "/Users/chuhlig/Documents/minishell" + } + ] + } \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6dcd55f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "lldb", + "request": "launch", + "args": [], + "cwd": "/Users/chuhlig/Documents/", + "program": "/Users/chuhlig/Documents/minishell" + } + ] + } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..91f5074 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,65 @@ +{ + "C_Cpp_Runner.cCompilerPath": "clang", + "C_Cpp_Runner.cppCompilerPath": "clang++", + "C_Cpp_Runner.debuggerPath": "lldb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false, + "files.associations": { + "minishell.h": "c", + "debug_tools.h": "c", + "token.h": "c", + "ios": "c" + } + } \ No newline at end of file diff --git a/.vscode/tasks copy.json b/.vscode/tasks copy.json new file mode 100644 index 0000000..4ede37a --- /dev/null +++ b/.vscode/tasks copy.json @@ -0,0 +1,29 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: clang build active file", + "command": "/usr/bin/clang", + "args": [ + "-fcolor-diagnostics", + "-fansi-escape-codes", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..4ede37a --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,29 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: clang build active file", + "command": "/usr/bin/clang", + "args": [ + "-fcolor-diagnostics", + "-fansi-escape-codes", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/Makefile b/Makefile index 7cfc894..568a7a3 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ NAME := minishell CC = cc -CFLAGS = -Wall -Wextra -Werror +CFLAGS = -Wall -Wextra -g LIB_DIR = lib LIBS = -L $(LIB_DIR)/libft -lft -lreadline HEADERS = -I include -I $(LIB_DIR)/libft @@ -19,7 +19,9 @@ SRC := main.c debug_tools.c init.c signal_handling.c repl.c new_token.c \ free_token.c new_node.c free_node.c tokenizer.c parser.c \ parse_cmd.c collect_redirs.c print_ast.c interpreter.c env.c \ get_cmd_path.c env_to_strlst.c execute_cmd.c format_string.c \ - builtins_part_one.c builtins_part_two.c + builtins_part_one.c builtins_part_two.c env_tools.c error.c \ + read_heredoc.c create_files.c builtins_part_three.c handle_redir.c \ + praise_the_norme.c OBJ_DIR := _obj OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o)) @@ -30,18 +32,18 @@ OBJ := $(addprefix $(OBJ_DIR)/, $(SRC:%.c=%.o)) all: libs $(NAME) -$(NAME): $(OBJ) - @$(CC) $(CFLAGS) $(HEADERS) $(LIBS) $^ -o $@ - @echo "[$(NAME)] Created binary." - libs: @make -C $(LIB_DIR)/libft +$(NAME): $(OBJ) + @$(CC) $(CFLAGS) $^ -o $@ $(HEADERS) $(LIBS) + @echo "[$(NAME)] Created binary." + $(OBJ_DIR)/%.o: %.c @if [ ! -d "$(dir $@)" ]; then \ mkdir -p $(dir $@); \ fi - @$(CC) $(CFLAGS) $(HEADERS) -c $< -o $@ + @$(CC) $(CFLAGS) -c $< -o $@ $(HEADERS) @echo "[$(NAME)] Compiled $<." clean: @@ -63,7 +65,9 @@ debug: CFLAGS += -g debug: CFLAGS += -fsanitize=address -fsanitize=undefined \ -fno-sanitize-recover=all -fsanitize=float-divide-by-zero \ -fsanitize=float-cast-overflow -fno-sanitize=null \ - -fno-sanitize=alignment + -fno-sanitize=alignment -fno-sanitize=object-size \ + -fno-sanitize=vptr -fno-sanitize=return -fno-sanitize=signed-integer-overflow \ + -fno-sanitize=bounds -fno-sanitize=pointer-subtract -fno-sanitize=pointer-compare debug: CFLAGS += -DDEBUG=1 debug: clean all diff --git a/include/ast.h b/include/ast.h index cd2f9c9..0dede50 100644 --- a/include/ast.h +++ b/include/ast.h @@ -3,15 +3,17 @@ /* ::: :::::::: */ /* ast.h :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:48:27 by dkaiser #+# #+# */ -/* Updated: 2024/08/11 12:20:56 by dkaiser ### ########.fr */ +/* Updated: 2025/01/18 19:28:51 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ -#include "debug_tools.h" -#include "stdlib.h" +#ifndef AST_H +# define AST_H +# include "debug_tools.h" +# include "stdlib.h" enum e_node_type { @@ -44,6 +46,7 @@ typedef struct s_cmd { char **args; struct s_redirection redirs[2]; + t_list *create_files; } t_cmd; union u_node_content @@ -61,7 +64,10 @@ typedef struct s_node t_node *new_node(int type); t_node *new_pipe_node(t_node *left, t_node *right); -t_node *new_cmd_node(char **args, t_redirection redirs[2]); +t_node *new_cmd_node(char **args, t_redirection redirs[2], + t_list *create_files); t_node *new_string_node(char *string); void free_node(t_node *node); + +#endif \ No newline at end of file diff --git a/include/debug_tools.h b/include/debug_tools.h index 4a7ff10..3f3dd26 100644 --- a/include/debug_tools.h +++ b/include/debug_tools.h @@ -3,17 +3,17 @@ /* ::: :::::::: */ /* debug_tools.h :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 18:34:37 by dkaiser #+# #+# */ -/* Updated: 2024/06/28 15:05:12 by dkaiser ### ########.fr */ +/* Updated: 2025/01/20 19:38:02 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef DEBUG_TOOLS_H # define DEBUG_TOOLS_H - # include "libft.h" +# include # ifndef DEBUG # define DEBUG 0 @@ -22,4 +22,5 @@ void dbg(char *str); void panic(char *msg); + #endif diff --git a/include/env.h b/include/env.h index d38ed29..bfb28c7 100644 --- a/include/env.h +++ b/include/env.h @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/08 16:53:39 by dkaiser #+# #+# */ -/* Updated: 2024/12/24 16:21:50 by chuhlig ### ########.fr */ +/* Updated: 2025/01/20 16:48:57 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ typedef struct s_env struct s_env *next; } t_env; +void free_env_node(t_env *node); void getenvlst(t_env **env, char **en); void free_envlst(t_env **env); char *env_get(t_env *env, char *name); @@ -29,10 +30,14 @@ char **env_to_strlst(t_env *env); void update_oldpwd(t_env **env); void update_pwd(t_env **env); int unset(char **av, t_env **env); -int export(char **av, t_env **env); +int export(char **av, t_env **env, int f); int echo(char **av); int pwd(t_env *env); int cd(t_env **env, char **args); int ft_env(t_env *env); +int builtin_exit(char **args, t_env **env); +t_env *env_new(char *name); +t_env *check_existing(t_env *env, char *av); +int check_flag(int f); -#endif \ No newline at end of file +#endif diff --git a/include/minishell.h b/include/minishell.h index 028a4fc..06abb04 100644 --- a/include/minishell.h +++ b/include/minishell.h @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/22 17:14:49 by dkaiser #+# #+# */ -/* Updated: 2025/01/11 16:05:11 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 20:20:09 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,21 +25,45 @@ # include # include # include +# include int init(void); int init_signal_handling(void); -void repl(const char *prompt, t_env **env); +void repl(const char *prompt, t_env **env, int *promptflag); -t_list *parse(t_token *tokens, t_env **env); +t_node *parse(t_token *tokens, t_env **env); t_node *parse_cmd(t_token *tokens, t_env **env); -t_redirection *collect_redirs(t_token **tokens); +t_redirection *collect_redirs(t_token **tokens, t_env *env, t_list **cf); void print_ast(t_node *ast); + int eval(t_node *node, t_env **env); -char *get_cmd_path(char *cmd, t_env *env); +char *get_cmd_path(char *cmd, t_env *env, int *return_code); int execute_cmd(t_cmd *cmd, t_env **env); -char *format_string(char *str, t_env *env); +char *format_string(char *str, t_env *env, int is_literal); +void set_return_code(int return_code, t_env **env); +int handle_redirections(t_redirection *redirs); +void *error(int err_code, char *err_text, int exit_code, + int *ret_code); +void command_not_found_error(char *cmd); +char *read_heredoc(char *delimiter); +int handle_input_redirection(t_redirection *redir); +int handle_output_redirection(t_redirection *redir); +int handle_redirections(t_redirection *redirs); +int handle_pipe_parent(int p[2], t_node *node, t_env **env); +int handle_pipe_child(int p[2], t_node *node, t_env **env, + int in_fd); +int open_file(char *path, int flags, int mode); +int eval_rec(t_node *node, t_env **env, int in_fd); +int create_files(t_list *files); +void q4fc(t_list **queue, t_redirection *redir); +void i_love_the_norme(t_token **cur, t_token **tokens); +typedef struct s_minidata +{ + t_env *env; + t_list **create_files; +} t_minidata; #endif diff --git a/include/token.h b/include/token.h index 54a65f2..2e8da35 100644 --- a/include/token.h +++ b/include/token.h @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 13:27:18 by dkaiser #+# #+# */ -/* Updated: 2024/08/29 15:26:23 by dkaiser ### ########.fr */ +/* Updated: 2025/01/20 19:10:30 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,11 +43,11 @@ t_token *new_str_token(char *str, t_token *previous, t_token *next); t_token *new_redir_token(int type, t_token *previous, t_token *next); - +void free_tokens(t_token *tokens); void free_token(t_token *token); void free_token_and_connect(t_token *token); -void free_tokens(t_token *tokens); void tokenizer(char *s, t_token **token_list, char quote_check); +void print_token(t_token *token); #endif diff --git a/lib/libft/_obj/ft_atoi.o b/lib/libft/_obj/ft_atoi.o new file mode 100644 index 0000000000000000000000000000000000000000..b5601c8d2f22565c44594f0d479cf6d188bc1455 GIT binary patch literal 1336 zcmb<-^>JfjWMqH=Mg}_u1P><4z)-=2U^{@B4h-B3TnwQeoliYFYhN69{Q}Z<-1QGg z^0?~{5cQg++4Towx9bm&$Jt=Y@k0m>4fG9_T!Xu8x1-0mc)}FAO?e|6p~aJ{C7x)~)V# z{lmZB^-Jtw26ty?D+LXg)TGSBJOx7|JtI8>T|*O1D3d`1*p3AYD=fp)+8tlGKV42ECNTl0*i*q~c-* zz2yAd+|)dvSYCcfs-C-FsBUpdVsbWvUQudJqF!o7d|FXrZYtC!$|z}|c2JnGp&8=< z<-`38<%85B14SSQB*u&^2xMEJD}>6U3#$XgLD5C7ejT7*keLQRj0|A*Dc2=r1RhurE+vTHV*cd7&XX7-!!n|W{My%i7EVvKM^ZA?J`Fla}g&6T&>>D@ zk;Z|>UOxu5y}*`_ADR1r6FY+#9kL`%@a~C)cd>jb8D|VBBRuLs)CBxFh|0wyHaL&O zQx-nzMdGsB@Kt@2mrOLS=#3rF+O5?C@aC(k@{8zIW9%y?Qo*(Y{@hnS@M5zGyi~7N zgBoJBx(fLE!$PL1{L)L{jbPK~L1m-d@T-CD^nY#{iEGd?CV1p6d`x=|tHDVR5zwYSW zKT}{nfhXtimUO`-jgyXcWb_87Hg0c{eA4}&(FN@&9-6VMH#l*oOcy;p1y1H?;FB1* QyQ5rI>z^2+_U>5!0xCnQ)c^nh literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_bzero.o b/lib/libft/_obj/ft_bzero.o new file mode 100644 index 0000000000000000000000000000000000000000..14b59f26d03aed485cd635cd4a5b419d40b2d1b9 GIT binary patch literal 1144 zcmbtSO-sW-5S^{XZ^cg#^bk)f=u$;d6eLn(7ZDF)kD_T!sc2hBBWgiB2tw(lH~lHz z1-<$c3L+FddFxGQ(%ra(deMQIeednOog|wZYiBFM7^q;d4nIt(0FRnz`mzZ<&<#mZ zei!BIx+tI5#EaFSt&d?*N!CThY6$lF3?Oc;2J`8fRde5})q^KU#N(^R^rn+KvGd0K z0$<>=dq^+g!5>dCsK={Mhzv z;HhE}c)F0wIeFCb1<&D$-Q--+v(u-*UFXc^PWCY4+BqjU`afVC&Gb#$Lx-4>2k$F6 z_3AN+gtRtYM0^qAiiZ7DxIy>zSN|+}>C70W9%{a!i-^^HwJvFz-g>VS4J)6Lwh@p< z_pQf+BrCdzIQ(x~s6{bNOg)4gG$uvz(H$wj(p$|Y%PSR(BfkQ4;Y!~)>{q&M3znFi aKN=`aAmut%JQ#2j6b=Q7P0<&q_BsxC$vx2c?!i*lU5w#bOu8TROPz zWTE@>5>|`FMSFVLD}QmSc78!EsQJ14n;E9mZh{_Y*6t^;nprD1GB9|8FZ>)eI%MzZ z@op@8m?@6-XEbJzkZ$y?y>R!C7VSyd#3&|?$Mk3xYLj@fDNSDfMTc#(={l84%~fuf zgC9vGly|*)4d4a$>_wz=|IoH#Oz(^7HtTd{WsXyf$pL|(W$_`>{-Ie ze>8^y+D}0e7=Li$Jo`h4B*`x^#riAOd)OB^7Lvf^{8@}s&ws7YV=eWR_e2_*%(vMW zkokg(7!WQwgr{*Q#*?`pF-F>>e+KkJO8vHk*2f r^gugl0}Lb5j+6D&H@SN%Y4ZHnY5S@!LekCD_g`!2QR4{84g~UQmqDDk4L_q{eF7ZNwULv^_qF^ip!Oqss zpJ8v~Pw)>|S=kFZbGN&$M{IOpX5PG=H* zy^Y(~+slvZ%MY_1!FbRf!C3V0MLUXkwjINmz3O?S5pUg(q&|Ftd@i??oLaR@HLISS zn`iSZotj&i7SLOPVORj;Vh4;?!WfJ8^xom1apcL#vJ_V0iJMR^7U9@H^)E)x5Qg{9 zPRCsx-aL+tLmKbxB5{QmYOZxsKXX`FE9Bgy03poe%9wlZaH|B&ATnwdt|P3}+XBx1Q==0%OuTkrKk!%`=yO$5aK zxNEE*(8)4>QZe|CuHi`--BcYu*cXdN1W!7;BdM2sr`;rZp@3HOB0wKz`o=-MnMdPmO^g&Sn1vai$uK)l5 literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_isalpha.o b/lib/libft/_obj/ft_isalpha.o new file mode 100644 index 0000000000000000000000000000000000000000..3989dd3002ec848e59e68923bc131cffb7ce989f GIT binary patch literal 1144 zcmbtSJxc>Y5S>e6{ES4gP_&4Z3TBBxK`i7Xej#EZ+6a3-*} z)9l_iyLKy%{;V~IzR*gbZ?p$}+55mVDb8PDFPGa$Ep9u-imawqvLY)o>6O(b4XJ60 z9GcZQ2CJU5X2%AHo^bXYa&*Yj50P9VUd9H>e=&OO7<_#8D@Xgh={Pn{8oWP? z#Fr{x@#OVwS&EX8@VzMwA{gleCcHaW$s!0()q1haNI7){;zBA3qUd=bN;j_SRFSLR zC`araou)k{OIILj&b1UyIe%G`t`l7SA25qz`Zn>jIk*f$ zF|1#}I_>SR`eoG8of$l)@%)rYBIfxV*9^{VeKZpTvyQ0)1jPN=HReycVO>WK;eT`o z3o$%4H|V&p2TkjobhIPZGv9AENnXjJ6?_jcjFG-^SkJs}3&NtFKNB!Lpy_~}Kos5` O6$`rYBK1&T~J2= literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_isascii.o b/lib/libft/_obj/ft_isascii.o new file mode 100644 index 0000000000000000000000000000000000000000..2023ffc46272c49cadde08318eb6cc83ecb0fd6f GIT binary patch literal 1136 zcmbtS&r1S96n?9w{ZcGC6n5B77382&5FKK}%!ud^2^|U>ZN;Tl!QF!eA`wL1`cpc3 z4EkF-b?PqEd+W?LEq18~Gw*xfeBXP!JKHTB?u9fBWN5Gr-<4zmo)yyYXalBT5=#5M zw_ay(-x)wVj(fKo>yz|-tWT=*S19K5Tl&hbS+RIS&*oT;WzyO8RRO(LxXlTm-5!J1 zPHL&?*!UART11`}#S(2hiR42lACI1)fa+g@o*@DspQDb$Bi=B9!dZp)W|6t(mMw=n zRm);krI3Af0YaE*`N5nU+vOEtj@ugMx zxV(A=tYuzvX4cEK7Pn2m^?yJL&Gc=efhLBi{r46%Y1N=};=(G4mIxrB6}^2#EV}*H}La!KTPE1^>|k9z<{%QXsM+ z2F;6_d~`?BFZofk$?`%Q#)Y>7Okk#O9P~?G$o!;>`3pWX1cLV28AQRmqr+1nJn@x7 H5cGcm6DUc% literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_isdigit.o b/lib/libft/_obj/ft_isdigit.o new file mode 100644 index 0000000000000000000000000000000000000000..befcb643234ae156e48354d1a78b234a8da03d3a GIT binary patch literal 1136 zcmbtS&r1S96n?9g{ZcGC6n5B7738E+P#t2!%!ud^2^|VsbOu20iIh6Y>kT}c+;Ss{%cZNNB;L3XeG z)^2w1o86V$5bhhTV27mdLmg6`y+S6H+SC_!th{Yj^+b{-Sv;0lT@tX@3b$ziw3{Q) z8WAlz5gd8KMsvv1qL`;`I~;lNr9#7}D4_b6pl1lc$LFA9|A03Pqi{;$d$Y(~;yK$X z+7~uw1*MREbpd>sX}Q6i>k2pXz#Lxh=dwiHYH(mhlbgWujsvVvt5mEia@88QSmrPr zbGTW!1Xj1MOlFmHrMg+M+}8gAQ8d%H8TK?WMD4z}s7b2^ofGF*NyMh7mZjIffCqGM zfAue;mwLu=sUhdj>fG@C3hv|*h0c7RdL^o_lK$qSjAbTNO{W%@wSE<1_Hdv|nrB811T IvJbreF9IYhz_w~W<+#|gbszRwxX14xO1>TC4$IXe@aJ> zL4Ql9PThriPiMAiu}eLedEfiy``+8#*>>h&*QaS9LxU~&t|SZatdK^ZHedqAA-C6g z>oj}!&E7&QjC-pc>XP(*q)V!^SIDN*oBHyORj8P@o=mY6OT?3FD+2ag;Wi_Hc6$U` zBdWzFL!(dFXdZc56pOTNN1_kDbU1j50;+!rdWHaed=5MI4|&4~3a1smKa0#Ip07C9 z^@`0|Q7L3!T>u|uT5d4srpnC%Fo)L%xhxU48XVY#$xUDd#{pKXRjZbboL%D<%O2+9 z4mXRJ!0OhO$*gj|R5z=Z+xkBshGzOUK~EDy)b4wWnzU-rIdOiKL~MF$S$h3TctH2| zSN|${sb>P08gjm_l8EJenb#FgmENg^f~8MV`v{2pao1Qs3c-fRGI{^e3?2k<8B!p! zAqLHgntXIe(l7a8v&r&88^(Em2N=Ul-`MMyypXv`7xU*_W&i~3vQvn>cSnaOLU`;d I2f*w90+RnqC;$Ke literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_isspace.o b/lib/libft/_obj/ft_isspace.o new file mode 100644 index 0000000000000000000000000000000000000000..6325fbb39acddcf3c26bccec42cbb9e614e4278b GIT binary patch literal 1136 zcmbtS&r1S96n?9w*)J?Q6n5C?P(cnV1<@fk%#4T*kcu z?br54E8D%h>FPX;d-O8WA@SQlhjd3TkjrG&^o32kSTSpQD$UX?nMf@!iqdTclf4Am z^*(6Lm=+(23_fC;8RThE%+aH-Qx$2bfi_R_z*cwK}(1 zZZDs3xM`gMYuM)|v&)52!>rm~>;DvSG}E^U`R&=H^-SVYL(bP#5^FhM<`sogrS~dOYUz{I4i?1yxNF2MAy^ezCjUR0#e)zo zLkdJT#GomG$wzl2{gUrDn=H??VVt--Kom25W4~YWLgpo1%%Ap{ULk0Y9mk6L`r}Xt J4}1rH{};1_N~r(< literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_itoa.o b/lib/libft/_obj/ft_itoa.o new file mode 100644 index 0000000000000000000000000000000000000000..a861d2b4e4f588856116cc15d31a70d47cb8538d GIT binary patch literal 1728 zcmbtU&ubG=5T4!ER&A9i9*PxQdXPrUk`_TIA}e*81_l2Q;g+O7O5y zd<4ORp#B5Wix*GgDQTgNo}wp@UW8(Ds3#Q`Psi)5 zQU9VU4W$;}U@70L_^{gZW7e;l{_G~N-!^@^)T^}NUjJJfpml+q)ltv%mDUKIRTFzO zt=y-u$2X0A#2znMBi>|YJ1G6UccSi%>*YYa6 z)RO$xeaxU1RpgcCmY9e9El39QTn(K>%LuRbe|I`htfW_<`J`g@;c@IQ27X7^z2AiC z$;kV(0~Z#!A($BV#@Gf|G}rYr&Gw05DYplAC0Z4 zlSld9@-; zxHCmT2@w~DF-E&Hq@2Ly{})4?KZKfU=}i&@e+F&hrN0*n!&CS(x zAH!N|l|+#t`fDvM zY5)BwqF(Hu+C+O(iN?uwauA164xmKq>E7t>k%9)Vr~S%^uH_g8yVcKe^0r)zcC`Kv DAgurJ literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstadd_back_bonus.o b/lib/libft/_obj/ft_lstadd_back_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..b5794314bcab3440880bb77b30ffb1277f353a3e GIT binary patch literal 1200 zcmbtS&r1S982whGtSl@#1a`1f1vR7;M2FZgbBKrtg*t@o>Wbkna96M(>QbYcmI7v4_2^EU9?PIIEqvoG9@d?e(Co9cdqQFM7*4{=l;$H-e>P~tCTA? zjH=}w{T~v=Fnyz8-yyot-unwpwJPROkQY=<<6~gwcDP;b;qs<3VnDHw6#Gn5GQxR?# literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstadd_front_bonus.o b/lib/libft/_obj/ft_lstadd_front_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..e72302fdf8b59b8e6706f38857bf55c779982bef GIT binary patch literal 1160 zcmbtS&r1S96n?8w_7jT^g&pjaLJk!L(IE^omxzc+=n}T-hEcnQJAwt#Em*wxKXvgR z>25b~^`6e#ro}GxVCMVYH}9J_JF_qOlcR`X0EYql@SU*=(AC83K+eK6OhM7~-%bCy zZ~D!i+0OUPb{wH+`e(6WT0|c2T)jadm)lFG4(;--4{2M=RQeAB8W7C5Z(Pxq(9u?w`~}RT`V>q&0pzu;PT2eXr=#ALV`l#My>C%L8J(vL|5$TS@e%4i404dc!9VkPhr%SC0Sy literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstclear_bonus.o b/lib/libft/_obj/ft_lstclear_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..5bad20bc3635ff1e5d57cc3ec3ef937c1585960d GIT binary patch literal 1384 zcmb_c&ubG=5S~p+8?}~HDirErz4!y#M^ikM9%LnreTXQCId}@2^p%uuHjsURv`{@r zge8~$MH28(1kWC&7a^dBc*{YkGrMonb=h7@2WID+Z@!uLGP~qM<>m97WdWN7PvIhC z7ND8Cz)l1mn1@?XmElkM@wY9* zEk#lQ>*x(wy`r@;KUX-xA9xRWa!Mn<9`wIKF&5Rk0BbSyCCX80HV=uwUm#X-_}a(ysEAR+HD+wh~%nS z+v~V3y5hB%jZsd;S!dJiWz*lI1nnj|?Ks^}bJM#=3h2LpOvGXOH1srI RM3mKEFbjD%RmLFQ{|})hl+FME literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstdelone_bonus.o b/lib/libft/_obj/ft_lstdelone_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..3bc32199123b71903122dda89010efb8ffd4d8f1 GIT binary patch literal 1272 zcmbtSK}#D^5T1>qwN*(=DS{pr1c{(eBRxnCWlO3qr6>qFcnX{NLeyjzvM&$|Vxb@` zIW$NAPY>2>|3kq;5B8QrA&te=vVhHk4{)C`3(z-6 zC#D^khF4H>qd)HVzgagr>$_3=*6nWf-7dJ@(ybd^4SvUYbag|L-t|w|DHaQM?vtz> zdA^CueXu%NYkqq2MGt2$AWu%VM#sn5>_w(HGjWUsls{th z*yHeTkaj(m@}}>w@QuO8vyfXv&!#o0sd6J!hq4j)vRn!Lb||V~l2B_&2|2ADM|_r}-8?-Nt=c+wu6IJ-aUx^PZYQ;0A>bf^$@wdIPd%Ti&!d)luA`gA^KFyFnCCMV49+b5VJ1e*I;Qq8Anw6GgLzLE zY-(iS{c-*ogS7pB(}Q@=wEszT)-#_rn|lAE1FbUzc!@|mPU@*|a`z;0^!ywphG}}l Syv8U^f2j)(MwP=LslNmAlVY5QgUx@mq;vAt)Ft6?D;{AcArdql<`$7%bx@oQUIt!{SGoIAe{05OCwGaHqrQGBzWWm^#@*{P zY(%3=;mI{Sd2Hpva}gF{vomw^Q&Iv9$)gz;yI`D!jFH}s&O1EgC~|VLeHvE#LpOnF zUwdE|GYGUc`n)#yuD4nZwzv`MKdA9WFDgC~iHswTgss3Rd zqE`LYyr3~X^+69bt?CroL_v(+Ten9UEb0)o{}+uRYeP5Dbvu=fh9#srdLvb@c&px2 uQl$aypfLh;;Y@ezuUA~AdDD*UKjx99kl3RGsQhn7i?=dy&&zBIfBg?}k8NiF literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstlast_bonus.o b/lib/libft/_obj/ft_lstlast_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..b968ed35873abe1170d8de921dc998eae6a14b3f GIT binary patch literal 1152 zcmbtSOG`pQ6h2qQ?1?=Vfkn2eAP1F#Xc0HeyhKDqEyJ#M#mGl^N3cLzM1iyg%^q#SFbu(w z)q1sB&8~IR>_UC=iI(1Ht#-O=wat*#qAcp$PW_F*@iSynsrBgMmXkZPE73%fC0RU{ zSXmM!?J-3G&A2)MqY*YDBLks(Ji`of|?Hp!a>*u1ZxYOXkPHk=j z%egMFe6?J5D#%r;++mr$qnOL>{5i0iQ?i*;%ob{P+3~jiPZ2>eeVd@Ri7BvmZ-J>- zwRr@@`Bf6@x`rjx^$WN_@Ag;yGHPkhIJ#%BWdPw%bT zqX26viM9TZrjZMvo9L?Ti$T+ZBptnx)JvY)^w}hNp@4SMivWX|=^N{M$%{5G#l`$N YkLefs{l}5k-;O$qqVcdV^P;Z*0{m51*Z=?k literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstmap_bonus.o b/lib/libft/_obj/ft_lstmap_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..aa0df25a4fe73803dfe6f6bd3b8e03df60bce170 GIT binary patch literal 1544 zcmbtT&ubG=5S~qI6KgH;$3cj~o~(*}G}VLjAggihLqtJX&{Nn=wp7e+H2Z>8C>|=s zB?$d9ihqCz9zC?)iU-L*AVlgR-UZ1$CX_jb-OK$!v8 zVO%K`pfEActt7Qz29ANl<8OT9hsERdE|1%LJa%^Z#(EdTEQUQ0c?`SIp8i0h@0`QBqUG|P)@kuA)ZuU?cXT@m2)Fo5y$0T^pV zqcoE*Y~g~=B2G^Bksdc@i<`O1@u}Q7&s5T-IxKFEIGi*n!Hb!I?`p;!nYxr(U=5D=S_1xMMd51?bPGThgJs8?+ z4L_pc?=*Z$!%d0jFp`gqMK1#3dcY#l8pc(Xwfu(5guf<$)m`BN^P&h?tr-MvNUP^tRszX};2jOGAZvX%Q literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstnew_bonus.o b/lib/libft/_obj/ft_lstnew_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..1e5a07e13c2451995bfbcb927f6df653dc0e6e70 GIT binary patch literal 1296 zcmbtSK}#D^5S~pWNo^`??4ghr_E4mS`Y_@_Jd~A~x)iY>1nenn(iO$*2C`3#LTEuM z1TQ`M2Lz8Ed+VWx(tpuQA)uGuauCv)&71hT-IETy{bs)T=1um?eyps&Nf`!k81Ncy zD`o-A)NO7@sSSB}2vw)|+d00roL;y8&BR8Znoh4WaE`kJ*w22Y`l{%hB6C{pJ3TW> zf7rQ5i1g3zuvRWFTQ63<`mP&Tr3JAd=I2U_FI7sy$MnE3jyA#Qm_{+5&3(Zi`V=`j z6cu``OqnOC@}o@3Mg7KPll8RX;!^ivMEfXBD4TI)=}j#4x`9753@QyUv$zmhPO#qX+M|bP{vk&$z5{ zy7XKxw4CRddWQ*d|9mr8Uns$nLI(Da>$jLB`G2MsvCrgx77x!epR}9q{zVUr&In)< lkvxvi)4g%;X=F?7e@=xKiXJo5m?h0$D&hOFa+Jj9{{oIxXk`EZ literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_lstsize_bonus.o b/lib/libft/_obj/ft_lstsize_bonus.o new file mode 100644 index 0000000000000000000000000000000000000000..f3ac188979de7ec38e52bc6462417d5dab3db804 GIT binary patch literal 1168 zcmbu7&r1S96vyAHl>Nk_Ltv1dN~ocvAUec`Z7vZVqK=`fZ78LJJAz3PAqC>4f1z7{ zLdT#(*Zzbc0>M-Fpx#?&wqfy958j*a`^`rbCaj-MfwOm4&$ zw(V@eD#cb3EWwtSR#xLex}z{m38B>wK&wTx=;&bh4rk0DCnwu-!+7L2kQ^Jh!~&Q0 z5A^dw@cG?uH`wO}X#S+a-C5Lp%G2i#cM5eooh_HD4$CPBAVxK40pV^!fjJjNZe?-h zmEM|{irX~~?8M?0u&m<%%aw~oyM(M%<~B?1A1yiD%AEnL*yk3r^Xb!yRkXdM|0AN< zOm{QjJ46?`_rFC>wW`fwLM*64)YraTrvCnU+@N>+YyTql(wWQXs>%5=6{42&<+`RY zwe((16fOHC+C@Q(-dnW?k*uo_wf`G6kcH57bk#Cq(6oTmM{gwiCGR(zTHYw2W!wlb mge%>#zh81u<}JFIKkJd65ZI#=sQhn7n>A5*=vDTFzyAkFE?n0D literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_memchr.o b/lib/libft/_obj/ft_memchr.o new file mode 100644 index 0000000000000000000000000000000000000000..70158a2049f1ad3e9bf68e5aa8f4a510362fc3cb GIT binary patch literal 1176 zcmbu7O-sW-5QZnU_+70cDAYqdsh~?+6huKPH8zNdiaCm=HKn4dkVa5J6a=C4qCdrp zc=zDZ9{U3-6ujuIH=Rj$;}Uw(f!%%Q*?D)8Y_7G9wUDBK2nCkmHxm?~Cc%`4Q_u&! zVCdy{y?oUupVjrUQPW?wChdMq>J_7*SG1I^XAud0jOe#oQ}Ifcw3_qw zOuoGr$fVPY>eQ;0Ju-`GBFU00KAV`E=8}piMp_Ffmph=GN0nHASNA6>&04oUIce_x(ctsE1W5bKa3>W4rs(x875H|VYqU`of*d=hv=`$ z5Vhzp)_IA^rH^tVY2g!S9R)GEZ#lfb9KnJNQ3rob4OtjR3Wpp8-e`Y5QgVY@%tM=L5o#wVvoMMzW7dLswM`6d{} zE@PmrvFQeX^B{6sWNF$KJG!pTRC|NDjU5DP8$E74e0|rd*421J?bz6(@NgE1v;L0f zdKvG8WqxCT1l7!EL|u7%N%>2n?sg6_FcBJ zVUHJlCvyla?;bhK-QUUP9nX!A{!cJ~VtOYH+964i$ImNr>Q!wB6Jm8L#Q0XrWvc6k zu|U`LSN#}j>C6dSs>%5Y6=E#sOFyG9we>+wlvwH{TE&2vDS_}W!p~}4|1>SE*W*fR zeMK>-UvSdV9Z9|9wPuGBq2CP?fM)dcj&;4{qAhm2Lf;pYC=fWN-5BY2M@9ONl5IsU H-gW&CJu_+9 literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_memcpy.o b/lib/libft/_obj/ft_memcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..62d92ff0944cdfac21ffa4965536e2f26c5a28bb GIT binary patch literal 1192 zcmbtTJxc>Y5S@$S_eT^#L5qlmADATu1+kE5JY7UZ#FV0!^Fl-~N^*fHh=nMI5b$UC z3#7`JAwNdd&nPb?zIb_AbL%DSEpx=1 z)!xVcyCAl_@$z=fUF_y5|4N>{XIP8J7eW&&R`STmgl3{F$|B*J*+~ImKzyopu>)Em zs10|uw%y}5kDyM2B2Cj$Pw+Mn?`{d0*g-<$pyM{fcdb#islg3(V`IOfyL*v2`!zDDa+_~)-Nz6{Rp3@RJR>1*wXgCJ2WG)BHJhg2rgIea)vDn&H zBAjy!^B7pxIx(1)-cMx>+wzwF4;V%>-ARjYk(l7#c?G9lHAaz;)})GvAADR=zkeJH z^jv@SPotOCjNnj1?jKS`#BzU`=M+tCeNl;mrB6!h2uP#%Rzv#dRS_|rRSg|UGme-l zA})xHhJ;Q&dL!wVdZWEvi|`+~1fU%=-Lc; JCvW!qe*m-*Z)5-f literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_memmove.o b/lib/libft/_obj/ft_memmove.o new file mode 100644 index 0000000000000000000000000000000000000000..c49861ba76f5b9a5109075150219ddbfd55f9b8c GIT binary patch literal 1256 zcmbtS&r2IY6n?u(w5>l&4=w3oJyk&m6$@z#B_-WDNG&4fD7r~UEbS(c-4rWG52ADl zg&qsNB7hxeMZ+p}C;*8mhp@;fl_I>Yr-#5d~o3HlUH>P2L3Ikq3 zyHYH`xY@?p7R@9U8uGt0gWXw z8UW^faeb$N*{@vXO@(~1`-wq_kbKvaV~q{szaePh5|t3$b;J~RaM2y>e#Mg}89$}}QIbR~>1%crkv=i3I=v literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_memset.o b/lib/libft/_obj/ft_memset.o new file mode 100644 index 0000000000000000000000000000000000000000..f3d6f95ee280bf57a7665b1b7050b5ce87352abd GIT binary patch literal 1152 zcmbu7Jxc>Y5QgWH;I|S*QP3h*D(Ir3APN$RXATh&@k-H4+z`==kXykBY9WXrjlV$r zDT0NqWm-WYU}cw1XD++va>PalcK4lU=iSNP=E~eyix>u|Fkl&eGDQI%HJJ2q5;~y+ zY^(fkl`m@L(>JSZSFLBWPP-oiR>iJa6|-&`FBSXkHf~*;b;AcsX0`Z=sUwYJ^iZy7;OgJPMcm7e%bB-Pzg z!UD>F3A#oMKEIl6N1NQd8w>k1?)M^dPVBkd^|)Z!9}SS8J&cGPenJ!TO0IA+xQb$9 z%_}ANnE-a+2nSfk^MGYfT$dM+6;1?a=}mje6HfLBSdkw)jOX`qMaSjA(f<*{Xr^z{ z5;`O)^WeTRr&>KmF(DS!A?nLeuF|l73^(Y#{_3AZFP%A!Ll4zIp+nTFzgp)trkCF9 ziKdlLp>-6*=)LuLkja7$QHTGVCbAfgBn~~cWTPPo$wzOb{E9d0O_nN682kPV(2gs8 jfI7C1Q7^SIN_^JN_L=vUdAt5; zY}m^5_qG!afcbR#X8iI!t57zp@nlL*>4~}IwJSWNZfEF)rmZc2)`)4d;p3AXoclat z^pJg^*PWBGSAle7BJd6wquMRP(F}Tt`io(ikg-Nr5`tfYamC=6jmD4|knrIwTpWbq zh5Xg(0%oL9?IHp**hlCML0EF~D|Wf+n5B}f7vV6@+g1@)?XqKmOcAm*9)!@-6n$DG z+78EQVN?_N7mlm^ILC=kk1&G=0vB_GUVmP3%mRAH9{FVv+13+NcdUj3ddYN5&h zVnTOi$RNfYeo2huC(x4?zmh{c%l#$vgiC)1!%9j$i1StWD&o}hU-e1UQcroOn1VQ8 z?W>-DgXF+z~zO=&-}sn>D}i{tc@95iJy#;X1g D6RX^^ literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_printf.o b/lib/libft/_obj/ft_printf.o new file mode 100644 index 0000000000000000000000000000000000000000..a2584eff7954dfe4cd56acf442de5568c4e91a2f GIT binary patch literal 3024 zcmb_d&1)M+6rYv9l+^C3Ay7jK6{QXq#9KQlC2dVn<7_+_JETcOQ)sbeSw^Oo>`1${ zQYzvgZ^*JN_);kCrT;)7J*0#{96=z8>BXl|3V|FNkWnZu_@IMY^}X2{X}pf16g}8^ zZ+`D{=Dm@w>yzgKib4b_gW}!Y^lGHwUSwpFgcj5*NTN2 zxz=;H0aQH&W>xK8H-w^Y7e?HZ+OzI9d+wq|wTn45>j^#GX}ol1zv7vV7$BSK`-!}(G7Jkn4h$vZihhCEcmamLRiy0-_Eer z6^NN<1z#~Qs~fT1ebK4Z#>do|syT<;tI)Eknmr=7ahYM%z6x!$pYXD)uS5I+v-iOO zlwaxl8-{Mr7~OcW0}5*2?}vG$_MIz?eLKULn*ugzTg!~Od0=ZLBdkXBRW&lTu0~=% zs*x{ltC3_$jik5Ki1|#76n4tiBv|65m90UL@a>hY6Ce#^E?0-iwT59!UF!le+d2(w z`v=fE%-6Ok;*Nz?!HXIlFg03aJEeuH8(R}ReZ>*C~%wpR^qjiYFz?<&usJIV8&crj1V$DHugby@N9B+A)X13 zoYYQg!$TwQMz{#4BS&!oQog=Olzd1z*4q}ULpK9secdx)09(|J zA`Y~Ui_ixgW`O$75eFI%z#{Y=X98$|`fpGPGy(ZqdR_4{Fx9>VO*_e7teJjg$4h=` z`@kq5;p{Bjv4gN*xIJO|xxKJsX9Mglj^E+d>`WjJ!589~%uXGEM-RX!55PY=08avb z1kP2*y9Hu*h{C)vy_{Xh81q_!Fkw28if6f)GlY~_%6vsuvI|DC=@Fls%QiQe*_Ld| zn^ZF2G@2*mP0R_@311I8(2;y8E0{y0B3;)f)> zAmN84{HcV$BH@2_zy`>lH_T9+9q;2?67}I?PG)?#n3Gi>F8W2Z+_kh3p9OAYJ)RO$ zHn|wrjAY&*+Faa-6Kyt^BU*OJ+a#9K>0}0UnI$8sjh~MV<&1dZOE5sUWNLao8&BhS zw1vVD1zUjs_cBHK<{Vy}M7&*1 z^yL+}KmQ3(V9fvPKLWlOlaCKb9*O)o^D_DKzYj{p@Q+3&m)9SbL6C*N;AbREHvQ>8 zp8r$s@2~$h_y0}~3bMF=0bc|GO``(f{4qcH4Bun_&{z12{^2?NxzUAo;Y!G9eo%aq m7}D>LZ`uYvF~|3RK8E(|&M`~M3YH_4m; literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_printhex.o b/lib/libft/_obj/ft_printhex.o new file mode 100644 index 0000000000000000000000000000000000000000..3fec031928d3c3ae4ec2ad16c5f3883db4f1898b GIT binary patch literal 1552 zcmbtT&1(};5T8v$Yc+PGR8Zm}dJq-6B*lXi(MVjo6hDd(&{NsOEeSQLB#TXjps*-; zhCt|F;n9m8dZ^VxLoa^(2e}BV$w6;I1L@4}d&#=&NeAAW-~8rtXLp~gw{L|c34};+ z4Mvt=0it6goN{0aB5(vU8vCwUy*R7&*e{J`I(6078fvEjFSq6T21Yj2p4E}9Ka*=y z9BwD->V9|Hwb&>5y=qHeE&B|zR;?#LJtc3cb|cec-#-2bYmH2Y?XoZS#$YfIm8;ja zrnPoG>oxdi>soQFwO2}Jx zY^|B;<8AEo$eHBU{9S^<32-kO&c$5TP!oT9Ui3t>X^f3G$1Ubh7-lU9y zArJ4&f*j2j4JdLJx#Jiw;+)wiZrNOVQZAItyirwhAmCEj$iZ5e>441Y~IC}Dp3 z^lnh%M52WFaSXgt90*?Y2c@!JH1#ZMv+U};KxN~xu9!yE1m%%#>Y!vR6;N`k#iCI{ zuC!_z%KY8TOvTi5E1)>xMt*6ztQQT@_kVR93(z|m_Z3QU`=^hmSg*v;pdF>WB;q_R z0_CKuU=lUu;-}+?;Lo8&yytgy{1^R=9M+BH&{3E0rkeknpTt~hHT+HxlZgIt#~NK? zETQMnCGaQ;U?GSMh`q--zOG@3MV|j)$hbi4PtXepg7*J{7ZlG$`=7ug^2PqCjlVZi s@P_wqk%4j;5B2fqQ(gb=k%B9{s6vKE{A)RezM%ZKJpZ95m!LoY0RHvNbpQYW literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_printnbr.o b/lib/libft/_obj/ft_printnbr.o new file mode 100644 index 0000000000000000000000000000000000000000..173d69e925e03822f02621708c313e6801138be0 GIT binary patch literal 2312 zcmcIlO-vI}5PsVth!&|v6Ac>n;t$4dC^m@3pDM0h6E%i}c+o&xx6)_}wu@3?1yeC> zYLgzlc=Y5!j|304B@rZ;G#n}Bz1H}N{TBnaeg#R%t0l>w zm4cZ&fj~gY7I-z6{b^AbvTN-fIW?bMv2b}V(~(sd)qEn;IW4Xy;-%)thm#`k@>1}# z&RgYyrEze3N&TQM7oJus6;^EQoRkvRXYtq&e2=<-M^wdfB3>pj8z#;ZU{s2GbW-X% zhlXk|Hl&MO`s19Tk9o0->?iROtdpZ{v)e&SDQy5X`xiZMToP;7E7wVY1N^vEl2ZL; z>`48h&KH(`RVqobJe7$x&1eU*f>%?%c8o8fHjGhSocXl0v?R5@$G}YatJAfk%jr7d>N(!+>LCt7JiWcA_#+o(U(g%oon1ng(CKix zI;aVQ0NJf8!j1P4Zp_ZL*_yVd;l}p^jz5$IT+Z*XKeP0gMx?Ib!`MK+SLy|=b>6gANVFJmtrtqR62nVKG3*)h zJy-}NqpgG-1#PFcQFVf|3-Z~%+AILW*&yCz(X+K4(F`a9BavWO3Hu^~pD=SEB2#A+ z0-E#Ykdez1heOE$WP@@5KBmBzv5`Yvbj^#1N@HL8?^KGvu#Ium3J2AWa?`2t>RgnU?)$#lsFbBD@o$xT$l-I2^#} zIIF2`VByT&RYW&N5CloB1fEiO?n-4^TjK^|sP`)|+Ed|(n$MV_yncoLS zz58RIoI#q1_lI1@XZMHaG1o?lL@(qkIw1I8iqDvt-wc@f?f@b@eSR*ZV-R!yJ0Vt& OKS)2BUIQ0RGygYAb*y{< literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_putchar_fd.o b/lib/libft/_obj/ft_putchar_fd.o new file mode 100644 index 0000000000000000000000000000000000000000..a3b55db73fa8e0e4ea72de36fc7016c47fc28cfe GIT binary patch literal 1272 zcmbtT&r2Io5T1>}SWQb54}}OWLZyNFFu_CdP`0EoLHYvHq zE~SuT|CU~RP%r)$f`?vu+e0AEY~HNTWqWA{=6y5Y`(|c$l0B`w-b)z_I?lNWp z0*$mn+JY=BLA~Z**FOKw`GG$SzE&o+?{6mGD#1^Z*ZeF0{D#Ei%U@6}mv_ylubgJj z9+<_FD2eT@;!Z(@VM{z#RbYI255_2Ge$IC~#FRAjw`8EnD|BKOc zq~Xsr>3S~VO_x!)qVeG@xZ4gb*1JOF__niT9gCpsP>f8F3C+*e& zh*0iy8y(l~htCqt_>aKETH5V=tcRs?-Wy+&R<}GRv@y@&(*X6E;Pzj+_?*jM%Y%LUH^HV*rGdE4A99e|5<;H-gZw%&U1dH(R+m<3duLrvc4-u?pT+*_)m^eqskJ zUP6pMvU@b#Ia7X9sFfxQ%g7)g-)J)v@M}MBwwQYp07W=ZPYa(Jc~B00l465PoSq={oYUQn!qOozUXjjXHnow z4yQVj?>n6M;t2q#_<7F;P4qTO{W?dH=?2Q0Eeon0*Z@>BjzLBJG->sFJrm+w*tbTl zJY1WNZP0px1d^HcMkfk-c(VUvK9->#)0w1IUBZ3hIpRv2#)R&qDnX1tIpSl7>4;?poSFCL+$Re;wzj=D+GIsHK{RdWSi$pT)E5-*Wmn^wPFn;!6-?*0aAW zFiCwc6A`nHp+^`HmfhzEM_6E@^L+mduVRqbKi?JPK2iTj%X-H1)~4FKG@!jp9h^o_ k>tyvO5zF?DB=pZByOFx_m_0xJSMu}=ZvVkpnFd+?9~eB2p#T5? literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_putnbr_fd.o b/lib/libft/_obj/ft_putnbr_fd.o new file mode 100644 index 0000000000000000000000000000000000000000..7f2b2c32763aa7a9299391a0a5033715e423843d GIT binary patch literal 1760 zcmbVML1+_E5S`uB+G<;(cu-n&4=M)C($rw9h(v4b9;}B#X)h8t>Ba_4BAX4iLadS^ zenO!a@1DeC&pkCQSnENe2fca`qUPesAb~iu`M+Jid+I>;&%AkW=I>0BrTDFzs-l1} z1+KzgBv61?fjvLwx-sa7KA1MxH>2FpSgFB^^~z+!NL7u@#=UepZB*+T+pPXk*}H1< zRA`gcs$W&5rfh_&>^-ZMH-=xt+vQTD_sN+`9CbA#^Qoizp`psvRN{5^mVK$eY`5FS z%48ekb-JFxKCtaN-D7oUi{By0N-b7wJ}b2lep(!?#GC7fiM!HI#68K+NEtbcLqu?k z$%Nl`T9xT$CEjA6vC9eUy|Wb_i9|=EV;3$)#~=(aF+P4-J9ooMX3U%x8PP}d;cz4x z;x523YKf*io&seds0{WU>{-QTLx|CbY?&U{27=Gk@&0ag2^pQ-6~fUhdhF)!x_N^9 zjNYRQezpB_0iTTqk*Iob_byxzq@2LlI4<+IB|eVUwU7Li`5MQmK7EA6 zxFhgokkPBr(dkD!)ndUuK;i2ef0g6I^zfWaA!Cs-+z|tXT3$y7xNeJ6gqzU>)`_x??w9~t zA?#)GFvi=*-#ulXs$>UbKGcbgDfkIy$Eer*YzR7J8lPr4#*Tt$Tb3^Oees z{d(4`FS~8KSW+c5Stw4uVH)=ac*baLe+6qZZ;g)(KJ4O)y+EA~S&1GWp5%Y!Dvt+z zOd$Ubqi^bmi>s_~U&a^bF>y4d$FoqIz(X<9UZIesLsQp&tm{w*wdRs)+;Yjmz^d1V zjbK@O)N_m*_aoBzdzIMRl>Q*4+pN>?N&O-K6>j<3tt09n!IrSVTXmK8HZ`avSG%C< zVF;?R=KEe7wf36!)cohgLa5!w3aB{UYt@>8>&NfNBmWC*tfqf5V00<7FZ-6Tc_+s) zK>I060wdiKvdIMC5h6))H=eWplJ!3J1p*-kn)BaboO<53zKFHdQ{EG4Y%6Jpl?17GKI82|tP literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_split.o b/lib/libft/_obj/ft_split.o new file mode 100644 index 0000000000000000000000000000000000000000..c0742f5f0da83cd153b868250a4cae95da56ce87 GIT binary patch literal 2392 zcmbVNPly{;7=JI>cH0`a+ft#}1#?iT#g4mGp=?D{*0GObwbTwMx@@xP)Gpm5vYEju zE-g%z4r5>s9(weyXX#1T7G2uYLYK1il*0-s$sxVXAsT<*oA)NekbwBXd*And-~aE; zORk&mzn9^hY2xf{HaKaNv5$8TrPIIC(Rvquhvg^t08m8JhR6=GvvZETRe7g?*?XX{+^8Qb*7PHn{sTyU|R%C z_-41g3oc!9=?=1xc+%W*c4FAwcZbS(@-sG_8c9PQn4u_dlAYk2QH1Bx7(%%Z0eb6P z+!p>ui$WoJOL(g-=8ntI?Tf1O_KPxF<2)C>)eWp(<1F{j^+frB2&|Ui50K?n292FE z!*900qx{fp{)w=%HLEN9NrD?@;+q0&Em1Fgs|fk^6&Cq-=`D6c-J1I|_dT;f0@7R)+>w97AK`+jaMJ z`-M?jH7ckZ=lj0Zfi+d$)CER^d(AUDxQEUud??>9_51yy;WntgsK8)8jOK!|CW9 zh{E+*_5$n})+AP%W&j*SoO$&lBYOiji#5#t9cAxkAb@0_BwThD>R&7`IYya%ZaWKK z)>bYplxuF)k;kfi%~^12SM4gRl$Muk<=CEGUa@UD5syMpxTmy%#;|r__3$kc{h;bh z<5Q|0!p9T#Z;rr!8i79?f#(sEh}6nNo(pmx;6-)TT-)pU-b~r+IWnXERmCYSf;%e_ zzoMlTd%0vdm>@GQm7EeY7VC9plxvlWjqw`QnqwPhKCq70ol^NKGo-nF1p_Tr;_Fdq z|2NCSlSZHT+mW#fa%b#uawx#mH7PA)^j*^36k;S2_R!^m)*{CCf|D4KCpZTq3}PmP%s zl>d*(ppfHZHuGt56!^?wq3Mnc;EUnQTgPfbAwl?ug!MB?aDS`XqLi`}d%iY7vK1Qo=CA_ME!!S;wM|ZbR2}{|cQ5X;y6?dksJXzWs#7Y<4D^&li`R@j$xX7Vx6K?Q(x(b-n23{l=WYiUn(+<`;<`){@olWuW!(QB8}wXH^^c*K&YZwyhMu1?NyK`-&eH~GN*~O^ zz}ly&&j^Tn^wwDaQG!n@>lFWM3Tz~BWwb!$A8OFBs>w%hr2U%jG@C4G<^N6vMlUY9 jS6a#@i2MHo89RV= literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strchr.o b/lib/libft/_obj/ft_strchr.o new file mode 100644 index 0000000000000000000000000000000000000000..632528a1ac7d756daee111fe5903513ffd7de983 GIT binary patch literal 1200 zcmbu7J4*vW5Xa}@`EqAo^)+4OMk_-5TrQ_ zpU7H459S_axS7O}JKtkkDsC4zuw9dzz>=;D%*tglb{1JS$8ENLez49InF9fZGBb?MN6MVt0;)keXCIx#heOJdw)$GSuKgwXK>cLJN9`AgG{&ibC*EQsUM{#DnNjbhEBRbfaWPh=TOcQV3rB z8UBLaDxw8F<_{Ed5d=@(1Nz?X%w`;N(g!o|d*A!Mo!vM4!&?5HU<_0+_zJB`v6vGr zoDX3hKEX#=w`=!y?exK}9W`#PCUqWDKdmM^vzoSBx6iBxo7K~Q;MbKHF}O@v-=U^q zvpdw}uEjq?1L@1UDNA2ojbGR58#l06D9mTa7QEuFQ_fD$@EJZeIXycrA-&81Z5Zri z6<9UH2D>}E&hZ0>kfTL$O53;I%o5}T{uwUcDv&g(7 zHUm*{{X_1yFhG`i7&LBeI$z~Ejnk$7^+LnSr>G?a#J##}tQ)u}a#4zR^VhVn zlfspc6%n9+oZ?HA!Wq#WDZk>|ogMn5e@ps5V5S+He#J{!oT}3QIc6dt>6q<9WZoS$ NFQjlSRz|?|zW@a1cm)6e literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strcpy.o b/lib/libft/_obj/ft_strcpy.o new file mode 100644 index 0000000000000000000000000000000000000000..5e4d60f33dfdf77b2ee15496af441396f4dc14fb GIT binary patch literal 1192 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 X9U-t!$4~|Djy4ZO;l5wl5kdbCH*!)w literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strmapi.o b/lib/libft/_obj/ft_strmapi.o new file mode 100644 index 0000000000000000000000000000000000000000..309084c5b6663316f7801285ade34ae5b8aaf8ad GIT binary patch literal 1456 zcmbtUL2DCH5S~qH6ScNcJSgoUphy+_Xo?5vK_YSOB34Dop$93ObW4lbM3N0up?HXh z%OdpV*?-_kJV`__c#9XwF&+fLy?FB=#F^chcDrsbI`H_u`QFSo%jA(K`pxSpO#=xH zuE1U4?4WRO9Ntr~93*=5|FgTzzPC zwujKpyrq&KD_+^ho}r=jKLYf0KTuVu4p5zX15@w%-f~#=Vn#zt!&~mVU)+~!lPXj=; z9@&mrL3ElSZU}2yHB&j(mIG?dbWBi{Rtr?MVcS+6wR*#`)Y7f;T+1=54?qRw*2e03 z)3hxf_ur652l`FMV@^fRW#4j5wb7WygmzSnipaCPgn8BvBT}!tk5jClV?E8ez*iwL zjL)avgFOGWzkt2uDc^}S2$`SfTtMavF5-o7sUeK~g+%4QYHw35o_%iy^DLVdkw-)J zC)y1pN&COdhO%ece+G~Ai=H%_ybYeeLkY$aJhbC@Kl#RYj}i>H{{khEV0l+Ljx4GF O4uAj3Ze>W~{eJ*n9HQO; literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strncmp.o b/lib/libft/_obj/ft_strncmp.o new file mode 100644 index 0000000000000000000000000000000000000000..a6cfedfaff261511e0525c2b7cd33dd1fce3b7dd GIT binary patch literal 1224 zcmbtSJxC)_5S|x3|L#sb5mEFYR;QqkC?|+Th{V-J3wwCEkBLuFp58TZp@2$@z)!o4CeDlqGZ+7Qx+1OeSF$T&QMByz{EI?oA z4aZtA1|MMn5~lZJdZmWxW%larO{u{t<>7K(rF2^Fz}h|Wg4>4w)oovK|O zHaCckBO2eDMdGyBb44zba(?oZmZ)>X642VU)dO(%mm{nsMv-gBLxqH05Wo*CVF6FN zF7Q;=aqJ9onXIt+#*f6jE3DKp@SJ^OarD0{dGH^b zMxMAXSy$m!fj|uEzhRxO?O*kCsHHO_=(?%-VVy**=Bv1*aeC{so@iL<6t#(fxOaDr zc^#c>xgGpx@E0|((v2STJKEqv4jPv{>FAD>Uh$n~lVn`#_bEZ^N2eVJ^@^t+-3n4a Zp_7Ou?XzDH1@DfE*RpZP?`(sh{x1}Kcmn_c literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strncpy.o b/lib/libft/_obj/ft_strncpy.o new file mode 100644 index 0000000000000000000000000000000000000000..978f1ef15e659d958d8babb22196f626056a161d GIT binary patch literal 1192 zcmb<-^>JfjWMqH=Mg}_u1P><4!0-Y|&;cy$z`)JG#SrSz`P8Gc_Jv1h>4VPDJI7uB z{0D;9^4+d~Jd!VXbh|$AV7$;B3gn#f=nj41!FY;)8$$JGCMxN`bO1 z2TBhDHNJ>F%;4_qY^9*#lA4s6n5ST9q-UgOplfKN31xzuAp&*_0|R4K5Cda{0HZVy zJI4f|TV;UaAPfSrAi|MPppD6ymyIa`r~)K_9e}*a!tn7wHd$sYA;Sk$D1;;qwhN>= ztt7sDP0a&}<>i;8>bd)c>K2zICTBC~6{Y4R>ZNAHrxhjUroxS;gdq*o3wuMg}nZ6_5pi zY?%Ep+7w9)S?OM64iX!t4<_UVWPrp_;u^?50K_0*0ioa|dJ=U7%CG>j16&1!Q316` z0xAyD2Z|$@ewa8myFprhfCwN+0Fw+1oIn~B#_0NC;!tI9DgtW1BwPf-fC|G!1%WK| SxC2Ro@+t^~Kqxqgt{(t~Xm5D{ literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strnstr.o b/lib/libft/_obj/ft_strnstr.o new file mode 100644 index 0000000000000000000000000000000000000000..5a06fae4d1751fcca3f1b5e6abb001846bd07d5b GIT binary patch literal 1360 zcmbtS&ubGw6n>Nb(rVLGv?%qkp8SCw+M*B?N=jTihQ2W=sQ zLjQzb?H^D)N=A;j1-+SNtzW10n``&$cKf@SkW3UKm zrcr>MOd1#BumERZ97>}3Q#9X2qS^$ zq{S?S;x5WIx06D2{3&5}h?qhnKv9xTjR`~|6m_xp$qgLZ#i5uXJDfIZ@!ZMHXT4r8zSr}wuv{$OajxC- z%dfn;GrzzW_}uLLt?MeJTb!p48hiT$*hY@coEe{(BQ59_XD&q8N|Ej-7Qz%^7dMP1B4u?WdHyG literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strrchr.o b/lib/libft/_obj/ft_strrchr.o new file mode 100644 index 0000000000000000000000000000000000000000..0c99b6664018c4b989927068a4be30a8da0b02b1 GIT binary patch literal 1224 zcmbtSJxc>Y5S@#n@%sY{MT=Oepo@w^u#iYxJwzcu0iE%7&&`=i2j=F@n|V8Tvvg;(Z~-@e8U8E zKs%(&;;UIadn@KE<`b_{<%!oQyib;R&9uvAiNBdfx#tc_sY<+@@2jKDBClTXno&n$ z@8v`Op~Nc~e)r>v)$K=EO(qv&7PkdR&hZNLv;oNj_q=rx8r zTcg+bfg{M1lbzCIsk`?olI&`U&C`@jsKoS;(f8>3D>nV zF0-{nog0&Y)~>A{fO#ibVWlw&*N+*6gi{c}_AFrmOM4zL`#76*a>(V5g~L`iQd6F= z>_cF#b7V0mv$OA7Sx1fhR~$w)?WQGkNCyVnwZR?z8# Gu>K1(Zg^k- literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_strtrim.o b/lib/libft/_obj/ft_strtrim.o new file mode 100644 index 0000000000000000000000000000000000000000..d7332af3d387104a495c5f9225121c0f6e29aab7 GIT binary patch literal 1688 zcmbtU&1(};5TBRyBWi7{C=^;S2N8?y(iRVG5lN}fK8jTl0(y|LiCY@XCXn4g6^lqz zx`aZHy?X0kAU#Q-V6mqnD7~n?2!VK5Zypxn%*%Ur-R7hNZ)fH=zxmjC%Rc9~ZpIh` zEex*1k*86B&G?a>l4c5e;1r~V_ucy?yt2Q>gT{cUa=-5_O!A=Iy-jr*=S7A4OyMtU zpvC-l9miE4UZc%Qx9`bM+ad{rxdYf*RWRLJ8& zl?P%|tlw=)oFSRlsft~vwskSZeP@U)9PF=psaCyDl68gql^Sc6Ljx;fN9us(4n<}4 z5Zndol%+`z1>1iQu*(BtG%h0K;{;52X}_8d*5{eGfYd#l9jSZRcr7M5Q@rkcqymjj zxrYxsFgH6poxFU*%H+&Ka(u#=Fvdp5uMR7d>XV#nDPT|U0bA*3gFW4e4P5XL;&e!+ z=rPmV|2j5%y30iZx)i%cI7)&pM91TC)?&!eu?JB*;Ait#0D*X$FQgaoSO}N1AVzba zMO^!G2E;Dl>Bke5VFcRYu;eZ}Zpkg>Y$FRfXE9d@LCVZq1+dM0zL<)9Tx-PzK%O}X@~kqopHTtZEF=(iywFQSbUKMIc^PBs5Ee;jkErk)c`DY}1B`C94z zT2Es@+nPiAO*^m+_m0BC-xB3-sr>uoghcO8L-S~~+kZkWM86m9zZ;Lv*ZZe7(cTFC p0k@<}TKv>X=kV6iIIZO=8H2kp zjuZtr(8k(KqzOg12$l%Hi_T9|gnK7pyC*`cDr86gd*O* z#e3nQSm#~8IEq3}g^MmHLS*$24+Q&^ z3}?q8dW4AUmY2$RZc0h5 z;cD^=z+OKEwp(Iz#lrMHE@&P(9kP$~bMI2=tyYqG@!!)bzRHyW)v%*mdU=;@rE4Xv8u=Tcmk zoSsMOi2xY>D>txf=mT%)ca-v+hHV7SZUDw}JFvm1`92u+mg_oAWX)FK7#okRB|ot1 zFTqICot>?1&vqR-?!TRm9q7N9%5*YitoE#~DK~AjC)$shhNw$&3Coh7M^CltNnDqF zLGlS1D|f0y#%Jf>#(V1duk~fDrJm|LQ6{G5>oQhO%~yU6FO*g}0UBE*-&el`k?CudkEbA93 XNSVYVGK(s&zA8WJ*(h@;vh}|K>Hw<1 literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/ft_tolower.o b/lib/libft/_obj/ft_tolower.o new file mode 100644 index 0000000000000000000000000000000000000000..17dbc32f94f2cc6641197b6126152fd53f2eb6cf GIT binary patch literal 1128 zcmbtS&r1SP5S~>j`y~|}3_EP63i6>+ARS`E%!r7HycD6Utr+)6cveVbKpQXxlaSr- zz4u!EZmVzHhcKSCgOBNc_f`M!W4?HUOe(ddukKofE3>A@6D+}E(fG!ifUqD|Xm=-| zHD|TR^myrz$C@!myBSIp;%y+%;z3R=HUKX7h%V%Mx*`$$?#(+yqvzZD7TEwQALntJS&1GDq2{ z&CTL9u!dDJnN`k}8fMjUkNyvcpqReRnCB2f)VhbKS=E-YAkMFni1VIWmR|h|Ht62| zs$WMfof$({EiVdPB@xU0GH)uJI@(bS1xuZz4iFIcr`z00~3_EP63i6RsARWRmGa@1)PZ7G>ic$W+eSrz4AOzB-KchdP zdw)w1bm}hDjQigDTI^B-GxN+JpRk5M!$ocuWs^@A`)q^TjJjcu+82n%9`);a~P z8PXy%6M-k(wS+u5nNDFh7<%xeX8q?lK=m(1kLiQYuW@bfm^TaJ;Jm`?Qdr_SUc0T= z%?2yNsE}*0{+s$JwaG zjp8-1hIwN!vz#k6jEdyV_Vbr(;wsx4zdoL40g=Uufd-TD=5(7pXt zzm8fua|2zqyeM>)L@f8qyrppJXjd&1EOnAPL_pk+yT-bUPL{Bf6W#x48aqDpq%&cI zgjf_7Jn86;q+aslc9Z0V0$P3;0VXliH+JhKFUFh{7W)?+#s-3R*f~V*yQAib7(8<( IZQ#~_1GoH5>i_@% literal 0 HcmV?d00001 diff --git a/lib/libft/_obj/get_next_line.o b/lib/libft/_obj/get_next_line.o new file mode 100644 index 0000000000000000000000000000000000000000..23c2b36e758531ccd38a7c3f3c48361b7039e079 GIT binary patch literal 2448 zcmbVN-)kII6h5;_Q*F04)>y?<7$_DK%&;jc(gsTrT$=zWC;(?ue?sv|2 ze%(8>x9qpyOc@3#G3Zq~*eR4~bL2qJ#%h+*bewV`cp!pGD=6Qu+Z`C%Ghyz2Xm^Z; zC^ST9w}jC+xkWR_$|F@q+fxJ0pKkk4z^shbXkz2Lwz0{9KD-?#sqSWi%B~2?O%ddF zg1J_hYjOBy@S6zgEx+6C26lvWan`1&rBiI)5g~=SNCbD`h5AI8+Yv#E*`Xa7jcPPm zehzU&b$g;$=jp!4;Qa9oKU9C?TvP2`Bgl2wPj%VkE`KIs(?vV_fPQa)a z9aSq4t)K1{TszV;_om!F1=~iN*|Nv>+3(@dJ`>J$L@l?+7EyZ%5Ia1>6?5-f&o3_(U8~T)&o8^h1md{`nlCR}87lc+-dR}4^KQ}gsIcrhp4xb>vp|cU z>-MvW@Pa}x$)o)1@b>_64YJKhU@+}HT;<7-;j8Uu^|or^AP-R zEsmZyjQ}jkIAan|)_+dJk26p8n>{3siQp_SOP6?`jh_d&x>wf|xH@05O6x1WGtaB< z_0}6o^W0^}^7+ikT5x=atoc%jtitNbid$r?xazysrFU{uCEqFBBrA4zZ{!y}XGNuz zS^xiHG8H4%{;uL++4xCxMQ@%lc^uM8G|n1ko!v)z$}a#}Oi94mLB$<`Jl$L99IwD} z7j*d|kyqK0`CniIVkY@tOTK!q72i~fT&HRw?}a*2vg7vM?h1(pQ^W9QA^7ea63QKR&}7PG=reMq%N}Nj)l+I%Rs*+Bln2-T^_B|xWozLD z%1R@6lXJe(h~C22Fxgan4ON@?O0N?or6C3PamMy3!}ndU4q&?-72ihy8nUcKQ z@k6lkveJC^UA!8`wQn0RIX*s?yf9&=b4DRKGAfVC!$TvN23ZKuOSeRmp56m#sYmMX z?(AB{AMy+`T4Yz~as61&tHk)xj>jm#l=cFSehAmz{zA0>kT}{udhq(h-%voTh0!*z(tw#))#EYq;{w42SEHXzfDxjCNZ4a-_Yv2B{X-5VCr-=z&#b2qdP z0`Cy`y1+XHKEwWmbdJcAOrJnci(85Xob!3j#yFoB$i*jl$4H}h?9eap$TlrQc5o&j z&l!#Za=KUqIkTA0n+0TrMaPsU?`T6s$H+VaIgpzRde%1bdvjoI5A2dyNh6?HiI!r? zJev>Si>1(y8#KEV7cf6fKMLAx@B}!7o@(j8Kz2HGa2`EzCTA4jeY_FdiQ|jN>CA)H zk6$I%o9t>*uc4Mb%^ znm>Ktyq?dW+QfTPNs7TWO3)7Dq9fz=bZ&h1i1y&kAc-FFv7CsckqDy(JM_Um8qJ^M E{|Y@K$N&HU literal 0 HcmV?d00001 diff --git a/lib/libft/ft_split.c b/lib/libft/ft_split.c index fbd16c1..1502ce3 100644 --- a/lib/libft/ft_split.c +++ b/lib/libft/ft_split.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* ft_split.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/08 15:36:44 by dkaiser #+# #+# */ -/* Updated: 2024/05/08 11:49:32 by dkaiser ### ########.fr */ +/* Updated: 2025/01/21 20:28:31 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/lib/libft/ft_strcat.c b/lib/libft/ft_strcat.c index 648c184..b21235b 100644 --- a/lib/libft/ft_strcat.c +++ b/lib/libft/ft_strcat.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/09 13:06:44 by chuhlig #+# #+# */ -/* Updated: 2025/01/09 13:07:15 by chuhlig ### ########.fr */ +/* Updated: 2025/01/14 14:09:49 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -26,4 +26,4 @@ char *ft_strcat(char *dest, char *src) } dest[i + j] = '\0'; return (dest); -} \ No newline at end of file +} diff --git a/lib/libft/ft_strcmp.c b/lib/libft/ft_strcmp.c index af7b2a1..a319c63 100644 --- a/lib/libft/ft_strcmp.c +++ b/lib/libft/ft_strcmp.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/18 19:03:14 by chuhlig #+# #+# */ -/* Updated: 2024/12/18 19:05:01 by chuhlig ### ########.fr */ +/* Updated: 2025/01/14 14:09:59 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,4 +20,4 @@ int ft_strcmp(char *s1, char *s2) while (s1[i] && s1[i] == s2[i]) i++; return (s1[i] - s2[i]); -} \ No newline at end of file +} diff --git a/lib/libft/ft_strcpy.c b/lib/libft/ft_strcpy.c index b5c612f..94a07f7 100644 --- a/lib/libft/ft_strcpy.c +++ b/lib/libft/ft_strcpy.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/09 14:38:30 by chuhlig #+# #+# */ -/* Updated: 2025/01/09 14:38:53 by chuhlig ### ########.fr */ +/* Updated: 2025/01/14 14:10:06 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,4 +22,4 @@ char *ft_strcpy(char *dest, char *src) } dest[i] = '\0'; return (dest); -} \ No newline at end of file +} diff --git a/lib/libft/ft_strjoin.c b/lib/libft/ft_strjoin.c index 526592b..5c0bf41 100644 --- a/lib/libft/ft_strjoin.c +++ b/lib/libft/ft_strjoin.c @@ -3,44 +3,44 @@ /* ::: :::::::: */ /* ft_strjoin.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/03/07 10:15:33 by dkaiser #+# #+# */ -/* Updated: 2024/03/10 14:02:07 by dkaiser ### ########.fr */ +/* Updated: 2025/01/22 00:27:04 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" -static int copy_str(char *dst, const char *src) -{ - int i; - - i = 0; - while (src[i]) - { - dst[i] = src[i]; - i++; - } - return (i); -} +// static int copy_str(char *dst, const char *src) +// { +// int i; + +// i = 0; +// while (src[i]) +// { +// dst[i] = src[i]; +// i++; +// } +// return (i); +// } -char *ft_strjoin(char const *s1, char const *s2) +char *ft_strjoin(const char *s1, const char *s2) { - int len; - char *result; - - len = ft_strlen(s1) + ft_strlen(s2); - result = malloc(len + 1); - if (result) - { - result[len] = '\0'; - len = copy_str(result, s1); - len = copy_str(result + len, s2); - return (result); - } - else - return (0); + char *joined_str; + size_t len1; + size_t len2; + + if (!s1 || !s2) + return (NULL); + len1 = strlen(s1); + len2 = strlen(s2); + joined_str = malloc(len1 + len2 + 1); + if (!joined_str) + return (NULL); + strcpy(joined_str, s1); + strcat(joined_str, s2); + return (joined_str); } /* #include */ diff --git a/lib/libft/libft.a b/lib/libft/libft.a new file mode 100644 index 0000000000000000000000000000000000000000..fe3527dab2c418c8a2d2e2e0534d255a33a9933d GIT binary patch literal 81400 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 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/09 17:01:16 by chuhlig #+# #+# */ -/* Updated: 2025/01/10 14:36:55 by chuhlig ### ########.fr */ +/* Updated: 2025/01/20 19:07:18 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "env.h" - -int echo(char **av) -{ - int i; - int f; - - i = 1; - f = 1; - if (av[1] == NULL || av[1][0] == '\0') - { - write(1, "\n", 1); - return (1); - } - if (ft_strncmp(av[1], "-n", 3) == 0) - { - i++; - f = 0; - } - while (av[i]) - { - write(1, av[i], ft_strlen(av[i])); - i++; - if (av[i]) - write(1, " ", 1); - } - if (f) - write(1, "\n", 1); - return (0); -} - -int pwd(t_env *env) -{ - while (env) - { - if (ft_strncmp(env->name, "PWD", 4) == 0) - { - ft_printf("%s\n", env->value); - break ; - } - env = env->next; - } - return (0); -} - -int ft_env(t_env *env) -{ - while (env != NULL) - { - printf("%s", env->name); - printf("=%s\n", env->value); - env = env->next; - } - return (0); -} - -// int exit(char *av) -// { -// freenode free toke free sequence stop repl free env; -// clear history; -// } -//// - -void free_env_node(t_env *node) -{ - free(node->name); - free(node->value); - free(node); -} +#include int unset(char **av, t_env **env) { @@ -109,21 +42,12 @@ int unset(char **av, t_env **env) return (0); } -t_env *env_new(char *name) -{ - t_env *result; - - result = malloc(sizeof(t_env)); - if (!result) - return (NULL); - result->name = name; - return (result); -} - t_env *check_existing(t_env *env, char *av) { while (env) { + if (ft_strcmp("$", av) == 0) + return (NULL); if (ft_strcmp(env->name, av) == 0) return (env); env = env->next; @@ -131,31 +55,66 @@ t_env *check_existing(t_env *env, char *av) return (NULL); } -int export(char **av, t_env **env) +void export_export(char *av, t_env **env) { char *tmp; t_env *current; - int i; current = NULL; + tmp = ft_strchr(av, '='); + *tmp = '\0'; + current = check_existing(*env, av); + if (current) + free(current->value); + else + { + current = env_new(ft_strdup(av)); + current->next = *env; + *env = current; + } + current->value = ft_strdup(tmp + 1); +} + +int is_valid_identifier(char *str) +{ + int i; + + i = 0; + if (!ft_isalpha(str[0]) && str[0] != '_') + return (0); + while (str[i] && str[i] != '=') + { + if (!ft_isalnum(str[i]) && str[i] != '_') + return (0); + i++; + } + return (1); +} + +int export(char **av, t_env **env, int f) +{ + char *equal_sign; + int i; + i = 0; while (av[++i]) { - if ((ft_strchr(av[i], '='))) + equal_sign = ft_strchr(av[i], '='); + if (equal_sign) + *equal_sign = '\0'; + if (!is_valid_identifier(av[i])) { - tmp = ft_strchr(av[i], '='); - *tmp = '\0'; - current = check_existing(*env, av[i]); - if (current) - free(current->value); - else - { - current = env_new(ft_strdup(av[i])); - current->next = *env; - *env = current; - } - current->value = ft_strdup(tmp + 1); + write(1, "Minishell $ export: not a valid identifier\n", 43); + if (equal_sign) + *equal_sign = '='; + f++; + continue ; + } + if (equal_sign) + { + *equal_sign = '='; + export_export(av[i], env); } } - return (0); -} \ No newline at end of file + return (check_flag(f)); +} diff --git a/src/builtins_part_three.c b/src/builtins_part_three.c new file mode 100644 index 0000000..3b9b100 --- /dev/null +++ b/src/builtins_part_three.c @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtins_part_three.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: chuhlig +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/18 18:29:24 by chuhlig #+# #+# */ +/* Updated: 2025/01/21 16:15:19 by chuhlig ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "env.h" + +void exit_shell(t_env **env, int exit_status) +{ + free_envlst(env); + exit(exit_status); +} + +int builtin_exit(char **av, t_env **env) +{ + int exit_status; + + if (av[1] && !av[2]) + exit_status = ft_atoi(av[1]); + else if (av[2]) + exit_status = 1; + else + exit_status = 0; + exit_shell(env, exit_status); + return (exit_status); +} + +void set_return_code(int return_code, t_env **env) +{ + t_env *cur; + + cur = check_existing(*env, "?"); + if (cur) + free(cur->value); + else + { + cur = env_new(ft_strdup("?")); + cur->next = *env; + *env = cur; + } + cur->value = ft_itoa(return_code); +} + +int echo(char **av) +{ + int i; + int f; + + i = 1; + f = 1; + if (av[1] == NULL || av[1][0] == '\0') + { + write(1, "\n", 1); + return (0); + } + if (ft_strncmp(av[1], "-n", 3) == 0) + { + i++; + f = 0; + } + while (av[i]) + { + write(1, av[i], ft_strlen(av[i])); + i++; + if (av[i]) + write(1, " ", 1); + } + if (f) + write(1, "\n", 1); + return (0); +} + +int check_flag(int f) +{ + if (f) + return (1); + return (0); +} diff --git a/src/builtins_part_two.c b/src/builtins_part_two.c index f54e04f..2382f25 100644 --- a/src/builtins_part_two.c +++ b/src/builtins_part_two.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/25 20:52:16 by chuhlig #+# #+# */ -/* Updated: 2024/12/20 18:53:03 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 18:44:03 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,17 +15,14 @@ void update_oldpwd(t_env **env) { t_env *current; - t_env *prev; char cwd[1028]; char *tmp; - prev = NULL; current = *env; while (current) { if (ft_strncmp(current->name, "OLDPWD", 6) == 0) break ; - prev = current; current = current->next; } getcwd(cwd, sizeof(cwd)); @@ -37,17 +34,14 @@ void update_oldpwd(t_env **env) void update_pwd(t_env **env) { t_env *current; - t_env *prev; char cwd[1028]; char *tmp; - prev = NULL; current = *env; while (current) { if (ft_strncmp(current->name, "PWD", 3) == 0) break ; - prev = current; current = current->next; } getcwd(cwd, sizeof(cwd)); @@ -72,6 +66,7 @@ int cd(t_env **env, char **av) } if (chdir(current->value) == -1) return (1); + update_pwd(env); } else { @@ -82,3 +77,33 @@ int cd(t_env **env, char **av) } return (0); } + +int pwd(t_env *env) +{ + while (env) + { + if (ft_strncmp(env->name, "PWD", 4) == 0) + { + ft_printf("%s\n", env->value); + break ; + } + env = env->next; + } + return (0); +} + +int ft_env(t_env *env) +{ + while (env != NULL) + { + if (ft_strchr(env->name, '?')) + { + env = env->next; + continue ; + } + printf("%s", env->name); + printf("=%s\n", env->value); + env = env->next; + } + return (0); +} diff --git a/src/collect_redirs.c b/src/collect_redirs.c index be0e00f..67ab8f8 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,121 +6,110 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/02 13:49:31 by dkaiser #+# #+# */ -/* Updated: 2025/01/13 09:52:00 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 20:19:48 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +#include -static void collect_and_check_redir(t_redirection *result, t_token **cur); -static void set_redir(t_redirection *redir, int type, char *specifier); +static void collect_and_check_redir(t_redirection *result, + t_token **cur, t_minidata *data, t_token **tokens); +static t_redirection *set_redir(t_redirection *redir, int type, char *spec, + t_env *env); +static int set_heredoc_data(t_token *cur, t_redirection *result, + t_env *env); -static char *read_heredoc(char *delimiter) -{ - char *line; - char *result; - char *temp; - size_t total_length; - size_t line_length; - - total_length = 0; - result = NULL; - while (1) - { - line = readline("> "); - if (!line || ft_strcmp(line, delimiter) == 0) - { - free(line); - break ; - } - line_length = ft_strlen(line) + 1; - temp = malloc(total_length + line_length + 1); - if (!temp) - { - perror("malloc"); - free(result); - return (NULL); - } - if (result) - { - ft_strcpy(temp, result); - free(result); - } - else - { - temp[0] = '\0'; - } - ft_strcat(temp, line); - ft_strcat(temp, "\n"); - result = temp; - total_length += line_length; - free(line); - } - return (result); -} - -t_redirection *collect_redirs(t_token **tokens) +t_redirection *collect_redirs(t_token **tokens, t_env *env, + t_list **create_files) { t_redirection *result; t_token *cur; + t_minidata data; cur = *tokens; result = malloc(sizeof(t_redirection) * 2); if (result == NULL) return (free_tokens(*tokens), NULL); - set_redir(&result[0], 0, NULL); - set_redir(&result[1], 0, NULL); - while (cur != NULL && cur->next != NULL) + free(set_redir(&result[0], 0, NULL, env)); + free(set_redir(&result[1], 0, NULL, env)); + data.create_files = create_files; + data.env = env; + while (cur != NULL) { if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) - collect_and_check_redir(result, &cur); + collect_and_check_redir(result, &cur, &data, tokens); else if (cur->type == REDIR_TOKEN) return (free(result), NULL); else cur = cur->next; } - if (cur && cur->type == REDIR_TOKEN) - return (free(result), NULL); return (result); } -static void set_redir(t_redirection *redir, int type, char *specifier) +static void collect_and_check_redir(t_redirection *result, t_token **cur, + t_minidata *data, t_token **tokens) { + char *str; + + if ((*cur)->content.redir_type != INPUT_LIMITER) + str = ft_strdup((*cur)->next->content.string); + if ((*cur)->content.redir_type == INPUT_LIMITER) + { + if (!set_heredoc_data(*cur, result, data->env)) + return ; + } + else if ((*cur)->content.redir_type == INPUT_FILE) + q4fc(data->create_files, set_redir(&result[0], INPUT_FILE, + format_string(str, data->env, 0), data->env)); + else if ((*cur)->content.redir_type == OUTPUT_OVERRIDE) + q4fc(data->create_files, set_redir(&result[1], OUTPUT_OVERRIDE, + format_string(str, data->env, 0), data->env)); + else if ((*cur)->content.redir_type == OUTPUT_APPEND) + q4fc(data->create_files, set_redir(&result[1], OUTPUT_APPEND, + format_string(str, data->env, 0), data->env)); + i_love_the_norme(cur, tokens); +} + +static t_redirection *set_redir(t_redirection *redir, int type, char *spec, + t_env *env) +{ + t_redirection *result; + redir->type = type; - redir->specifier = specifier; + // if (redir->specifier != NULL) + // free(redir->specifier); + if (spec != NULL) + redir->specifier = format_string(spec, env, ft_atoi("0")); + else + redir->specifier = spec; + if (redir->type != INPUT_LIMITER) + { + result = malloc(sizeof(t_redirection)); + if (!result) + return (NULL); + result->type = type; + result->specifier = spec; + return (result); + } + return (NULL); } -static void collect_and_check_redir(t_redirection *result, t_token **cur) +static int set_heredoc_data(t_token *cur, t_redirection *result, t_env *env) { char *heredoc_data; - t_token *next_token; heredoc_data = NULL; - if ((*cur)->content.redir_type == INPUT_LIMITER) + if (cur->content.redir_type == INPUT_LIMITER) { - heredoc_data = read_heredoc((*cur)->next->content.string); + heredoc_data = read_heredoc(cur->next->content.string); if (!heredoc_data) { perror("Heredoc allocation failed"); - return ; + return (0); } - set_redir(&result[0], INPUT_LIMITER, heredoc_data); - } - else if ((*cur)->content.redir_type == INPUT_FILE) - set_redir(&result[0], INPUT_FILE, ft_strdup((*cur)->next->content.string)); - else if ((*cur)->content.redir_type == OUTPUT_OVERRIDE) - set_redir(&result[1], OUTPUT_OVERRIDE, ft_strdup((*cur)->next->content.string)); - else if ((*cur)->content.redir_type == OUTPUT_APPEND) - set_redir(&result[1], OUTPUT_APPEND, ft_strdup((*cur)->next->content.string)); - else - printf("Unknown redirection type encountered\n"); - next_token = (*cur)->next; - free_token_and_connect(*cur); - if (next_token) - { - *cur = next_token->next; - free_token_and_connect(next_token); + set_redir(&result[0], INPUT_LIMITER, heredoc_data, env); } - else - *cur = NULL; + set_redir(&result[0], INPUT_LIMITER, heredoc_data, env); + return (1); } diff --git a/src/create_files.c b/src/create_files.c new file mode 100644 index 0000000..8c04d8f --- /dev/null +++ b/src/create_files.c @@ -0,0 +1,65 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* create_files.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: chuhlig +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/16 16:23:51 by dkaiser #+# #+# */ +/* Updated: 2025/01/21 13:17:47 by dkaiser ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" +#include +#include + +static int cant_write(char *filename); +static void create_file(char *filename, int mode); + +int create_files(t_list *files) +{ + t_redirection *file; + + while (files) + { + if (files->content != NULL) + { + file = (t_redirection *)files->content; + if (file->type == INPUT_FILE && (access(file->specifier, F_OK) == -1 + || access(file->specifier, R_OK) == -1)) + return (EXIT_FAILURE); + if (cant_write(file->specifier)) + break ; + if (file->type == OUTPUT_OVERRIDE) + create_file(file->specifier, O_TRUNC); + else if (file->type == OUTPUT_APPEND) + create_file(file->specifier, O_APPEND); + if (files->next == NULL) + break ; + if (((t_redirection *)files->next->content)->type == 0) + break ; + } + files = files->next; + } + return (EXIT_SUCCESS); +} + +static int cant_write(char *filename) +{ + return (access(filename, F_OK) != -1 && access(filename, W_OK) == -1); +} + +static void create_file(char *filename, int mode) +{ + int fd; + + fd = open(filename, O_WRONLY | O_CREAT | mode, 0644); + if (fd != -1) + close(fd); +} + +void q4fc(t_list **queue, t_redirection *redir) +{ + ft_lstadd_back(queue, ft_lstnew(redir)); +} diff --git a/src/debug_tools.c b/src/debug_tools.c index de59703..6bee1b0 100644 --- a/src/debug_tools.c +++ b/src/debug_tools.c @@ -3,14 +3,16 @@ /* ::: :::::::: */ /* debug_tools.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 15:34:14 by dkaiser #+# #+# */ -/* Updated: 2024/06/28 15:04:43 by dkaiser ### ########.fr */ +/* Updated: 2025/01/20 12:50:36 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "debug_tools.h" +#include +#include void dbg(char *msg) { diff --git a/src/env.c b/src/env.c index 0213209..572040c 100644 --- a/src/env.c +++ b/src/env.c @@ -6,11 +6,12 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/17 14:31:07 by chuhlig #+# #+# */ -/* Updated: 2024/12/17 19:36:14 by chuhlig ### ########.fr */ +/* Updated: 2025/01/20 19:12:43 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "env.h" +#include "minishell.h" #include void getenvlst(t_env **env, char **en) @@ -54,9 +55,27 @@ char *env_get(t_env *env, char *name) { while (env != NULL) { - if (!ft_strncmp(env->name, name, ft_strlen(name))) + if (!ft_strncmp(env->name, name, ft_strlen(env->name))) return (env->value); env = env->next; } return (NULL); -} \ No newline at end of file +} + +t_env *env_new(char *name) +{ + t_env *result; + + result = malloc(sizeof(t_env)); + if (!result) + return (NULL); + result->name = name; + return (result); +} + +void free_env_node(t_env *node) +{ + free(node->name); + free(node->value); + free(node); +} diff --git a/src/env_to_strlst.c b/src/env_to_strlst.c index c4c98c3..5806d96 100644 --- a/src/env_to_strlst.c +++ b/src/env_to_strlst.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:22:28 by chuhlig #+# #+# */ -/* Updated: 2024/12/17 19:22:36 by chuhlig ### ########.fr */ +/* Updated: 2025/01/18 18:50:49 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,20 +15,32 @@ static char *get_var_assign(t_env *cur); -char **env_to_strlst(t_env *env) +static int getsize(t_env *env) { int size; t_env *cur; - char **result; - int i; size = 0; cur = env; - while (cur != NULL) + while (cur) { - size++; + if (!ft_strchr(cur->name, '?')) + size++; cur = cur->next; } + return (size); +} + +char **env_to_strlst(t_env *env) +{ + int size; + t_env *cur; + char **result; + int i; + + size = 0; + cur = env; + size = getsize(env); result = malloc(sizeof(char *) * (size + 1)); if (result == NULL) return (NULL); @@ -36,6 +48,8 @@ char **env_to_strlst(t_env *env) cur = env; while (i < size) { + if (ft_strchr(cur->name, '?')) + cur = cur->next; result[i] = get_var_assign(cur); cur = cur->next; i++; @@ -55,4 +69,4 @@ static char *get_var_assign(t_env *cur) result = ft_strjoin(left_side, cur->value); free(left_side); return (result); -} \ No newline at end of file +} diff --git a/src/env_tools.c b/src/env_tools.c new file mode 100644 index 0000000..f1c3748 --- /dev/null +++ b/src/env_tools.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* env_tools.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: chuhlig +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/15 16:14:31 by dkaiser #+# #+# */ +/* Updated: 2025/01/22 00:01:03 by chuhlig ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +// char **get_split_path(t_env *env) +// { +// char *path; + +// path = env_get(env, "PATH"); +// return (ft_split(path, ':')); +// } diff --git a/src/error.c b/src/error.c new file mode 100644 index 0000000..2ca60b2 --- /dev/null +++ b/src/error.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* error.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser + +void *error(int err_code, char *err_text, int exit_code, int *ret_code) +{ + errno = err_code; + perror(err_text); + if (ret_code != NULL) + *ret_code = exit_code; + return (NULL); +} + +void command_not_found_error(char *cmd) +{ + ft_printf("%s:", cmd); + ft_putstr_fd(" command not found", 2); + ft_printf("\n"); +} diff --git a/src/execute_cmd.c b/src/execute_cmd.c index 803d88f..012391f 100644 --- a/src/execute_cmd.c +++ b/src/execute_cmd.c @@ -6,72 +6,100 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:21:35 by chuhlig #+# #+# */ -/* Updated: 2025/01/13 09:50:56 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 23:52:38 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" -#include +#include #include -#include -#include -#include -#include + +static void establish_pipeline(int original_stdin, int original_stdout); +static int exec_cmd(t_cmd *cmd, t_env **env, int original_std[2], int result); + +int is_builtin(char *cmd) +{ + return ((ft_strcmp(cmd, "export") == 0) || (ft_strcmp(cmd, "unset") == 0) + || (ft_strcmp(cmd, "cd") == 0) || (ft_strcmp(cmd, "exit") == 0) + || (ft_strcmp(cmd, "echo") == 0) || (ft_strcmp(cmd, "pwd") == 0) + || (ft_strcmp(cmd, "env") == 0)); +} + +int execute_builtin(char **args, t_env **env) +{ + if (ft_strcmp(args[0], "export") == 0) + return (export(args, env, ft_atoi("0"))); + else if (ft_strcmp(args[0], "unset") == 0) + return (unset(args, env)); + else if (ft_strcmp(args[0], "cd") == 0) + return (cd(env, args)); + else if (ft_strcmp(args[0], "echo") == 0) + return (echo(args)); + else if (ft_strcmp(args[0], "pwd") == 0) + return (pwd(*env)); + else if (ft_strcmp(args[0], "env") == 0) + return (ft_env(*env)); + else if (ft_strcmp(args[0], "exit") == 0) + return (builtin_exit(args, env)); + return (1); +} int execute_cmd(t_cmd *cmd, t_env **env) { - char *cmd_path; - pid_t pid; - int status; - int result; - int original_stdout; - int original_stdin; + int original_std[2]; + int result; - original_stdout = dup(STDOUT_FILENO); - original_stdin = dup(STDIN_FILENO); + original_std[1] = dup(STDOUT_FILENO); + original_std[0] = dup(STDIN_FILENO); + create_files(cmd->create_files); if (handle_redirections(cmd->redirs) == -1) { - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); + establish_pipeline(original_std[0], original_std[1]); return (EXIT_FAILURE); } if (is_builtin(cmd->args[0])) { result = execute_builtin(cmd->args, env); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); + establish_pipeline(original_std[0], original_std[1]); return (result); } + return (exec_cmd(cmd, env, original_std, EXIT_SUCCESS)); +} + +static void establish_pipeline(int original_stdin, int original_stdout) +{ + dup2(original_stdout, STDOUT_FILENO); + dup2(original_stdin, STDIN_FILENO); + close(original_stdout); + close(original_stdin); +} + +static int exec_cmd(t_cmd *cmd, t_env **env, int original_std[2], int result) +{ + int i; + int status; + char *cmd_path; + pid_t pid; + pid = fork(); if (pid == -1) { perror("fork"); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); + establish_pipeline(original_std[0], original_std[1]); return (EXIT_FAILURE); } if (pid == 0) { - cmd_path = get_cmd_path(cmd->args[0], *env); - if (!cmd_path) - { - printf("%s: command not found\n", cmd->args[0]); - exit(EXIT_FAILURE); - } - execve(cmd_path, cmd->args, env_to_strlst(*env)); - perror("execve"); - exit(EXIT_FAILURE); + i = 0; + while (cmd->args[i][0] == '\0') + i++; + cmd_path = get_cmd_path(cmd->args[i], *env, &result); + if (cmd_path != NULL) + execve(cmd_path, &(cmd->args[i]), env_to_strlst(*env)); + free(cmd_path); + exit(result); } waitpid(pid, &status, 0); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); - return (WEXITSTATUS(status)); -} \ No newline at end of file + establish_pipeline(original_std[0], original_std[1]); + return ((status >> 8) & 255); +} diff --git a/src/format_string.c b/src/format_string.c index bd7f703..775a3da 100644 --- a/src/format_string.c +++ b/src/format_string.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:30:11 by chuhlig #+# #+# */ -/* Updated: 2024/12/17 19:31:54 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 23:25:20 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,52 +14,18 @@ #include "libft.h" #include "minishell.h" -static void append_slice(char **dst, char *src, int start, int end); -static void append_var(char **dst, char *src, int *pos, t_env *env); - -enum e_format_mode -{ - LITERAL = 1, - VARIABLE = 2, -}; - -char *format_string(char *str, t_env *env) +void append_var_exit_code(char **dst, t_env *env) { + char *exit_code; char *result; - int pos; - int start; - int mode; - pos = 0; - start = 0; - mode = 0; - result = NULL; - if (str == NULL) - return (NULL); - while (str[pos] != '\0') + exit_code = env_get(env, "?"); + if (exit_code) { - if (str[pos] == '\'') - { - append_slice(&result, str, start, pos); - start = pos + 1; - mode ^= LITERAL; - } - if (str[pos] == '"' && !(mode & LITERAL)) - { - append_slice(&result, str, start, pos); - start = pos + 1; - } - if (str[pos] == '$' && !(mode & LITERAL)) - { - append_slice(&result, str, start, pos); - append_var(&result, str, &pos, env); - start = pos; - continue ; - } - pos++; + result = ft_strjoin(*dst, exit_code); + free(*dst); + *dst = result; } - append_slice(&result, str, start, pos); - return (result); } static void append_slice(char **dst, char *src, int start, int end) @@ -71,9 +37,7 @@ static void append_slice(char **dst, char *src, int start, int end) if (*dst != NULL) len = ft_strlen(*dst); else - { len = 0; - } result = malloc(len + (end - start) + 1); if (!result) return ; @@ -99,27 +63,63 @@ static void append_var(char **dst, char *src, int *pos, t_env *env) i = 0; *pos += 1; - while (src[*pos + i] != '\0' && src[*pos + i] != '\'' && src[*pos - + i] != '"' && src[*pos + i] != '$') - { + while (ft_isalnum(src[*pos + i]) || src[*pos + i] == '_') i++; - } - var = malloc(i + 1); - if (var == NULL) + if (i == 0) return ; - var[i] = '\0'; - i--; - while (i >= 0) - { - var[i] = src[*pos + i]; - i--; - } + var = ft_substr(src, *pos, i); value = env_get(env, var); - if (value != NULL) + if (value) { result = ft_strjoin(*dst, value); free(*dst); *dst = result; } - *pos += ft_strlen(var); + *pos += i; + free(var); +} + +static void handle_dollar_sign(char **result, char *str, int *pos, t_env *env) +{ + if (str[*pos + 1] == '?') + { + append_var_exit_code(result, env); + *pos += 2; + } + else if (ft_isalnum(str[*pos + 1]) || str[*pos + 1] == '_') + append_var(result, str, pos, env); + else + { + append_slice(result, str, *pos, *pos + 1); + (*pos)++; + } +} + +char *format_string(char *str, t_env *env, int is_literal) +{ + char *result; + int pos; + int start; + + pos = 0; + start = 0; + result = NULL; + if (!str) + return (NULL); + while (str[pos]) + { + if (str[pos] == '\'' || (str[pos] == '\"' && !is_literal) + || (str[pos] == '$' && !is_literal)) + { + append_slice(&result, str, start, pos); + if (str[pos] == '$') + handle_dollar_sign(&result, str, &pos, env); + else + is_literal ^= (str[pos++] == '\''); + start = pos; + continue ; + } + pos++; + } + return (append_slice(&result, str, start, pos), result); } diff --git a/src/free_node.c b/src/free_node.c index 6eae059..d866727 100644 --- a/src/free_node.c +++ b/src/free_node.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* free_node.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:41:46 by dkaiser #+# #+# */ -/* Updated: 2024/08/11 12:26:20 by dkaiser ### ########.fr */ +/* Updated: 2025/01/22 01:53:34 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,18 +14,64 @@ static void free_pipe_node(t_node *node); static void free_cmd_node(t_node *node); +static void free_file(void *arg); + +// void free_node(t_node *node) +// { +// if (node->type == PIPE_NODE) +// free_pipe_node(node); +// else if (node->type == CMD_NODE) +// free_cmd_node(node); +// else if (node->type == STRING_NODE) +// free(node->content.string); +// else +// panic(UNREACHABLE); +// free(node); +// } +void free_redirections(t_redirection redirs[2]) +{ + for (int i = 0; i < 2; i++) + { + if (redirs[i].specifier) + free(redirs[i].specifier); + } +} void free_node(t_node *node) { - if (node->type == PIPE_NODE) - free_pipe_node(node); - else if (node->type == CMD_NODE) - free_cmd_node(node); - else if (node->type == STRING_NODE) - free(node->content.string); - else - panic(UNREACHABLE); - free(node); + if (!node) + return; + + if (node->type == PIPE_NODE) + { + free_node(node->content.pipe.left); + free_node(node->content.pipe.right); + } + else if (node->type == CMD_NODE) + { + if (node->content.cmd.args) + { + for (int i = 0; node->content.cmd.args[i]; i++) + free(node->content.cmd.args[i]); + free(node->content.cmd.args); + } + free_redirections(node->content.cmd.redirs); + // Assuming create_files is a list of dynamically allocated strings + t_list *current = node->content.cmd.create_files; + t_list *next; + while (current) + { + next = current->next; + free(current->content); + free(current); + current = next; + } + } + else if (node->type == STRING_NODE) + { + free(node->content.string); + } + free(node); } static void free_pipe_node(t_node *node) @@ -51,4 +97,15 @@ static void free_cmd_node(t_node *node) if (node->content.cmd.redirs[1].type != 0 && node->content.cmd.redirs[0].specifier != NULL) free(node->content.cmd.redirs[1].specifier); + if (node->content.cmd.create_files != NULL) + ft_lstclear(&node->content.cmd.create_files, free_file); +} + +static void free_file(void *arg) +{ + t_redirection *file; + + file = (t_redirection *)arg; + free(file->specifier); + free(file); } diff --git a/src/free_token.c b/src/free_token.c index 9b035ac..64278a8 100644 --- a/src/free_token.c +++ b/src/free_token.c @@ -3,14 +3,15 @@ /* ::: :::::::: */ /* free_token.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 14:38:57 by dkaiser #+# #+# */ -/* Updated: 2024/08/02 14:23:56 by dkaiser ### ########.fr */ +/* Updated: 2025/01/22 00:07:58 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "token.h" +#include "debug_tools.h" void free_token(t_token *token) { @@ -18,7 +19,10 @@ void free_token(t_token *token) token->previous->next = NULL; if (token->next != NULL) token->next->previous = NULL; - free(token); + // if (token->type == STRING_TOKEN && token->content.string != NULL) + // free(token->content.string); // Ensure content is freed + free(token);//maybe free token + token = NULL; } void free_token_and_connect(t_token *token) @@ -28,14 +32,26 @@ void free_token_and_connect(t_token *token) if (token->next != NULL) token->next->previous = token->previous; free(token); + token = NULL; } -void free_tokens(t_token *tokens) +// void free_tokens(t_token *tokens) +// { +// while (tokens->next != NULL) +// { +// tokens = tokens->next; +// free_token(tokens->previous); +// } +// free_token(tokens); +// } +void free_tokens(t_token *tokens) { - while (tokens->next != NULL) - { - tokens = tokens->next; - free_token(tokens->previous); - } - free_token(tokens); + t_token *tmp; + + while (tokens) + { + tmp = tokens; + tokens = tokens->next; + free_token(tmp); // Ensure each token is freed + } } diff --git a/src/get_cmd_path.c b/src/get_cmd_path.c index 8a27584..713c397 100644 --- a/src/get_cmd_path.c +++ b/src/get_cmd_path.c @@ -6,28 +6,35 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:19:59 by chuhlig #+# #+# */ -/* Updated: 2024/12/17 19:20:08 by chuhlig ### ########.fr */ +/* Updated: 2025/01/22 00:01:48 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" #include "minishell.h" +#include +#include +#include +#include +#include -static char *get_absolute_cmd_path(char *cmd, t_env *env); -static char *find_in_path(char *cmd, t_env *env); +static char *get_simple_cmd_path(char *cmd, int *return_code); +static char *get_absolute_cmd_path(char *cmd, t_env *env, int *return_code); +static char *find_in_path(char *cmd, t_env *env, int *return_code); char **get_split_path(t_env *env); +static int is_directory(char *path); -char *get_cmd_path(char *cmd, t_env *env) +char *get_cmd_path(char *cmd, t_env *env, int *return_code) { if (cmd[0] == '/') - return (ft_strdup(cmd)); + return (get_simple_cmd_path(cmd, return_code)); else if (ft_strchr(cmd, '/')) - return (get_absolute_cmd_path(cmd, env)); + return (get_absolute_cmd_path(cmd, env, return_code)); else - return (find_in_path(cmd, env)); + return (find_in_path(cmd, env, return_code)); } -static char *get_absolute_cmd_path(char *cmd, t_env *env) +static char *get_absolute_cmd_path(char *cmd, t_env *env, int *return_code) { char *cur_dir; char *result; @@ -38,45 +45,118 @@ static char *get_absolute_cmd_path(char *cmd, t_env *env) result = ft_strjoin(cur_dir, cmd); free(cur_dir); if (!result) - return (NULL); + return (error(ENOENT, cmd, 127, return_code)); + if (access(result, F_OK) == -1) + { + free(result); + return (error(ENOENT, cmd, 127, return_code)); + } if (access(result, X_OK) == -1) { free(result); - return (NULL); + return (error(EACCES, cmd, 126, return_code)); } + if (is_directory(cmd)) + return (error(EISDIR, cmd, 126, return_code)); return (result); } -static char *find_in_path(char *cmd, t_env *env) +void free_split_path(char **path) +{ + char **tmp = path; + while (*tmp) + { + free(*tmp); + tmp++; + } + free(path); +} + +char **get_split_path(t_env *env) { - char *cur_path; - char *cmd_path; - char **path; + char *path_env; + char **split_path; - path = get_split_path(env); - cmd_path = NULL; - while (*path) + path_env = env_get(env, "PATH"); + if (!path_env) + return (NULL); + split_path = ft_split(path_env, ':'); + free(path_env); + return (split_path); +} + +static char *find_in_path(char *cmd, t_env *env, int *return_code) +{ + char *cur_path; + char *cmd_path; + char **path; + char **path_start; // To keep track of the start of the path array + + path = get_split_path(env); + path_start = path; // Save the start of the path array + cmd_path = NULL; + while (*path) + { + if (cmd_path) + free(cmd_path); + cur_path = ft_strjoin(*path, "/"); + if (!cur_path) + { + free_split_path(path_start); // Free the entire path array + return (NULL); + } + cmd_path = ft_strjoin(cur_path, cmd); + free(cur_path); + if (!cmd_path) + { + free_split_path(path_start); // Free the entire path array + return (NULL); + } + if (access(cmd_path, X_OK) != -1) + { + free_split_path(path_start); // Free the entire path array + return (cmd_path); + } + path++; + } + free_split_path(path_start); // Free the entire path array + *return_code = 127; + command_not_found_error(cmd); + return (NULL); +} + +static char *get_simple_cmd_path(char *cmd, int *return_code) +{ + char *result; + + result = ft_strdup(cmd); + if (!result) + return (NULL); + if (access(result, F_OK) == -1) + { + free(result); + return (error(ENOENT, cmd, 127, return_code)); + } + if (access(result, X_OK) == -1) { - if (cmd_path) - free(cmd_path); - cur_path = ft_strjoin(*path, "/"); - if (!cur_path) - return (NULL); - cmd_path = ft_strjoin(cur_path, cmd); - free(cur_path); - if (!cmd_path) - return (NULL); - if (access(cmd_path, X_OK) != -1) - return (cmd_path); - path++; + free(result); + return (error(EACCES, cmd, 126, return_code)); } - return (NULL); + if (is_directory(cmd)) + { + free(result); + return (error(EISDIR, cmd, 126, return_code)); + } + return (result); } -char **get_split_path(t_env *env) +static int is_directory(char *path) { - char *path; + struct stat path_stat; - path = env_get(env, "PATH"); - return (ft_split(path, ':')); + stat(path, &path_stat); + if ((path_stat.st_mode & S_IFMT) == S_IFDIR) + return (1); + else + return (0); } diff --git a/src/handle_redir.c b/src/handle_redir.c new file mode 100644 index 0000000..e8a1010 --- /dev/null +++ b/src/handle_redir.c @@ -0,0 +1,103 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* handle_redir.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: chuhlig +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2025/01/18 18:34:51 by chuhlig #+# #+# */ +/* Updated: 2025/01/20 14:59:38 by chuhlig ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "minishell.h" + +int handle_input_redirection(t_redirection *redir) +{ + int fd; + + if (redir->type == INPUT_FILE) + { + fd = open_file(redir->specifier, O_RDONLY, 0); + if (fd < 0) + return (-1); + dup2(fd, STDIN_FILENO); + close(fd); + } + else if (redir->type == INPUT_LIMITER) + { + fd = open_file("/tmp/heredoc_tmp", O_WRONLY | O_TRUNC, 0644); + if (fd < 0) + return (-1); + write(fd, redir->specifier, ft_strlen(redir->specifier)); + close(fd); + fd = open_file("/tmp/heredoc_tmp", O_RDONLY, 0); + if (fd < 0) + return (-1); + dup2(fd, STDIN_FILENO); + close(fd); + } + return (0); +} + +int handle_output_redirection(t_redirection *redir) +{ + int fd; + + if (redir->type == OUTPUT_OVERRIDE) + { + fd = open_file(redir->specifier, O_WRONLY | O_TRUNC, 0644); + if (fd < 0) + return (-1); + dup2(fd, STDOUT_FILENO); + close(fd); + } + else if (redir->type == OUTPUT_APPEND) + { + fd = open_file(redir->specifier, O_WRONLY | O_APPEND, 0644); + if (fd < 0) + return (-1); + dup2(fd, STDOUT_FILENO); + close(fd); + } + return (0); +} + +int handle_redirections(t_redirection *redirs) +{ + if (redirs[0].type == INPUT_FILE || redirs[0].type == INPUT_LIMITER) + { + if (handle_input_redirection(&redirs[0]) < 0) + return (-1); + } + if (redirs[1].type == OUTPUT_OVERRIDE || redirs[1].type == OUTPUT_APPEND) + { + if (handle_output_redirection(&redirs[1]) < 0) + return (-1); + } + return (0); +} + +int handle_pipe_parent(int p[2], t_node *node, t_env **env) +{ + int original_stdin; + int result; + + close(p[1]); + original_stdin = dup(STDIN_FILENO); + dup2(p[0], STDIN_FILENO); + result = eval_rec(node->content.pipe.right, env, p[0]); + dup2(original_stdin, STDIN_FILENO); + close(original_stdin); + close(p[0]); + return (result); +} + +int handle_pipe_child(int p[2], t_node *node, t_env **env, int in_fd) +{ + close(p[0]); + dup2(in_fd, STDIN_FILENO); + dup2(p[1], STDOUT_FILENO); + close(p[1]); + exit(eval_rec(node->content.pipe.left, env, in_fd)); +} diff --git a/src/init.c b/src/init.c index fd2c8ac..f41e64a 100644 --- a/src/init.c +++ b/src/init.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* init.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 15:02:24 by dkaiser #+# #+# */ -/* Updated: 2024/06/24 15:25:57 by dkaiser ### ########.fr */ +/* Updated: 2025/01/13 17:45:46 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/interpreter.c b/src/interpreter.c index 7b0306f..11f0620 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -6,154 +6,53 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:15:49 by chuhlig #+# #+# */ -/* Updated: 2025/01/13 09:53:33 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 16:35:38 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "debug_tools.h" #include "minishell.h" -#include -#include -#include -#include -#include -#include -#include -int is_builtin(char *cmd) -{ - return ((ft_strcmp(cmd, "export") == 0) - || (ft_strcmp(cmd, "unset") == 0) - || (ft_strcmp(cmd, "cd") == 0) - || (ft_strcmp(cmd, "exit") == 0) - || (ft_strcmp(cmd, "echo") == 0) - || (ft_strcmp(cmd, "pwd") == 0) - || (ft_strcmp(cmd, "env") == 0)); -} - -int execute_builtin(char **args, t_env **env) -{ - if (ft_strcmp(args[0], "export") == 0) - return (export(args, env)); - else if (ft_strcmp(args[0], "unset") == 0) - return (unset(args, env)); - else if (ft_strcmp(args[0], "cd") == 0) - return (cd(env, args)); - else if (ft_strcmp(args[0], "exit") == 0) - return (EXIT_SUCCESS); - else if (ft_strcmp(args[0], "echo") == 0) - return (echo(args)); - else if (ft_strcmp(args[0], "pwd") == 0) - return (pwd(*env)); - else if (ft_strcmp(args[0], "env") == 0) - return (ft_env(*env)); - return (1); -} +int eval_rec(t_node *node, t_env **env, int in_fd); -static int handle_redirections(t_redirection *redirs) +int open_file(char *path, int flags, int mode) { int fd; - if (redirs[0].type == INPUT_FILE) - { - fd = open(redirs[0].specifier, O_RDONLY); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDIN_FILENO); - close(fd); - } - else if (redirs[0].type == INPUT_LIMITER) - { - fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) - { - perror("open"); - return (-1); - } - write(fd, redirs[0].specifier, ft_strlen(redirs[0].specifier)); - close(fd); - fd = open("/tmp/heredoc_tmp", O_RDONLY); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDIN_FILENO); - close(fd); - } - if (redirs[1].type == OUTPUT_OVERRIDE) - { - fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDOUT_FILENO); - close(fd); - } - else if (redirs[1].type == OUTPUT_APPEND) - { - fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDOUT_FILENO); - close(fd); - } - return (0); - } + fd = open(path, flags, mode); + if (fd < 0) + perror(path); + return (fd); +} -static int eval_rec(t_node *node, t_env **env, int in_fd) +int eval_rec(t_node *node, t_env **env, int in_fd) { - pid_t pid; int p[2]; + pid_t pid; int result; - int status; - int original_stdin; if (node->type == PIPE_NODE) { - pipe(p); + if (pipe(p) == -1) + return (perror("pipe"), EXIT_FAILURE); pid = fork(); + if (pid == -1) + return (perror("fork"), close(p[0]), close(p[1]), EXIT_FAILURE); if (pid == 0) - { - close(p[0]); - dup2(in_fd, STDIN_FILENO); - dup2(p[1], STDOUT_FILENO); - result = eval_rec(node->content.pipe.left, env, in_fd); - exit(result); - } - else - { - close(p[1]); - original_stdin = dup(STDIN_FILENO); - dup2(p[0], STDIN_FILENO); - result = eval_rec(node->content.pipe.right, env, p[0]); - waitpid(pid, &status, 0); - dup2(original_stdin, STDIN_FILENO); - close(original_stdin); - } + handle_pipe_child(p, node, env, in_fd); + result = handle_pipe_parent(p, node, env); } else if (node->type == CMD_NODE) - { result = execute_cmd(&node->content.cmd, env); - } else { - printf("Handling unknown node type\n"); - panic("UNREACHABLE"); result = EXIT_FAILURE; + free_node(node); } return (result); } -int eval(t_node *node, t_env **env) +int eval(t_node *node, t_env **env) { return (eval_rec(node, env, STDIN_FILENO)); } diff --git a/src/main.c b/src/main.c index a53760c..e863f3a 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/22 17:14:03 by dkaiser #+# #+# */ -/* Updated: 2024/12/17 19:26:42 by chuhlig ### ########.fr */ +/* Updated: 2025/01/22 01:49:12 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,13 +14,18 @@ int main(int argc, char *argv[], char *envp[]) { - t_env *env; + t_env *env; + static int promptflag; env = NULL; + promptflag = 0; if (!argc && !argv) return (1); if (init()) return (1); getenvlst(&env, envp); - repl("Minishell $ ", &env); + set_return_code(0, &env); + repl("Minishell $ ", &env, &promptflag); + free_envlst(&env); + return (0); } diff --git a/src/new_node.c b/src/new_node.c index c58d291..b2ab7ea 100644 --- a/src/new_node.c +++ b/src/new_node.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* new_node.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 11:21:03 by dkaiser #+# #+# */ -/* Updated: 2024/09/17 18:46:35 by dkaiser ### ########.fr */ +/* Updated: 2025/01/20 17:59:01 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,7 +37,8 @@ t_node *new_pipe_node(t_node *left, t_node *right) return (node); } -t_node *new_cmd_node(char **args, t_redirection redirs[2]) +t_node *new_cmd_node(char **args, t_redirection redirs[2], + t_list *create_files) { t_node *node; @@ -49,7 +50,9 @@ t_node *new_cmd_node(char **args, t_redirection redirs[2]) { node->content.cmd.redirs[0] = redirs[0]; node->content.cmd.redirs[1] = redirs[1]; + node->content.cmd.create_files = create_files; free(redirs); + redirs = NULL; return (node); } return (NULL); diff --git a/src/new_token.c b/src/new_token.c index 92ff421..6f49681 100644 --- a/src/new_token.c +++ b/src/new_token.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* new_token.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/27 14:29:44 by dkaiser #+# #+# */ -/* Updated: 2024/06/28 14:59:34 by dkaiser ### ########.fr */ +/* Updated: 2025/01/22 00:41:47 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,7 +35,10 @@ t_token *new_str_token(char *str, t_token *previous, t_token *next) token = new_token(STRING_TOKEN, previous, next); if (token == NULL) + { + free(str); return (NULL); + } token->content.string = str; return (token); } diff --git a/src/parse_cmd.c b/src/parse_cmd.c index 3c4eb96..c0a9ad9 100644 --- a/src/parse_cmd.c +++ b/src/parse_cmd.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/07/08 15:06:25 by dkaiser #+# #+# */ -/* Updated: 2025/01/11 16:04:50 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 21:27:29 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,8 +18,10 @@ t_node *parse_cmd(t_token *tokens, t_env **env) { char **args; t_redirection *redirs; + t_list *create_files; - redirs = collect_redirs(&tokens); + create_files = NULL; + redirs = collect_redirs(&tokens, *env, &create_files); if (redirs == NULL) return (NULL); args = collect_args(&tokens, env); @@ -28,7 +30,7 @@ t_node *parse_cmd(t_token *tokens, t_env **env) free(redirs); return (NULL); } - return (new_cmd_node(args, redirs)); + return (new_cmd_node(args, redirs, create_files)); } static char **collect_args(t_token **tokens, t_env **env) @@ -36,6 +38,7 @@ static char **collect_args(t_token **tokens, t_env **env) t_token *cur; char **result; int i; + t_token *next; cur = *tokens; i = 0; @@ -48,11 +51,14 @@ static char **collect_args(t_token **tokens, t_env **env) i = 0; while (cur != NULL && cur->type == STRING_TOKEN) { + next = cur->next; if (cur->previous) free_token(cur->previous); - result[i] = format_string(cur->content.string, *env); + result[i] = format_string(cur->content.string, *env, ft_atoi("0")); i++; - cur = cur->next; + if (cur->next == NULL) + free_token(cur); + cur = next; } result[i] = NULL; return (result); diff --git a/src/parser.c b/src/parser.c index 1375954..e7b53c2 100644 --- a/src/parser.c +++ b/src/parser.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/29 15:53:29 by dkaiser #+# #+# */ -/* Updated: 2025/01/11 16:06:54 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 21:27:15 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,7 @@ static t_token *find_token_by_type(t_token *tokens, int type); t_token *split_at_first(t_token **tokens, int type); static t_node *parse_statement(t_token *tokens, t_env **env); -t_list *parse(t_token *tokens, t_env **env) +t_node *parse(t_token *tokens, t_env **env) { t_node *result; @@ -29,7 +29,7 @@ t_list *parse(t_token *tokens, t_env **env) result = parse_statement(tokens, env); if (result == NULL) printf("Parsing error.\n"); - return (ft_lstnew(result)); + return (result); } static t_node *parse_statement(t_token *tokens, t_env **env) @@ -40,6 +40,7 @@ static t_node *parse_statement(t_token *tokens, t_env **env) if (left_side_tokens == NULL) { free_tokens(tokens); + tokens = NULL; return (NULL); } else if (tokens != NULL) @@ -70,6 +71,7 @@ t_token *split_at_first(t_token **tokens, int type) if (result == split) result = NULL; free_token(split); + split = NULL; return (result); } diff --git a/src/praise_the_norme.c b/src/praise_the_norme.c new file mode 100644 index 0000000..a22843b --- /dev/null +++ b/src/praise_the_norme.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* praise_the_norme.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser next; + free_token_and_connect(*cur); + if (next_token) + { + if (next_token->previous == NULL) + *tokens = next_token->next; + *cur = next_token->next; + free_token_and_connect(next_token); + } + else + *cur = NULL; +} diff --git a/src/read_heredoc.c b/src/read_heredoc.c new file mode 100644 index 0000000..53633e8 --- /dev/null +++ b/src/read_heredoc.c @@ -0,0 +1,76 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* read_heredoc.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser +#include +#include + +static char *concat_str(char *temp, char *line); +static char *get_result(char *temp, char *result, char *line); +static void *print_error_and_free(char *result); + +char *read_heredoc(char *delimiter) +{ + char *line; + char *result; + char *temp; + size_t total_length; + size_t line_length; + + total_length = 0; + result = NULL; + while (1) + { + line = readline("> "); + if (!line || ft_strcmp(line, delimiter) == 0) + { + free(line); + break ; + } + line_length = ft_strlen(line) + 1; + temp = malloc(total_length + line_length + 1); + if (!temp) + return (print_error_and_free(result)); + result = get_result(temp, result, line); + total_length += line_length; + } + return (result); +} + +static char *concat_str(char *temp, char *line) +{ + ft_strcat(temp, line); + ft_strcat(temp, "\n"); + free(line); + return (temp); +} + +static char *get_result(char *temp, char *result, char *line) +{ + if (result) + { + ft_strcpy(temp, result); + free(result); + } + else + temp[0] = '\0'; + return (concat_str(temp, line)); +} + +static void *print_error_and_free(char *result) +{ + errno = ENOMEM; + perror("heredoc"); + free(result); + return (NULL); +} diff --git a/src/repl.c b/src/repl.c index 7ff80a8..2dcd16d 100644 --- a/src/repl.c +++ b/src/repl.c @@ -6,56 +6,44 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 16:07:04 by dkaiser #+# #+# */ -/* Updated: 2025/01/11 16:01:44 by chuhlig ### ########.fr */ +/* Updated: 2025/01/21 21:29:16 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "../include/minishell.h" #include "token.h" -t_token *reverse_token_list(t_token *head) +void free_repl(char *input, t_node *ast) { - t_token *prev; - t_token *current; - t_token *next; - - prev = NULL; - current = head; - next = NULL; - while (current != NULL) - { - next = current->previous; - current->next = prev; - current->previous = next; - prev = current; - current = next; - } - return (prev); + free(input); + free_node(ast); } -void repl(const char *prompt, t_env **env) +void repl(const char *prompt, t_env **env, int *promptflag) { char *input; t_token *token_list; - t_list *lines; + t_node *ast; + (*promptflag)++; while (1) { input = readline(prompt); if (input == NULL) - return ; + { + if (*promptflag > 1) + (*promptflag)--; + printf("exit\n"); + break ; + } if (input[0] == '\0') continue ; add_history(input); token_list = NULL; tokenizer(input, &token_list, '\0'); - token_list = reverse_token_list(token_list); - lines = parse(token_list, env); - if (lines) - { - print_ast(lines->content); - eval(lines->content, env); - } - free(input); + ast = parse(token_list, env); + if (ast) + set_return_code(eval(ast, env), env); + free_repl(input, ast); } } diff --git a/src/signal_handling.c b/src/signal_handling.c index a19fa94..6c6ca1e 100644 --- a/src/signal_handling.c +++ b/src/signal_handling.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* signal_handling.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dkaiser +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/24 15:08:43 by dkaiser #+# #+# */ -/* Updated: 2024/06/25 13:33:26 by dkaiser ### ########.fr */ +/* Updated: 2025/01/20 12:15:32 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/tokenizer.c b/src/tokenizer.c index 26edd2e..451fa50 100644 --- a/src/tokenizer.c +++ b/src/tokenizer.c @@ -6,13 +6,33 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/28 20:55:50 by chuhlig #+# #+# */ -/* Updated: 2025/01/11 15:22:07 by chuhlig ### ########.fr */ +/* Updated: 2025/01/22 00:49:10 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" #include "token.h" +t_token *reverse_token_list(t_token *head) +{ + t_token *prev; + t_token *current; + t_token *next; + + prev = NULL; + current = head; + next = NULL; + while (current != NULL) + { + next = current->previous; + current->next = prev; + current->previous = next; + prev = current; + current = next; + } + return (prev); +} + void print_token(t_token *token) { if (DEBUG) @@ -77,11 +97,11 @@ void handle_special_chars(char *s, int *i, int *start, t_token **token_list) *token_list = new_token(PIPE_TOKEN, *token_list, NULL); else if (s[*i] == '\n') *token_list = new_token(NEWLINE_TOKEN, *token_list, NULL); - print_token(*token_list); if (s[*i] == '<' && s[*i + 1] == '<') (*i)++; if (s[*i] == '>' && s[*i + 1] == '>') (*i)++; + print_token(*token_list); *start = *i + 1; } @@ -111,4 +131,5 @@ void tokenizer(char *s, t_token **token_list, char quote_check) pos = i + 1; } } + *token_list = reverse_token_list(*token_list); } diff --git a/valgrind_out.txt b/valgrind_out.txt new file mode 100644 index 0000000..c005c63 --- /dev/null +++ b/valgrind_out.txt @@ -0,0 +1,1040 @@ +root@aaf7f63c7efc:/dorker_workspace# valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./minishell +==7626== Memcheck, a memory error detector +==7626== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. +==7626== Using Valgrind-3.19.0 and LibVEX; rerun with -h for copyright info +==7626== Command: ./minishell +==7626== +Minishell $ a +==7626== Invalid read of size 8 +==7626== at 0x1097D1: free_tokens (free_token.c:55) +==7626== by 0x10A08A: parse (parser.c:40) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Address 0x4b01c38 is 24 bytes inside a block of size 32 free'd +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x109746: free_token (free_token.c:24) +==7626== by 0x10A395: collect_args (parse_cmd.c:91) +==7626== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7626== by 0x10A12A: parse_statement (parser.c:62) +==7626== by 0x10A07A: parse (parser.c:39) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Block was alloc'd at +==7626== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7626== by 0x1095F6: new_token (new_token.c:19) +==7626== by 0x109686: new_str_token (new_token.c:36) +==7626== by 0x109C55: snap_string_token (tokenizer.c:79) +==7626== by 0x10A014: tokenizer (tokenizer.c:130) +==7626== by 0x109573: repl (repl.c:50) +==7626== by 0x109372: main (main.c:28) +==7626== +==7626== Invalid read of size 8 +==7626== at 0x1097DD: free_tokens (free_token.c:56) +==7626== by 0x10A08A: parse (parser.c:40) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Address 0x4b01c28 is 8 bytes inside a block of size 32 free'd +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x109746: free_token (free_token.c:24) +==7626== by 0x10A395: collect_args (parse_cmd.c:91) +==7626== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7626== by 0x10A12A: parse_statement (parser.c:62) +==7626== by 0x10A07A: parse (parser.c:39) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Block was alloc'd at +==7626== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7626== by 0x1095F6: new_token (new_token.c:19) +==7626== by 0x109686: new_str_token (new_token.c:36) +==7626== by 0x109C55: snap_string_token (tokenizer.c:79) +==7626== by 0x10A014: tokenizer (tokenizer.c:130) +==7626== by 0x109573: repl (repl.c:50) +==7626== by 0x109372: main (main.c:28) +==7626== +==7626== Invalid free() / delete / delete[] / realloc() +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x1097F4: free_tokens (free_token.c:57) +==7626== by 0x10A08A: parse (parser.c:40) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Address 0x4b01c20 is 0 bytes inside a block of size 32 free'd +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x109746: free_token (free_token.c:24) +==7626== by 0x10A395: collect_args (parse_cmd.c:91) +==7626== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7626== by 0x10A12A: parse_statement (parser.c:62) +==7626== by 0x10A07A: parse (parser.c:39) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Block was alloc'd at +==7626== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7626== by 0x1095F6: new_token (new_token.c:19) +==7626== by 0x109686: new_str_token (new_token.c:36) +==7626== by 0x109C55: snap_string_token (tokenizer.c:79) +==7626== by 0x10A014: tokenizer (tokenizer.c:130) +==7626== by 0x109573: repl (repl.c:50) +==7626== by 0x109372: main (main.c:28) +==7626== +a: command not found +==7627== +==7627== HEAP SUMMARY: +==7627== in use at exit: 199,597 bytes in 269 blocks +==7627== total heap usage: 450 allocs, 182 frees, 224,561 bytes allocated +==7627== +==7627== 2 bytes in 1 blocks are still reachable in loss record 1 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10D412: ft_strdup (in /dorker_workspace/minishell) +==7627== by 0x10C82F: set_return_code (builtins_part_three.c:44) +==7627== by 0x109355: main (main.c:27) +==7627== +==7627== 2 bytes in 1 blocks are still reachable in loss record 2 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10CFE2: ft_itoa (in /dorker_workspace/minishell) +==7627== by 0x10C85F: set_return_code (builtins_part_three.c:48) +==7627== by 0x109355: main (main.c:27) +==7627== +==7627== 2 bytes in 1 blocks are still reachable in loss record 3 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x489124E: _rl_init_locale (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4891321: _rl_init_eightbit (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700F2: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 2 bytes in 1 blocks are still reachable in loss record 4 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EFB9: readline_internal_teardown (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703DA: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 2 bytes in 1 blocks are still reachable in loss record 5 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x489258C: alloc_history_entry (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48927F9: add_history (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x109553: repl (repl.c:48) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 2 bytes in 1 blocks are still reachable in loss record 6 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10B868: append_slice (format_string.c:41) +==7627== by 0x10BC33: format_string (format_string.c:124) +==7627== by 0x10A375: collect_args (parse_cmd.c:88) +==7627== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7627== by 0x10A12A: parse_statement (parser.c:62) +==7627== by 0x10A07A: parse (parser.c:39) +==7627== by 0x109586: repl (repl.c:51) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 5 bytes in 1 blocks are still reachable in loss record 7 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x494C969: strdup (strdup.c:42) +==7627== by 0x4AA4435: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 6 bytes in 1 blocks are still reachable in loss record 8 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48976A6: sh_get_home_dir (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x489832C: tilde_expand_word (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4898560: tilde_expand (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487E26B: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487E4FB: rl_read_init_file (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700F9: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 7 bytes in 1 blocks are definitely lost in loss record 9 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10D4F9: ft_strjoin (in /dorker_workspace/minishell) +==7627== by 0x10AFDA: find_in_path (get_cmd_path.c:79) +==7627== by 0x10ADFF: get_cmd_path (get_cmd_path.c:34) +==7627== by 0x10B720: exec_cmd (execute_cmd.c:96) +==7627== by 0x10B622: execute_cmd (execute_cmd.c:66) +==7627== by 0x10AB22: eval_rec (interpreter.c:46) +==7627== by 0x10AB67: eval (interpreter.c:57) +==7627== by 0x1095A4: repl (repl.c:53) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 8 bytes in 1 blocks are still reachable in loss record 10 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899377: xrealloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4881C4E: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48827F5: rl_expand_prompt (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486ECFE: rl_set_prompt (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870385: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 12 bytes in 1 blocks are still reachable in loss record 11 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48927D7: add_history (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x109553: repl (repl.c:48) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 13 bytes in 1 blocks are still reachable in loss record 12 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486ECDA: rl_set_prompt (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870385: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 13 bytes in 1 blocks are still reachable in loss record 13 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4882183: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48827F5: rl_expand_prompt (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486ECFE: rl_set_prompt (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870385: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 13 bytes in 1 blocks are still reachable in loss record 14 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487E422: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700F9: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 16 bytes in 1 blocks are still reachable in loss record 15 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x48701E7: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 16 bytes in 1 blocks are still reachable in loss record 16 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10A2DC: collect_args (parse_cmd.c:78) +==7627== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7627== by 0x10A12A: parse_statement (parser.c:62) +==7627== by 0x10A07A: parse (parser.c:39) +==7627== by 0x109586: repl (repl.c:51) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 20 bytes in 1 blocks are still reachable in loss record 17 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487F143: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487DFD2: rl_parse_and_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487E39C: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700F9: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 24 bytes in 1 blocks are still reachable in loss record 18 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10AD28: env_new (env.c:69) +==7627== by 0x10C837: set_return_code (builtins_part_three.c:44) +==7627== by 0x109355: main (main.c:27) +==7627== +==7627== 24 bytes in 1 blocks are still reachable in loss record 19 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4892573: alloc_history_entry (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48927F9: add_history (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x109553: repl (repl.c:48) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 33 bytes in 1 blocks are still reachable in loss record 20 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4AABF1A: _nc_read_termtype (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACB1A: _nc_read_file_entry (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACE7C: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACFCB: _nc_read_entry2 (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4018: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA43D5: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== +==7627== 33 bytes in 1 blocks are still reachable in loss record 21 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4A9F2E8: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4404: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 40 bytes in 1 blocks are still reachable in loss record 22 of 67 +==7627== at 0x48455EF: calloc (vg_replace_malloc.c:1328) +==7627== by 0x4AA15CB: _nc_first_db (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACFA6: _nc_read_entry2 (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4018: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA43D5: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 44 bytes in 1 blocks are still reachable in loss record 23 of 67 +==7627== at 0x48455EF: calloc (vg_replace_malloc.c:1328) +==7627== by 0x4AAC020: _nc_read_termtype (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACB1A: _nc_read_file_entry (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACE7C: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACFCB: _nc_read_entry2 (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4018: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA43D5: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== +==7627== 44 bytes in 1 blocks are still reachable in loss record 24 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4A9F0BE: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4404: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 56 bytes in 1 blocks are still reachable in loss record 25 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x109814: new_node (new_node.c:19) +==7627== by 0x1098B2: new_cmd_node (new_node.c:45) +==7627== by 0x10A284: parse_cmd (parse_cmd.c:33) +==7627== by 0x10A12A: parse_statement (parser.c:62) +==7627== by 0x10A07A: parse (parser.c:39) +==7627== by 0x109586: repl (repl.c:51) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 61 bytes in 6 blocks are indirectly lost in loss record 26 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10D193: get_next_token (in /dorker_workspace/minishell) +==7627== by 0x10D27E: ft_split (in /dorker_workspace/minishell) +==7627== by 0x10C32A: get_split_path (env_tools.c:20) +==7627== by 0x10AF78: find_in_path (get_cmd_path.c:70) +==7627== by 0x10ADFF: get_cmd_path (get_cmd_path.c:34) +==7627== by 0x10B720: exec_cmd (execute_cmd.c:96) +==7627== by 0x10B622: execute_cmd (execute_cmd.c:66) +==7627== by 0x10AB22: eval_rec (interpreter.c:46) +==7627== by 0x10AB67: eval (interpreter.c:57) +==7627== by 0x1095A4: repl (repl.c:53) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 72 bytes in 1 blocks are still reachable in loss record 27 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4AA1530: _nc_first_db (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACFA6: _nc_read_entry2 (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4018: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA43D5: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 78 bytes in 1 blocks are still reachable in loss record 28 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4A9F1FD: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4404: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 106 bytes in 12 blocks are still reachable in loss record 29 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10D412: ft_strdup (in /dorker_workspace/minishell) +==7627== by 0x10ABEC: getenvlst (env.c:30) +==7627== by 0x109344: main (main.c:26) +==7627== +==7627== 117 (56 direct, 61 indirect) bytes in 1 blocks are definitely lost in loss record 30 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10D236: ft_split (in /dorker_workspace/minishell) +==7627== by 0x10C32A: get_split_path (env_tools.c:20) +==7627== by 0x10AF78: find_in_path (get_cmd_path.c:70) +==7627== by 0x10ADFF: get_cmd_path (get_cmd_path.c:34) +==7627== by 0x10B720: exec_cmd (execute_cmd.c:96) +==7627== by 0x10B622: execute_cmd (execute_cmd.c:66) +==7627== by 0x10AB22: eval_rec (interpreter.c:46) +==7627== by 0x10AB67: eval (interpreter.c:57) +==7627== by 0x1095A4: repl (repl.c:53) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 156 bytes in 1 blocks are still reachable in loss record 31 of 67 +==7627== at 0x48455EF: calloc (vg_replace_malloc.c:1328) +==7627== by 0x4AAC0CE: _nc_read_termtype (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACB1A: _nc_read_file_entry (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACE7C: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACFCB: _nc_read_entry2 (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4018: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA43D5: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== +==7627== 253 bytes in 12 blocks are still reachable in loss record 32 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10D412: ft_strdup (in /dorker_workspace/minishell) +==7627== by 0x10AC03: getenvlst (env.c:31) +==7627== by 0x109344: main (main.c:26) +==7627== +==7627== 256 bytes in 1 blocks are still reachable in loss record 33 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870346: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 288 bytes in 12 blocks are still reachable in loss record 34 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x10ABC9: getenvlst (env.c:29) +==7627== by 0x109344: main (main.c:26) +==7627== +==7627== 760 bytes in 1 blocks are still reachable in loss record 35 of 67 +==7627== at 0x48455EF: calloc (vg_replace_malloc.c:1328) +==7627== by 0x4AA437F: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 36 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899377: xrealloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48813DB: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48814E2: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 37 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899377: xrealloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48813F3: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48814E2: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 38 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899377: xrealloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x488140B: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48814E2: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 39 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899377: xrealloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4881423: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48814E2: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 40 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4881535: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 41 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4881550: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 42 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4881568: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,024 bytes in 1 blocks are still reachable in loss record 43 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4881580: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4887916: rl_redisplay (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EDFA: readline_internal_setup (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48703AE: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 1,536 bytes in 1 blocks are still reachable in loss record 44 of 67 +==7627== at 0x484582F: realloc (vg_replace_malloc.c:1437) +==7627== by 0x489935D: xrealloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874B84: rl_add_funmap_entry (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874BCE: rl_initialize_funmap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700ED: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 2,032 bytes in 1 blocks are still reachable in loss record 45 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x488E6C9: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 2,272 bytes in 142 blocks are still reachable in loss record 46 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874B2C: rl_add_funmap_entry (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874BCE: rl_initialize_funmap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700ED: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 3,312 bytes in 1 blocks are still reachable in loss record 47 of 67 +==7627== at 0x48455EF: calloc (vg_replace_malloc.c:1328) +==7627== by 0x4AAC1A9: _nc_read_termtype (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACB1A: _nc_read_file_entry (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACE7C: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AACFCB: _nc_read_entry2 (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4018: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA43D5: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== +==7627== 3,312 bytes in 1 blocks are still reachable in loss record 48 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4A9F0DE: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4404: _nc_setupterm (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA4922: tgetent_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E45C: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,016 bytes in 1 blocks are still reachable in loss record 49 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4892869: add_history (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x109553: repl (repl.c:48) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,080 bytes in 1 blocks are still reachable in loss record 50 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x488E6A9: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,112 bytes in 1 blocks are still reachable in loss record 51 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EBD9: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870145: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,112 bytes in 1 blocks are still reachable in loss record 52 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC7A: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870145: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,112 bytes in 1 blocks are still reachable in loss record 53 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EBD9: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870154: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,112 bytes in 1 blocks are still reachable in loss record 54 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC7A: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870154: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,112 bytes in 1 blocks are still reachable in loss record 55 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EBD9: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870179: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 4,112 bytes in 1 blocks are still reachable in loss record 56 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC7A: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870179: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 7,952 bytes in 1 blocks are still reachable in loss record 57 of 67 +==7627== at 0x48455EF: calloc (vg_replace_malloc.c:1328) +==7627== by 0x4AA07A7: ??? (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA0F1A: _nc_find_type_entry (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x4AA52B4: tgetstr_sp (in /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4) +==7627== by 0x488E49A: _rl_init_terminal_io (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700D0: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 8,224 bytes in 2 blocks are still reachable in loss record 58 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC6B: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870145: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 8,224 bytes in 2 blocks are still reachable in loss record 59 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EB62: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870154: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 8,224 bytes in 2 blocks are still reachable in loss record 60 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EB62: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870179: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 8,224 bytes in 2 blocks are still reachable in loss record 61 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870193: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 12,336 bytes in 3 blocks are still reachable in loss record 62 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC42: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870154: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 12,336 bytes in 3 blocks are still reachable in loss record 63 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC6B: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870154: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 12,336 bytes in 3 blocks are still reachable in loss record 64 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC42: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870179: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 12,336 bytes in 3 blocks are still reachable in loss record 65 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x486EC6B: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4870179: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 12,336 bytes in 3 blocks are still reachable in loss record 66 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487D4AD: rl_bind_keyseq_if_unbound_in_map (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48701A2: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== 41,120 bytes in 10 blocks are still reachable in loss record 67 of 67 +==7627== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7627== by 0x4899338: xmalloc (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x4874CBD: rl_make_bare_keymap (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487C3DD: rl_generic_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487E1BA: rl_parse_and_bind (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487E39C: ??? (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x48700F9: rl_initialize (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x487038A: readline (in /usr/lib/x86_64-linux-gnu/libreadline.so.8.2) +==7627== by 0x1094FF: repl (repl.c:38) +==7627== by 0x109372: main (main.c:28) +==7627== +==7627== LEAK SUMMARY: +==7627== definitely lost: 63 bytes in 2 blocks +==7627== indirectly lost: 61 bytes in 6 blocks +==7627== possibly lost: 0 bytes in 0 blocks +==7627== still reachable: 199,473 bytes in 261 blocks +==7627== suppressed: 0 bytes in 0 blocks +==7627== +==7627== For lists of detected and suppressed errors, rerun with: -s +==7627== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 0 from 0) +==7626== Invalid read of size 8 +==7626== at 0x1097D1: free_tokens (free_token.c:55) +==7626== by 0x1094C1: free_repl (repl.c:25) +==7626== by 0x1095CB: repl (repl.c:54) +==7626== by 0x109372: main (main.c:28) +==7626== Address 0x4b01c38 is 24 bytes inside a block of size 32 free'd +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x109746: free_token (free_token.c:24) +==7626== by 0x10A395: collect_args (parse_cmd.c:91) +==7626== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7626== by 0x10A12A: parse_statement (parser.c:62) +==7626== by 0x10A07A: parse (parser.c:39) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Block was alloc'd at +==7626== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7626== by 0x1095F6: new_token (new_token.c:19) +==7626== by 0x109686: new_str_token (new_token.c:36) +==7626== by 0x109C55: snap_string_token (tokenizer.c:79) +==7626== by 0x10A014: tokenizer (tokenizer.c:130) +==7626== by 0x109573: repl (repl.c:50) +==7626== by 0x109372: main (main.c:28) +==7626== +==7626== Invalid read of size 8 +==7626== at 0x1097DD: free_tokens (free_token.c:56) +==7626== by 0x1094C1: free_repl (repl.c:25) +==7626== by 0x1095CB: repl (repl.c:54) +==7626== by 0x109372: main (main.c:28) +==7626== Address 0x4b01c28 is 8 bytes inside a block of size 32 free'd +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x109746: free_token (free_token.c:24) +==7626== by 0x10A395: collect_args (parse_cmd.c:91) +==7626== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7626== by 0x10A12A: parse_statement (parser.c:62) +==7626== by 0x10A07A: parse (parser.c:39) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Block was alloc'd at +==7626== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7626== by 0x1095F6: new_token (new_token.c:19) +==7626== by 0x109686: new_str_token (new_token.c:36) +==7626== by 0x109C55: snap_string_token (tokenizer.c:79) +==7626== by 0x10A014: tokenizer (tokenizer.c:130) +==7626== by 0x109573: repl (repl.c:50) +==7626== by 0x109372: main (main.c:28) +==7626== +==7626== Invalid free() / delete / delete[] / realloc() +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x1097E8: free_tokens (free_token.c:56) +==7626== by 0x1094C1: free_repl (repl.c:25) +==7626== by 0x1095CB: repl (repl.c:54) +==7626== by 0x109372: main (main.c:28) +==7626== Address 0x4b01bd0 is 0 bytes inside a block of size 2 free'd +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x1097E8: free_tokens (free_token.c:56) +==7626== by 0x10A08A: parse (parser.c:40) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Block was alloc'd at +==7626== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7626== by 0x109BCD: snap_string_token (tokenizer.c:68) +==7626== by 0x10A014: tokenizer (tokenizer.c:130) +==7626== by 0x109573: repl (repl.c:50) +==7626== by 0x109372: main (main.c:28) +==7626== +==7626== Invalid free() / delete / delete[] / realloc() +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x1097F4: free_tokens (free_token.c:57) +==7626== by 0x1094C1: free_repl (repl.c:25) +==7626== by 0x1095CB: repl (repl.c:54) +==7626== by 0x109372: main (main.c:28) +==7626== Address 0x4b01c20 is 0 bytes inside a block of size 32 free'd +==7626== at 0x484317B: free (vg_replace_malloc.c:872) +==7626== by 0x109746: free_token (free_token.c:24) +==7626== by 0x10A395: collect_args (parse_cmd.c:91) +==7626== by 0x10A24F: parse_cmd (parse_cmd.c:27) +==7626== by 0x10A12A: parse_statement (parser.c:62) +==7626== by 0x10A07A: parse (parser.c:39) +==7626== by 0x109586: repl (repl.c:51) +==7626== by 0x109372: main (main.c:28) +==7626== Block was alloc'd at +==7626== at 0x48407B4: malloc (vg_replace_malloc.c:381) +==7626== by 0x1095F6: new_token (new_token.c:19) +==7626== by 0x109686: new_str_token (new_token.c:36) +==7626== by 0x109C55: snap_string_token (tokenizer.c:79) +==7626== by 0x10A014: tokenizer (tokenizer.c:130) +==7626== by 0x109573: repl (repl.c:50) +==7626== by 0x109372: main (main.c:28) +==7626== + +atic t_assign **collect_assigns(t_token **tokens); +static char **collect_args(t_token **tokens); +static t_assign *to_assign(char *str); +static void set_redir(t_redirection *redir, int type, + char *specifier); + +t_node *parse_cmd(t_token *tokens) +{ + char **args; + t_assign **assigns; + t_redirection *redirs; + + redirs = collect_redirs(&tokens); + assigns = collect_assigns(&tokens); + args = collect_args(&tokens); + return (new_cmd_node(args, assigns, redirs)); +} + +static t_redirection *collect_redirs(t_token **tokens) +{ + t_redirection *result; + t_token *cur; + int idx; + + cur = *tokens; + result = malloc(sizeof(t_redirection) * 2); + if (result == NULL) + { + // free all tokens + return (NULL); + } + set_redir(&result[0], 0, NULL); + set_redir(&result[1], 0, NULL); + while (cur != NULL && cur->next != NULL) + { + if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) + { + if (cur->content.redir_type & (INPUT_FILE | INPUT_LIMITER)) + idx = 0; + else if (cur->content.redir_type & (OUTPUT_APPEND | OUTPUT_OVERRIDE)) + idx = 1; + set_redir(&result[idx], cur->content.redir_type, + cur->next->content.string); + cur = cur->next; + free_token_and_connect(cur->previous); + if (cur->next != NULL) + { + cur = cur->next; + free_token_and_connect(cur->previous); + } + else + { + free_token(cur); + } + } + else if (cur->type == REDIR_TOKEN) + { + // err Parsing error + free(result); + return (NULL); + } + else + { + cur = cur->next; + } + } + return (result); +} + +static t_assign **collect_assigns(t_token **tokens) +{ + t_token *cur; + t_assign **result; + int i; + + cur = *tokens; + i = 0; + while (cur != NULL && cur->type == STRING_TOKEN + && cur->content.string[0] != '"' && cur->content.string[0] != '\'' + && ft_strchr(cur->content.string, '=') != NULL) + { + i++; + cur = cur->next; + } + result = malloc(sizeof(t_assign *) * (i + 1)); + if (!result) + { + // free all tokens + return (NULL); + } + cur = *tokens; + i = 0; + while (cur != NULL && cur->type == STRING_TOKEN + && cur->content.string[0] != '"' && cur->content.string[0] != '\'' + && ft_strchr(cur->content.string, '=') != NULL) + { + result[i] = to_assign(cur->content.string); + i++; + cur = cur->next; + free_token(cur->previous); + } + *tokens = cur; + result[i] = NULL; + return (result); +} + +static t_assign *to_assign(char *str) +{ + t_assign *result; + char *split_pos; + + split_pos = ft_strchr(str, '='); + *split_pos = '\0'; + result = malloc(sizeof(t_assign)); + if (result == NULL) + { + return (NULL); + } + result->var = str; + result->value = split_pos + 1; + return (result); +} + +static char **collect_args(t_token **tokens) +{ + t_token *cur; + char **result; + int i; + + cur = *tokens; + i = 0; + while (cur != NULL) + { + i++; + cur = cur->next; + } + result = malloc(sizeof(char *) * (i + 1)); + if (!result) + { + // free all tokens; + return (NULL); + } + cur = *tokens; + i = 0; + while (cur != NULL) + { + result[i] = cur->content.string; + // free token + i++; + cur = cur->next; + } + result[i] = NULL; + return (result); +} + +static void set_redir(t_redirection *redir, int type, char *specifier) +{ + redir->type = type; + redir->specifier = specifier; +} -- 2.47.2