From 6e493e84ea275c420f9965d1f7acd78d36e0bd1a Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 21:32:18 +0100 Subject: [PATCH 01/17] extra file rm'd and norm --- 42sh/libft/includes/cliopts.h | 9 +- 42sh/src/builtin/bt_read_get.c | 3 +- 42sh/src/main/ft_putast.c | 100 -------------- 42sh/src/parser/read_stack.c | 239 --------------------------------- 4 files changed, 5 insertions(+), 346 deletions(-) delete mode 100644 42sh/src/main/ft_putast.c delete mode 100644 42sh/src/parser/read_stack.c diff --git a/42sh/libft/includes/cliopts.h b/42sh/libft/includes/cliopts.h index 9ea82890..cb8acc5d 100644 --- a/42sh/libft/includes/cliopts.h +++ b/42sh/libft/includes/cliopts.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/14 20:22:56 by jhalford #+# #+# */ -/* Updated: 2017/03/25 14:59:53 by jhalford ### ########.fr */ +/* Updated: 2017/03/25 21:31:28 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ typedef struct s_cliopts t_cliopts; typedef struct s_data_template t_data_template; typedef long long t_flag; -struct s_cliopts +struct s_cliopts { char c; char *str; @@ -30,15 +30,14 @@ struct s_cliopts int arg_required:1; }; -struct s_data_template +struct s_data_template { t_flag flag; char **av_data; }; -int cliopts_get(char **av, t_cliopts opt_map[], void *data); +int cliopts_get(char **av, t_cliopts opt_map[], void *data); t_cliopts *cliopts_getmap_long(t_cliopts opt_map[], char *arg); t_cliopts *cliopts_getmap_short(t_cliopts opt_map[], char arg); -int cliopts_has(char **av, char c); #endif diff --git a/42sh/src/builtin/bt_read_get.c b/42sh/src/builtin/bt_read_get.c index aca2a726..0953afe9 100644 --- a/42sh/src/builtin/bt_read_get.c +++ b/42sh/src/builtin/bt_read_get.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/01/21 18:00:03 by jhalford #+# #+# */ -/* Updated: 2017/03/25 04:00:30 by jhalford ### ########.fr */ +/* Updated: 2017/03/25 21:29:45 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,6 @@ int bt_read_getdelim(char *opt_arg, t_read *data) return (1); if (data) data->delim = *opt_arg; - DG("delim=%c", data->delim); return (0); } diff --git a/42sh/src/main/ft_putast.c b/42sh/src/main/ft_putast.c deleted file mode 100644 index 30df296b..00000000 --- a/42sh/src/main/ft_putast.c +++ /dev/null @@ -1,100 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_putast.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/14 18:18:04 by jhalford #+# #+# */ -/* Updated: 2017/03/24 16:28:14 by gwojda ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -char *ft_putast(void *nodein) -{ - t_astnode *node; - node = nodein; - - if (node->type == TK_BANG) - return ("TK_BANG"); - if (node->type == TK_DSEMI) - return ("TK_DSEMI"); - if (node->type == WORDLIST) - return ("WORDLIST"); - if (node->type == CMD) - return ("CMD"); - if (node->type == REDIR) - return ("REDIR"); - if (node->type == CLOSE_LIST) - return ("CLOSE_LIST"); - if (node->type == FNAME) - return ("FNAME"); - if (node->type == TK_LBRACE) - return ("TK_LBRACE"); - if (node->type == TK_ASSIGNMENT_WORD) - return ("ASSIGNEMENT_WORD"); - if (node->type == SUBSHELL) - return ("SUBSHELL"); - if (node->type == TK_NAME) - return ("TK_NAME"); - if (node->type == TK_FOR) - return ("TK_FOR"); - if (node->type == TK_CASE) - return ("TK_CASE"); - else if (node->type == TK_PAREN_OPEN) - return ("TK_OPE"); - else if (node->type == TK_PAREN_CLOSE) - return ("TK_CLO"); - else if (node->type == TK_IN) - return ("TK_IN"); - else if (node->type ==TK_ESAC) - return ("TK_ESAC"); - else if (node->type == TK_THEN) - return ("THEN"); - else if (node->type == TK_FI) - return ("FI"); - else if (node->type == TK_DO) - return ("TK_DO"); - else if (node->type == TK_AMP) - return (" & "); - else if (node->type == TK_WORD) - return (" TK_WORD"); - else if (node->type == TK_SEMI) - return (" ; "); - else if (node->type == TK_AND_IF) - return (" && "); - else if (node->type == TK_OR_IF) - return (" || "); - else if (node->type == TK_PIPE) - return (" | "); - else if (node->type == TK_COMMAND) - return (" COM "); - else if (node->type == TK_WHILE) - return (" WHILE "); - else if (node->type == TK_IF) - return ("IF"); - else if (node->type == TK_ELIF) - return ("ELIF"); - else if (node->type == TK_ELSE) - return ("ELSE"); - else if (node->type == TK_UNTIL) - return ("UNTIL"); - else if (node->type == TK_NEWLINE) - return ("NEW"); - else if (node->type == TK_GREAT) - return (" > "); - else if (node->type == TK_LESS) - return (" < "); - else if (node->type == TK_DGREAT) - return (" >> "); - else if (node->type == TK_DLESS) - return (" << "); - else if (node->type == TK_GREATAND) - return (" >& "); - else if (node->type == TK_LESSAND) - return (" <& "); - else - return ("OTHER"); -} diff --git a/42sh/src/parser/read_stack.c b/42sh/src/parser/read_stack.c deleted file mode 100644 index 43443a85..00000000 --- a/42sh/src/parser/read_stack.c +++ /dev/null @@ -1,239 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* read_stack.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: ariard +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/09 15:32:10 by ariard #+# #+# */ -/* Updated: 2017/03/24 17:25:03 by gwojda ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -char *read_state(t_sym current) -{ - if (current == FNAME) - return ("FNAME"); - if (current == PIPE_CLOSE_SEQUENCE) - return ("PIPE_CLOSE_SEQUENCE"); - if (current == TK_BANG) - return ("TK_BANG"); - if (current == OPEN_FUNC) - return ("OPEN_FUNC"); - if (current == CLOSE_FUNC) - return ("CLOSE_FUNC"); - if (current == HEREDOCDATA) - return ("HEREDOCDATA"); - if (current == TERMINUS) - return ("TERMINUS"); - if (current == SEQUENCE) - return ("SEQUENCE"); - if (current == LINEBREAK) - return ("LINEBREAK"); - if (current == CLOSE_LIST) - return ("CLOSE_LIST"); - if (current == BRACE_CLAUSE) - return ("BRACE_CLAUSE"); - if (current == FUNC_NAME) - return ("FUNC_NAME"); - if (current == TK_LBRACE) - return ("TK_LBRACE"); - if (current == TK_RBRACE) - return ("TK_RBRACE"); - if (current == TK_ASSIGNMENT_WORD) - return ("TK_ASSIGNMENT_WORD"); - if (current == CASE_CLAUSE) - return ("CASE_CLAUSE"); - if (current == CASE_LIST_NS) - return ("CASE_LIST_NS"); - if (current == TK_DSEMI) - return ("TK_DSEMI"); - if (current == TK_PAREN_OPEN) - return ("TK_PAREN_OPEN"); - if (current == TK_PAREN_CLOSE) - return ("TK_PAREN_CLOSE"); - if (current == FOR_WORDLIST) - return ("FOR_WORDLIST"); - if (current == FOR_CLAUSE) - return ("FOR_CLAUSE"); - if (current == TK_NAME) - return ("TK_NAME"); - if (current == TK_FOR) - return ("FOR"); - if (current == NAME) - return ("NAME"); - if (current == 0) - return ("NULL"); - if (current == PATTERN) - return ("PATTERN"); - if (current == TK_CASE) - return ("TK_CASE"); - if (current == TK_IN) - return ("TK_IN"); - if (current == TK_ESAC) - return ("TK_ESAC"); - if (current == UNTIL_CLAUSE) - return ("UNTIL_CLAUSE"); - if (current == TK_UNTIL) - return ("TK_UNTIL"); - if (current == IF_CLAUSE) - return ("IF_CLAUSE"); - if (current == CONDITION) - return ("CONDITION"); - if (current == COMPLETE_CONDITION) - return ("COMPLETE_CONDITION"); - if (current == TK_ELSE) - return ("TK_ELSE"); - if (current == TK_FI) - return ("TK_FI"); - if (current == ELSE_PART) - return ("ELSE_PART"); - if (current == TK_FI) - return ("TK_FI"); - if (current == TK_IF) - return ("TK_IF"); - if (current == TK_ELIF) - return ("TK_ELIF"); - if (current == TK_THEN) - return ("TK_THEN"); - if (current == COMPOUND_COMMAND) - return ("COMPOUND_COMMAND"); - if (current == WHILE_CLAUSE) - return ("WHILE_CLAUSE"); - if (current == LOOP) - return ("LOOP"); - if (current == TK_DONE) - return ("DONE"); - if (current == TK_DO) - return ("TK_DO"); - if (current == END_COMMAND) - return ("END_COMMAND"); - if (current == SEQUENTIAL_SEP) - return ("SEQUENTIAL_SEP"); - if (current == SEPARATOR) - return ("SEPARATOR"); - if (current == SEPARATOR_OP) - return ("SEPARATOR_OP"); - if (current == TERM) - return ("TERM"); - if (current == COMPOUND_LIST) - return ("COMPOUND_LIST"); - if (current == DO_GROUP) - return ("DO_GROUP"); - if (current == TK_NEWLINE) - return ("TK_NEWLINE"); - if (current == TK_WHILE) - return ("TK_WHILE"); - if (current == TK_DO) - return ("TK_DO"); - if (current == TK_DONE) - return ("TK_DONE"); - if (current == AND_OR_MINOR) - return ("AND_OR_MINOR"); - if (current == AND_OR_MAJOR) - return ("AND_OR_MAJOR"); - if (current == TK_COMMAND) - return ("TK_COMMAND"); - if (current == TK_AND_IF) - return ("TK_AND_IF"); - if (current == TK_OR_IF) - return ("TK_OR_IF"); - if (current == TK_AMP) - return ("TK_AMP"); - if (current == TK_PIPE) - return ("TK_PIPE"); - if (current == TK_LESS) - return ("TK_LESS"); - if (current == TK_GREAT) - return ("TK_GREAT"); - if (current == TK_DLESS) - return ("TK_DLESS"); - if (current == TK_DGREAT) - return ("TK_DGREAT"); - if (current == TK_DGREAT) - return ("TK_DGREAT"); - if (current == TK_LESSAND) - return ("TK_LESSAND"); - if (current == TK_GREATAND) - return ("TK_GREATAND"); - if (current == SUBSHELL) - return ("SUBSEHLL"); - if (current == CMD_SUPERIOR) - return ("CMD_SUPERIOR"); - if (current == TK_IO_NUMBER) - return ("IO_NUMBER"); - if (current == CMD_SUFFIX) - return ("CMD_SUFFIX"); - if (current == CMD_PREFIX) - return ("CMD_PREFIX"); - if (current == IO_REDIRECT) - return ("IO_REDIRECT"); - if (current == IO_FILE) - return ("IO_FILE"); - if (current == PIPE_SEMI_SEQUENCE) - return ("PIPE_SEMI_SEQUENCE"); - if (current == TK_PIPE) - return ("TK_PIPE"); - if (current == PROGRAM) - return ("PROGRAM"); - if (current == COMMAND) - return ("COMMAND"); - if (current == PIPE_SEQUENCE) - return ("PIPE_SEQUENCE"); - if (current == PIPELINE) - return ("PIPELINE"); - if (current == AND_OR) - return ("AND_OR"); - if (current == LIST) - return ("LIST"); - if (current == COMPLETE_COMMAND) - return ("COMPLETE_COMMAND"); - if (current == COMPLETE_COMMANDS) - return ("COMPLETE_COMMANDS"); - if (current == TK_WORD) - return ("TK_WORD"); - if (current == CMD_NAME) - return ("CMD_NAME"); - if (current == HERE_END) - return ("HERE_END"); - if (current == FILENAME) - return ("FILENAME"); - if (current == CMD_SUFFIX) - return ("CMD_SUFFIX"); - if (current == SIMPLE_COMMAND) - return ("SIMPLE_COMMAND"); - if (current == TK_SEMI) - return ("TK_SEMI"); - if (current == ALL) - return ("ALL"); - if (current == NEWLINE_LIST) - return ("NEWLINE_LIST"); - if (current == CMD) - return ("CMD"); - if (current != 0) - return ("NON-DEFINED"); - if (current == 0) - return ("NULL"); - return ("NULL"); -} - -int ft_read_stack(t_sym *stack) -{ - while (*stack) - DG("%s", read_state(*stack--)); - return (0); -} - -int ft_show_heredoc_data(t_astnode *node) -{ - t_redir *redir; - - if (node->type != CMD) - return (1); - redir = (node->data.cmd.redir)->content; - if (redir->type != TK_DLESS) - return (1); - return (0); -} From 2dd095f525f4da611bff2b84293938bcde8b2794 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 21:33:28 +0100 Subject: [PATCH 02/17] extra files --- 42sh/21sh_error | 235 -- 42sh/42ShellTester/.gitignore | 4 - 42sh/42ShellTester/42ShellTester.sh | 122 - 42sh/42ShellTester/README.md | 574 ---- 42sh/42ShellTester/lib/assert.sh | 145 - .../lib/assets/42ShellTester.ascii | 21 - .../lib/assets/42ShellTester.png | Bin 89993 -> 0 bytes .../lib/assets/42ShellTester_250x250.png | Bin 12527 -> 0 bytes .../lib/assets/42ShellTester_416x416.png | Bin 20059 -> 0 bytes .../lib/assets/42ShellTester_cropped.png | Bin 21401 -> 0 bytes .../lib/assets/42shTestsTeamLogo.png | Bin 5071 -> 0 bytes .../lib/assets/42shTestsTeamLogo_sm.png | Bin 5337 -> 0 bytes 42sh/42ShellTester/lib/assets/README.md | 5 - 42sh/42ShellTester/lib/assets/hard.png | Bin 570 -> 0 bytes 42sh/42ShellTester/lib/assets/non-posix.png | Bin 725 -> 0 bytes 42sh/42ShellTester/lib/assets/pending.png | Bin 654 -> 0 bytes 42sh/42ShellTester/lib/main.sh | 280 -- 42sh/42ShellTester/lib/verbs/be_empty.sh | 16 - 42sh/42ShellTester/lib/verbs/create_file.sh | 47 - .../lib/verbs/exit_with_status.sh | 17 - .../lib/verbs/have_nb_of_lines.sh | 17 - .../lib/verbs/match_each_regex_of_file.sh | 28 - 42sh/42ShellTester/lib/verbs/match_regex.sh | 38 - 42sh/42ShellTester/log | 346 --- 42sh/42ShellTester/minishell_error | 1 - 42sh/42ShellTester/spec/README.md | 6 - 42sh/42ShellTester/spec/minishell_error | 0 42sh/42ShellTester/support/Makefile | 29 - .../support/display-env/Makefile | 12 - .../support/display-env/README.md | 28 - .../support/display-env/description | 1 - 42sh/42ShellTester/support/display-env/main.c | 22 - .../support/display-program-name/Makefile | 12 - .../support/display-program-name/README.md | 16 - .../support/display-program-name/description | 1 - .../support/display-program-name/main.c | 10 - .../support/display-pwd/Makefile | 12 - .../support/display-pwd/README.md | 19 - .../support/display-pwd/description | 1 - 42sh/42ShellTester/support/display-pwd/main.c | 13 - .../support/exit-with-status/Makefile | 12 - .../support/exit-with-status/README.md | 15 - .../support/exit-with-status/description | 1 - .../support/exit-with-status/main.c | 9 - .../support/read-on-stdin/Makefile | 12 - .../support/read-on-stdin/README.md | 27 - .../support/read-on-stdin/description | 1 - .../support/read-on-stdin/main.c | 21 - .../sleep-and-exit-with-status/Makefile | 12 - .../sleep-and-exit-with-status/README.md | 22 - .../sleep-and-exit-with-status/description | 1 - .../support/sleep-and-exit-with-status/main.c | 16 - .../sleep-and-write-on-stderr/Makefile | 12 - .../sleep-and-write-on-stderr/README.md | 24 - .../sleep-and-write-on-stderr/description | 1 - .../support/sleep-and-write-on-stderr/main.c | 18 - .../write-all-arguments-on-stdout/Makefile | 12 - .../write-all-arguments-on-stdout/README.md | 28 - .../write-all-arguments-on-stdout/description | 1 - .../write-all-arguments-on-stdout/main.c | 22 - .../support/write-on-stderr/Makefile | 12 - .../support/write-on-stderr/README.md | 25 - .../support/write-on-stderr/description | 1 - .../support/write-on-stderr/main.c | 19 - .../write-on-stdout-and-stderr/Makefile | 12 - .../write-on-stdout-and-stderr/README.md | 25 - .../write-on-stdout-and-stderr/description | 1 - .../support/write-on-stdout-and-stderr/main.c | 19 - .../support/write-on-stdout/Makefile | 12 - .../support/write-on-stdout/README.md | 22 - .../support/write-on-stdout/description | 1 - .../support/write-on-stdout/main.c | 16 - 42sh/42ShellTester/tasks/generate_readmes.sh | 181 -- 42sh/42sh_error | 2501 ----------------- 42sh/auteur | 4 - 42sh/donovan_segaults_06-02 | 533 ---- 42sh/minishell_error | 332 --- 42sh/scriptheader.sh | 133 - 42sh/update_makefile.sh | 17 - 79 files changed, 6211 deletions(-) delete mode 100644 42sh/21sh_error delete mode 100644 42sh/42ShellTester/.gitignore delete mode 100644 42sh/42ShellTester/42ShellTester.sh delete mode 100644 42sh/42ShellTester/README.md delete mode 100644 42sh/42ShellTester/lib/assert.sh delete mode 100644 42sh/42ShellTester/lib/assets/42ShellTester.ascii delete mode 100644 42sh/42ShellTester/lib/assets/42ShellTester.png delete mode 100644 42sh/42ShellTester/lib/assets/42ShellTester_250x250.png delete mode 100644 42sh/42ShellTester/lib/assets/42ShellTester_416x416.png delete mode 100644 42sh/42ShellTester/lib/assets/42ShellTester_cropped.png delete mode 100644 42sh/42ShellTester/lib/assets/42shTestsTeamLogo.png delete mode 100644 42sh/42ShellTester/lib/assets/42shTestsTeamLogo_sm.png delete mode 100644 42sh/42ShellTester/lib/assets/README.md delete mode 100644 42sh/42ShellTester/lib/assets/hard.png delete mode 100644 42sh/42ShellTester/lib/assets/non-posix.png delete mode 100644 42sh/42ShellTester/lib/assets/pending.png delete mode 100644 42sh/42ShellTester/lib/main.sh delete mode 100644 42sh/42ShellTester/lib/verbs/be_empty.sh delete mode 100644 42sh/42ShellTester/lib/verbs/create_file.sh delete mode 100644 42sh/42ShellTester/lib/verbs/exit_with_status.sh delete mode 100644 42sh/42ShellTester/lib/verbs/have_nb_of_lines.sh delete mode 100644 42sh/42ShellTester/lib/verbs/match_each_regex_of_file.sh delete mode 100644 42sh/42ShellTester/lib/verbs/match_regex.sh delete mode 100644 42sh/42ShellTester/log delete mode 100644 42sh/42ShellTester/minishell_error delete mode 100644 42sh/42ShellTester/spec/README.md delete mode 100644 42sh/42ShellTester/spec/minishell_error delete mode 100644 42sh/42ShellTester/support/Makefile delete mode 100644 42sh/42ShellTester/support/display-env/Makefile delete mode 100644 42sh/42ShellTester/support/display-env/README.md delete mode 100644 42sh/42ShellTester/support/display-env/description delete mode 100644 42sh/42ShellTester/support/display-env/main.c delete mode 100644 42sh/42ShellTester/support/display-program-name/Makefile delete mode 100644 42sh/42ShellTester/support/display-program-name/README.md delete mode 100644 42sh/42ShellTester/support/display-program-name/description delete mode 100644 42sh/42ShellTester/support/display-program-name/main.c delete mode 100644 42sh/42ShellTester/support/display-pwd/Makefile delete mode 100644 42sh/42ShellTester/support/display-pwd/README.md delete mode 100644 42sh/42ShellTester/support/display-pwd/description delete mode 100644 42sh/42ShellTester/support/display-pwd/main.c delete mode 100644 42sh/42ShellTester/support/exit-with-status/Makefile delete mode 100644 42sh/42ShellTester/support/exit-with-status/README.md delete mode 100644 42sh/42ShellTester/support/exit-with-status/description delete mode 100644 42sh/42ShellTester/support/exit-with-status/main.c delete mode 100644 42sh/42ShellTester/support/read-on-stdin/Makefile delete mode 100644 42sh/42ShellTester/support/read-on-stdin/README.md delete mode 100644 42sh/42ShellTester/support/read-on-stdin/description delete mode 100644 42sh/42ShellTester/support/read-on-stdin/main.c delete mode 100644 42sh/42ShellTester/support/sleep-and-exit-with-status/Makefile delete mode 100644 42sh/42ShellTester/support/sleep-and-exit-with-status/README.md delete mode 100644 42sh/42ShellTester/support/sleep-and-exit-with-status/description delete mode 100644 42sh/42ShellTester/support/sleep-and-exit-with-status/main.c delete mode 100644 42sh/42ShellTester/support/sleep-and-write-on-stderr/Makefile delete mode 100644 42sh/42ShellTester/support/sleep-and-write-on-stderr/README.md delete mode 100644 42sh/42ShellTester/support/sleep-and-write-on-stderr/description delete mode 100644 42sh/42ShellTester/support/sleep-and-write-on-stderr/main.c delete mode 100644 42sh/42ShellTester/support/write-all-arguments-on-stdout/Makefile delete mode 100644 42sh/42ShellTester/support/write-all-arguments-on-stdout/README.md delete mode 100644 42sh/42ShellTester/support/write-all-arguments-on-stdout/description delete mode 100644 42sh/42ShellTester/support/write-all-arguments-on-stdout/main.c delete mode 100644 42sh/42ShellTester/support/write-on-stderr/Makefile delete mode 100644 42sh/42ShellTester/support/write-on-stderr/README.md delete mode 100644 42sh/42ShellTester/support/write-on-stderr/description delete mode 100644 42sh/42ShellTester/support/write-on-stderr/main.c delete mode 100644 42sh/42ShellTester/support/write-on-stdout-and-stderr/Makefile delete mode 100644 42sh/42ShellTester/support/write-on-stdout-and-stderr/README.md delete mode 100644 42sh/42ShellTester/support/write-on-stdout-and-stderr/description delete mode 100644 42sh/42ShellTester/support/write-on-stdout-and-stderr/main.c delete mode 100644 42sh/42ShellTester/support/write-on-stdout/Makefile delete mode 100644 42sh/42ShellTester/support/write-on-stdout/README.md delete mode 100644 42sh/42ShellTester/support/write-on-stdout/description delete mode 100644 42sh/42ShellTester/support/write-on-stdout/main.c delete mode 100644 42sh/42ShellTester/tasks/generate_readmes.sh delete mode 100644 42sh/42sh_error delete mode 100644 42sh/donovan_segaults_06-02 delete mode 100644 42sh/minishell_error delete mode 100755 42sh/scriptheader.sh delete mode 100755 42sh/update_makefile.sh diff --git a/42sh/21sh_error b/42sh/21sh_error deleted file mode 100644 index 4e43d0d5..00000000 --- a/42sh/21sh_error +++ /dev/null @@ -1,235 +0,0 @@ -.x....................xxx...xxxx..x. - ----------------------------------------------------------------- - -21sh/misc/002-simple-command-line (FAILED) - - Description: - The purpose of this test is to check that the Shell is able to execute a simple command line that contains separators `;`, pipes `|`, and a right redirection `>`. - - Before test: - 01: rm -rf "./size" - 02: rm -rf "TOKEN201703241734" - 03: echo '^'$(echo TOKEN201703241734_FILE_TOKEN201703241734_STDOUT | wc -c)'$' > "./size" - - STDIN: - 01: mkdir TOKEN201703241734 ; cd TOKEN201703241734 ; touch TOKEN201703241734_FILE ; ls -1 ; ls | cat | wc -c > TOKEN201703241734_STDOUT ; cat TOKEN201703241734_STDOUT - - STDOUT: - SUCCESS expected_to match_regex `TOKEN201703241734_FILE$` - FAILURE expected_to match_each_regex_of_file `./size` - 01: TOKEN201703241734_FILE - 02: 98839 redirect_great.c 24 3 1 - 03: 23 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -21sh/redirections/outputs/truncating/001-creates-file-if-not-exits (FAILED) - - Description: - The right redirection `>` opens the file with the oflag `O_CREAT` so that the file is created if it does not exists. - - Before test: - 01: rm -f new_file - - STDIN: - 01: ./write_on_stdout TOKEN201703241734 >new_file - - STDOUT: - SUCCESS expected_to_not match_regex `TOKEN201703241734` - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - - MISC: - SUCCESS expected_to create_file `new_file` matching_regex `TOKEN201703241734` - FAILURE expected_to create_file `new_file` with_nb_of_lines `1` - ----------------------------------------------------------------- - -21sh/redirections/outputs/truncating/002-truncates-file-if-exists (FAILED) - - Description: - The right redirection `>` opens the file with the oflag `O_TRUNC` so that the file size is truncated to 0 before writing in it. - - Before test: - 01: ./write_on_stdout TOKEN201703241734_first >truncated_file - - STDIN: - 01: ./write_on_stdout TOKEN201703241734_second >truncated_file - - STDOUT: - SUCCESS expected_to_not match_regex TOKEN201703241734_second - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - - MISC: - SUCCESS expected_to create_file `truncated_file` matching_regex `TOKEN201703241734_second` - SUCCESS expected_to create_file `truncated_file` not_matching_regex `TOKEN201703241734_first` - FAILURE expected_to create_file `truncated_file` with_nb_of_lines `1` - ----------------------------------------------------------------- - -21sh/redirections/outputs/truncating/003-whitespace-before-filename (FAILED) - - Description: - The file name for a right redirection can be specified closely to the character `>` or in a separated field. - - Before test: - 01: rm -f "new_file" - - STDIN: - 01: ./write_on_stdout TOKEN201703241734 > new_file - - STDOUT: - SUCCESS expected_to_not match_regex `TOKEN201703241734` - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - - MISC: - SUCCESS expected_to create_file `new_file` matching_regex `TOKEN201703241734` - FAILURE expected_to create_file `new_file` with_nb_of_lines `1` - ----------------------------------------------------------------- - -21sh/redirections/outputs/truncating/multiple/004-together (FAILED) - - Description: - A right redirection can be associated to the twice outputs by using `&>...`, that means `redirect stdout and stderr to ...`. - - Before test: - 01: rm -f "new_file_stderr_and_stdout" - - STDIN: - 01: ./write_on_stdout_and_stderr TOKEN201703241734_1 TOKEN201703241734_2 &>new_file_stderr_and_stdout - - STDOUT: - FAILURE expected_to_not match_regex `TOKEN201703241734_1` - SUCCESS expected_to_not match_regex `TOKEN201703241734_2` - 01: TOKEN201703241734_1 - - STDERR: - SUCCESS expected_to_not match_regex `TOKEN201703241734_1` - FAILURE expected_to_not match_regex `TOKEN201703241734_2` - 01: TOKEN201703241734_2 - - MISC: - FAILURE expected_to create_file `new_file_stderr_and_stdout` matching_regex `TOKEN201703241734_1$` - FAILURE expected_to create_file `new_file_stderr_and_stdout` matching_regex `TOKEN201703241734_2$` - ----------------------------------------------------------------- - -21sh/redirections/outputs/truncating/multiple/005-together-with-whitespaces (FAILED) - - Description: - A right redirection can be associated to the twice outputs by using `&>...`, that means `redirect stdout and stderr to ...`. - In this test, we specify the file name in a separate field. - - Before test: - 01: rm -f new_file_stderr_and_stdout - - STDIN: - 01: ./write_on_stdout_and_stderr TOKEN201703241734_1 TOKEN201703241734_2 &> new_file_stderr_and_stdout - - STDOUT: - FAILURE expected_to_not match_regex `TOKEN201703241734_1` - SUCCESS expected_to_not match_regex `TOKEN201703241734_2` - 01: TOKEN201703241734_1 - - STDERR: - SUCCESS expected_to_not match_regex `TOKEN201703241734_1` - FAILURE expected_to_not match_regex `TOKEN201703241734_2` - 01: TOKEN201703241734_2 - - MISC: - FAILURE expected_to create_file `new_file_stderr_and_stdout` matching_regex `TOKEN201703241734_1$` - FAILURE expected_to create_file `new_file_stderr_and_stdout` matching_regex `TOKEN201703241734_2$` - ----------------------------------------------------------------- - -21sh/redirections/outputs/truncating/stderr/001-works (FAILED) - - Description: - The purpose of this test is to check that redirecting the standard error STDERR to a file `2>` works. In this test, the binary writes a token on each standard and error output, so that only the STDOUT is outputted and STDERR is written in a file `new_file_stderr`. - - Before test: - 01: rm -f "./new_file_stderr" - - STDIN: - 01: ./write_on_stdout_and_stderr TOKEN201703241734_STDOUT TOKEN201703241734_STDERR 2>new_file_stderr - - STDOUT: - SUCCESS expected_to match_regex `TOKEN201703241734_STDOUT` - 01: TOKEN201703241734_STDOUT - - STDERR: - SUCCESS expected_to_not match_regex `TOKEN201703241734_STDERR` - (no output) - - MISC: - SUCCESS expected_to create_file `new_file_stderr` matching_regex `TOKEN201703241734_STDERR` - FAILURE expected_to create_file `new_file_stderr` with_nb_of_lines 1 - ----------------------------------------------------------------- - -21sh/redirections/outputs/truncating/stdout/001-with-explicit-fd (FAILED) - - Description: - The purpose of this test is to check if '1>' redirect STDIN to a file. - We are using echo with one argument. The output should NOT return anything on the standard output. - - Before test: - 01: rm -f new_file - - STDIN: - 01: /bin/echo TOKEN1 1>new_file - - STDOUT: - SUCCESS expected_to_not match_regex TOKEN1 - (no output) - - STDERR: - (no output) - - MISC: - SUCCESS expected_to create_file new_file matching_regex TOKEN1 - FAILURE expected_to create_file new_file with_nb_of_lines 1 - ----------------------------------------------------------------- - -21sh/separators/semicolon/003-parse-error-empty-inline-command (FAILED) - - Description: - The purpose of this test is to check that using the simicolon separator `;` with empty commands results in error. - - STDIN: - 01: ./write_on_stdout TOKEN201703241734 ; ; ./exit_with_status 42 - - STDOUT: - SUCCESS expected_to be_empty - (no output) - - STDERR: - SUCCESS expected_to_not be_empty - SUCCESS might match_regex `([Ss]yntax|[Pp]arse) error` - 01: syntax error near unexpected token `;' - - MISC: - SUCCESS expected_to_not exit_with_status `42` - FAILURE expected_to_not exit_with_status `0` - -Total tests: 36 -Total failed tests: 9 -Total pending tests: 0 diff --git a/42sh/42ShellTester/.gitignore b/42sh/42ShellTester/.gitignore deleted file mode 100644 index 28f63f2b..00000000 --- a/42sh/42ShellTester/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -tmp/ -.mshell_hist -.DS_Store diff --git a/42sh/42ShellTester/42ShellTester.sh b/42sh/42ShellTester/42ShellTester.sh deleted file mode 100644 index 8bb3198b..00000000 --- a/42sh/42ShellTester/42ShellTester.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/bin/bash - -# /* -# Launcher -# */ - -get_install_directory() -{ - local SOURCE="${BASH_SOURCE[0]}" - local DIR - while [ -h "${SOURCE}" ] - do - DIR="$(cd -P "$(dirname "${SOURCE}")" && pwd)" - SOURCE="$(readlink "${SOURCE}")" - [[ "${SOURCE}" != /* ]] && SOURCE="${DIR}/${SOURCE}" - done - printf "%s" "$(cd -P "$(dirname "${SOURCE}")" && pwd)" -} - -# global variables -GLOBAL_PROG="" -GLOBAL_PROG_REFERENCE="" -GLOBAL_SPECS_FILTER="" -GLOBAL_ENTRYPATH=$(pwd) -GLOBAL_INSTALLDIR="$(get_install_directory)" -GLOBAL_TMP_DIRECTORY="${GLOBAL_INSTALLDIR}/tmp" -GLOBAL_LOCALBRANCH=$(git branch | awk '$0 ~ /^\*/ {print $2; exit}') -GLOBAL_TOKEN="TOKEN$(date +%Y%m%d%H%M)" -GLOBAL_TOTAL_TESTS=0 -GLOBAL_TOTAL_FAILED_TESTS=0 -GLOBAL_TOTAL_PENDING_TESTS=0 -GLOBAL_LOG="" -GLOBAL_SHOW_SUCCESS=0 -GLOBAL_RUN_POSIX_ONLY=0 -GLOBAL_RUN_PENDING_TESTS=0 -GLOBAL_RUN_HARD_TESTS=0 -GLOBAL_RUN_ALL_TESTS=0 -GLOBAL_INVALID_OPTION=0 -C_BOLD="\033[37;1m" -C_RED="\033[31m\033[38;5;160m" -C_GREEN="\033[31m\033[38;5;34m" -C_YELLOW="\033[31m\033[1;33m" -C_GREY="\033[38;5;239m" -C_CLEAR="\033[0m" - -# retrieve options -while [ ! -z "${1}" ]; do - if [[ "${1}" =~ ^-- ]] - then - case "${1}" in - "--reference") - shift 1 - GLOBAL_PROG_REFERENCE="$(which ${1})" - ;; - "--filter") - shift 1 - GLOBAL_SPECS_FILTER="${1}" - ;; - "--show-success") - GLOBAL_SHOW_SUCCESS=1 - ;; - "--pending") - GLOBAL_RUN_PENDING_TESTS=1 - ;; - "--posix") - GLOBAL_RUN_POSIX_ONLY=1 - ;; - "--hard") - GLOBAL_RUN_HARD_TESTS=1 - ;; - "--all") - GLOBAL_RUN_ALL_TESTS=1 - ;; - *) - printf "%s\n" "Invalid option: ${1}" - exit 1 - ;; - esac - else - if [ "${GLOBAL_PROG}" == "" ] - then - [[ "${1}" =~ ^[\.][\.]\/ ]] && GLOBAL_PROG="../${1}" || GLOBAL_PROG="$(which ${1})" - fi - fi - shift 1 -done - -# go to install directory -cd "${GLOBAL_INSTALLDIR}" - -# load application sources -for FILE in ./lib/* ./lib/verbs/* -do - if [ -f "${FILE}" ] - then - source "${FILE}" - fi -done - -# create and go to temporary directory -mkdir -p "${GLOBAL_TMP_DIRECTORY}" -cd "${GLOBAL_TMP_DIRECTORY}" - -# compile support binaries -make re -C "${GLOBAL_INSTALLDIR}/support/" TARGET_DIR=${GLOBAL_TMP_DIRECTORY} 1>- 2>- - -# run main function -run_main - -# display log -printf "%s\n\nTotal tests: %s\nTotal failed tests: %s\nTotal pending tests: %s\n" "${GLOBAL_LOG}" "${GLOBAL_TOTAL_TESTS}" "${GLOBAL_TOTAL_FAILED_TESTS}" "${GLOBAL_TOTAL_PENDING_TESTS}" - -# go back to entry directory -cd "${GLOBAL_ENTRYPATH}" - -# exit with success or error status -if [ "${GLOBAL_TOTAL_FAILED_TESTS}" == "0" ] -then - exit 0 -else - exit 1 -fi diff --git a/42sh/42ShellTester/README.md b/42sh/42ShellTester/README.md deleted file mode 100644 index 8746bd71..00000000 --- a/42sh/42ShellTester/README.md +++ /dev/null @@ -1,574 +0,0 @@ -# 42ShellTester - -42ShellTester is an **integration testing framework** wrote in Bash and designed for the pedagogical projects of the Shell branch at School 42 (Paris) listed bellow: -* **minishell** -* **21sh** -* **42sh** - -It brings you an easy way to **add**, **maintain** and **run** integration tests, helping you to work step by step on your Shell implementation. - - -42ShellTester is currently packaged with **289 tests**. - - -## Install - -```bash -git clone https://github.com/we-sh/42ShellTester ~/42ShellTester -``` - -## Run tests - -Add the path to your Shell as argument: - -```bash -bash ~/42ShellTester/42ShellTester.sh "/ABSOLUTE/PATH/TO/YOUR/SHELL" -``` - -## Options - -##### `--filter` + `$regex` - -Run tests that matches with the specified regular expression (e.g. `--filter "builtins"`). - -##### `--reference` + `$binary` - -Run tests that does not fail with the specified Shell binary (e.g. `--reference "bash"`). - -##### `--posix` - -Run tests that are POSIX compliant only (run all by default). - -##### `--hard` - -Run tests that are marked as « hard » (omitted by default). - -##### `--pending` - -Also run pending tests. - -##### `--all` - -Equivalent to use the two options `--pending` and `--hard` together. - -##### `--show-success` - -Also display tests that succeed (hidden by default). - -## List of tests - - -* **[21sh/](spec/21sh)** - * **[misc/](spec/21sh/misc)** - * [001-no-prompt-in-non-interactive-mode](spec/21sh/misc/001-no-prompt-in-non-interactive-mode) - * [002-simple-command-line](spec/21sh/misc/002-simple-command-line) - * **[pipe/](spec/21sh/pipe)** - * [001-single-pipe](spec/21sh/pipe/001-single-pipe) - * [002-chained-pipes](spec/21sh/pipe/002-chained-pipes) - * [003-many-chained-pipes](spec/21sh/pipe/003-many-chained-pipes) - * [004-without-surrounding-whitespaces](spec/21sh/pipe/004-without-surrounding-whitespaces) - * [005-asynchronous](spec/21sh/pipe/005-asynchronous) - * [006-exit-status](spec/21sh/pipe/006-exit-status) - * **[mixed/](spec/21sh/pipe/mixed)** - * [001-exit-or-not-exit ](spec/21sh/pipe/mixed/001-exit-or-not-exit) - * [002-cd-or-not-cd ](spec/21sh/pipe/mixed/002-cd-or-not-cd) - * [003-unsetenv-or-not-unsetenv ](spec/21sh/pipe/mixed/003-unsetenv-or-not-unsetenv) - * [004-setenv-or-not-setenv ](spec/21sh/pipe/mixed/004-setenv-or-not-setenv) - * **[redirections/](spec/21sh/redirections)** - * **[inputs/](spec/21sh/redirections/inputs)** - * [001-close-stdin](spec/21sh/redirections/inputs/001-close-stdin) - * [002-filename](spec/21sh/redirections/inputs/002-filename) - * [003-filename-with-whitespaces](spec/21sh/redirections/inputs/003-filename-with-whitespaces) - * [004-absolute-path](spec/21sh/redirections/inputs/004-absolute-path) - * [005-no-such-file](spec/21sh/redirections/inputs/005-no-such-file) - * **[outputs/](spec/21sh/redirections/outputs)** - * **[appending/](spec/21sh/redirections/outputs/appending)** - * [001-append-default-to-file](spec/21sh/redirections/outputs/appending/001-append-default-to-file) - * [002-append-stdout-to-file](spec/21sh/redirections/outputs/appending/002-append-stdout-to-file) - * [003-append-stderr-to-file](spec/21sh/redirections/outputs/appending/003-append-stderr-to-file) - * **[multiple/](spec/21sh/redirections/outputs/appending/multiple)** - * [001-append-twice-separately](spec/21sh/redirections/outputs/appending/multiple/001-append-twice-separately) - * **[closing/](spec/21sh/redirections/outputs/closing)** - * [001-close-default-output](spec/21sh/redirections/outputs/closing/001-close-default-output) - * [002-close-stdout](spec/21sh/redirections/outputs/closing/002-close-stdout) - * [003-close-stderr](spec/21sh/redirections/outputs/closing/003-close-stderr) - * [004-close-twice-outputs](spec/21sh/redirections/outputs/closing/004-close-twice-outputs) - * **[touching/](spec/21sh/redirections/outputs/touching)** - * [001-works](spec/21sh/redirections/outputs/touching/001-works) - * **[truncating/](spec/21sh/redirections/outputs/truncating)** - * [001-creates-file-if-not-exits](spec/21sh/redirections/outputs/truncating/001-creates-file-if-not-exits) - * [002-truncates-file-if-exists](spec/21sh/redirections/outputs/truncating/002-truncates-file-if-exists) - * [003-whitespace-before-filename](spec/21sh/redirections/outputs/truncating/003-whitespace-before-filename) - * **[multiple/](spec/21sh/redirections/outputs/truncating/multiple)** - * [001-separately](spec/21sh/redirections/outputs/truncating/multiple/001-separately) - * [002-together-stdout-first](spec/21sh/redirections/outputs/truncating/multiple/002-together-stdout-first) - * [003-together-stderr-first](spec/21sh/redirections/outputs/truncating/multiple/003-together-stderr-first) - * [004-together](spec/21sh/redirections/outputs/truncating/multiple/004-together) - * [005-together-with-whitespaces](spec/21sh/redirections/outputs/truncating/multiple/005-together-with-whitespaces) - * **[stderr/](spec/21sh/redirections/outputs/truncating/stderr)** - * [001-works](spec/21sh/redirections/outputs/truncating/stderr/001-works) - * **[stdout/](spec/21sh/redirections/outputs/truncating/stdout)** - * [001-with-explicit-fd](spec/21sh/redirections/outputs/truncating/stdout/001-with-explicit-fd) - * **[separators/](spec/21sh/separators)** - * **[semicolon/](spec/21sh/separators/semicolon)** - * [001-two-commands-sequentially](spec/21sh/separators/semicolon/001-two-commands-sequentially) - * [002-n-commands-sequentially](spec/21sh/separators/semicolon/002-n-commands-sequentially) - * [003-parse-error-empty-inline-command](spec/21sh/separators/semicolon/003-parse-error-empty-inline-command) - * [004-parse-error-empty-command](spec/21sh/separators/semicolon/004-parse-error-empty-command) -* **[42sh/](spec/42sh)** - * **[builtins/](spec/42sh/builtins)** - * **[export/](spec/42sh/builtins/export)** - * [001-display-env](spec/42sh/builtins/export/001-display-env) - * [002-export-basic-key-value-1](spec/42sh/builtins/export/002-export-basic-key-value-1) - * [003-export-basic-key-value-2](spec/42sh/builtins/export/003-export-basic-key-value-2) - * [004-export-empty-variable-1](spec/42sh/builtins/export/004-export-empty-variable-1) - * [005-export-empty-variable-2](spec/42sh/builtins/export/005-export-empty-variable-2) - * [006-export-update-env-variable](spec/42sh/builtins/export/006-export-update-env-variable) - * [007-existing-environment-variable](spec/42sh/builtins/export/007-existing-environment-variable) - * [008-local-to-environment](spec/42sh/builtins/export/008-local-to-environment) - * [009-export-with-equal-but-no-value-part1](spec/42sh/builtins/export/009-export-with-equal-but-no-value-part1) - * [010-export-with-equal-but-no-value-part2](spec/42sh/builtins/export/010-export-with-equal-but-no-value-part2) - * **[errors/](spec/42sh/builtins/export/errors)** - * [001-invalid-identifier-1](spec/42sh/builtins/export/errors/001-invalid-identifier-1) - * [002-invalid-identifier-2](spec/42sh/builtins/export/errors/002-invalid-identifier-2) - * [003-illegal-option](spec/42sh/builtins/export/errors/003-illegal-option) - * **[mixed/](spec/42sh/builtins/export/mixed)** - * [001-export-and-tmp-env-part1](spec/42sh/builtins/export/mixed/001-export-and-tmp-env-part1) - * [002-export-and-tmp-env-part2](spec/42sh/builtins/export/mixed/002-export-and-tmp-env-part2) - * **[options/](spec/42sh/builtins/export/options)** - * [001-export-with-only-p-parameter](spec/42sh/builtins/export/options/001-export-with-only-p-parameter) - * [002-export-p-param-and-token-should-add-local-var-only-part1](spec/42sh/builtins/export/options/002-export-p-param-and-token-should-add-local-var-only-part1) - * [003-export-p-param-and-token-should-add-local-var-only-part2](spec/42sh/builtins/export/options/003-export-p-param-and-token-should-add-local-var-only-part2) - * [004-export-n-param](spec/42sh/builtins/export/options/004-export-n-param) - * **[escaping/](spec/42sh/escaping)** - * [001-escape-single-character-1](spec/42sh/escaping/001-escape-single-character-1) - * [002-escape-single-character-2](spec/42sh/escaping/002-escape-single-character-2) - * [003-escape-single-character-3](spec/42sh/escaping/003-escape-single-character-3) - * [004-escape-single-character-4](spec/42sh/escaping/004-escape-single-character-4) - * [005-escape-single-character-5](spec/42sh/escaping/005-escape-single-character-5) - * **[mixed/](spec/42sh/escaping/mixed)** - * **[globbing/](spec/42sh/escaping/mixed/globbing)** - * **[brace-expansion/](spec/42sh/escaping/mixed/globbing/brace-expansion)** - * [001-it-does-not-expand-braces-1](spec/42sh/escaping/mixed/globbing/brace-expansion/001-it-does-not-expand-braces-1) - * [002-it-expands-braces-1](spec/42sh/escaping/mixed/globbing/brace-expansion/002-it-expands-braces-1) - * [003-it-expands-braces-2](spec/42sh/escaping/mixed/globbing/brace-expansion/003-it-expands-braces-2) - * **[bracket-expansion/](spec/42sh/escaping/mixed/globbing/bracket-expansion)** - * [001-it-does-not-expand-brackets](spec/42sh/escaping/mixed/globbing/bracket-expansion/001-it-does-not-expand-brackets) - * [002-escaped-inversion-mark](spec/42sh/escaping/mixed/globbing/bracket-expansion/002-escaped-inversion-mark) - * [003-it-takes-escaped-bracket-as-pattern-character](spec/42sh/escaping/mixed/globbing/bracket-expansion/003-it-takes-escaped-bracket-as-pattern-character) - * **[variable-expansion/](spec/42sh/escaping/mixed/variable-expansion)** - * [001-escape-variable-1](spec/42sh/escaping/mixed/variable-expansion/001-escape-variable-1) - * [002-it-does-not-escape-variable](spec/42sh/escaping/mixed/variable-expansion/002-it-does-not-escape-variable) - * [003-escape-variable-2](spec/42sh/escaping/mixed/variable-expansion/003-escape-variable-2) - * **[globbing/](spec/42sh/globbing)** - * **[brace-expansion/](spec/42sh/globbing/brace-expansion)** - * **[ascii-range/](spec/42sh/globbing/brace-expansion/ascii-range)** - * [001-simple-ascending-1](spec/42sh/globbing/brace-expansion/ascii-range/001-simple-ascending-1) - * [002-simple-ascending-2](spec/42sh/globbing/brace-expansion/ascii-range/002-simple-ascending-2) - * [003-simple-ascending-3](spec/42sh/globbing/brace-expansion/ascii-range/003-simple-ascending-3) - * [004-simple-descending-1](spec/42sh/globbing/brace-expansion/ascii-range/004-simple-descending-1) - * [005-simple-descending-2](spec/42sh/globbing/brace-expansion/ascii-range/005-simple-descending-2) - * [006-simple-descending-3](spec/42sh/globbing/brace-expansion/ascii-range/006-simple-descending-3) - * [007-identical-start-and-end](spec/42sh/globbing/brace-expansion/ascii-range/007-identical-start-and-end) - * [008-multiple-1](spec/42sh/globbing/brace-expansion/ascii-range/008-multiple-1) - * [009-multiple-2](spec/42sh/globbing/brace-expansion/ascii-range/009-multiple-2) - * [010-big-range](spec/42sh/globbing/brace-expansion/ascii-range/010-big-range) - * **[errors/](spec/42sh/globbing/brace-expansion/errors)** - * [001-invalid-pattern-1](spec/42sh/globbing/brace-expansion/errors/001-invalid-pattern-1) - * [002-invalid-pattern-2](spec/42sh/globbing/brace-expansion/errors/002-invalid-pattern-2) - * [003-invalid-pattern-3](spec/42sh/globbing/brace-expansion/errors/003-invalid-pattern-3) - * [004-invalid-pattern-4](spec/42sh/globbing/brace-expansion/errors/004-invalid-pattern-4) - * **[list-of-values/](spec/42sh/globbing/brace-expansion/list-of-values)** - * [001-nothing-to-be-done](spec/42sh/globbing/brace-expansion/list-of-values/001-nothing-to-be-done) - * [002-simple-test-1](spec/42sh/globbing/brace-expansion/list-of-values/002-simple-test-1) - * [003-simple-test-2](spec/42sh/globbing/brace-expansion/list-of-values/003-simple-test-2) - * **[numeric-range/](spec/42sh/globbing/brace-expansion/numeric-range)** - * [001-simple-ascending-1](spec/42sh/globbing/brace-expansion/numeric-range/001-simple-ascending-1) - * [002-simple-ascending-2](spec/42sh/globbing/brace-expansion/numeric-range/002-simple-ascending-2) - * [003-simple-ascending-3](spec/42sh/globbing/brace-expansion/numeric-range/003-simple-ascending-3) - * [004-simple-ascending-4](spec/42sh/globbing/brace-expansion/numeric-range/004-simple-ascending-4) - * [005-simple-ascending-5](spec/42sh/globbing/brace-expansion/numeric-range/005-simple-ascending-5) - * [006-simple-descending-1](spec/42sh/globbing/brace-expansion/numeric-range/006-simple-descending-1) - * [007-simple-descending-2](spec/42sh/globbing/brace-expansion/numeric-range/007-simple-descending-2) - * [008-simple-descending-3](spec/42sh/globbing/brace-expansion/numeric-range/008-simple-descending-3) - * [009-simple-descending-4](spec/42sh/globbing/brace-expansion/numeric-range/009-simple-descending-4) - * [010-simple-descending-5](spec/42sh/globbing/brace-expansion/numeric-range/010-simple-descending-5) - * [011-identical-positive-start-and-end](spec/42sh/globbing/brace-expansion/numeric-range/011-identical-positive-start-and-end) - * [012-identical-negative-start-and-end](spec/42sh/globbing/brace-expansion/numeric-range/012-identical-negative-start-and-end) - * [013-multiple-1](spec/42sh/globbing/brace-expansion/numeric-range/013-multiple-1) - * [014-multiple-2](spec/42sh/globbing/brace-expansion/numeric-range/014-multiple-2) - * [015-big-range](spec/42sh/globbing/brace-expansion/numeric-range/015-big-range) - * **[bracket-expansion/](spec/42sh/globbing/bracket-expansion)** - * **[multi/](spec/42sh/globbing/bracket-expansion/multi)** - * [001-range-and-char](spec/42sh/globbing/bracket-expansion/multi/001-range-and-char) - * [002-reverse-range-and-chars](spec/42sh/globbing/bracket-expansion/multi/002-reverse-range-and-chars) - * [003-reverse-multi-hard](spec/42sh/globbing/bracket-expansion/multi/003-reverse-multi-hard) - * [004-simple-bracket+char+range](spec/42sh/globbing/bracket-expansion/multi/004-simple-bracket+char+range) - * **[not/](spec/42sh/globbing/bracket-expansion/not)** - * [001-simple-opposit-match](spec/42sh/globbing/bracket-expansion/not/001-simple-opposit-match) - * [002-simple-opposite-range](spec/42sh/globbing/bracket-expansion/not/002-simple-opposite-range) - * **[range-pattern/](spec/42sh/globbing/bracket-expansion/range-pattern)** - * [001-alpha-range](spec/42sh/globbing/bracket-expansion/range-pattern/001-alpha-range) - * [002-numeric-range](spec/42sh/globbing/bracket-expansion/range-pattern/002-numeric-range) - * [003-ascii-range-1](spec/42sh/globbing/bracket-expansion/range-pattern/003-ascii-range-1) - * [004-ascii-range-2](spec/42sh/globbing/bracket-expansion/range-pattern/004-ascii-range-2) - * **[simple-pattern/](spec/42sh/globbing/bracket-expansion/simple-pattern)** - * [001-simple-list](spec/42sh/globbing/bracket-expansion/simple-pattern/001-simple-list) - * [002-multi-bracket](spec/42sh/globbing/bracket-expansion/simple-pattern/002-multi-bracket) - * [003-brackets-as-pattern](spec/42sh/globbing/bracket-expansion/simple-pattern/003-brackets-as-pattern) - * [004-multi-bracket-multi-char](spec/42sh/globbing/bracket-expansion/simple-pattern/004-multi-bracket-multi-char) - * **[single-char-pattern/](spec/42sh/globbing/bracket-expansion/single-char-pattern)** - * [001-single-char](spec/42sh/globbing/bracket-expansion/single-char-pattern/001-single-char) - * [002-closing-bracket-char](spec/42sh/globbing/bracket-expansion/single-char-pattern/002-closing-bracket-char) - * [003-opening-bracket-char](spec/42sh/globbing/bracket-expansion/single-char-pattern/003-opening-bracket-char) - * **[local-variable/](spec/42sh/local-variable)** - * [001-declare-and-expand-1](spec/42sh/local-variable/001-declare-and-expand-1) - * [002-declare-and-expand-2](spec/42sh/local-variable/002-declare-and-expand-2) - * [003-unknown-variable-does-not-result-in-new-argument](spec/42sh/local-variable/003-unknown-variable-does-not-result-in-new-argument) - * [004-existing-variable-in-environment-1](spec/42sh/local-variable/004-existing-variable-in-environment-1) - * [005-existing-variable-in-environment-2](spec/42sh/local-variable/005-existing-variable-in-environment-2) - * [006-existing-variable-in-environment-3](spec/42sh/local-variable/006-existing-variable-in-environment-3) - * [007-multiple-declaration-at-a-time](spec/42sh/local-variable/007-multiple-declaration-at-a-time) - * [008-multiple-declaration-with-same-name](spec/42sh/local-variable/008-multiple-declaration-with-same-name) - * [009-last-exit-status](spec/42sh/local-variable/009-last-exit-status) - * **[mixed/](spec/42sh/local-variable/mixed)** - * **[inline-environment-variable/](spec/42sh/local-variable/mixed/inline-environment-variable)** - * [001-local-variable-shouldnt-be-set](spec/42sh/local-variable/mixed/inline-environment-variable/001-local-variable-shouldnt-be-set) - * **[redirections/](spec/42sh/local-variable/mixed/redirections)** - * [001-truncating](spec/42sh/local-variable/mixed/redirections/001-truncating) - * [002-appending](spec/42sh/local-variable/mixed/redirections/002-appending) - * [003-reading](spec/42sh/local-variable/mixed/redirections/003-reading) - * **[tilde-expansion/](spec/42sh/local-variable/mixed/tilde-expansion)** - * [001-process-tilde-expansion](spec/42sh/local-variable/mixed/tilde-expansion/001-process-tilde-expansion) - * **[quoting/](spec/42sh/quoting)** - * **[double-quotes/](spec/42sh/quoting/double-quotes)** - * [001-it-works](spec/42sh/quoting/double-quotes/001-it-works) - * [002-concatenated-strings](spec/42sh/quoting/double-quotes/002-concatenated-strings) - * [003-first-argument-inhibited](spec/42sh/quoting/double-quotes/003-first-argument-inhibited) - * [004-multiline-1](spec/42sh/quoting/double-quotes/004-multiline-1) - * [005-multiline-2](spec/42sh/quoting/double-quotes/005-multiline-2) - * **[mixed/](spec/42sh/quoting/double-quotes/mixed)** - * **[escaping/](spec/42sh/quoting/double-quotes/mixed/escaping)** - * [001-escape-double-quote-1](spec/42sh/quoting/double-quotes/mixed/escaping/001-escape-double-quote-1) - * [002-escape-double-quote-2](spec/42sh/quoting/double-quotes/mixed/escaping/002-escape-double-quote-2) - * [003-escape-double-quote-3](spec/42sh/quoting/double-quotes/mixed/escaping/003-escape-double-quote-3) - * [004-it-results-in-error](spec/42sh/quoting/double-quotes/mixed/escaping/004-it-results-in-error) - * [005-it-does-not-escape-double-quote](spec/42sh/quoting/double-quotes/mixed/escaping/005-it-does-not-escape-double-quote) - * **[globbing/](spec/42sh/quoting/double-quotes/mixed/globbing)** - * **[brace-expansion/](spec/42sh/quoting/double-quotes/mixed/globbing/brace-expansion)** - * [001-it-does-not-expand-braces-1](spec/42sh/quoting/double-quotes/mixed/globbing/brace-expansion/001-it-does-not-expand-braces-1) - * [002-it-does-not-expand-braces-2](spec/42sh/quoting/double-quotes/mixed/globbing/brace-expansion/002-it-does-not-expand-braces-2) - * [003-it-does-not-expand-braces-3](spec/42sh/quoting/double-quotes/mixed/globbing/brace-expansion/003-it-does-not-expand-braces-3) - * [004-it-does-not-expand-braces-4](spec/42sh/quoting/double-quotes/mixed/globbing/brace-expansion/004-it-does-not-expand-braces-4) - * [005-it-does-not-expand-braces-5](spec/42sh/quoting/double-quotes/mixed/globbing/brace-expansion/005-it-does-not-expand-braces-5) - * **[bracket-expansion/](spec/42sh/quoting/double-quotes/mixed/globbing/bracket-expansion)** - * [001-it-works-1](spec/42sh/quoting/double-quotes/mixed/globbing/bracket-expansion/001-it-works-1) - * [002-it-works-2](spec/42sh/quoting/double-quotes/mixed/globbing/bracket-expansion/002-it-works-2) - * **[variable-expansion/](spec/42sh/quoting/double-quotes/mixed/variable-expansion)** - * [001-expansion-enabled](spec/42sh/quoting/double-quotes/mixed/variable-expansion/001-expansion-enabled) - * **[mixed/](spec/42sh/quoting/mixed)** - * [001-simple-and-double-quotes](spec/42sh/quoting/mixed/001-simple-and-double-quotes) - * [002-multiline](spec/42sh/quoting/mixed/002-multiline) - * **[globbing/](spec/42sh/quoting/mixed/globbing)** - * **[brace-expansion/](spec/42sh/quoting/mixed/globbing/brace-expansion)** - * [001-it-does-not-expand-braces-1](spec/42sh/quoting/mixed/globbing/brace-expansion/001-it-does-not-expand-braces-1) - * **[bracket-expansion/](spec/42sh/quoting/mixed/globbing/bracket-expansion)** - * [001-it-works-1](spec/42sh/quoting/mixed/globbing/bracket-expansion/001-it-works-1) - * [002-it-works-2](spec/42sh/quoting/mixed/globbing/bracket-expansion/002-it-works-2) - * **[variable-expansion/](spec/42sh/quoting/mixed/variable-expansion)** - * [001-it-does-not-expand-in-quotes](spec/42sh/quoting/mixed/variable-expansion/001-it-does-not-expand-in-quotes) - * **[simple-quotes/](spec/42sh/quoting/simple-quotes)** - * [001-it-works](spec/42sh/quoting/simple-quotes/001-it-works) - * [002-concatenated-strings](spec/42sh/quoting/simple-quotes/002-concatenated-strings) - * [003-first-argument-inhibited](spec/42sh/quoting/simple-quotes/003-first-argument-inhibited) - * [004-multiline-1](spec/42sh/quoting/simple-quotes/004-multiline-1) - * [005-multiline-2](spec/42sh/quoting/simple-quotes/005-multiline-2) - * **[mixed/](spec/42sh/quoting/simple-quotes/mixed)** - * **[escaping/](spec/42sh/quoting/simple-quotes/mixed/escaping)** - * [001-escape-simple-quote-1](spec/42sh/quoting/simple-quotes/mixed/escaping/001-escape-simple-quote-1) - * [002-escape-simple-quote-2](spec/42sh/quoting/simple-quotes/mixed/escaping/002-escape-simple-quote-2) - * [003-escape-simple-quote-3](spec/42sh/quoting/simple-quotes/mixed/escaping/003-escape-simple-quote-3) - * [004-it-does-not-escape-simple-quote-1](spec/42sh/quoting/simple-quotes/mixed/escaping/004-it-does-not-escape-simple-quote-1) - * [005-it-does-not-escape-simple-quote-2](spec/42sh/quoting/simple-quotes/mixed/escaping/005-it-does-not-escape-simple-quote-2) - * **[globbing/](spec/42sh/quoting/simple-quotes/mixed/globbing)** - * **[brace-expansion/](spec/42sh/quoting/simple-quotes/mixed/globbing/brace-expansion)** - * [001-it-does-not-expand-braces-1](spec/42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/001-it-does-not-expand-braces-1) - * [002-it-does-not-expand-braces-2](spec/42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/002-it-does-not-expand-braces-2) - * [003-it-does-not-expand-braces-3](spec/42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/003-it-does-not-expand-braces-3) - * [004-it-does-not-expand-braces-4](spec/42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/004-it-does-not-expand-braces-4) - * [005-it-does-not-expand-braces-5](spec/42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/005-it-does-not-expand-braces-5) - * **[bracket-expansion/](spec/42sh/quoting/simple-quotes/mixed/globbing/bracket-expansion)** - * [001-it-works-1](spec/42sh/quoting/simple-quotes/mixed/globbing/bracket-expansion/001-it-works-1) - * [002-it-works-2](spec/42sh/quoting/simple-quotes/mixed/globbing/bracket-expansion/002-it-works-2) - * **[variable-expansion/](spec/42sh/quoting/simple-quotes/mixed/variable-expansion)** - * [001-expansion-disabled](spec/42sh/quoting/simple-quotes/mixed/variable-expansion/001-expansion-disabled) - * **[subshell/](spec/42sh/subshell)** - * [001-tokens-are-recognized](spec/42sh/subshell/001-tokens-are-recognized) - * [002-multiple-levels-of-subshells](spec/42sh/subshell/002-multiple-levels-of-subshells) - * [003-multiline](spec/42sh/subshell/003-multiline) - * [004-exit-status](spec/42sh/subshell/004-exit-status) - * [005-copy-of-environment](spec/42sh/subshell/005-copy-of-environment) - * **[errors/](spec/42sh/subshell/errors)** - * [001-parse-error-1](spec/42sh/subshell/errors/001-parse-error-1) - * [002-parse-error-2](spec/42sh/subshell/errors/002-parse-error-2) - * [003-parse-error-3](spec/42sh/subshell/errors/003-parse-error-3) - * [004-parse-error-4](spec/42sh/subshell/errors/004-parse-error-4) - * **[mixed/](spec/42sh/subshell/mixed)** - * **[builtins/](spec/42sh/subshell/mixed/builtins)** - * **[cd/](spec/42sh/subshell/mixed/builtins/cd)** - * [001-it-does-not-change-current-directory](spec/42sh/subshell/mixed/builtins/cd/001-it-does-not-change-current-directory) - * [002-multiline](spec/42sh/subshell/mixed/builtins/cd/002-multiline) - * **[exit/](spec/42sh/subshell/mixed/builtins/exit)** - * [001-exiting-subshell](spec/42sh/subshell/mixed/builtins/exit/001-exiting-subshell) - * **[setenv/](spec/42sh/subshell/mixed/builtins/setenv)** - * [001-it-does-not-modify-parent-environment](spec/42sh/subshell/mixed/builtins/setenv/001-it-does-not-modify-parent-environment) - * **[unsetenv/](spec/42sh/subshell/mixed/builtins/unsetenv)** - * [001-it-does-not-modify-parent-environment](spec/42sh/subshell/mixed/builtins/unsetenv/001-it-does-not-modify-parent-environment) - * **[escaping/](spec/42sh/subshell/mixed/escaping)** - * [001-escaped-subshell-1](spec/42sh/subshell/mixed/escaping/001-escaped-subshell-1) - * [002-escaped-subshell-2](spec/42sh/subshell/mixed/escaping/002-escaped-subshell-2) - * **[inline-environment-variable/](spec/42sh/subshell/mixed/inline-environment-variable)** - * [001-modifies-the-child-environment-only-1](spec/42sh/subshell/mixed/inline-environment-variable/001-modifies-the-child-environment-only-1) - * [002-modifies-the-child-environment-only-2](spec/42sh/subshell/mixed/inline-environment-variable/002-modifies-the-child-environment-only-2) - * **[piping/](spec/42sh/subshell/mixed/piping)** - * [001-subshells-inside-piped-command](spec/42sh/subshell/mixed/piping/001-subshells-inside-piped-command) - * [002-pipes-inside-subshells](spec/42sh/subshell/mixed/piping/002-pipes-inside-subshells) - * [003-imbricated-subshells-and-pipes](spec/42sh/subshell/mixed/piping/003-imbricated-subshells-and-pipes) - * **[quoting/](spec/42sh/subshell/mixed/quoting)** - * [001-with-simple-quotes](spec/42sh/subshell/mixed/quoting/001-with-simple-quotes) - * [002-with-double-quotes](spec/42sh/subshell/mixed/quoting/002-with-double-quotes) - * [003-with-simple-and-double-quotes](spec/42sh/subshell/mixed/quoting/003-with-simple-and-double-quotes) -* **[bonuses/](spec/bonuses)** - * **[builtins/](spec/bonuses/builtins)** - * **[env/](spec/bonuses/builtins/env)** - * [001-unset-variables ](spec/bonuses/builtins/env/001-unset-variables) - * [002-unset-and-set-variable ](spec/bonuses/builtins/env/002-unset-and-set-variable) - * **[inline-environment-variable/](spec/bonuses/inline-environment-variable)** - * [001-modifies-child-environment-1](spec/bonuses/inline-environment-variable/001-modifies-child-environment-1) - * [002-modifies-child-environment-2](spec/bonuses/inline-environment-variable/002-modifies-child-environment-2) - * [003-modifies-PATH-only](spec/bonuses/inline-environment-variable/003-modifies-PATH-only) - * **[redirections/](spec/bonuses/redirections)** - * [001-append-twice-outputs-together ](spec/bonuses/redirections/001-append-twice-outputs-together) - * **[separators/](spec/bonuses/separators)** - * **[and/](spec/bonuses/separators/and)** - * [001-run-twice](spec/bonuses/separators/and/001-run-twice) - * [002-do-not-run-second](spec/bonuses/separators/and/002-do-not-run-second) - * [003-run-until-failing](spec/bonuses/separators/and/003-run-until-failing) - * **[errors/](spec/bonuses/separators/and/errors)** - * [001-parse-error-at-beginning](spec/bonuses/separators/and/errors/001-parse-error-at-beginning) - * [002-parse-error-too-much-symbol](spec/bonuses/separators/and/errors/002-parse-error-too-much-symbol) - * **[mixed/](spec/bonuses/separators/mixed)** - * [001-and-or](spec/bonuses/separators/mixed/001-and-or) - * [002-and-or](spec/bonuses/separators/mixed/002-and-or) - * [003-and-or](spec/bonuses/separators/mixed/003-and-or) - * [004-or-and](spec/bonuses/separators/mixed/004-or-and) - * [005-or-and](spec/bonuses/separators/mixed/005-or-and) - * [006-or-and](spec/bonuses/separators/mixed/006-or-and) - * **[or/](spec/bonuses/separators/or)** - * [001-run-first-only](spec/bonuses/separators/or/001-run-first-only) - * [002-run-second-only](spec/bonuses/separators/or/002-run-second-only) - * [003-run-until-succeeding](spec/bonuses/separators/or/003-run-until-succeeding) - * **[errors/](spec/bonuses/separators/or/errors)** - * [001-parse-error-at-beginning](spec/bonuses/separators/or/errors/001-parse-error-at-beginning) - * [002-parse-error-too-much-symbol](spec/bonuses/separators/or/errors/002-parse-error-too-much-symbol) - * **[tilde-expansion/](spec/bonuses/tilde-expansion)** - * [001-expanded-with-HOME-1](spec/bonuses/tilde-expansion/001-expanded-with-HOME-1) - * [002-expanded-with-HOME-2](spec/bonuses/tilde-expansion/002-expanded-with-HOME-2) - * [003-expanded-with-PWD-1](spec/bonuses/tilde-expansion/003-expanded-with-PWD-1) - * [004-expanded-with-PWD-2](spec/bonuses/tilde-expansion/004-expanded-with-PWD-2) - * [005-expanded-with-OLDPWD-1](spec/bonuses/tilde-expansion/005-expanded-with-OLDPWD-1) - * [006-expanded-with-OLDPWD-2](spec/bonuses/tilde-expansion/006-expanded-with-OLDPWD-2) - * **[not-expanded/](spec/bonuses/tilde-expansion/not-expanded)** - * [001-not-expanded-with-HOME-1](spec/bonuses/tilde-expansion/not-expanded/001-not-expanded-with-HOME-1) - * [002-not-expanded-with-HOME-2](spec/bonuses/tilde-expansion/not-expanded/002-not-expanded-with-HOME-2) - * [003-not-expanded-with-PWD](spec/bonuses/tilde-expansion/not-expanded/003-not-expanded-with-PWD) - * [004-not-expanded-with-OLDPWD](spec/bonuses/tilde-expansion/not-expanded/004-not-expanded-with-OLDPWD) -* **[minishell/](spec/minishell)** - * **[binary/](spec/minishell/binary)** - * [001-binary-path-relative](spec/minishell/binary/001-binary-path-relative) - * [002-binary-path-absolute](spec/minishell/binary/002-binary-path-absolute) - * [003-binary-test-exec-order](spec/minishell/binary/003-binary-test-exec-order) - * [004-binary-test-empty-path](spec/minishell/binary/004-binary-test-empty-path) - * [005-binary-test-wrong-path](spec/minishell/binary/005-binary-test-wrong-path) - * [006-binary-undefined-path](spec/minishell/binary/006-binary-undefined-path) - * [007-binary-permission-denied](spec/minishell/binary/007-binary-permission-denied) - * [008-binary-too-many-symbolic-links-encountered](spec/minishell/binary/008-binary-too-many-symbolic-links-encountered) - * **[builtins/](spec/minishell/builtins)** - * **[cd/](spec/minishell/builtins/cd)** - * [001-no-arg](spec/minishell/builtins/cd/001-no-arg) - * [002-current-directory](spec/minishell/builtins/cd/002-current-directory) - * [003-current-directory-2](spec/minishell/builtins/cd/003-current-directory-2) - * [004-parent-directory](spec/minishell/builtins/cd/004-parent-directory) - * [005-root-path](spec/minishell/builtins/cd/005-root-path) - * [006-root-path-2](spec/minishell/builtins/cd/006-root-path-2) - * [007-symbolic-link](spec/minishell/builtins/cd/007-symbolic-link) - * [008-symbolic-link-2](spec/minishell/builtins/cd/008-symbolic-link-2) - * [009-following-links ](spec/minishell/builtins/cd/009-following-links) - * [010-update-OLDPWD](spec/minishell/builtins/cd/010-update-OLDPWD) - * [011-dotdot](spec/minishell/builtins/cd/011-dotdot) - * [012-dot](spec/minishell/builtins/cd/012-dot) - * [013-absolute-path](spec/minishell/builtins/cd/013-absolute-path) - * **[errors/](spec/minishell/builtins/cd/errors)** - * [001-not-a-directory](spec/minishell/builtins/cd/errors/001-not-a-directory) - * [002-not-a-directory-2](spec/minishell/builtins/cd/errors/002-not-a-directory-2) - * [003-permission-denied](spec/minishell/builtins/cd/errors/003-permission-denied) - * [004-permission-denied-2](spec/minishell/builtins/cd/errors/004-permission-denied-2) - * [005-too-many-symbolic-links-encountered](spec/minishell/builtins/cd/errors/005-too-many-symbolic-links-encountered) - * [006-too-many-symbolic-links-encountered-2](spec/minishell/builtins/cd/errors/006-too-many-symbolic-links-encountered-2) - * [007-no-such-file-or-directory](spec/minishell/builtins/cd/errors/007-no-such-file-or-directory) - * [008-no-such-file-or-directory-2](spec/minishell/builtins/cd/errors/008-no-such-file-or-directory-2) - * [009-no-such-file-or-directory-symlink](spec/minishell/builtins/cd/errors/009-no-such-file-or-directory-symlink) - * [010-no-such-file-or-directory-symlink-2](spec/minishell/builtins/cd/errors/010-no-such-file-or-directory-symlink-2) - * **[options/](spec/minishell/builtins/cd/options)** - * [001-not-following-links](spec/minishell/builtins/cd/options/001-not-following-links) - * [002-oldpwd](spec/minishell/builtins/cd/options/002-oldpwd) - * **[env/](spec/minishell/builtins/env)** - * [001-env-same-value-as-parent](spec/minishell/builtins/env/001-env-same-value-as-parent) - * [002-env-check-usefull-var](spec/minishell/builtins/env/002-env-check-usefull-var) - * [003-ignore-environment](spec/minishell/builtins/env/003-ignore-environment) - * [005-set-variables](spec/minishell/builtins/env/005-set-variables) - * **[errors/](spec/minishell/builtins/env/errors)** - * [001-command-not-found](spec/minishell/builtins/env/errors/001-command-not-found) - * [002-illegal-option](spec/minishell/builtins/env/errors/002-illegal-option) - * **[multiple-options/](spec/minishell/builtins/env/multiple-options)** - * [001-ignore-environment-and-set-variable](spec/minishell/builtins/env/multiple-options/001-ignore-environment-and-set-variable) - * **[exit/](spec/minishell/builtins/exit)** - * [001-without-any-argument](spec/minishell/builtins/exit/001-without-any-argument) - * [002-status-passed-as-argument](spec/minishell/builtins/exit/002-status-passed-as-argument) - * [003-status-of-last-command](spec/minishell/builtins/exit/003-status-of-last-command) - * **[errors/](spec/minishell/builtins/exit/errors)** - * [001-too-many-args](spec/minishell/builtins/exit/errors/001-too-many-args) - * [002-non-numeric-argument](spec/minishell/builtins/exit/errors/002-non-numeric-argument) - * **[mixed/](spec/minishell/builtins/mixed)** - * [001-setenv-unsetenv](spec/minishell/builtins/mixed/001-setenv-unsetenv) - * **[setenv/](spec/minishell/builtins/setenv)** - * [001-no-argument](spec/minishell/builtins/setenv/001-no-argument) - * [002-add-new-variable](spec/minishell/builtins/setenv/002-add-new-variable) - * [003-set-existing-variable](spec/minishell/builtins/setenv/003-set-existing-variable) - * [004-invalid-identifier](spec/minishell/builtins/setenv/004-invalid-identifier) - * [005-add-and-set-multiple-variables](spec/minishell/builtins/setenv/005-add-and-set-multiple-variables) - * **[unsetenv/](spec/minishell/builtins/unsetenv)** - * [001-unsetenv-first-elem](spec/minishell/builtins/unsetenv/001-unsetenv-first-elem) - * [002-unsetenv-mult-envp](spec/minishell/builtins/unsetenv/002-unsetenv-mult-envp) - * [003-unsetenv-mult-envp-inline](spec/minishell/builtins/unsetenv/003-unsetenv-mult-envp-inline) - * **[misc/](spec/minishell/misc)** - * [001-copy-of-environment](spec/minishell/misc/001-copy-of-environment) - - - -# Development - -## Coding convention - -* Scope indentation must be done with 2 spaces -* Variable names must be upper case (e.g. `INDEX`) -* Global variables must be prefixed with `GLOBAL_` (e.g. `GLOBAL_TOKEN`) -* Variable expansion must be surrounded by curly braces (e.g. `${VARIABLE}`) -* Arguments of functions and commands must be surrounded by double or simple quotes (e.g. `run_assert "STDERR"`) -* Semicolon are banned so that words like `then` and `do` are always at start of lines (e.g. wrong inline code: `if [ ... ]; then cmd; fi`) -* Folder names may only contain alphanumeric and `-` - -## Adding new test - -An integration test must be **self-sufficient**, that means executing the full test suite or only one test must result in the same failed or success status. The framework 42ShellTester brings you tools for that! - -Firstly, tests are executed inside a temporary folder `tmp/` that is created at launch time and placed at the root installation folder of the framework. You may generate temporary files, binaries and folders that are needed for your test, but pay attention to not touch external folders. Use the `before_exec` callback to generate these resources. - -Secondly, each test is executed within a sub-shell, so that you may modify the environment without disrupting the test suite. Use the `before_exec` callback to modify the environment. - -Thirdly, a test must concern one single feature at a time, that means **wherever possible** you must avoid the use of multiple builtins or capabilities (e.g. do not use a pipe `|` within a test that concerns the builtin `env`, or again use absolute paths to binaries like `/bin/ls` to let the Shell implementation not support the `PATH`, except if you precisely test this feature!). - -Fourthly, when a test need binaries like `/bin/env` or `/bin/echo`, prefer to recode your own, simplier and multi-platform, and place it in `support/` folder. Then use the `before_exec` callback to compile it and make it available for your test. - -Sixthly, a test that is not POSIX compliant must contain a file named `non-posix` containing a small explanation of why. - -Finally, don't write a README and let the task `generate_readmes` do it for you :-) A description may be added in a file named `description` that will appear at the top of the README. - -Follow the guideline to add a new test: - -1. Create a sub-folder in `spec/` (e.g. `spec/minishell/builtin/cd/new-test/`) -2. If necessary, create a file `before_exec` that contains the shell commands that prepare the environment and the temporary resources (e.g. `mkdir valid_folder`) -2. Create a file `stdin` that contains the shell command you want to test (e.g. `cd invalid_folder`) -3. Create the files `stdout` and/or `stderr` that contain the expected output assertions (e.g. in stderr: `expected_to_not be_empty`) (see available assertions and verbs bellow) -4. You may also create a file `misc` that contains special expectations not concerning output on standard and error (e.g. `expected_to_not exit_with_status 0`) -5. If necessary, create a file `description` that describes more precisely the purpose of the test (e.g. `Trying to access invalid folder must display an error on standard error and result in a failure status code`) (the description will be included at top of the auto-generated README) -6. If the test is not POSIX compliant, create a file `non-posix` that explains why. - -## Assertions - -* **`expected_to`** / **`expected_to_not`** + *`verb`*: An assertion beginning with **expected_to** (or its opposite **expected_to_not**) makes the test resulting in failure status if the expectation that follows **does not** comply. - -* **`might`** / **`might_not`** + *`verb`*: An assertion beginning with **might** (or its opposite **might_not**) always makes the test resulting in success status. When the expectation that follows **may not** comply, it is nevertheless considered as success but it displays a warning message. - -## Verbs - -* **`be_empty`**: Actual output is empty. -* **`create_file`** + *`$filename`*: Actual command creates a file named *$filename*. May also be followed with a file test: - * **`matching_regex`** + *`$regex`*: At least one line of the file matches with the regular expression *$regex*. - * **`not_matching_regex`** + *`$regex`*: Any line of the file does match with the regular expression *$regex*. - * **`with_nb_of_lines`** + *`$int`*: The file contains exactly *$int* lines. -* **`exit_with_status`** + *`$int`*: The Shell termination results in the exit status *$int*. -* **`have_nb_of_lines`** + *`$int`*: Actual output contains exactly *$int* lines. -* **`match_regex`** + *`$regex`*: At least one line of actual output does match with the regular expression *$regex*. - * **`once`**: The matching is limited to only one occurrence. - * *`$int`* **`times`**: The matching must exactly occur *$int* times. -* **`match_each_regex_of_file`** + *`$filename`*: Actual output does match with each regular expression contained in the file named *$filename* (in an indifferent order). - -## Adding new verb - -A verb is a function that is prefixed by `run_verb_` and that returns `0` or `1` according to the tested behavior. It may return a status `255` when bad or missing argument. - -At runtime, the framework provides a list of variables that can be used by the verbs: - -* **`RESPONSE`**: The path to the file containing actual output (STDOUT or STDERR) -* **`RESPONSE_EXIT_STATUS`**: The exit status of the Shell termination -* **`EXPECTED_TO_ARGS[]`**: An array containing the arguments following the verb - -Follow the guideline to add a new verb: - -1. Choose the best name that respects the *CamelCase* convention and that can be human-readable when used with an assertion (e.g. `expected_to be_empty` can be read `actual output is expected to be empty`) -2. Create a file in `lib/verbs/` with the exact name of the verb and that is prefixed with `run_verb_` (e.g. `lib/verbs/run_verb_be_empty.sh` -3. Add a *shebang*: `#!/bin/sh` and a comment that describes the tested behavior -4. Create a function with the exact name of the verb and that is prefixed with `run_verb_` (the same as the file name) and make it respect the following rules: - * Local variables must be declared with `local` - * No output can be done with `echo` or `printf` - * Function returns `0` on succes, `1` on fail or `255` on bad use - * Use the array `EXPECTED_TO_ARGS[]` to take advantage of arguments (e.g. `expected_to match_regex "regex"`, then `EXPECTED_TO_ARGS[0]` contains `regex`) - -## Support binaries - -The framework 42ShellTester provides several binaries to be used within the tests. Using them instead of using Unix binaries prevents from undefined behaviors and compatibility errors. - -Find the available list of support binaries bellow: - - - -* **[./display_env](http://github.com/we-sh/42ShellTester/tree/master/support/display-env)**: A binary that iterates on `**envp` and write each element on standard output. -* **[./display_program_name](http://github.com/we-sh/42ShellTester/tree/master/support/display-program-name)**: A binary that writes its name on standard ouput. -* **[./display_pwd](http://github.com/we-sh/42ShellTester/tree/master/support/display-pwd)**: A binary that writes on standard output the absolute path of the current directory returned by `getcwd(3)`, encountered with the strings `PWD:` and `:PWD`. -* **[./exit_with_status](http://github.com/we-sh/42ShellTester/tree/master/support/exit-with-status)**: A binary that immediately exits with the status given as first argument. -* **[./read_on_stdin](http://github.com/we-sh/42ShellTester/tree/master/support/read-on-stdin)**: A binary that reads on standard entry and write each line on standard output suffixed with the character `@` (e.g. same behavior as `cat -e` and the *newline* character). When `read(2)` returns `-1`, then the string `STDIN READ ERROR` is written on standard error. -* **[./sleep_and_exit_with_status](http://github.com/we-sh/42ShellTester/tree/master/support/sleep-and-exit-with-status)**: A binary that sleeps for a duration in seconds given as first argument and then exits with status given as second argument. -* **[./sleep_and_write_on_stderr](http://github.com/we-sh/42ShellTester/tree/master/support/sleep-and-write-on-stderr)**: A binary that sleeps for a duration in seconds given as first argument and then writes on STDERR the string given as second argument without EOL. -* **[./write_all_arguments_on_stdout](http://github.com/we-sh/42ShellTester/tree/master/support/write-all-arguments-on-stdout)**: A binary that writes on standard output each argument separated by the symbol `@`. If no argument is given, it writes the string "nothing to be written on stdout". -* **[./write_on_stderr](http://github.com/we-sh/42ShellTester/tree/master/support/write-on-stderr)**: A binary that writes on standard error the first given argument (the same behavior as `echo` but with only one argument) and exits with an error status code given as second argument. If no argument is given, it writes the string "write on stderr" and exit with status `1`. -* **[./write_on_stdout](http://github.com/we-sh/42ShellTester/tree/master/support/write-on-stdout)**: A binary that writes on standard output the first given argument (the same behavior as `echo` but with only one argument). If no argument is given, it writes the string "write on stdout". -* **[./write_on_stdout_and_stderr](http://github.com/we-sh/42ShellTester/tree/master/support/write-on-stdout-and-stderr)**: A binary that writes on standard output the first given argument, and writes on standard error the second given argument. If an argument is missing, it writes the strings "write on stdout" and "write on stderr". - - - -## Tasks - -* `bash ./tasks/generate_readmes.sh` (only on master branch) to automaticaly generate the README files of tests - -# The Team - -* **Adrien Nouvel** [@anouvel](https://github.com/anouvel) -* **Gabriel Kuma** [@gabkk](https://github.com/gabkk) -* **Jean-Michel Gigault** [@jgigault](https://github.com/jgigault) - -## Logo credits - -Edouard Audeguy -Illustrateur / Infographiste -https://edouardaudeguy.wix.com/portfolio diff --git a/42sh/42ShellTester/lib/assert.sh b/42sh/42ShellTester/lib/assert.sh deleted file mode 100644 index b23d96c4..00000000 --- a/42sh/42ShellTester/lib/assert.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/bin/bash - -# /* -# Assert logic -# -# run_assert -# @param -> prefix applied to output file name -# @param -> output that is tested (STDOUT, STDERR or MISC) -# function that: -# - sets the variable RESPONSE with the path of the file that stores the actual output -# - iterates over the current test configuration file ('stdout', 'stderr' or 'misc') -# - calls the expected type of assertion ('expected', 'might' or their opposite) -# -# run_expected_to -# run_expected_to_not -# run_might -# run_might_to -# @param -> current test (e.g. 'expected_to be_empty') -# functions that calls the verbs and treats their exit status -# */ - -run_assert() -{ - local LINE - local PREFIX_STD="${1}" - local EXPECTED_STD="RESPONSE_${PREFIX_STD}${2}" - local RESPONSE="${!EXPECTED_STD}" - local EXPECTED_STD_NAME="${2}" - local RESPONSE_EXIT_STATUS_VAR="${PREFIX_STD}EXIT_STATUS" - local RESPONSE_EXIT_STATUS="${!RESPONSE_EXIT_STATUS_VAR}" - local TEST_CMD - local OLD_IFS="${IFS}" - local ASSERT_STATUS="0" - local CURRENT_ASSERT_STATUS - local DISPLAY_LINE - - IFS=$'\n' - for LINE in $(awk '{gsub(/\\\\/, "\\\\\\\\\\\\\\\\"); print}' "${TEST}/$(echo "${EXPECTED_STD_NAME}" | awk '{print tolower($0)}')") - do - TEST_CMD="$(echo "${LINE}" | awk '{ print $1 }')" - DISPLAY_LINE="$(printf "${LINE}" | awk -v GLOBAL_TOKEN="${GLOBAL_TOKEN}" -v GLOBAL_INSTALLDIR="${GLOBAL_INSTALLDIR}" -v GLOBAL_TMP_DIRECTORY="${GLOBAL_TMP_DIRECTORY}" -v PATH="${PATH}" -v HOME="${HOME}" '{i=1; while(i <= NF) {gsub(/^"/, "`", $i); gsub(/"$/, "`", $i); i++}; gsub(/\\\\\\\\/, "\\"); gsub(/\$\{GLOBAL_TOKEN\}/, GLOBAL_TOKEN); gsub(/\$\{GLOBAL_INSTALLDIR\}/, GLOBAL_INSTALLDIR); gsub(/\$\{GLOBAL_TMP_DIRECTORY\}/, GLOBAL_TMP_DIRECTORY); gsub(/\$\{PATH\}/, PATH); gsub(/\$\{HOME\}/, HOME); print}')" - eval "run_${TEST_CMD}" ${LINE} - CURRENT_ASSERT_STATUS="${?}" - if [ "${CURRENT_ASSERT_STATUS}" != "0" ] - then - [ "${ASSERT_STATUS}" == "0" -o "${ASSERT_STATUS}" == "2" ] && ASSERT_STATUS="${CURRENT_ASSERT_STATUS}" - fi - done - IFS="${OLD_IFS}" - - return "${ASSERT_STATUS}" -} - -run_expected_to() -{ - shift 1 - local EXPECTED_TO_CMD="${1}" - shift 1 - local -a EXPECTED_TO_ARGS='(${@})' - local ASSERT_STATUS - - eval "run_verb_${EXPECTED_TO_CMD}" - ASSERT_STATUS="${?}" - case "${ASSERT_STATUS}" in - 0) - printf "${C_GREEN} %-10s %s${C_CLEAR}\n" "SUCCESS" "${DISPLAY_LINE}" ;; - 1) - printf "${C_RED} %-10s %s${C_CLEAR}\n" "FAILURE" "${DISPLAY_LINE}" ;; - 255) - printf "${C_RED} [!] INVALID TEST COMMAND: %s${C_CLEAR}\n" "${DISPLAY_LINE}" ;; - esac - - return "${ASSERT_STATUS}" -} - -run_expected_to_not() -{ - shift 1 - local EXPECTED_TO_CMD="${1}" - shift 1 - local -a EXPECTED_TO_ARGS='(${@})' - local ASSERT_STATUS - - eval "run_verb_${EXPECTED_TO_CMD}" - ASSERT_STATUS="${?}" - case "${ASSERT_STATUS}" in - 1) - ASSERT_STATUS="0" - printf "${C_GREEN} %-10s %s${C_CLEAR}\n" "SUCCESS" "${DISPLAY_LINE}" ;; - 0) - ASSERT_STATUS="1" - printf "${C_RED} %-10s %s${C_CLEAR}\n" "FAILURE" "${DISPLAY_LINE}" ;; - 255) - printf "${C_RED} [!] INVALID TEST COMMAND: %s${C_CLEAR}\n" "${DISPLAY_LINE}" ;; - esac - - return "${ASSERT_STATUS}" -} - -run_might() -{ - shift 1 - local EXPECTED_TO_CMD="${1}" - shift 1 - local -a EXPECTED_TO_ARGS='(${@})' - local ASSERT_STATUS - - eval "run_verb_${EXPECTED_TO_CMD}" - ASSERT_STATUS="${?}" - case "${ASSERT_STATUS}" in - 0) - printf "${C_GREEN} %-10s %s${C_CLEAR}\n" "SUCCESS" "${DISPLAY_LINE}" ;; - 1) - ASSERT_STATUS="2" - printf "${C_YELLOW} %-10s %s${C_CLEAR}\n" "WARNING" "${DISPLAY_LINE}" ;; - 255) - printf "${C_RED} [!] INVALID TEST COMMAND: %s${C_CLEAR}\n" "${DISPLAY_LINE}" ;; - esac - - return "${ASSERT_STATUS}" -} - -run_might_not() -{ - shift 1 - local EXPECTED_TO_CMD="${1}" - shift 1 - local -a EXPECTED_TO_ARGS='(${@})' - local ASSERT_STATUS - - eval "run_verb_${EXPECTED_TO_CMD}" - ASSERT_STATUS="${?}" - case "${ASSERT_STATUS}" in - 1) - ASSERT_STATUS="0" - printf "${C_GREEN} %-10s %s${C_CLEAR}\n" "SUCCESS" "${DISPLAY_LINE}" ;; - 0) - ASSERT_STATUS="2" - printf "${C_YELLOW} %-10s %s${C_CLEAR}\n" "WARNING" "${DISPLAY_LINE}" ;; - 255) - printf "${C_RED} [!] INVALID TEST COMMAND: ${EXPECTED_STD_NAME} %s${C_CLEAR}\n" "${DISPLAY_LINE}" ;; - esac - - return "${ASSERT_STATUS}" -} diff --git a/42sh/42ShellTester/lib/assets/42ShellTester.ascii b/42sh/42ShellTester/lib/assets/42ShellTester.ascii deleted file mode 100644 index c74786df..00000000 --- a/42sh/42ShellTester/lib/assets/42ShellTester.ascii +++ /dev/null @@ -1,21 +0,0 @@ - #### ######## - #### ## #### - #### ##### - ########### ##### # - ########### ######## - #### - ################### #### - ################### - ################### - ################### ##### - ########## ##### - ########## ############ - ########## ############ -# ########## ############ -### ######### ##### -##### ####### ##### -####### ##### ##### -######### ### ##### - #### - ### - ## diff --git a/42sh/42ShellTester/lib/assets/42ShellTester.png b/42sh/42ShellTester/lib/assets/42ShellTester.png deleted file mode 100644 index aa14b009e1e8de28050d167c9c53f4c82a77cb8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89993 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 diff --git a/42sh/42ShellTester/lib/assets/42ShellTester_250x250.png b/42sh/42ShellTester/lib/assets/42ShellTester_250x250.png deleted file mode 100644 index 32114b804af5afbafc805a4878c9acb72da94b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12527 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 Cu6&~a diff --git a/42sh/42ShellTester/lib/assets/42shTestsTeamLogo.png b/42sh/42ShellTester/lib/assets/42shTestsTeamLogo.png deleted file mode 100644 index 07609eaccd99db232221d7dea12d81af7ac999a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5071 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 Q!zRc0tl61@)7Z$r1JRq`i2wiq diff --git a/42sh/42ShellTester/lib/assets/42shTestsTeamLogo_sm.png b/42sh/42ShellTester/lib/assets/42shTestsTeamLogo_sm.png deleted file mode 100644 index cb25d709d7424e3cfd6ae8abbc8f18effedaa6d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5337 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 DnQA5H diff --git a/42sh/42ShellTester/lib/assets/README.md b/42sh/42ShellTester/lib/assets/README.md deleted file mode 100644 index 2a50a487..00000000 --- a/42sh/42ShellTester/lib/assets/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## logo credits - -Edouard Audeguy -Illustrateur / Infographiste -https://edouardaudeguy.wix.com/portfolio diff --git a/42sh/42ShellTester/lib/assets/hard.png b/42sh/42ShellTester/lib/assets/hard.png deleted file mode 100644 index 256dd7fd365d283f06151c82e9e3c28168105726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmV-A0>%A_P)dbVG7wVRUJ4ZXi@?ZDjyCFEBMPF*Zw41K$7u0h38Y zK~y-6%~ipTJ`W5W(;5-65Q2|7{(QmRovU5f zVV-ALYfta=eUEvb;hcM^Nhxu?UNHSr&}rh+!BYglOI?rR-upBF2c6 zQjPU3Va!}lOV~6`bq-sug%ChQP)cDO$5V0BG(jo#zA$41TFpxwcFdbVG7wVRUJ4ZXi@?ZDjyCFEBMPF*Zw41K$7u0xn5J zK~zYI>v!>%e?<{2j>n#2S*2S2`<6u0C(UH;&gDSAfyA*0qKBLpnU8pV4r>V z`_9g2Yy{FG5Q2jMfOOzJxJA)9^nf z;BoDPc)OXVWRRx5=vDQ+?k^LdiFTkt!GWDt4DT!1SC8e9W+y)H3bYkjl z+22D-l)B!>6(jKYn2*&Gyr++@qrARme^*R{j}hp5;OU7IC~-R782`47*|uMUwSaRB zM$hLKmvg}PH}LYpAeDcPuH$ALkF=TL;YKqIbi6Ql7uM{(&r(kI{hd45_xm#@MrKLh z1Lt#Iv^mNRSXiLj;8Wtn&*!PZ=Vz|Y3T>CWv}RuhueSjJ91aYmT&z7@%JclpOj*h_ z=YWq79>=AHU9HSoVO6I^qixwXW?DhF?C%w)wZ1j3vT$`>E@q`q)mxiyhpxL*?aPU3 zwNzbIO#{-aNGGyo|3ATRafQIjuQ$wmgO;wg81vP4)g69cc$%VR3R}zcDs}ppiIHbb zQ+ThvqOK|B!)1;&E`7`>pPqU383N}MV}8(-eOEs@_&dbVG7wVRUJ4ZXi@?ZDjyCFEBMPF*Zw41K$7u0q03X zK~zYI-BvAA!$1&yWe{;aS$VQDvX0;?BXQ&(5Q$6p1>_%49FEG$;3^|=1Xsu5;)-~; zbNRZawY-^3I=8zo`}THsIy+`K;veFAaI#8)K=JpX0zS9S7Uf;vx&%xOgh|&|X`WRZ zXIGjwQ@gk}@3~xZwn~9T=6aeNXlMLQ`BU_hC(D(hzkiU_d@v=tr9S@~Y&2AqKc zk`h=K!2ZJ++!vf7-HW*tQ(Us#7NNa>>`YjbS*kD_m>N6&sZ{&*yom8tB)|D|Kksn z+9s0=V8GQFc2S^!^viA65zGevJaohs8(YKues2u@79rb25>=XyoVAzCp|X{4iIQ(N oW||A2ux0FStuDLvQDOfCe^VA5LXh8k5&!@I07*qoM6N<$g8w!g{Qv*} diff --git a/42sh/42ShellTester/lib/main.sh b/42sh/42ShellTester/lib/main.sh deleted file mode 100644 index 6a665006..00000000 --- a/42sh/42ShellTester/lib/main.sh +++ /dev/null @@ -1,280 +0,0 @@ -#!/bin/bash - -# /* -# Main function -# -# run_main -# function that: -# - iterates over the spec folder -# - executes the tests and their callbacks -# - displays the results -# */ - -run_main() -{ - local TEST - local TEST_NAME - local TEST_FULLNAME - local RESULT - local RESPONSE_STDOUT - local RESPONSE_STDERR - local EXIT_STATUS - local RESPONSE_REFERENCE_STDOUT - local RESPONSE_REFERENCE_STDERR - local REFERENCE_EXIT_STATUS - local RUN_TEST - local RUN_ASSERT - local TEST_STATUS - local ASSERT_STATUS - local LOG_CURRENT_TEST - local LOG_CURRENT_TEST_STDOUT - local LOG_CURRENT_TEST_STDERR - local LOG_CURRENT_TEST_MISC - local LOG_SUCCESS_TESTS - local LOG_FAILED_TESTS - local AWK_PATH="$(which "awk")" - local OLD_IFS="${IFS}" - local UNAME=`uname` - local FIND="find" - - # Use find instead find -E on Linux - if [ {UNAME} == "Darwin" ]; then - FIND= "find -E" - fi - - if [ ! -f "${GLOBAL_PROG}" ] - then - [ "${GLOBAL_PROG}" == "" ] && printf "%s\n" "Missing argument: specify the binary to test" && return - [ ! -f "${GLOBAL_PROG}" -a ! -f "$(which "${GLOBAL_PROG}")" ] && printf "%s\n" "Wrong argument: no such file '"${GLOBAL_PROG}"'" && return - fi - - IFS=$'\n' - for TEST in $(${FIND} "${GLOBAL_INSTALLDIR}/spec" -type d -regex "${GLOBAL_INSTALLDIR}/spec/.*${GLOBAL_SPECS_FILTER}.*") - do - [ -f "${TEST}/pending" -a "${GLOBAL_RUN_PENDING_TESTS}" == "0" ] && (( GLOBAL_TOTAL_PENDING_TESTS = GLOBAL_TOTAL_PENDING_TESTS + 1 )) - if [ -f "${TEST}/stdin" ] && [ ! -f "${TEST}/non-posix" -o "${GLOBAL_RUN_POSIX_ONLY}" == "0" ] && [ ! -f "${TEST}/pending" -o "${GLOBAL_RUN_PENDING_TESTS}" == "1" -o "${GLOBAL_RUN_ALL_TESTS}" == "1" ] && [ ! -f "${TEST}/hard" -o "${GLOBAL_RUN_HARD_TESTS}" == "1" -o "${GLOBAL_RUN_ALL_TESTS}" == "1" ] - then - - # compile support binaries - make -C "${GLOBAL_INSTALLDIR}/support/" TARGET_DIR=${GLOBAL_TMP_DIRECTORY} 1>- 2>- - - TEST_NAME="${TEST##*/}" - TEST_FULLNAME="${TEST##*spec/}" - RUN_TEST=0 - TEST_STATUS="0" - LOG_CURRENT_TEST="${TEST_FULLNAME}" - LOG_CURRENT_TEST_STDOUT="" - LOG_CURRENT_TEST_STDERR="" - LOG_CURRENT_TEST_MISC="" - - RESPONSE_STDOUT="${GLOBAL_TMP_DIRECTORY}/${TEST_FULLNAME//\//-}.stdout" - RESPONSE_STDERR="${GLOBAL_TMP_DIRECTORY}/${TEST_FULLNAME//\//-}.stderr" - RESPONSE_REFERENCE_STDOUT="${GLOBAL_TMP_DIRECTORY}/${TEST_FULLNAME//\//-}.ref.stdout" - RESPONSE_REFERENCE_STDERR="${GLOBAL_TMP_DIRECTORY}/${TEST_FULLNAME//\//-}.ref.stderr" - - rm -f "${GLOBAL_TMP_DIRECTORY}/stdin" - local INDEX=1 - local LINE - local TOTAL=$(awk 'END {print NR+1}' "${TEST}/stdin") - while [ "$INDEX" -le "$TOTAL" ] - do - awk -v INDEX="${INDEX}" -v GLOBAL_TOKEN="${GLOBAL_TOKEN}" -v GLOBAL_INSTALLDIR="${GLOBAL_INSTALLDIR}" -v GLOBAL_TMP_DIRECTORY="${GLOBAL_TMP_DIRECTORY}" -v PATH="${PATH}" -v HOME="${HOME}" 'NR == INDEX {gsub(/\$\{GLOBAL_TOKEN\}/, GLOBAL_TOKEN); gsub(/\$\{GLOBAL_INSTALLDIR\}/, GLOBAL_INSTALLDIR); gsub(/\$\{GLOBAL_TMP_DIRECTORY\}/, GLOBAL_TMP_DIRECTORY); gsub(/\$\{PATH\}/, PATH); gsub(/\$\{HOME\}/, HOME); print; exit}' "${TEST}/stdin" >>"${GLOBAL_TMP_DIRECTORY}/stdin" - - (( INDEX += 1 )) - done - - ( - SUBSHELL_EXIT_STATUS= - - if [ -f "${TEST}/before_exec" ] - then - - local INDEX=0 - local TOTAL=$(${AWK_PATH} 'END {print NR+1}' "${TEST}/before_exec") - while [ "$INDEX" -le "$TOTAL" ] - do - eval $(${AWK_PATH} -v INDEX="${INDEX}" 'NR == INDEX {print $0; exit}' "${TEST}/before_exec") - (( INDEX += 1 )) - done - - fi - - eval "${GLOBAL_PROG}" < "${GLOBAL_TMP_DIRECTORY}/stdin" 1> "${RESPONSE_STDOUT}.raw" 2> "${RESPONSE_STDERR}.raw" - SUBSHELL_EXIT_STATUS=${?} - - if [ -f "${TEST}/after_exec" ] - then - - local INDEX=0 - local TOTAL=$(${AWK_PATH} 'END {print NR+1}' "${TEST}/after_exec") - while [ "$INDEX" -le "$TOTAL" ] - do - eval $(${AWK_PATH} -v INDEX="${INDEX}" 'NR == INDEX {print $0; exit}' "${TEST}/after_exec") - (( INDEX += 1 )) - done - - fi - - exit "${SUBSHELL_EXIT_STATUS}" - ) - EXIT_STATUS=${?} - - awk '{gsub(/\033\[[0-9;]*m/, ""); print}' "${RESPONSE_STDOUT}.raw" > "${RESPONSE_STDOUT}" - awk '{gsub(/\033\[[0-9;]*m/, ""); print}' "${RESPONSE_STDERR}.raw" > "${RESPONSE_STDERR}" - - if [ "${GLOBAL_PROG_REFERENCE}" != "" ] - then - ( - SUBSHELL_EXIT_STATUS= - - if [ -f "${TEST}/before_exec" ] - then - - local INDEX=0 - local TOTAL=$(${AWK_PATH} 'END {print NR+1}' "${TEST}/before_exec") - while [ "$INDEX" -le "$TOTAL" ] - do - eval $(${AWK_PATH} -v INDEX="${INDEX}" 'NR == INDEX {print $0; exit}' "${TEST}/before_exec") - (( INDEX += 1 )) - done - - fi - - eval "${GLOBAL_PROG_REFERENCE}" < "${GLOBAL_TMP_DIRECTORY}/stdin" 1> "${RESPONSE_REFERENCE_STDOUT}.raw" 2> "${RESPONSE_REFERENCE_STDERR}.raw" - SUBSHELL_EXIT_STATUS=${?} - - - if [ -f "${TEST}/after_exec" ] - then - - local INDEX=0 - local TOTAL=$(${AWK_PATH} 'END {print NR+1}' "${TEST}/after_exec") - while [ "$INDEX" -le "$TOTAL" ] - do - eval $(${AWK_PATH} -v INDEX="${INDEX}" 'NR == INDEX {print $0; exit}' "${TEST}/after_exec") - (( INDEX += 1 )) - done - - fi - - exit "${SUBSHELL_EXIT_STATUS}" - ) - REFERENCE_EXIT_STATUS=${?} - - awk '{gsub(/\033\[[0-9;]*m/, ""); print}' "${RESPONSE_REFERENCE_STDOUT}.raw" > "${RESPONSE_REFERENCE_STDOUT}" - awk '{gsub(/\033\[[0-9;]*m/, ""); print}' "${RESPONSE_REFERENCE_STDERR}.raw" > "${RESPONSE_REFERENCE_STDERR}" - fi - - if [ -f "${TEST}/stdout" ] - then - RUN_ASSERT="0" - if [ "${GLOBAL_PROG_REFERENCE}" != "" ] - then - run_assert "REFERENCE_" "STDOUT" 1>- 2>- - RUN_ASSERT="${?}" - fi - if [ "${RUN_ASSERT}" == "0" ] - then - LOG_CURRENT_TEST_STDOUT="$(run_assert "" "STDOUT")" - ASSERT_STATUS="${?}" - if [ "${ASSERT_STATUS}" != "0" ] - then - [ "${TEST_STATUS}" == "0" -o "${TEST_STATUS}" == "2" ] && TEST_STATUS="${ASSERT_STATUS}" - fi - RUN_TEST=1 - fi - fi - - if [ -f "${TEST}/stderr" ] - then - RUN_ASSERT="0" - if [ "${GLOBAL_PROG_REFERENCE}" != "" ] - then - run_assert "REFERENCE_" "STDERR" 1>- 2>- - RUN_ASSERT="${?}" - fi - if [ "${RUN_ASSERT}" == "0" ] - then - LOG_CURRENT_TEST_STDERR="$(run_assert "" "STDERR")" - ASSERT_STATUS="${?}" - if [ "${ASSERT_STATUS}" != "0" ] - then - [ "${TEST_STATUS}" == "0" -o "${TEST_STATUS}" == "2" ] && TEST_STATUS="${ASSERT_STATUS}" - fi - RUN_TEST=1 - fi - fi - - if [ -f "${TEST}/misc" ] - then - RUN_ASSERT="0" - if [ "${GLOBAL_PROG_REFERENCE}" != "" ] - then - run_assert "REFERENCE_" "MISC" 1>- 2>- - RUN_ASSERT="${?}" - fi - if [ "${RUN_ASSERT}" == "0" ] - then - LOG_CURRENT_TEST_MISC="$(run_assert "" "MISC")" - ASSERT_STATUS="${?}" - if [ "${ASSERT_STATUS}" != "0" ] - then - [ "${TEST_STATUS}" == "0" -o "${TEST_STATUS}" == "2" ] && TEST_STATUS="${ASSERT_STATUS}" - fi - RUN_TEST=1 - fi - fi - - - if [ "${RUN_TEST}" == "1" ] - then - (( GLOBAL_TOTAL_TESTS = GLOBAL_TOTAL_TESTS + 1 )) - - if [ "${TEST_STATUS}" != "0" -o "${GLOBAL_SHOW_SUCCESS}" == "1" ] - then - GLOBAL_LOG="$(printf "%s\n\n%s\n\n${C_BOLD}%s${C_CLEAR}" "${GLOBAL_LOG}" "----------------------------------------------------------------" "${LOG_CURRENT_TEST}")" - case "${TEST_STATUS}" in - 0) GLOBAL_LOG="$(printf "%s ${C_GREEN}%s${C_CLEAR}" "${GLOBAL_LOG}" "(SUCCESS)")" ;; - 1) GLOBAL_LOG="$(printf "%s ${C_RED}%s${C_CLEAR}" "${GLOBAL_LOG}" "(FAILED)")" ;; - 2) GLOBAL_LOG="$(printf "%s ${C_YELLOW}%s${C_CLEAR}" "${GLOBAL_LOG}" "(WARNING)")" ;; - 255) GLOBAL_LOG="$(printf "%s ${C_RED}%s${C_CLEAR}" "${GLOBAL_LOG}" "(RUNTIME ERROR)")" ;; - esac - [ -f "${TEST}/description" ] && GLOBAL_LOG="$(printf "%s\n\n Description:\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "$(awk '{printf " %s\n", $0}' "${TEST}/description")")" - - [ -f "${TEST}/before_exec" ] && GLOBAL_LOG="$(printf "%s\n\n Before test:\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "$(awk -v GLOBAL_TOKEN="${GLOBAL_TOKEN}" -v GLOBAL_INSTALLDIR="${GLOBAL_INSTALLDIR}" -v GLOBAL_TMP_DIRECTORY="${GLOBAL_TMP_DIRECTORY}" -v PATH="${PATH}" -v HOME="${HOME}" '{gsub(/\$\{GLOBAL_TOKEN\}/, GLOBAL_TOKEN); gsub(/\$\{GLOBAL_INSTALLDIR\}/, GLOBAL_INSTALLDIR); gsub(/\$\{GLOBAL_TMP_DIRECTORY\}/, GLOBAL_TMP_DIRECTORY); gsub(/\$\{PATH\}/, PATH); gsub(/\$\{HOME\}/, HOME); printf " %02s: %s\n", NR, $0}' "${TEST}/before_exec")")" - - GLOBAL_LOG="$(printf " %s\n\n STDIN:\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "$(awk '{printf " %02s: %s\n", NR, $0}' "${GLOBAL_TMP_DIRECTORY}/stdin")")" - - if [ "${LOG_CURRENT_TEST_STDOUT}" != "" ] - then - GLOBAL_LOG="$(printf "%s\n\n STDOUT:\n%s\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "${LOG_CURRENT_TEST_STDOUT}" "$(awk '{printf " %02s: %s\n", NR, $0} END {if (NR==0) { print " (no output)" }}' "${RESPONSE_STDOUT}")")" - else - GLOBAL_LOG="$(printf "%s\n\n STDOUT:\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "$(awk '{printf " %02s: %s\n", NR, $0} END {if (NR==0) { print " (no output)" }}' "${RESPONSE_STDOUT}")")" - fi - - if [ "${LOG_CURRENT_TEST_STDERR}" != "" ] - then - GLOBAL_LOG="$(printf "%s\n\n STDERR:\n%s\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "${LOG_CURRENT_TEST_STDERR}" "$(awk '{printf " %02s: %s\n", NR, $0} END {if (NR==0) { print " (no output)" }}' "${RESPONSE_STDERR}")")" - else - GLOBAL_LOG="$(printf "%s\n\n STDERR:\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "$(awk '{printf " %02s: %s\n", NR, $0} END {if (NR==0) { print " (no output)" }}' "${RESPONSE_STDERR}")")" - fi - - [ "${LOG_CURRENT_TEST_MISC}" != "" ] && GLOBAL_LOG="$(printf "%s\n\n MISC:\n%s" "${GLOBAL_LOG}" "${LOG_CURRENT_TEST_MISC}")" - - [ -f "${TEST}/after_exec" ] && GLOBAL_LOG="$(printf "%s\n\n After test:\n${C_GREY}%s${C_CLEAR}" "${GLOBAL_LOG}" "$(awk -v GLOBAL_TOKEN="${GLOBAL_TOKEN}" -v GLOBAL_INSTALLDIR="${GLOBAL_INSTALLDIR}" -v GLOBAL_TMP_DIRECTORY="${GLOBAL_TMP_DIRECTORY}" -v PATH="${PATH}" -v HOME="${HOME}" '{gsub(/\$\{GLOBAL_TOKEN\}/, GLOBAL_TOKEN); gsub(/\$\{GLOBAL_INSTALLDIR\}/, GLOBAL_INSTALLDIR); gsub(/\$\{GLOBAL_TMP_DIRECTORY\}/, GLOBAL_TMP_DIRECTORY); gsub(/\$\{PATH\}/, PATH); gsub(/\$\{HOME\}/, HOME); printf " %02s: %s\n", NR, $0}' "${TEST}/after_exec")")" - - [ "${TEST_STATUS}" == "1" ] && (( GLOBAL_TOTAL_FAILED_TESTS = GLOBAL_TOTAL_FAILED_TESTS + 1 )) - fi - - case "${TEST_STATUS}" in - 0) printf "${C_GREEN}.${C_CLEAR}" ;; - 1) printf "${C_RED}x${C_CLEAR}" ;; - 2) printf "${C_YELLOW}~${C_CLEAR}" ;; - 255) printf "${C_RED}!${C_CLEAR}" ;; - esac - fi - - fi - done - IFS="${OLD_IFS}" -} diff --git a/42sh/42ShellTester/lib/verbs/be_empty.sh b/42sh/42ShellTester/lib/verbs/be_empty.sh deleted file mode 100644 index 81d091ef..00000000 --- a/42sh/42ShellTester/lib/verbs/be_empty.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# /* -# Test emptiness of output -# RESPONSE -> actual output (stdout or stderr) -# */ - -run_verb_be_empty() -{ - if [ "$(awk '{print}' "${RESPONSE}")" == "" ] - then - return 0 - else - return 1 - fi -} diff --git a/42sh/42ShellTester/lib/verbs/create_file.sh b/42sh/42ShellTester/lib/verbs/create_file.sh deleted file mode 100644 index 127e3eaa..00000000 --- a/42sh/42ShellTester/lib/verbs/create_file.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# /* -# Test file creation -# EXPECTED_TO_ARGS[0]* -> expected file path -# EXPECTED_TO_ARGS[1] -> file test (with_regexp, without_regexp, with_nb_of_lines) -# EXPECTED_TO_ARGS[2] -> argument of file test -# */ - -run_verb_create_file() -{ - if [ -f "${EXPECTED_TO_ARGS[0]}" ] - then - if [ "${EXPECTED_TO_ARGS[1]}" == "" ] - then - return 0 - else - case "${EXPECTED_TO_ARGS[1]}" in - matching_regex) - if [ "$(awk -v regexp="${EXPECTED_TO_ARGS[2]}" '$0 ~ regexp {print}' "${EXPECTED_TO_ARGS[0]}")" == "" ] - then - return 1 - else - return 0 - fi ;; - not_matching_regex) - if [ "$(awk -v regexp="${EXPECTED_TO_ARGS[2]}" '$0 ~ regexp {print}' "${EXPECTED_TO_ARGS[0]}")" == "" ] - then - return 0 - else - return 1 - fi ;; - with_nb_of_lines) - if [ "$(awk 'END {print NR}' "${EXPECTED_TO_ARGS[0]}")" == "${EXPECTED_TO_ARGS[2]}" ] - then - return 0 - else - return 1 - fi ;; - *) - return 255 ;; - esac - fi - else - return 1 - fi -} diff --git a/42sh/42ShellTester/lib/verbs/exit_with_status.sh b/42sh/42ShellTester/lib/verbs/exit_with_status.sh deleted file mode 100644 index 062e17f1..00000000 --- a/42sh/42ShellTester/lib/verbs/exit_with_status.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# /* -# Test exit status -# EXPECTED_TO_ARGS[0]* -> expected exit status (integer) -# RESPONSE_EXIT_STATUS -> actual exit status -# */ - -run_verb_exit_with_status() -{ - if [ "${RESPONSE_EXIT_STATUS}" == "${EXPECTED_TO_ARGS[0]}" ] - then - return 0 - else - return 1 - fi -} diff --git a/42sh/42ShellTester/lib/verbs/have_nb_of_lines.sh b/42sh/42ShellTester/lib/verbs/have_nb_of_lines.sh deleted file mode 100644 index b7571838..00000000 --- a/42sh/42ShellTester/lib/verbs/have_nb_of_lines.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# /* -# Test number of output lines -# EXPECTED_TO_ARGS[0]* -> expected number of lines (integer) -# RESPONSE -> actual output (stdout or stderr) -# */ - -run_verb_have_nb_of_lines() -{ - if [ "$(awk 'END {printf NR}' "${RESPONSE}")" == "${EXPECTED_TO_ARGS[0]}" ] - then - return 0 - else - return 1 - fi -} diff --git a/42sh/42ShellTester/lib/verbs/match_each_regex_of_file.sh b/42sh/42ShellTester/lib/verbs/match_each_regex_of_file.sh deleted file mode 100644 index 17569d4a..00000000 --- a/42sh/42ShellTester/lib/verbs/match_each_regex_of_file.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -# /* -# Multiple test regular expression -# EXPECTED_TO_ARGS[0]* -> file path that stores expected regular expression -# RESPONSE -> actual output (stdout or stderr) -# */ - -run_verb_match_each_regex_of_file() -{ - local INDEX=0 ERROR=0 TOTAL LINE - TOTAL=$(awk 'END {print NR+1}' "${EXPECTED_TO_ARGS[0]}") - while [ "${INDEX}" -le "${TOTAL}" ] - do - LINE="$(awk -v INDEX="${INDEX}" 'NR == INDEX {print; exit}' "${EXPECTED_TO_ARGS[0]}")" - if [ "$(awk -v regexp="${LINE}" '$0 ~ regexp {print}' "${RESPONSE}")" == "" ] - then - ERROR=1 - fi - (( INDEX += 1 )) - done - if [ ${ERROR} -eq 1 ] - then - return 1 - else - return 0 - fi -} diff --git a/42sh/42ShellTester/lib/verbs/match_regex.sh b/42sh/42ShellTester/lib/verbs/match_regex.sh deleted file mode 100644 index 2c9e8b92..00000000 --- a/42sh/42ShellTester/lib/verbs/match_regex.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# /* -# Test regular expression -# EXPECTED_TO_ARGS[0]* -> expected regular expression match -# EXPECTED_TO_ARGS[1]* -> value 'once' or if next argument is value 'times', the number of times -# RESPONSE -> actual output (stdout or stderr) -# */ - -run_verb_match_regex() -{ - local NB_OF_TIMES="0" RESULT - if [ "${EXPECTED_TO_ARGS[1]}" == "once" ] - then - NB_OF_TIMES="1" - fi - if [ "${EXPECTED_TO_ARGS[2]}" == "times" ] - then - NB_OF_TIMES="${EXPECTED_TO_ARGS[1]}" - fi - RESULT="$(awk -v regexp="${EXPECTED_TO_ARGS[0]}" 'BEGIN {TOTAL=0} $0 ~ regexp {TOTAL++} END {printf TOTAL}' "${RESPONSE}")" - if [ "${NB_OF_TIMES}" == "0" ] - then - if [ "${RESULT}" != "0" ] - then - return 0 - else - return 1 - fi - else - if [ "${RESULT}" == "${NB_OF_TIMES}" ] - then - return 0 - else - return 1 - fi - fi -} diff --git a/42sh/42ShellTester/log b/42sh/42ShellTester/log deleted file mode 100644 index 89d7badb..00000000 --- a/42sh/42ShellTester/log +++ /dev/null @@ -1,346 +0,0 @@ -...x...~......xx....~...~.....~.....~.....~........... - ----------------------------------------------------------------- - -minishell/binary/004-binary-test-empty-path (FAILED) - - Description: - The purpose of this test is to check that the Shell finds binaries that are located in the current directory when the environment variable PATH is empty. - - Before test: - 01: export PATH="" - - STDIN: - 01: write_on_stdout "TOKEN201703252056" - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703252056` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ../../42sh: command not found: write_on_stdout - - MISC: - FAILURE expected_to exit_with_status `0` - ----------------------------------------------------------------- - -minishell/binary/008-binary-too-many-symbolic-links-encountered (WARNING) - - Description: - The purpose of this test is to check that trying to execute a path that encounters an infinite loop of symbolic link results in an error on standard error and a failure exit status. - - Before test: - 01: rm -rf ./symbolic_link1 ./symbolic_link2 ./symbolic_link3 - 02: ln -s ./symbolic_link1 ./symbolic_link2 - 03: ln -s ./symbolic_link2 ./symbolic_link3 - 04: ln -s ./symbolic_link3 ./symbolic_link1 - - STDIN: - 01: ./symbolic_link1 - - STDOUT: - SUCCESS might be_empty - (no output) - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Tt]oo many.*symbolic links` - 01: ../../42sh: ./symbolic_link1: no such file or directory - - MISC: - SUCCESS expected_to_not exit_with_status 0 - ----------------------------------------------------------------- - -minishell/builtins/cd/007-symbolic-link (FAILED) - - Description: - The purpose of this test is to check that using a symbolic link as first argument with the builtin `cd` results in moving the linked directory. - - Before test: - 01: rm -f "./symbolic_link" - 02: mkdir -p "./sub_directory" - 03: ln -s "./sub_directory" "./symbolic_link" - - STDIN: - 01: cd symbolic_link - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - 03: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_env - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD$` - FAILURE expected_to match_regex `^PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/symbolic_link$` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD - 02: ------------------------------ - 03: TERM_PROGRAM=iTerm.app - 04: TERM=screen-256color - 05: SHELL=/bin/zsh - 06: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 07: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 08: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.h7gvN9K1go/Render - 09: TERM_PROGRAM_VERSION=3.0.10 - 10: TERM_SESSION_ID=w0t0p1:D7FAE8F0-DDCC-428E-AC84-622B27EDC123 - 11: ZSH=/Users/ariard/.oh-my-zsh - 12: USER=ariard - 13: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.1T0c86pYlP/Listeners - 14: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 15: PAGER=less - 16: TMUX=/private/tmp/tmux-18965/default,23758,2 - 17: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 18: LSCOLORS=Gxfxcxdxbxegedabagacad - 19: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 20: MAIL=ariard@student.42.fr - 21: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory - 22: LANG=en_US.UTF-8 - 23: ITERM_PROFILE=Default - 24: XPC_FLAGS=0x0 - 25: TMUX_PANE=%21 - 26: XPC_SERVICE_NAME=0 - 27: SHLVL=4 - 28: HOME=/Users/ariard - 29: COLORFGBG=7;0 - 30: ITERM_SESSION_ID=w0t0p1:D7FAE8F0-DDCC-428E-AC84-622B27EDC123 - 31: LOGNAME=ariard - 32: LESS=-R - 33: LC_CTYPE=en_US.UTF-8 - 34: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 35: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 36: _=../../42sh - 37: ?=0 - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -minishell/builtins/cd/008-symbolic-link-2 (FAILED) - - Description: - The purpose of this test is to check that using a symbolic link as first argument with the builtin `cd` results in moving to the linked directory. In this test, the directory is linked with to chained symbolic links. - - Before test: - 01: rm -f "./symbolic_link1" "./symbolic_link2" - 02: mkdir -p "./sub_directory" - 03: ln -s "./sub_directory" "./symbolic_link1" - 04: ln -s "./symbolic_link1" "./symbolic_link2" - - STDIN: - 01: cd symbolic_link2 - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - 03: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_env - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD$` - FAILURE expected_to match_regex `^PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/symbolic_link2$` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD - 02: ------------------------------ - 03: TERM_PROGRAM=iTerm.app - 04: TERM=screen-256color - 05: SHELL=/bin/zsh - 06: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 07: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 08: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.h7gvN9K1go/Render - 09: TERM_PROGRAM_VERSION=3.0.10 - 10: TERM_SESSION_ID=w0t0p1:D7FAE8F0-DDCC-428E-AC84-622B27EDC123 - 11: ZSH=/Users/ariard/.oh-my-zsh - 12: USER=ariard - 13: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.1T0c86pYlP/Listeners - 14: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 15: PAGER=less - 16: TMUX=/private/tmp/tmux-18965/default,23758,2 - 17: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 18: LSCOLORS=Gxfxcxdxbxegedabagacad - 19: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 20: MAIL=ariard@student.42.fr - 21: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory - 22: LANG=en_US.UTF-8 - 23: ITERM_PROFILE=Default - 24: XPC_FLAGS=0x0 - 25: TMUX_PANE=%21 - 26: XPC_SERVICE_NAME=0 - 27: SHLVL=4 - 28: HOME=/Users/ariard - 29: COLORFGBG=7;0 - 30: ITERM_SESSION_ID=w0t0p1:D7FAE8F0-DDCC-428E-AC84-622B27EDC123 - 31: LOGNAME=ariard - 32: LESS=-R - 33: LC_CTYPE=en_US.UTF-8 - 34: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 35: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 36: _=../../42sh - 37: ?=0 - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -minishell/builtins/cd/errors/001-not-a-directory (WARNING) - - Description: - The purpose of this test is to check that using a file name as first argument with the builtin `cd` results in error and not changing current directory. - - Before test: - 01: touch "./not_a_directory" - - STDIN: - 01: cd not_a_directory - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Nn]ot a directory` - 01: ../../42sh: cd : ./not_a_directory: Permission denied - ----------------------------------------------------------------- - -minishell/builtins/cd/errors/005-too-many-symbolic-links-encountered (WARNING) - - Description: - The purpose of this test is to check that using a symbolic link resulting in ELOOP error as first argument with the builtin `cd` results in error and not changing current directory. - - Before test: - 01: rm -f "./symbolic_link1" "./symbolic_link2" "./symbolic_link3" - 02: ln -s "./symbolic_link1" "./symbolic_link2" - 03: ln -s "./symbolic_link2" "./symbolic_link3" - 04: ln -s "./symbolic_link3" "./symbolic_link1" - - STDIN: - 01: cd symbolic_link1 - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Tt]oo many.*symbolic links` - 01: ../../42sh: cd : ./symbolic_link1: No such file or directory - ----------------------------------------------------------------- - -minishell/builtins/cd/options/001-not-following-links (WARNING) - - Description: - The purpose of this test is to check that using symbolic links twice with the builtin `cd` and the option `-P` results in a correct environment variable PWD. The option `-P` makes the Shell to resolve symbolic links. - - Before test: - 01: rm -fr "./sub_directory_link" "./sub_directory" - 02: mkdir -p "./sub_directory/sub_sub_directory" - 03: ln -s "./sub_directory" "./sub_directory_link" - 04: ln -s "./sub_sub_directory" "./sub_directory/sub_sub_directory_link" - - STDIN: - 01: cd -P sub_directory_link - 02: cd -P sub_sub_directory_link - 03: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_env - - STDOUT: - SUCCESS expected_to match_regex `PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory/sub_sub_directory` - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TERM=screen-256color - 04: SHELL=/bin/zsh - 05: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 06: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 07: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.h7gvN9K1go/Render - 08: TERM_PROGRAM_VERSION=3.0.10 - 09: TERM_SESSION_ID=w0t0p1:D7FAE8F0-DDCC-428E-AC84-622B27EDC123 - 10: ZSH=/Users/ariard/.oh-my-zsh - 11: USER=ariard - 12: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.1T0c86pYlP/Listeners - 13: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 14: PAGER=less - 15: TMUX=/private/tmp/tmux-18965/default,23758,2 - 16: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 17: LSCOLORS=Gxfxcxdxbxegedabagacad - 18: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 19: MAIL=ariard@student.42.fr - 20: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory/sub_sub_directory - 21: LANG=en_US.UTF-8 - 22: ITERM_PROFILE=Default - 23: XPC_FLAGS=0x0 - 24: TMUX_PANE=%21 - 25: XPC_SERVICE_NAME=0 - 26: SHLVL=4 - 27: HOME=/Users/ariard - 28: COLORFGBG=7;0 - 29: ITERM_SESSION_ID=w0t0p1:D7FAE8F0-DDCC-428E-AC84-622B27EDC123 - 30: LOGNAME=ariard - 31: LESS=-R - 32: LC_CTYPE=en_US.UTF-8 - 33: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 34: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 35: _=../../42sh - 36: ?=73 - 37: ------------------------------ - 38: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - WARNING might be_empty - 01: ../../42sh: cd : ./sub_directory_link: Symlink not resolved - 02: ../../42sh: cd : ./sub_sub_directory_link: Symlink not resolved - ----------------------------------------------------------------- - -minishell/builtins/env/errors/001-command-not-found (WARNING) - - Description: - The purpose of this test is to check that using the builtin `env` with an invalid binary as argument results in an error and failure exit status. - - Before test: - 01: rm -f "./invalid_binary" - - STDIN: - 01: env ./invalid_binary - - STDOUT: - (no output) - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Cc]ommand not found` - 01: ../../42sh: env: ./invalid_binary: No such file or directory - - MISC: - SUCCESS expected_to_not exit_with_status `0` - ----------------------------------------------------------------- - -minishell/builtins/exit/errors/001-too-many-args (WARNING) - - Description: - The purpose of this test is to check that using a wrong number of arguments with the builtin `exit` does not result in the Shell termination but an error on standard error. - - STDIN: - 01: exit 21 42 - 02: ./write_on_stdout TOKEN201703252056 - - STDOUT: - SUCCESS expected_to match_regex `TOKEN201703252056` - 01: TOKEN201703252056 - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `([Tt]oo many arguments|[Aa]rgument list too long)` - 01: ../../42sh: exit: too many argument required - - MISC: - SUCCESS expected_to exit_with_status `0` - -Total tests: 54 -Total failed tests: 3 -Total pending tests: 0 diff --git a/42sh/42ShellTester/minishell_error b/42sh/42ShellTester/minishell_error deleted file mode 100644 index 5ace4e58..00000000 --- a/42sh/42ShellTester/minishell_error +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file diff --git a/42sh/42ShellTester/spec/README.md b/42sh/42ShellTester/spec/README.md deleted file mode 100644 index dba95403..00000000 --- a/42sh/42ShellTester/spec/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# spec - -* [21sh](./21sh) -* [42sh](./42sh) -* [bonuses](./bonuses) -* [minishell](./minishell) diff --git a/42sh/42ShellTester/spec/minishell_error b/42sh/42ShellTester/spec/minishell_error deleted file mode 100644 index e69de29b..00000000 diff --git a/42sh/42ShellTester/support/Makefile b/42sh/42ShellTester/support/Makefile deleted file mode 100644 index f8aeae9c..00000000 --- a/42sh/42ShellTester/support/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -TARGET_DIR=../../tmp - -all: - make TARGET_DIR=$(TARGET_DIR) -C ./display-env - make TARGET_DIR=$(TARGET_DIR) -C ./display-program-name - make TARGET_DIR=$(TARGET_DIR) -C ./display-pwd - make TARGET_DIR=$(TARGET_DIR) -C ./exit-with-status - make TARGET_DIR=$(TARGET_DIR) -C ./read-on-stdin - make TARGET_DIR=$(TARGET_DIR) -C ./sleep-and-exit-with-status - make TARGET_DIR=$(TARGET_DIR) -C ./sleep-and-write-on-stderr - make TARGET_DIR=$(TARGET_DIR) -C ./write-all-arguments-on-stdout - make TARGET_DIR=$(TARGET_DIR) -C ./write-on-stderr - make TARGET_DIR=$(TARGET_DIR) -C ./write-on-stdout - make TARGET_DIR=$(TARGET_DIR) -C ./write-on-stdout-and-stderr - -re: fclean all - -fclean: - make TARGET_DIR=$(TARGET_DIR) fclean -C ./display-env - make TARGET_DIR=$(TARGET_DIR) fclean -C ./display-program-name - make TARGET_DIR=$(TARGET_DIR) fclean -C ./display-pwd - make TARGET_DIR=$(TARGET_DIR) fclean -C ./exit-with-status - make TARGET_DIR=$(TARGET_DIR) fclean -C ./read-on-stdin - make TARGET_DIR=$(TARGET_DIR) fclean -C ./sleep-and-exit-with-status - make TARGET_DIR=$(TARGET_DIR) fclean -C ./sleep-and-write-on-stderr - make TARGET_DIR=$(TARGET_DIR) fclean -C ./write-all-arguments-on-stdout - make TARGET_DIR=$(TARGET_DIR) fclean -C ./write-on-stderr - make TARGET_DIR=$(TARGET_DIR) fclean -C ./write-on-stdout - make TARGET_DIR=$(TARGET_DIR) fclean -C ./write-on-stdout-and-stderr diff --git a/42sh/42ShellTester/support/display-env/Makefile b/42sh/42ShellTester/support/display-env/Makefile deleted file mode 100644 index d2691951..00000000 --- a/42sh/42ShellTester/support/display-env/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=display_env -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/display-env/README.md b/42sh/42ShellTester/support/display-env/README.md deleted file mode 100644 index 3b363278..00000000 --- a/42sh/42ShellTester/support/display-env/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# ./display_env - -A binary that iterates on `**envp` and write each element on standard output. - -```c -#include -#include -#include - -int main(int argc, char **argv, char **envp) -{ - int i; - - i = 0; - (void)argc; - (void)argv; - write(1, "------------------------------\n", 31); - while (envp[i]) - { - write(1, envp[i], strlen(envp[i])); - write(1, "\n", 1); - i++; - } - write(1, "------------------------------\n", 31); - printf("TOTAL ENVIRONMENT VARIABLES: %d\n", i); - return (0); -} -``` diff --git a/42sh/42ShellTester/support/display-env/description b/42sh/42ShellTester/support/display-env/description deleted file mode 100644 index 8ea7d9c4..00000000 --- a/42sh/42ShellTester/support/display-env/description +++ /dev/null @@ -1 +0,0 @@ -A binary that iterates on `**envp` and write each element on standard output. diff --git a/42sh/42ShellTester/support/display-env/main.c b/42sh/42ShellTester/support/display-env/main.c deleted file mode 100644 index 95bfa3a1..00000000 --- a/42sh/42ShellTester/support/display-env/main.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include - -int main(int argc, char **argv, char **envp) -{ - int i; - - i = 0; - (void)argc; - (void)argv; - write(1, "------------------------------\n", 31); - while (envp[i]) - { - write(1, envp[i], strlen(envp[i])); - write(1, "\n", 1); - i++; - } - write(1, "------------------------------\n", 31); - printf("TOTAL ENVIRONMENT VARIABLES: %d\n", i); - return (0); -} diff --git a/42sh/42ShellTester/support/display-program-name/Makefile b/42sh/42ShellTester/support/display-program-name/Makefile deleted file mode 100644 index 6cf460d1..00000000 --- a/42sh/42ShellTester/support/display-program-name/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=display_program_name -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/display-program-name/README.md b/42sh/42ShellTester/support/display-program-name/README.md deleted file mode 100644 index 54fba524..00000000 --- a/42sh/42ShellTester/support/display-program-name/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# ./display_program_name - -A binary that writes its name on standard ouput. - -```c -#include -#include - -int main(int ac, char **av) -{ - (void)ac; - write(1, av[0], strlen(av[0])); - write(1, "\n", 1); - return (0); -} -``` diff --git a/42sh/42ShellTester/support/display-program-name/description b/42sh/42ShellTester/support/display-program-name/description deleted file mode 100644 index 67f56943..00000000 --- a/42sh/42ShellTester/support/display-program-name/description +++ /dev/null @@ -1 +0,0 @@ -A binary that writes its name on standard ouput. diff --git a/42sh/42ShellTester/support/display-program-name/main.c b/42sh/42ShellTester/support/display-program-name/main.c deleted file mode 100644 index 3c3d8c9b..00000000 --- a/42sh/42ShellTester/support/display-program-name/main.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -int main(int ac, char **av) -{ - (void)ac; - write(1, av[0], strlen(av[0])); - write(1, "\n", 1); - return (0); -} diff --git a/42sh/42ShellTester/support/display-pwd/Makefile b/42sh/42ShellTester/support/display-pwd/Makefile deleted file mode 100644 index 3f67de1c..00000000 --- a/42sh/42ShellTester/support/display-pwd/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=display_pwd -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/display-pwd/README.md b/42sh/42ShellTester/support/display-pwd/README.md deleted file mode 100644 index 6f1a2b1f..00000000 --- a/42sh/42ShellTester/support/display-pwd/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# ./display_pwd - -A binary that writes on standard output the absolute path of the current directory returned by `getcwd(3)`, encountered with the strings `PWD:` and `:PWD`. - -```c -#include -#include - -int main(void) -{ - char *pwd; - - pwd = getcwd(NULL, 0); - write(1, "PWD:", 4); - write(1, pwd, strlen(pwd)); - write(1, ":PWD\n", 5); - return (0); -} -``` diff --git a/42sh/42ShellTester/support/display-pwd/description b/42sh/42ShellTester/support/display-pwd/description deleted file mode 100644 index 3ed81da3..00000000 --- a/42sh/42ShellTester/support/display-pwd/description +++ /dev/null @@ -1 +0,0 @@ -A binary that writes on standard output the absolute path of the current directory returned by `getcwd(3)`, encountered with the strings `PWD:` and `:PWD`. diff --git a/42sh/42ShellTester/support/display-pwd/main.c b/42sh/42ShellTester/support/display-pwd/main.c deleted file mode 100644 index 4577602e..00000000 --- a/42sh/42ShellTester/support/display-pwd/main.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -int main(void) -{ - char *pwd; - - pwd = getcwd(NULL, 0); - write(1, "PWD:", 4); - write(1, pwd, strlen(pwd)); - write(1, ":PWD\n", 5); - return (0); -} diff --git a/42sh/42ShellTester/support/exit-with-status/Makefile b/42sh/42ShellTester/support/exit-with-status/Makefile deleted file mode 100644 index ff89498a..00000000 --- a/42sh/42ShellTester/support/exit-with-status/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=exit_with_status -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/exit-with-status/README.md b/42sh/42ShellTester/support/exit-with-status/README.md deleted file mode 100644 index 03ff819a..00000000 --- a/42sh/42ShellTester/support/exit-with-status/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# ./exit_with_status - -A binary that immediately exits with the status given as first argument. - -```c -#include - -int main(int argc, char **argv) -{ - (void)argc; - if (argc == 2) - return (atoi(argv[1])); - return (0); -} -``` diff --git a/42sh/42ShellTester/support/exit-with-status/description b/42sh/42ShellTester/support/exit-with-status/description deleted file mode 100644 index cc796af3..00000000 --- a/42sh/42ShellTester/support/exit-with-status/description +++ /dev/null @@ -1 +0,0 @@ -A binary that immediately exits with the status given as first argument. diff --git a/42sh/42ShellTester/support/exit-with-status/main.c b/42sh/42ShellTester/support/exit-with-status/main.c deleted file mode 100644 index b79772e5..00000000 --- a/42sh/42ShellTester/support/exit-with-status/main.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -int main(int argc, char **argv) -{ - (void)argc; - if (argc == 2) - return (atoi(argv[1])); - return (0); -} diff --git a/42sh/42ShellTester/support/read-on-stdin/Makefile b/42sh/42ShellTester/support/read-on-stdin/Makefile deleted file mode 100644 index 4cf56248..00000000 --- a/42sh/42ShellTester/support/read-on-stdin/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=read_on_stdin -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/read-on-stdin/README.md b/42sh/42ShellTester/support/read-on-stdin/README.md deleted file mode 100644 index 69399bf0..00000000 --- a/42sh/42ShellTester/support/read-on-stdin/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# ./read_on_stdin - -A binary that reads on standard entry and write each line on standard output suffixed with the character `@` (e.g. same behavior as `cat -e` and the *newline* character). When `read(2)` returns `-1`, then the string `STDIN READ ERROR` is written on standard error. - -```c -#include -#include - -int main(void) -{ - char buf[1]; - int ret; - - while ((ret = read(0, buf, 1)) > 0) - { - if (buf[0] == '\n') - write(1, "@", 1); - write(1, buf, ret); - } - if (ret < 0) - { - write(2, "STDIN READ ERROR\n", 17); - return (1); - } - return (0); -} -``` diff --git a/42sh/42ShellTester/support/read-on-stdin/description b/42sh/42ShellTester/support/read-on-stdin/description deleted file mode 100644 index e5f02ab5..00000000 --- a/42sh/42ShellTester/support/read-on-stdin/description +++ /dev/null @@ -1 +0,0 @@ -A binary that reads on standard entry and write each line on standard output suffixed with the character `@` (e.g. same behavior as `cat -e` and the *newline* character). When `read(2)` returns `-1`, then the string `STDIN READ ERROR` is written on standard error. diff --git a/42sh/42ShellTester/support/read-on-stdin/main.c b/42sh/42ShellTester/support/read-on-stdin/main.c deleted file mode 100644 index 1bbe6af9..00000000 --- a/42sh/42ShellTester/support/read-on-stdin/main.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -int main(void) -{ - char buf[1]; - int ret; - - while ((ret = read(0, buf, 1)) > 0) - { - if (buf[0] == '\n') - write(1, "@", 1); - write(1, buf, ret); - } - if (ret < 0) - { - write(2, "STDIN READ ERROR\n", 17); - return (1); - } - return (0); -} diff --git a/42sh/42ShellTester/support/sleep-and-exit-with-status/Makefile b/42sh/42ShellTester/support/sleep-and-exit-with-status/Makefile deleted file mode 100644 index c73f1aed..00000000 --- a/42sh/42ShellTester/support/sleep-and-exit-with-status/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=sleep_and_exit_with_status -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/sleep-and-exit-with-status/README.md b/42sh/42ShellTester/support/sleep-and-exit-with-status/README.md deleted file mode 100644 index 1fd5254f..00000000 --- a/42sh/42ShellTester/support/sleep-and-exit-with-status/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# ./sleep_and_exit_with_status - -A binary that sleeps for a duration in seconds given as first argument and then exits with status given as second argument. - -```c -#include -#include -#include - -int main(int argc, char **argv) -{ - int seconds; - - seconds = 1; - if (argc > 1) - seconds = atoi(argv[1]); - sleep(seconds); - if (argc > 2) - return (atoi(argv[2])); - return (0); -} -``` diff --git a/42sh/42ShellTester/support/sleep-and-exit-with-status/description b/42sh/42ShellTester/support/sleep-and-exit-with-status/description deleted file mode 100644 index 0717f2fd..00000000 --- a/42sh/42ShellTester/support/sleep-and-exit-with-status/description +++ /dev/null @@ -1 +0,0 @@ -A binary that sleeps for a duration in seconds given as first argument and then exits with status given as second argument. diff --git a/42sh/42ShellTester/support/sleep-and-exit-with-status/main.c b/42sh/42ShellTester/support/sleep-and-exit-with-status/main.c deleted file mode 100644 index 32f90c46..00000000 --- a/42sh/42ShellTester/support/sleep-and-exit-with-status/main.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include - -int main(int argc, char **argv) -{ - int seconds; - - seconds = 1; - if (argc > 1) - seconds = atoi(argv[1]); - sleep(seconds); - if (argc > 2) - return (atoi(argv[2])); - return (0); -} diff --git a/42sh/42ShellTester/support/sleep-and-write-on-stderr/Makefile b/42sh/42ShellTester/support/sleep-and-write-on-stderr/Makefile deleted file mode 100644 index 39311aca..00000000 --- a/42sh/42ShellTester/support/sleep-and-write-on-stderr/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=sleep_and_write_on_stderr -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/sleep-and-write-on-stderr/README.md b/42sh/42ShellTester/support/sleep-and-write-on-stderr/README.md deleted file mode 100644 index 5ce004e5..00000000 --- a/42sh/42ShellTester/support/sleep-and-write-on-stderr/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# ./sleep_and_write_on_stderr - -A binary that sleeps for a duration in seconds given as first argument and then writes on STDERR the string given as second argument without EOL. - -```c -#include -#include -#include - -int main(int argc, char **argv) -{ - int seconds; - - seconds = 1; - if (argc > 1) - seconds = atoi(argv[1]); - sleep(seconds); - if (argc > 2) - { - write(2, argv[2], strlen(argv[2])); - } - return (0); -} -``` diff --git a/42sh/42ShellTester/support/sleep-and-write-on-stderr/description b/42sh/42ShellTester/support/sleep-and-write-on-stderr/description deleted file mode 100644 index a4852ae2..00000000 --- a/42sh/42ShellTester/support/sleep-and-write-on-stderr/description +++ /dev/null @@ -1 +0,0 @@ -A binary that sleeps for a duration in seconds given as first argument and then writes on STDERR the string given as second argument without EOL. diff --git a/42sh/42ShellTester/support/sleep-and-write-on-stderr/main.c b/42sh/42ShellTester/support/sleep-and-write-on-stderr/main.c deleted file mode 100644 index b9c77a68..00000000 --- a/42sh/42ShellTester/support/sleep-and-write-on-stderr/main.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include - -int main(int argc, char **argv) -{ - int seconds; - - seconds = 1; - if (argc > 1) - seconds = atoi(argv[1]); - sleep(seconds); - if (argc > 2) - { - write(2, argv[2], strlen(argv[2])); - } - return (0); -} diff --git a/42sh/42ShellTester/support/write-all-arguments-on-stdout/Makefile b/42sh/42ShellTester/support/write-all-arguments-on-stdout/Makefile deleted file mode 100644 index 2ef23814..00000000 --- a/42sh/42ShellTester/support/write-all-arguments-on-stdout/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=write_all_arguments_on_stdout -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/write-all-arguments-on-stdout/README.md b/42sh/42ShellTester/support/write-all-arguments-on-stdout/README.md deleted file mode 100644 index 0dc66c74..00000000 --- a/42sh/42ShellTester/support/write-all-arguments-on-stdout/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# ./write_all_arguments_on_stdout - -A binary that writes on standard output each argument separated by the symbol `@`. If no argument is given, it writes the string "nothing to be written on stdout". - -```c -#include -#include - -int main(int argc, char **argv) -{ - if (argc >= 2) - { - argv++; - while (*argv) - { - write(1, *argv, strlen(*argv)); - write(1, "@", 1); - argv++; - } - write(1, "\n", 1); - } - else - { - write(1, "nothing to be written on stdout\n", 32); - } - return (0); -} -``` diff --git a/42sh/42ShellTester/support/write-all-arguments-on-stdout/description b/42sh/42ShellTester/support/write-all-arguments-on-stdout/description deleted file mode 100644 index 5e8a8ec3..00000000 --- a/42sh/42ShellTester/support/write-all-arguments-on-stdout/description +++ /dev/null @@ -1 +0,0 @@ -A binary that writes on standard output each argument separated by the symbol `@`. If no argument is given, it writes the string "nothing to be written on stdout". diff --git a/42sh/42ShellTester/support/write-all-arguments-on-stdout/main.c b/42sh/42ShellTester/support/write-all-arguments-on-stdout/main.c deleted file mode 100644 index f274e832..00000000 --- a/42sh/42ShellTester/support/write-all-arguments-on-stdout/main.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -int main(int argc, char **argv) -{ - if (argc >= 2) - { - argv++; - while (*argv) - { - write(1, *argv, strlen(*argv)); - write(1, "@", 1); - argv++; - } - write(1, "\n", 1); - } - else - { - write(1, "nothing to be written on stdout\n", 32); - } - return (0); -} diff --git a/42sh/42ShellTester/support/write-on-stderr/Makefile b/42sh/42ShellTester/support/write-on-stderr/Makefile deleted file mode 100644 index a754e806..00000000 --- a/42sh/42ShellTester/support/write-on-stderr/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=write_on_stderr -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/write-on-stderr/README.md b/42sh/42ShellTester/support/write-on-stderr/README.md deleted file mode 100644 index 6a704fb8..00000000 --- a/42sh/42ShellTester/support/write-on-stderr/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# ./write_on_stderr - -A binary that writes on standard error the first given argument (the same behavior as `echo` but with only one argument) and exits with an error status code given as second argument. If no argument is given, it writes the string "write on stderr" and exit with status `1`. - -```c -#include -#include -#include - -int main(int argc, char **argv) -{ - if (argc > 1) - { - write(2, argv[1], strlen(argv[1])); - write(2, "\n", 1); - } - else - { - write(2, "write on stderr\n", 16); - } - if (argc == 3) - return (atoi(argv[2])); - return (1); -} -``` diff --git a/42sh/42ShellTester/support/write-on-stderr/description b/42sh/42ShellTester/support/write-on-stderr/description deleted file mode 100644 index 3095b703..00000000 --- a/42sh/42ShellTester/support/write-on-stderr/description +++ /dev/null @@ -1 +0,0 @@ -A binary that writes on standard error the first given argument (the same behavior as `echo` but with only one argument) and exits with an error status code given as second argument. If no argument is given, it writes the string "write on stderr" and exit with status `1`. diff --git a/42sh/42ShellTester/support/write-on-stderr/main.c b/42sh/42ShellTester/support/write-on-stderr/main.c deleted file mode 100644 index 2c917f48..00000000 --- a/42sh/42ShellTester/support/write-on-stderr/main.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include - -int main(int argc, char **argv) -{ - if (argc > 1) - { - write(2, argv[1], strlen(argv[1])); - write(2, "\n", 1); - } - else - { - write(2, "write on stderr\n", 16); - } - if (argc == 3) - return (atoi(argv[2])); - return (1); -} diff --git a/42sh/42ShellTester/support/write-on-stdout-and-stderr/Makefile b/42sh/42ShellTester/support/write-on-stdout-and-stderr/Makefile deleted file mode 100644 index d10c9daf..00000000 --- a/42sh/42ShellTester/support/write-on-stdout-and-stderr/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=write_on_stdout_and_stderr -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/write-on-stdout-and-stderr/README.md b/42sh/42ShellTester/support/write-on-stdout-and-stderr/README.md deleted file mode 100644 index a0460a0d..00000000 --- a/42sh/42ShellTester/support/write-on-stdout-and-stderr/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# ./write_on_stdout_and_stderr - -A binary that writes on standard output the first given argument, and writes on standard error the second given argument. If an argument is missing, it writes the strings "write on stdout" and "write on stderr". - -```c -#include -#include - -int main(int argc, char **argv) -{ - if (argc == 3) - { - write(1, argv[1], strlen(argv[1])); - write(1, "\n", 1); - write(2, argv[2], strlen(argv[2])); - write(2, "\n", 1); - } - else - { - write(1, "write on stdout\n", 16); - write(2, "write on stderr\n", 16); - } - return (0); -} -``` diff --git a/42sh/42ShellTester/support/write-on-stdout-and-stderr/description b/42sh/42ShellTester/support/write-on-stdout-and-stderr/description deleted file mode 100644 index d5e369af..00000000 --- a/42sh/42ShellTester/support/write-on-stdout-and-stderr/description +++ /dev/null @@ -1 +0,0 @@ -A binary that writes on standard output the first given argument, and writes on standard error the second given argument. If an argument is missing, it writes the strings "write on stdout" and "write on stderr". diff --git a/42sh/42ShellTester/support/write-on-stdout-and-stderr/main.c b/42sh/42ShellTester/support/write-on-stdout-and-stderr/main.c deleted file mode 100644 index 96058cdc..00000000 --- a/42sh/42ShellTester/support/write-on-stdout-and-stderr/main.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include - -int main(int argc, char **argv) -{ - if (argc == 3) - { - write(1, argv[1], strlen(argv[1])); - write(1, "\n", 1); - write(2, argv[2], strlen(argv[2])); - write(2, "\n", 1); - } - else - { - write(1, "write on stdout\n", 16); - write(2, "write on stderr\n", 16); - } - return (0); -} diff --git a/42sh/42ShellTester/support/write-on-stdout/Makefile b/42sh/42ShellTester/support/write-on-stdout/Makefile deleted file mode 100644 index 741b593b..00000000 --- a/42sh/42ShellTester/support/write-on-stdout/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -NAME=write_on_stdout -TARGET_DIR=. - -$(NAME): all - -all: - gcc -Wall -Werror -Wextra main.c -o "$(TARGET_DIR)/$(NAME)" - -fclean: - rm -f "$(TARGET_DIR)/$(NAME)" - -re: fclean all diff --git a/42sh/42ShellTester/support/write-on-stdout/README.md b/42sh/42ShellTester/support/write-on-stdout/README.md deleted file mode 100644 index 978d1326..00000000 --- a/42sh/42ShellTester/support/write-on-stdout/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# ./write_on_stdout - -A binary that writes on standard output the first given argument (the same behavior as `echo` but with only one argument). If no argument is given, it writes the string "write on stdout". - -```c -#include -#include - -int main(int argc, char **argv) -{ - if (argc == 2) - { - write(1, argv[1], strlen(argv[1])); - write(1, "\n", 1); - } - else - { - write(1, "write on stdout\n", 16); - } - return (0); -} -``` diff --git a/42sh/42ShellTester/support/write-on-stdout/description b/42sh/42ShellTester/support/write-on-stdout/description deleted file mode 100644 index 69367f59..00000000 --- a/42sh/42ShellTester/support/write-on-stdout/description +++ /dev/null @@ -1 +0,0 @@ -A binary that writes on standard output the first given argument (the same behavior as `echo` but with only one argument). If no argument is given, it writes the string "write on stdout". diff --git a/42sh/42ShellTester/support/write-on-stdout/main.c b/42sh/42ShellTester/support/write-on-stdout/main.c deleted file mode 100644 index eb342002..00000000 --- a/42sh/42ShellTester/support/write-on-stdout/main.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -int main(int argc, char **argv) -{ - if (argc == 2) - { - write(1, argv[1], strlen(argv[1])); - write(1, "\n", 1); - } - else - { - write(1, "write on stdout\n", 16); - } - return (0); -} diff --git a/42sh/42ShellTester/tasks/generate_readmes.sh b/42sh/42ShellTester/tasks/generate_readmes.sh deleted file mode 100644 index 0f572155..00000000 --- a/42sh/42ShellTester/tasks/generate_readmes.sh +++ /dev/null @@ -1,181 +0,0 @@ -#!/bin/bash - -GLOBAL_INSTALLDIR="$(pwd)" -GLOBAL_TMP_DIRECTORY="${GLOBAL_INSTALLDIR}/tmp" -GLOBAL_LOCALBRANCH=$(git branch | awk '$0 ~ /^\*/ {print $2; exit}') -GLOBAL_LIST_OF_TESTS= -GLOBAL_TOTAL_TESTS=0 -GLOBAL_SUPPORT_BINARIES_LIST="" -GLOBAL_SUPPORT_BINARIES_LIST2="" - -if [ "${GLOBAL_LOCALBRANCH}" != "master" ] -then - printf "%s\n" "Task error: must be run in master branch to ensure pull requests to keep clean" - exit 1 -fi - -if [ -f "./tasks/${BASH_SOURCE[0]}" ] -then - printf "%s\n" "Task error: must be run from install directory" - exit 1 -fi - -run_create_support_binaries_readme() -{ - local SUPPORT_FILE - local README - local SUPPORT_FILE_NAME - - for SUPPORT_FILE in ./support/* - do - if [ -d "${SUPPORT_FILE}" ] - then - - README="${SUPPORT_FILE}/README.md" - SUPPORT_MAIN="${SUPPORT_FILE}/main.c" - SUPPORT_DESCRIPTION="${SUPPORT_FILE}/description" - SUPPORT_DIR_NAME="${SUPPORT_FILE##*/}" - SUPPORT_BINARY_NAME="${SUPPORT_DIR_NAME//-/_}" - - printf "# %s\n\n" "./${SUPPORT_BINARY_NAME}" >"${README}" - [ -f "${SUPPORT_DESCRIPTION}" ] && printf "%s\n\n" "$(cat "${SUPPORT_DESCRIPTION}")" >>"${README}" - printf "\`\`\`c\n%s\n\`\`\`\n" "$(cat "${SUPPORT_MAIN}")" >>"${README}" - - GLOBAL_SUPPORT_BINARIES_LIST="$(printf "%s\n%s" "${GLOBAL_SUPPORT_BINARIES_LIST}" "* **[./${SUPPORT_BINARY_NAME}](http://github.com/we-sh/42ShellTester/tree/master/support/${SUPPORT_DIR_NAME})** -> $(cat "${SUPPORT_DESCRIPTION}")")" - GLOBAL_SUPPORT_BINARIES_LIST2="${GLOBAL_SUPPORT_BINARIES_LIST2}\n\052 **[./${SUPPORT_BINARY_NAME}](http://github.com/we-sh/42ShellTester/tree/master/support/${SUPPORT_DIR_NAME})**: $(cat "${SUPPORT_DESCRIPTION}")" - - fi - done -} - -run_create_support_binaries_readme - -run_create_readme() -{ - local INDEX="${1}" - local TEST="${2}" - local TEST_NAME="${TEST##*/}" - local TEST_FULLNAME="${TEST##*spec/}" - local PARENT_DIR_NAME="${TEST%/*}" - local README="${TEST}/README.md" - - (( GLOBAL_TOTAL_TESTS= GLOBAL_TOTAL_TESTS + 1 )) - - printf "# %s\n\n" "${TEST_NAME}" >"${README}" - printf "*[%s](%s) > %s*\n\n" "${PARENT_DIR_NAME//\// > }" ".." "${DIR_NAME}" >>"${README}" - - if [ -f "${TEST}/description" ]; then cat "${TEST}/description" >>"${README}"; fi - - if [ -f "${TEST}/before_exec" ] - then - printf "### What is done before test\n\n\`\`\`bash\n" >>"${README}" - cat "${TEST}/before_exec" >>"${README}" - printf "\n\`\`\`\n\n" >>"${README}" - fi - - printf "### Shell commands that are sent to the standard entry\n\n\`\`\`bash\n" >>"${README}" - cat "${TEST}/stdin" >>"${README}" - printf "\n\`\`\`\n\n" >>"${README}" - - if [ -f "${TEST}/stdout" ] - then - printf "### What is expected on standard output\n\n\`\`\`bash\n" >>"${README}" - cat "${TEST}/stdout" >>"${README}" - printf "\n\`\`\`\n\n" >>"${README}" - fi - - if [ -f "${TEST}/stderr" ] - then - printf "### What is expected on error output\n\n\`\`\`bash\n" >>"${README}" - cat "${TEST}/stderr" >>"${README}" - printf "\n\`\`\`\n\n" >>"${README}" - fi - - if [ -f "${TEST}/misc" ] - then - printf "### What miscellaneous behaviors are expected\n\n\`\`\`bash\n" >>"${README}" - cat "${TEST}/misc" >>"${README}" - printf "\n\`\`\`\n\n" >>"${README}" - fi - - printf "### Variables\n\nThe following variables may appear in this test:\n\n" >>"${README}" - printf "* \${**GLOBAL_INSTALLDIR**} -> The installation directory of 42ShellTester\n" >>"${README}" - printf "* \${**GLOBAL_TMP_DIRECTORY**} -> The temporary directory in which tests are executed\n" >>"${README}" - printf "* \${**GLOBAL_TOKEN**} -> A token that changes value at launch time\n" >>"${README}" - printf "* \${**PATH**} -> The standard environment variable PATH\n" >>"${README}" - printf "* \${**HOME**} -> The standard environment variable HOME\n\n" >>"${README}" - - printf "### Support binaries\n\nThe following binaries may appear in this test:\n\n%s\n" "${GLOBAL_SUPPORT_BINARIES_LIST}" >>"${README}" -} - -run_browse_directory() -{ - local -i INDEX=${1} - local DIR="${2}" - local DIR_NAME="${DIR##*/}" - local DIR_FULLNAME="${DIR##*spec/}" - local PARENT_DIR_NAME="${DIR%/*}" - local README="${DIR}/README.md" - local SUBDIR - local IMGS="" - - if [ -f "${DIR}/stdin" ] - then - [ -f "${DIR}/non-posix" ] && IMGS=" " - [ -f "${DIR}/hard" ] && IMGS="${IMGS} " - [ -f "${DIR}/pending" ] && IMGS="${IMGS} " - GLOBAL_LIST_OF_TESTS="${GLOBAL_LIST_OF_TESTS}$(printf "% $(( INDEX * 2 ))s\052 [%s](%s)" "" "${DIR_NAME}${IMGS}" "${DIR}")\n" - run_create_readme "${INDEX}" "${DIR}" - else - - [ "${INDEX}" != "-1" ] && GLOBAL_LIST_OF_TESTS="${GLOBAL_LIST_OF_TESTS}$(printf "% $(( INDEX * 2 ))s\052 **[%s/](%s)**" "" "${DIR_NAME}" "${DIR}")\n" - - printf "# %s\n\n" "${DIR_NAME}" >"${README}" - [ "${INDEX}" != "-1" ] && printf "*[%s](%s) > %s*\n\n" "${PARENT_DIR_NAME//\// > }" ".." "${DIR_NAME}" >>"${README}" - - for SUBDIR in $(ls -1 "${DIR}") - do - if [ -d "${DIR}/${SUBDIR}" ] - then - printf "\052 [%s](%s)\n" "${SUBDIR}" "./${SUBDIR}" >>"${README}" - run_browse_directory "$(( INDEX + 1 ))" "${DIR}/${SUBDIR}" - fi - done - - fi -} - -run_browse_directory -1 "spec" - -awk -v SUPPORT_BINARIES_LIST="${GLOBAL_SUPPORT_BINARIES_LIST2}\n" -v LIST="${GLOBAL_LIST_OF_TESTS}" -v GLOBAL_TOTAL_TESTS="${GLOBAL_TOTAL_TESTS}" ' -BEGIN { - INSERT_DATA=0 -} -INSERT_DATA == 0 { - print -} -$0 ~ // { - INSERT_DATA=1; - print "42ShellTester is currently packaged with **"GLOBAL_TOTAL_TESTS" tests**." -} -$0 ~ // { - INSERT_DATA=0; - print -} -$0 ~ // { - INSERT_DATA=1; - print SUPPORT_BINARIES_LIST -} -$0 ~ // { - INSERT_DATA=0; - print -} -$0 ~ // { - INSERT_DATA=1; - print LIST -} -$0 ~ // { - INSERT_DATA=0; - print -} -' README.md > README.new.md && rm -f README.md && mv README.new.md README.md diff --git a/42sh/42sh_error b/42sh/42sh_error deleted file mode 100644 index 6455094c..00000000 --- a/42sh/42sh_error +++ /dev/null @@ -1,2501 +0,0 @@ -x.xxx..x.xxx.xx.xxx......xxxxx...xxxxxxxxxx.......xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxx.xx.xxx.x......xxxx.xxxxxx...xxxx...........xxxxxx.................xx...... - ----------------------------------------------------------------- - -42sh/builtins/export/001-display-env (FAILED) - - Description: - The purpose of this test is to check that using the builtin `export` without parameters results at least in a display of the environment variables. - - Before test: - 01: rm -rf "./stored_env" - 02: env | awk 'BEGIN {FS="="} $0 !~ /^(OLDPWD|_)/ {print $1"="}' > "./stored_env" - - STDIN: - 01: export - - STDOUT: - FAILURE expected_to match_each_regex_of_file `./stored_env` - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/003-export-basic-key-value-2 (FAILED) - - Description: - The purpose of this test is to check that the builtin `export` may declare a new environment variable and is able to display it later. - - Before test: - 01: unset "TOKEN201703241737_NAME" - - STDIN: - 01: export TOKEN201703241737_NAME=TOKEN201703241737_VALUE - 02: export - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703241737_NAME=["]?TOKEN201703241737_VALUE["]?$` - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/004-export-empty-variable-1 (FAILED) - - Description: - The purpose of this test is to check that exporting an empty variable does not add it to the environment. - - Before test: - 01: unset "TOKEN201703241737" - - STDIN: - 01: export TOKEN201703241737 - 02: ./display_env - - STDOUT: - FAILURE expected_to_not match_regex `TOKEN201703241737` - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TERM=screen-256color - 04: SHELL=/bin/zsh - 05: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 06: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 07: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 08: TERM_PROGRAM_VERSION=3.0.10 - 09: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 10: ZSH=/Users/ariard/.oh-my-zsh - 11: USER=ariard - 12: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 13: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 14: PAGER=less - 15: TMUX=/private/tmp/tmux-18965/default,73780,2 - 16: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 17: LSCOLORS=Gxfxcxdxbxegedabagacad - 18: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 19: MAIL=ariard@student.42.fr - 20: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 21: LANG=en_US.UTF-8 - 22: ITERM_PROFILE=Default - 23: XPC_FLAGS=0x0 - 24: TMUX_PANE=%9 - 25: XPC_SERVICE_NAME=0 - 26: SHLVL=4 - 27: HOME=/Users/ariard - 28: COLORFGBG=7;0 - 29: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 30: LOGNAME=ariard - 31: LESS=-R - 32: LC_CTYPE=en_US.UTF-8 - 33: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 34: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 35: _=../../42sh - 36: ?=0 - 37: TOKEN201703241737= - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 36 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/005-export-empty-variable-2 (FAILED) - - Description: - The purpose of this test is to check that exporting an empty variable does not add it to the environment, but can be displayed with the builtin `export`. - - Before test: - 01: unset "TOKEN201703241737" - - STDIN: - 01: export TOKEN201703241737 - 02: export - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703241737` - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/008-local-to-environment (FAILED) - - Description: - The purpose of this test is to check that a declared local variable may be exported to the environment with the builtin `export`. - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_VALUE - 02: export TOKEN201703241737_NAME - 03: ./display_env - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737_NAME=TOKEN201703241737_VALUE$` - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TERM=screen-256color - 04: SHELL=/bin/zsh - 05: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 06: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 07: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 08: TERM_PROGRAM_VERSION=3.0.10 - 09: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 10: ZSH=/Users/ariard/.oh-my-zsh - 11: USER=ariard - 12: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 13: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 14: PAGER=less - 15: TMUX=/private/tmp/tmux-18965/default,73780,2 - 16: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 17: LSCOLORS=Gxfxcxdxbxegedabagacad - 18: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 19: MAIL=ariard@student.42.fr - 20: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 21: LANG=en_US.UTF-8 - 22: ITERM_PROFILE=Default - 23: XPC_FLAGS=0x0 - 24: TMUX_PANE=%9 - 25: XPC_SERVICE_NAME=0 - 26: SHLVL=4 - 27: HOME=/Users/ariard - 28: COLORFGBG=7;0 - 29: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 30: LOGNAME=ariard - 31: LESS=-R - 32: LC_CTYPE=en_US.UTF-8 - 33: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 34: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 35: _=../../42sh - 36: ?=0 - 37: TOKEN201703241737_NAME=OKEN201703241737_VALUE - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 36 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/010-export-with-equal-but-no-value-part2 (FAILED) - - Description: - The purpose of this test is to check if the builtin export works fine with equal sign but no value. This test is based on the local variables return. - - Before test: - 01: unset "TOKEN201703241737" - - STDIN: - 01: export TOKEN201703241737_NAME= - 02: export - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703241737_NAME=` - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/errors/001-invalid-identifier-1 (FAILED) - - Description: - The purpose of this test is to check that trying to export an invalid variable identifier results in error. - - STDIN: - 01: export 42=TOKEN201703241737 - - STDOUT: - SUCCESS expected_to_not match_regex `TOKEN201703241737` - (no output) - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `(not.*identifier|must begin.*letter)` - 01: ../../42sh: export: 42: invalid variable name - - MISC: - FAILURE expected_to_not exit_with_status `0` - ----------------------------------------------------------------- - -42sh/builtins/export/errors/002-invalid-identifier-2 (FAILED) - - Description: - The purpose of this test is to check that trying to export an invalid variable identifier results in error. - - STDIN: - 01: export .=TOKEN201703241737 - - STDOUT: - SUCCESS expected_to_not match_regex `TOKEN201703241737` - (no output) - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `(not.*identifier|must begin.*letter)` - 01: ../../42sh: export: .: invalid variable name - - MISC: - FAILURE expected_to_not exit_with_status `0` - ----------------------------------------------------------------- - -42sh/builtins/export/mixed/001-export-and-tmp-env-part1 (FAILED) - - Description: - The purpose of this test is to check that modifying the environment for the builtin `export` results in an added variable into the exported list. - - Before test: - 01: unset "TOKEN201703241737_NAME" - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_VALUE export TOKEN201703241737_NAME - 02: export - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703241737_NAME=["]?TOKEN201703241737_VALUE["]?` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ../../42sh: command not found: TOKEN201703241737_NAME=TOKEN201703241737_VALUE - ----------------------------------------------------------------- - -42sh/builtins/export/mixed/002-export-and-tmp-env-part2 (FAILED) - - Description: - The purpose of this test is to check that modifying the environment for the builtin `export` results in an added environment variable. - - Before test: - 01: unset "TOKEN201703241737_NAME" - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_VALUE export TOKEN201703241737_NAME - 02: ./display_env - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703241737_NAME=TOKEN201703241737_VALUE` - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TERM=screen-256color - 04: SHELL=/bin/zsh - 05: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 06: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 07: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 08: TERM_PROGRAM_VERSION=3.0.10 - 09: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 10: ZSH=/Users/ariard/.oh-my-zsh - 11: USER=ariard - 12: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 13: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 14: PAGER=less - 15: TMUX=/private/tmp/tmux-18965/default,73780,2 - 16: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 17: LSCOLORS=Gxfxcxdxbxegedabagacad - 18: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 19: MAIL=ariard@student.42.fr - 20: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 21: LANG=en_US.UTF-8 - 22: ITERM_PROFILE=Default - 23: XPC_FLAGS=0x0 - 24: TMUX_PANE=%9 - 25: XPC_SERVICE_NAME=0 - 26: SHLVL=4 - 27: HOME=/Users/ariard - 28: COLORFGBG=7;0 - 29: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 30: LOGNAME=ariard - 31: LESS=-R - 32: LC_CTYPE=en_US.UTF-8 - 33: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 34: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 35: _=../../42sh - 36: ?=127 - 37: ------------------------------ - 38: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - FAILURE expected_to be_empty - 01: ../../42sh: command not found: TOKEN201703241737_NAME=TOKEN201703241737_VALUE - ----------------------------------------------------------------- - -42sh/builtins/export/options/002-export-p-param-and-token-should-add-local-var-only-part1 (FAILED) - - Description: - The purpose of this test is to check if export with -p option + token , add the variable into export list but not in env list. And don't display the export variable on stdout. - - Before test: - 01: rm -f "./stored_env" - 02: unset "TOKEN201703241737_NAME" - 03: export | awk 'BEGIN {FS="="} $0 !~ /^(OLDPWD|_)/ {print $1"="}' > "./stored_env" - - STDIN: - 01: export -p TOKEN201703241737_NAME - 02: export - - STDOUT: - FAILURE expected_to_not match_each_regex_of_file `./stored_env` - FAILURE expected_to match_regex `TOKEN201703241737_NAME` - 01: export TERM_PROGRAM=iTerm.app - 02: export TERM=screen-256color - 03: export SHELL=/bin/zsh - 04: export HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 05: export TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 06: export Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 07: export TERM_PROGRAM_VERSION=3.0.10 - 08: export TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 09: export ZSH=/Users/ariard/.oh-my-zsh - 10: export USER=ariard - 11: export SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 12: export __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 13: export PAGER=less - 14: export TMUX=/private/tmp/tmux-18965/default,73780,2 - 15: export HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 16: export LSCOLORS=Gxfxcxdxbxegedabagacad - 17: export PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 18: export MAIL=ariard@student.42.fr - 19: export PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 20: export LANG=en_US.UTF-8 - 21: export ITERM_PROFILE=Default - 22: export XPC_FLAGS=0x0 - 23: export TMUX_PANE=%9 - 24: export XPC_SERVICE_NAME=0 - 25: export SHLVL=4 - 26: export HOME=/Users/ariard - 27: export COLORFGBG=7;0 - 28: export ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 29: export LOGNAME=ariard - 30: export LESS=-R - 31: export LC_CTYPE=en_US.UTF-8 - 32: export TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 33: export OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 34: export _=../../42sh - 35: export ?=0 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/options/003-export-p-param-and-token-should-add-local-var-only-part2 (FAILED) - - Description: - The purpose of this test is to check that the builtin `export` with option `-p` results in an added variable into the export list but not from the environment. - - Before test: - 01: rm -f "./stored_env" - 02: unset "TOKEN201703241737_NAME" - 03: export | awk 'BEGIN {FS="="} $0 !~ /^(OLDPWD|_)/ {print $1"="}' > "./stored_env" - - STDIN: - 01: export -p TOKEN201703241737_NAME - 02: ./display_env - - STDOUT: - FAILURE expected_to_not match_each_regex_of_file `./stored_env` - SUCCESS expected_to_not match_regex `TOKEN201703241737_NAME` - 01: export TERM_PROGRAM=iTerm.app - 02: export TERM=screen-256color - 03: export SHELL=/bin/zsh - 04: export HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 05: export TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 06: export Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 07: export TERM_PROGRAM_VERSION=3.0.10 - 08: export TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 09: export ZSH=/Users/ariard/.oh-my-zsh - 10: export USER=ariard - 11: export SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 12: export __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 13: export PAGER=less - 14: export TMUX=/private/tmp/tmux-18965/default,73780,2 - 15: export HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 16: export LSCOLORS=Gxfxcxdxbxegedabagacad - 17: export PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 18: export MAIL=ariard@student.42.fr - 19: export PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 20: export LANG=en_US.UTF-8 - 21: export ITERM_PROFILE=Default - 22: export XPC_FLAGS=0x0 - 23: export TMUX_PANE=%9 - 24: export XPC_SERVICE_NAME=0 - 25: export SHLVL=4 - 26: export HOME=/Users/ariard - 27: export COLORFGBG=7;0 - 28: export ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 29: export LOGNAME=ariard - 30: export LESS=-R - 31: export LC_CTYPE=en_US.UTF-8 - 32: export TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 33: export OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 34: export _=../../42sh - 35: export ?=0 - 36: ------------------------------ - 37: TERM_PROGRAM=iTerm.app - 38: TERM=screen-256color - 39: SHELL=/bin/zsh - 40: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 41: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 42: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 43: TERM_PROGRAM_VERSION=3.0.10 - 44: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 45: ZSH=/Users/ariard/.oh-my-zsh - 46: USER=ariard - 47: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 48: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 49: PAGER=less - 50: TMUX=/private/tmp/tmux-18965/default,73780,2 - 51: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 52: LSCOLORS=Gxfxcxdxbxegedabagacad - 53: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 54: MAIL=ariard@student.42.fr - 55: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 56: LANG=en_US.UTF-8 - 57: ITERM_PROFILE=Default - 58: XPC_FLAGS=0x0 - 59: TMUX_PANE=%9 - 60: XPC_SERVICE_NAME=0 - 61: SHLVL=4 - 62: HOME=/Users/ariard - 63: COLORFGBG=7;0 - 64: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 65: LOGNAME=ariard - 66: LESS=-R - 67: LC_CTYPE=en_US.UTF-8 - 68: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 69: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 70: _=../../42sh - 71: ?=0 - 72: ------------------------------ - 73: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/builtins/export/options/004-export-n-param (FAILED) - - Description: - The purpose of this test is to check that using the builtin `export` with option `-n` results in a removed environment variable. - - Before test: - 01: export TOKEN201703241737_NAME=TOKEN201703241737_VALUE - - STDIN: - 01: export -n TOKEN201703241737_NAME - 02: export - 03: ./display_env - - STDOUT: - SUCCESS expected_to_not match_regex `TOKEN201703241737_NAME` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: export: invalid option -n - 02: ./lib/main.sh: line 102: 12935 Segmentation fault: 11 ../../42sh - ----------------------------------------------------------------- - -42sh/escaping/mixed/globbing/brace-expansion/002-it-expands-braces-1 (FAILED) - - Description: - The purpose of this test is to check that using multiple escape characters `\\` results in a good behavior with the brace expansion. - - STDIN: - 01: ./write_all_arguments_on_stdout \\{1..2} - - STDOUT: - FAILURE expected_to match_regex `^\1@\2@$` - 01: \{1..2}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/escaping/mixed/globbing/brace-expansion/003-it-expands-braces-2 (FAILED) - - Description: - The purpose of this test is to check that using multiple escape characters `\\` results in a good behavior with the brace expansion. - - STDIN: - 01: ./write_all_arguments_on_stdout \\\{1..2} \\\\{1..2} \\\\\{1..2} \\\\\\{1..2} - - STDOUT: - FAILURE expected_to match_regex `^\[{]1..2}@\\1@\\2@\\[{]1..2}@\\\1@\\\2@$` - 01: \{1..2}@\\{1..2}@\\{1..2}@\\\{1..2}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/escaping/mixed/globbing/bracket-expansion/001-it-does-not-expand-brackets (FAILED) - - Description: - The purpose of this test is to check that escaping brackets does not result in an expansion process. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout \[abc] [abc\] \[abc\] - - STDOUT: - FAILURE expected_to match_regex `^[[]abc]@[[]abc]@[[]abc]@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/escaping/mixed/globbing/bracket-expansion/002-escaped-inversion-mark (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with an inversion mark `!` or `^` as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' 'd' 'e' 'f' '!' '^' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [\!abc] - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [\^abc] - - STDOUT: - FAILURE expected_to match_regex `!@` - FAILURE expected_to match_regex `[\^]@` - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `b@` - FAILURE expected_to match_regex `c@` - SUCCESS expected_to_not match_regex `d@` - SUCCESS expected_to_not match_regex `e@` - SUCCESS expected_to_not match_regex `f@` - WARNING might match_regex `^!@a@b@c@$` - WARNING might match_regex `^[\^]@a@b@c@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/escaping/mixed/globbing/bracket-expansion/003-it-takes-escaped-bracket-as-pattern-character (FAILED) - - Description: - The purpose of this test is to check that a closing bracket ']' may be escaped in a backet expansion pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' 'd' 'e' 'f' ']' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [abc\]def] - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [abc\\\]def] - 03: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [abc\\\\\]def] - 04: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [abc\\\\\\\]def] - - STDOUT: - FAILURE expected_to match_regex `a@` 4 times - FAILURE expected_to match_regex `b@` 4 times - FAILURE expected_to match_regex `c@` 4 times - FAILURE expected_to match_regex `]@` 4 times - FAILURE expected_to match_regex `d@` 4 times - FAILURE expected_to match_regex `e@` 4 times - FAILURE expected_to match_regex `f@` 4 times - SUCCESS expected_to_not match_regex `def` - WARNING might match_regex `^]@a@b@c@d@e@f@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/001-simple-ascending-1 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with an ASCII range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {a..e} - - STDOUT: - FAILURE expected_to match_regex `^a@b@c@d@e@$` - 01: {a..e}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/002-simple-ascending-2 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with an ASCII range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{a..e}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737aTOKEN201703241737@TOKEN201703241737bTOKEN201703241737@TOKEN201703241737cTOKEN201703241737@TOKEN201703241737dTOKEN201703241737@TOKEN201703241737eTOKEN201703241737@$` - 01: TOKEN201703241737{a..e}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/003-simple-ascending-3 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with an ASCII range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {A..E} - - STDOUT: - FAILURE expected_to match_regex `^A@B@C@D@E@$` - 01: {A..E}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/004-simple-descending-1 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with an ASCII range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {E..A} - - STDOUT: - FAILURE expected_to match_regex `^E@D@C@B@A@$` - 01: {E..A}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/005-simple-descending-2 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with an ASCII range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{E..A}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737ETOKEN201703241737@TOKEN201703241737DTOKEN201703241737@TOKEN201703241737CTOKEN201703241737@TOKEN201703241737BTOKEN201703241737@TOKEN201703241737ATOKEN201703241737@$` - 01: TOKEN201703241737{E..A}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/006-simple-descending-3 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with an ASCII range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{e..a} - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737e@TOKEN201703241737d@TOKEN201703241737c@TOKEN201703241737b@TOKEN201703241737a@$` - 01: TOKEN201703241737{e..a}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/007-identical-start-and-end (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a range of single ASCII value. - - STDIN: - 01: ./write_all_arguments_on_stdout {f..f} - - STDOUT: - FAILURE expected_to match_regex `^f@$` - 01: {f..f}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/008-multiple-1 (FAILED) - - Description: - The purpose of this test is to check that brace expansion may be performed with multiple brace patterns. - - STDIN: - 01: ./write_all_arguments_on_stdout {a..b}{c..d}{e..f} - - STDOUT: - FAILURE expected_to match_regex `^ace@acf@ade@adf@bce@bcf@bde@bdf@$` - 01: {a..b}{c..d}{e..f}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/009-multiple-2 (FAILED) - - Description: - The purpose of this test is to check that brace expansion may be performed with multiple brace patterns. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{a..b}abc{Z..X}def{s..s} - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737aabcZdefs@TOKEN201703241737aabcYdefs@TOKEN201703241737aabcXdefs@TOKEN201703241737babcZdefs@TOKEN201703241737babcYdefs@TOKEN201703241737babcXdefs@$` - 01: TOKEN201703241737{a..b}abc{Z..X}def{s..s}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/ascii-range/010-big-range (FAILED) - - Description: - The purpose of this test is to check that brace expansion may be performed with a big numeric range. - - STDIN: - 01: ./write_all_arguments_on_stdout {A..z} - - STDOUT: - FAILURE expected_to match_regex `^A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@.+@.?@.+@.+@_@.+@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@$` - 01: {A..z}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/001-simple-ascending-1 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {1..5} - - STDOUT: - FAILURE expected_to match_regex `^1@2@3@4@5@$` - 01: {1..5}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/002-simple-ascending-2 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{1..5}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^TOKEN2017032417371TOKEN201703241737@TOKEN2017032417372TOKEN201703241737@TOKEN2017032417373TOKEN201703241737@TOKEN2017032417374TOKEN201703241737@TOKEN2017032417375TOKEN201703241737@$` - 01: TOKEN201703241737{1..5}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/003-simple-ascending-3 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{1..+5} - - STDOUT: - FAILURE expected_to match_regex `^TOKEN2017032417371@TOKEN2017032417372@TOKEN2017032417373@TOKEN2017032417374@TOKEN2017032417375@$` - 01: TOKEN201703241737{1..+5}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/004-simple-ascending-4 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {-5..0}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^-5TOKEN201703241737@-4TOKEN201703241737@-3TOKEN201703241737@-2TOKEN201703241737@-1TOKEN201703241737@0TOKEN201703241737@$` - 01: {-5..0}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/005-simple-ascending-5 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in ascending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {-100..-98}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^-100TOKEN201703241737@-99TOKEN201703241737@-98TOKEN201703241737@$` - 01: {-100..-98}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/006-simple-descending-1 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {5..1} - - STDOUT: - FAILURE expected_to match_regex `^5@4@3@2@1@$` - 01: {5..1}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/007-simple-descending-2 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{5..1}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^TOKEN2017032417375TOKEN201703241737@TOKEN2017032417374TOKEN201703241737@TOKEN2017032417373TOKEN201703241737@TOKEN2017032417372TOKEN201703241737@TOKEN2017032417371TOKEN201703241737@$` - 01: TOKEN201703241737{5..1}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/008-simple-descending-3 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{5..+1} - - STDOUT: - FAILURE expected_to match_regex `^TOKEN2017032417375@TOKEN2017032417374@TOKEN2017032417373@TOKEN2017032417372@TOKEN2017032417371@$` - 01: TOKEN201703241737{5..+1}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/009-simple-descending-4 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {0..-5}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^0TOKEN201703241737@-1TOKEN201703241737@-2TOKEN201703241737@-3TOKEN201703241737@-4TOKEN201703241737@-5TOKEN201703241737@$` - 01: {0..-5}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/010-simple-descending-5 (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a numeric range in descending order. - - STDIN: - 01: ./write_all_arguments_on_stdout {-98..-100}TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^-98TOKEN201703241737@-99TOKEN201703241737@-100TOKEN201703241737@$` - 01: {-98..-100}TOKEN201703241737@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/011-identical-positive-start-and-end (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a range of single value. - - STDIN: - 01: ./write_all_arguments_on_stdout {42..42} - - STDOUT: - FAILURE expected_to match_regex `^42@$` - 01: {42..42}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/012-identical-negative-start-and-end (FAILED) - - Description: - The purpose of this test is to check that the brace expansion does work with a range of single value. - - STDIN: - 01: ./write_all_arguments_on_stdout {-42..-42} - - STDOUT: - FAILURE expected_to match_regex `^-42@$` - 01: {-42..-42}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/013-multiple-1 (FAILED) - - Description: - The purpose of this test is to check that brace expansion may be performed with multiple brace patterns. - - STDIN: - 01: ./write_all_arguments_on_stdout {1..2}{3..4}{5..6} - - STDOUT: - FAILURE expected_to match_regex `^135@136@145@146@235@236@245@246@$` - 01: {1..2}{3..4}{5..6}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/014-multiple-2 (FAILED) - - Description: - The purpose of this test is to check that brace expansion may be performed with multiple brace patterns. - - STDIN: - 01: ./write_all_arguments_on_stdout TOKEN201703241737{1..2}abc{-50..-53}def{0..0} - - STDOUT: - FAILURE expected_to match_regex `^TOKEN2017032417371abc-50def0@TOKEN2017032417371abc-51def0@TOKEN2017032417371abc-52def0@TOKEN2017032417371abc-53def0@TOKEN2017032417372abc-50def0@TOKEN2017032417372abc-51def0@TOKEN2017032417372abc-52def0@TOKEN2017032417372abc-53def0@$` - 01: TOKEN201703241737{1..2}abc{-50..-53}def{0..0}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/brace-expansion/numeric-range/015-big-range (FAILED) - - Description: - The purpose of this test is to check that brace expansion may be performed with a big numeric range. - - STDIN: - 01: ./write_all_arguments_on_stdout {-100..100} - - STDOUT: - FAILURE expected_to match_regex `^-100@-99@-98@-97@-96@-95@-94@-93@-92@-91@-90@-89@-88@-87@-86@-85@-84@-83@-82@-81@-80@-79@-78@-77@-76@-75@-74@-73@-72@-71@-70@-69@-68@-67@-66@-65@-64@-63@-62@-61@-60@-59@-58@-57@-56@-55@-54@-53@-52@-51@-50@-49@-48@-47@-46@-45@-44@-43@-42@-41@-40@-39@-38@-37@-36@-35@-34@-33@-32@-31@-30@-29@-28@-27@-26@-25@-24@-23@-22@-21@-20@-19@-18@-17@-16@-15@-14@-13@-12@-11@-10@-9@-8@-7@-6@-5@-4@-3@-2@-1@0@1@2@3@4@5@6@7@8@9@10@11@12@13@14@15@16@17@18@19@20@21@22@23@24@25@26@27@28@29@30@31@32@33@34@35@36@37@38@39@40@41@42@43@44@45@46@47@48@49@50@51@52@53@54@55@56@57@58@59@60@61@62@63@64@65@66@67@68@69@70@71@72@73@74@75@76@77@78@79@80@81@82@83@84@85@86@87@88@89@90@91@92@93@94@95@96@97@98@99@100@$` - 01: {-100..100}@ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/multi/001-range-and-char (FAILED) - - Description: - The purpose of this test is to check that brackets expansion works with a range and 2 characters as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch '1' '2' '3' 'a' 'b' 'z' 'C' '-' '[a-z-2]' 'a-z-2' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [a-z-2] - - STDOUT: - FAILURE expected_to match_regex `-@` - FAILURE expected_to match_regex `2@` - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `b@` - FAILURE expected_to match_regex `z@` - SUCCESS expected_to_not match_regex `1@` - SUCCESS expected_to_not match_regex `3@` - SUCCESS expected_to_not match_regex `C@` - SUCCESS expected_to_not match_regex `[[]a-z-2]@` - SUCCESS expected_to_not match_regex `a-z-2@` - WARNING might match_regex `^-@2@a@b@z@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/multi/002-reverse-range-and-chars (FAILED) - - Description: - The purpose of this test is to check that brackets expansion works with 2 patterns. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a4' 'a3' 'a2' 'a42' 'a[42]' 'z4' 'z3' 'z2' 'z42' 'z[42]' '42' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [!a-y][42] - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [^a-y][42] - - STDOUT: - FAILURE expected_to match_regex `42@` - FAILURE expected_to match_regex `z4@` - FAILURE expected_to match_regex `z2@` - SUCCESS expected_to_not match_regex `z3@` - SUCCESS expected_to_not match_regex `z42@` - SUCCESS expected_to_not match_regex `z[[]42]@` - SUCCESS expected_to_not match_regex `a3@` - SUCCESS expected_to_not match_regex `a42@` - SUCCESS expected_to_not match_regex `a[[]42]@` - WARNING might match_regex `^42@z2@z4@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/multi/003-reverse-multi-hard (FAILED) - - Description: - The purpose of this test is to check how the value inside multiple brackets are parsed with bracket as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch '][' 'a[' '1[' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [!]az][[] - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [^]az][[] - - STDOUT: - FAILURE expected_to match_regex `1[[]@` - SUCCESS expected_to_not match_regex `][[]@` - SUCCESS expected_to_not match_regex `a[[]@` - WARNING might match_regex `^1[[]@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/multi/004-simple-bracket+char+range (FAILED) - - Description: - The purpose of this test is to control if 2 patterns splited by a minus characters can be match. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a-0' 'a-1' 'a-2' 'b-0' 'b-1' 'b-2' 'Z-0' 'Z-1' 'Z-2' 'a1' 'Z9' 'D4' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [aZ]-[1-9] - - STDOUT: - FAILURE expected_to match_regex `a-1@` - FAILURE expected_to match_regex `a-2@` - FAILURE expected_to match_regex `Z-1@` - FAILURE expected_to match_regex `Z-2@` - SUCCESS expected_to_not match_regex `a-0@` - SUCCESS expected_to_not match_regex `b-0@` - SUCCESS expected_to_not match_regex `b-1@` - SUCCESS expected_to_not match_regex `b-2@` - SUCCESS expected_to_not match_regex `a1@` - SUCCESS expected_to_not match_regex `Z9@` - SUCCESS expected_to_not match_regex `D4@` - WARNING might match_regex `^Z-1@Z-2@a-1@a-2@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/not/001-simple-opposit-match (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with the inversion mark `!` or `^`. The expected behavior is the reversion of the following pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' '1' 'Z' 'd' 'e' 'f' 'def' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [!a1Z] - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [^a1Z] - - STDOUT: - FAILURE expected_to match_regex `d@` - FAILURE expected_to match_regex `e@` - FAILURE expected_to match_regex `f@` - SUCCESS expected_to_not match_regex `def@` - WARNING might match_regex `^d@e@f@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/not/002-simple-opposite-range (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with the inversion mark `!` or `^`. The expected behavior is the reversion of the following pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' 'z' '1' '2' '3' '42' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [!a-z] - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [^a-z] - - STDOUT: - FAILURE expected_to match_regex `1@` - FAILURE expected_to match_regex `2@` - FAILURE expected_to match_regex `3@` - SUCCESS expected_to_not match_regex `42@` - WARNING might match_regex `^1@2@3@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/range-pattern/001-alpha-range (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with the following pattern `[a-z]`. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'f' 'z' 'A' '1' '[a-z]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [a-z] - - STDOUT: - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `f@` - FAILURE expected_to match_regex `z@` - SUCCESS expected_to_not match_regex `A@` - SUCCESS expected_to_not match_regex `1@` - SUCCESS expected_to_not match_regex `[[]a-z]@` - WARNING might match_regex `^a@f@z@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/range-pattern/002-numeric-range (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with the following pattern `[0-9]`. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch '4' '2' '1' '9' 'a' 'C' '[0-9]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [0-9] - - STDOUT: - FAILURE expected_to match_regex `1@` - FAILURE expected_to match_regex `2@` - FAILURE expected_to match_regex `4@` - FAILURE expected_to match_regex `9@` - SUCCESS expected_to_not match_regex `a@` - SUCCESS expected_to_not match_regex `C@` - SUCCESS expected_to_not match_regex `[[]0-9]@` - WARNING might match_regex `^1@2@4@9@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/range-pattern/003-ascii-range-1 (FAILED) - - Description: - The purpose of this test is to check if the bracket expansion works with the following pattern []-z]. - One test use the following range which is the default range for bash: - < > , ; : ! ' " ( ) [ ] { } @ $ \ # % 1 2 3 4 5 6 7 8 9 a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y z - The other use the ascii value, which does make more sense. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch '2' 'a' 'B' 'c' 'Z' '[' ']' '[]-z]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout []-z] - - STDOUT: - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `c@` - FAILURE expected_to match_regex `]@` - SUCCESS expected_to_not match_regex `2@` - SUCCESS expected_to_not match_regex `B@` - SUCCESS expected_to_not match_regex `Z@` - SUCCESS expected_to_not match_regex `[[]@` - SUCCESS expected_to_not match_regex `[[]]-z]@` - WARNING might match_regex `^]@a@c@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/range-pattern/004-ascii-range-2 (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with the following pattern `[1-z]`. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch '2' 'a' 'B' 'c' 'Z' ']' '[' '[1-z]' '1-z' '-' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [1-z] - - STDOUT: - FAILURE expected_to match_regex `2@` - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `B@` - FAILURE expected_to match_regex `c@` - FAILURE expected_to match_regex `Z@` - FAILURE expected_to match_regex `]@` - FAILURE expected_to match_regex `[[]@` - SUCCESS expected_to_not match_regex `-@` - SUCCESS expected_to_not match_regex `1-z@` - SUCCESS expected_to_not match_regex `[[]1-z]@` - WARNING might match_regex `^2@B@Z@[[]@]@a@c@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/simple-pattern/001-simple-list (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with a simple list of characters as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' 'd' 'e' 'f' '[bca]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [bca] - - STDOUT: - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `b@` - FAILURE expected_to match_regex `c@` - SUCCESS expected_to_not match_regex `d@` - SUCCESS expected_to_not match_regex `e@` - SUCCESS expected_to_not match_regex `f@` - SUCCESS expected_to_not match_regex `[[]bca]@` - WARNING might match_regex `^a@b@c@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/simple-pattern/002-multi-bracket (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with multiple brackets patterns. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch "TOKEN201703241737abcd" "TOKEN201703241737abc" "TOKEN201703241737abdc" "TOKEN201703241737b" "TOKEN201703241737" "TOKEN201703241737\[a]b\[c]\[d]" - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout TOKEN201703241737[a]b[c][d] - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737abcd@$` - SUCCESS expected_to_not match_regex `TOKEN201703241737abc@` - SUCCESS expected_to_not match_regex `TOKEN201703241737abdc@` - SUCCESS expected_to_not match_regex `TOKEN201703241737b@` - SUCCESS expected_to_not match_regex `TOKEN201703241737@` - SUCCESS expected_to_not match_regex `TOKEN201703241737[[]a]b[[]c][[]d]@` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/simple-pattern/003-brackets-as-pattern (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with an opening bracket `[` and a closing bracket `]` as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch '[' ']' 'a' 'Z' '[][]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [][] - - STDOUT: - FAILURE expected_to match_regex `[[]@` - FAILURE expected_to match_regex `]@` - SUCCESS expected_to_not match_regex `a@` - SUCCESS expected_to_not match_regex `Z@` - SUCCESS expected_to_not match_regex `[[]][[]]@` - WARNING might match_regex `^[[]@]@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/simple-pattern/004-multi-bracket-multi-char (FAILED) - - Description: - The purpose of this test is to match a file name which contain a bracket as first character. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 21 23 24 25 26 27 28 29 ']' '[' '[12][34]' '1234' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [12][34] - - STDOUT: - FAILURE expected_to match_regex `13@` - FAILURE expected_to match_regex `14@` - FAILURE expected_to match_regex `23@` - FAILURE expected_to match_regex `24@` - SUCCESS expected_to_not match_regex `0[0-9]@` - SUCCESS expected_to_not match_regex `1[0-2]@` - SUCCESS expected_to_not match_regex `1[5-9]@` - SUCCESS expected_to_not match_regex `2[0-2]@` - SUCCESS expected_to_not match_regex `2[5-9]@` - SUCCESS expected_to_not match_regex `[[]@` - SUCCESS expected_to_not match_regex `]@` - SUCCESS expected_to_not match_regex `[[]12][[]34]@` - SUCCESS expected_to_not match_regex `1234@` - WARNING might match_regex `^13@14@23@24@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/single-char-pattern/001-single-char (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with a single character as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' '[a]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [a] - - STDOUT: - FAILURE expected_to match_regex `a@` - SUCCESS expected_to_not match_regex `b@` - SUCCESS expected_to_not match_regex `[[]a]@` - WARNING might match_regex `^a@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/single-char-pattern/002-closing-bracket-char (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with a closing bracket `]` as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch ']' '[]]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout []] - - STDOUT: - FAILURE expected_to match_regex `]@` - SUCCESS expected_to_not match_regex `[[]]]@` - WARNING might match_regex `^]@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/globbing/bracket-expansion/single-char-pattern/003-opening-bracket-char (FAILED) - - Description: - The purpose of this test is to check that the brackets expansion works with an opening bracket `[` as pattern. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch '[' '[[]' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [[] - - STDOUT: - FAILURE expected_to match_regex `[[]@` - SUCCESS expected_to_not match_regex `[[][[]]@` - WARNING might match_regex `^[[]@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/local-variable/002-declare-and-expand-2 (FAILED) - - Description: - The purpose of this test is to check that an empty variable is not expanded as an empty string and results in any new argument in the command line. - - STDIN: - 01: TOKEN201703241737_NAME= - 02: ./write_on_stdout_and_stderr $TOKEN201703241737_NAME $TOKEN201703241737_NAME - - STDOUT: - FAILURE expected_to match_regex `write on stdout` - 01:  - - STDERR: - FAILURE expected_to match_regex `write on stderr` - 01:  - ----------------------------------------------------------------- - -42sh/local-variable/003-unknown-variable-does-not-result-in-new-argument (FAILED) - - Description: - The purpose of this test is to check that an unknown variable is not expanded as an empty string and results in any new argument in the command line. - - Before test: - 01: unset "TOKEN201703241737_UNKNOWN" - - STDIN: - 01: ./write_on_stdout $TOKEN201703241737_UNKNOWN TOKEN201703241737_DISPLAYED - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703241737_DISPLAYED` - 01: write on stdout - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/local-variable/004-existing-variable-in-environment-1 (FAILED) - - Description: - The purpose of this test is initialize a local variable named as an environment variable and check if it's update the existing environment variable. - - Before test: - 01: export "TOKEN201703241737_NAME=TOKEN201703241737_VALUE_OLD" - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_VALUE_NEW - 02: ./display_env - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737_NAME=TOKEN201703241737_VALUE_NEW$` - FAILURE expected_to_not match_regex `^TOKEN201703241737_NAME=TOKEN201703241737_VALUE_OLD$` - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TOKEN201703241737_NAME=TOKEN201703241737_VALUE_OLD - 04: TERM=screen-256color - 05: SHELL=/bin/zsh - 06: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 07: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 08: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 09: TERM_PROGRAM_VERSION=3.0.10 - 10: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 11: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 12: ZSH=/Users/ariard/.oh-my-zsh - 13: USER=ariard - 14: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 15: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 16: PAGER=less - 17: TMUX=/private/tmp/tmux-18965/default,73780,2 - 18: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 19: LSCOLORS=Gxfxcxdxbxegedabagacad - 20: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 21: MAIL=ariard@student.42.fr - 22: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 23: LANG=en_US.UTF-8 - 24: ITERM_PROFILE=Default - 25: XPC_FLAGS=0x0 - 26: TMUX_PANE=%9 - 27: XPC_SERVICE_NAME=0 - 28: SHLVL=4 - 29: HOME=/Users/ariard - 30: COLORFGBG=7;0 - 31: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 32: LOGNAME=ariard - 33: LESS=-R - 34: LC_CTYPE=en_US.UTF-8 - 35: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 36: _=../../42sh - 37: ?=0 - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 36 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/local-variable/005-existing-variable-in-environment-2 (FAILED) - - Description: - The purpose of this test is initialize a local variable named as an environment variable and check if it's update the existing environment variable. - - Before test: - 01: export "TOKEN201703241737_NAME=TOKEN201703241737_VALUE" - - STDIN: - 01: TOKEN201703241737_NAME= - 02: ./display_env - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737_NAME=$` - FAILURE expected_to_not match_regex `^TOKEN201703241737_NAME=TOKEN201703241737_VALUE$` - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TOKEN201703241737_NAME=TOKEN201703241737_VALUE - 04: TERM=screen-256color - 05: SHELL=/bin/zsh - 06: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 07: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 08: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 09: TERM_PROGRAM_VERSION=3.0.10 - 10: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 11: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 12: ZSH=/Users/ariard/.oh-my-zsh - 13: USER=ariard - 14: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 15: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 16: PAGER=less - 17: TMUX=/private/tmp/tmux-18965/default,73780,2 - 18: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 19: LSCOLORS=Gxfxcxdxbxegedabagacad - 20: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 21: MAIL=ariard@student.42.fr - 22: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 23: LANG=en_US.UTF-8 - 24: ITERM_PROFILE=Default - 25: XPC_FLAGS=0x0 - 26: TMUX_PANE=%9 - 27: XPC_SERVICE_NAME=0 - 28: SHLVL=4 - 29: HOME=/Users/ariard - 30: COLORFGBG=7;0 - 31: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 32: LOGNAME=ariard - 33: LESS=-R - 34: LC_CTYPE=en_US.UTF-8 - 35: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 36: _=../../42sh - 37: ?=0 - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 36 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/local-variable/007-multiple-declaration-at-a-time (FAILED) - - Description: - The purpose of this test is to check that declaring multiple variables in the same command line does work. - - STDIN: - 01: TOKEN201703241737_NAME1=TOKEN201703241737_VALUE1 TOKEN201703241737_NAME2=TOKEN201703241737_VALUE2 TOKEN201703241737_NAME3=TOKEN201703241737_VALUE3 - 02: ./write_on_stdout_and_stderr $TOKEN201703241737_NAME1 $TOKEN201703241737_NAME1 - 03: ./write_on_stdout $TOKEN201703241737_NAME2 - 04: ./write_on_stderr $TOKEN201703241737_NAME3 - - STDOUT: - SUCCESS expected_to match_regex `^TOKEN201703241737_VALUE1$` - FAILURE expected_to match_regex `^TOKEN201703241737_VALUE2$` - SUCCESS expected_to_not match_regex `^TOKEN201703241737_VALUE3$` - 01: TOKEN201703241737_VALUE1 - 02:  - - STDERR: - SUCCESS expected_to match_regex `^TOKEN201703241737_VALUE1$` - SUCCESS expected_to_not match_regex `^TOKEN201703241737_VALUE2$` - FAILURE expected_to match_regex `^TOKEN201703241737_VALUE3$` - 01: TOKEN201703241737_VALUE1 - 02:  - ----------------------------------------------------------------- - -42sh/local-variable/008-multiple-declaration-with-same-name (FAILED) - - Description: - The purpose of this test is to check that declaring the same variable several times in the same command line does work and does not result in error. - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_VALUE1 TOKEN201703241737_NAME=TOKEN201703241737_VALUE2 TOKEN201703241737_NAME=TOKEN201703241737_VALUE3 - 02: ./write_on_stdout $TOKEN201703241737_NAME - - STDOUT: - FAILURE expected_to_not match_regex `^TOKEN201703241737_VALUE1$` - SUCCESS expected_to_not match_regex `^TOKEN201703241737_VALUE2$` - FAILURE expected_to match_regex `^TOKEN201703241737_VALUE3$` - 01: TOKEN201703241737_VALUE1 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/local-variable/mixed/inline-environment-variable/001-local-variable-shouldnt-be-set (FAILED) - - Description: - The purpose of this test is to check that declaring a variable and specifying a binary does not result in local variable declaration but a modified environment for the command. - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_VALUE ./display_env - 02: ./write_on_stderr $TOKEN201703241737 - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737_NAME=TOKEN201703241737_VALUE$` - (no output) - - STDERR: - FAILURE expected_to_not match_regex `TOKEN201703241737_VALUE` - FAILURE expected_to match_regex `write on stderr` - 01: ../../42sh: command not found: TOKEN201703241737_NAME=TOKEN201703241737_VALUE - 02:  - ----------------------------------------------------------------- - -42sh/local-variable/mixed/redirections/001-truncating (FAILED) - - Description: - The purpose of this test is to check that a redirection can be set with a local variable as file name. - - Before test: - 01: rm -f "TOKEN201703241737_FILENAME" - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_FILENAME - 02: ./write_on_stdout TOKEN201703241737_VALUE > $TOKEN201703241737_NAME - - STDOUT: - SUCCESS expected_to be_empty - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - - MISC: - FAILURE expected_to create_file `TOKEN201703241737_FILENAME` matching_regex `^TOKEN201703241737_VALUE$` - SUCCESS expected_to exit_with_status `0` - ----------------------------------------------------------------- - -42sh/local-variable/mixed/redirections/002-appending (FAILED) - - Description: - The purpose of this test is to check that a redirection can be set with a local variable as file name. - - Before test: - 01: rm -f "TOKEN201703241737_FILENAME" - - STDIN: - 01: TOKEN201703241737_NAME=TOKEN201703241737_FILENAME - 02: ./write_on_stdout TOKEN201703241737_VALUE1 >> $TOKEN201703241737_NAME - 03: ./write_on_stdout TOKEN201703241737_VALUE2 >> $TOKEN201703241737_NAME - - STDOUT: - SUCCESS expected_to be_empty - (no output) - - STDERR: - SUCCESS expected_to be_empty - (no output) - - MISC: - FAILURE expected_to create_file `TOKEN201703241737_FILENAME` matching_regex `^TOKEN201703241737_VALUE1$` - FAILURE expected_to create_file `TOKEN201703241737_FILENAME` matching_regex `^TOKEN201703241737_VALUE2$` - SUCCESS expected_to exit_with_status `0` - ----------------------------------------------------------------- - -42sh/local-variable/mixed/tilde-expansion/001-process-tilde-expansion (FAILED) - - Description: - The purpose of this test is to check that the tilde expansion `~` in variable declaration. - - Before test: - 01: export "HOME=/TOKEN201703241737" - - STDIN: - 01: TOKEN201703241737=~ - 02: ./write_on_stdout TILDE:$TOKEN201703241737 - - STDOUT: - FAILURE expected_to_not match_regex `TILDE:~` - WARNING might match_regex `TILDE:/TOKEN201703241737` - 01: TILDE:~ - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/escaping/002-escape-double-quote-2 (FAILED) - - Description: - The purpose of this test is to check that a double-quote `"` may be preserved when it is preceded by a backslash `\\`. - - STDIN: - 01: ./write_on_stdout "TOKEN201703241737 \" TOKEN201703241737" - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737 ` TOKEN201703241737$` - 01: TOKEN201703241737 TOKEN201703241737 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/escaping/003-escape-double-quote-3 (FAILED) - - Description: - The purpose of this test is to check that a double-quote `"` may be preserved when it is preceded by a backslash `\\`. - - STDIN: - 01: ./write_on_stdout "\"" - - STDOUT: - FAILURE expected_to match_regex `^"$` - 01:  - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/escaping/004-it-results-in-error (FAILED) - - Description: - The purpose of this test is to check that using backslash `\\` before the closing double-quote `"` does result in syntax error. - - STDIN: - 01: ./write_on_stdout "TOKEN201703241737\" - - STDOUT: - SUCCESS expected_to_not match_regex `^TOKEN201703241737$` - (no output) - - STDERR: - FAILURE expected_to_not be_empty - WARNING might match_regex `([Ss]yntax|[Pp]arse) error` - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/escaping/005-it-does-not-escape-double-quote (FAILED) - - Description: - The purpose of this test is to check that using two backslashes `\\` before the symbol double-quote `"` does not result in escaped inhibitors. - - STDIN: - 01: ./write_on_stdout \\"TOKEN201703241737\\" - - STDOUT: - FAILURE expected_to match_regex `^\TOKEN201703241737\$` - 01: \TOKEN201703241737 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/globbing/brace-expansion/002-it-does-not-expand-braces-2 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout {1..2}"{1..2}" - - STDOUT: - FAILURE expected_to match_regex `1[{]1..2}@2[{]1..2}@` - 01: {1..2}{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/globbing/brace-expansion/003-it-does-not-expand-braces-3 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout "{1..2}"{1..2} - - STDOUT: - FAILURE expected_to match_regex `[{]1..2}1@[{]1..2}2@` - 01: {1..2}{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/globbing/brace-expansion/004-it-does-not-expand-braces-4 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout "{1..2}"{1..2}"{1..2}"{1..2}"{1..2}"{1..2} - - STDOUT: - FAILURE expected_to match_regex `[{]1..2}1[{]1..2}1[{]1..2}1@[{]1..2}1[{]1..2}1[{]1..2}2@[{]1..2}1[{]1..2}2[{]1..2}1@[{]1..2}1[{]1..2}2[{]1..2}2@[{]1..2}2[{]1..2}1[{]1..2}1@[{]1..2}2[{]1..2}1[{]1..2}2@[{]1..2}2[{]1..2}2[{]1..2}1@[{]1..2}2[{]1..2}2[{]1..2}2@` - 01: {1..2}{1..2}{1..2}{1..2}{1..2}{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/globbing/brace-expansion/005-it-does-not-expand-braces-5 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout "{1..2}" {1..2} "{1..2}" "{1..2}" - - STDOUT: - FAILURE expected_to match_regex `[{]1..2}@1@2@[{]1..2}@[{]1..2}@` - 01: {1..2}@{1..2}@{1..2}@{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/globbing/bracket-expansion/001-it-works-1 (FAILED) - - Description: - The purpose of this test is to check that an argument made with quoted and unquoted parts results in bracket pattern expansion. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout ["a"] - - STDOUT: - SUCCESS expected_to_not match_regex `[[]a]@` - FAILURE expected_to match_regex `^a@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/quoting/double-quotes/mixed/globbing/bracket-expansion/002-it-works-2 (FAILED) - - Description: - The purpose of this test is to check that an argument made with quoted and unquoted parts results in bracket pattern expansion. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout ["a"bc"def"gh] - - STDOUT: - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `b@` - FAILURE expected_to match_regex `c@` - FAILURE expected_to match_regex `d@` - FAILURE expected_to match_regex `e@` - FAILURE expected_to match_regex `f@` - FAILURE expected_to match_regex `g@` - FAILURE expected_to match_regex `h@` - SUCCESS expected_to_not match_regex `bc` - SUCCESS expected_to_not match_regex `def` - SUCCESS expected_to_not match_regex `gh` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/quoting/mixed/globbing/brace-expansion/001-it-does-not-expand-braces-1 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout "{1..2}"{1..2}'{1..2}'{1..2}"{1..2}"{1..2} - - STDOUT: - FAILURE expected_to match_regex `[{]1..2}1[{]1..2}1[{]1..2}1@[{]1..2}1[{]1..2}1[{]1..2}2@[{]1..2}1[{]1..2}2[{]1..2}1@[{]1..2}1[{]1..2}2[{]1..2}2@[{]1..2}2[{]1..2}1[{]1..2}1@[{]1..2}2[{]1..2}1[{]1..2}2@[{]1..2}2[{]1..2}2[{]1..2}1@[{]1..2}2[{]1..2}2[{]1..2}2@` - 01: {1..2}{1..2}{1..2}{1..2}{1..2}{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/mixed/globbing/bracket-expansion/001-it-works-1 (FAILED) - - Description: - The purpose of this test is to check that an argument made with quoted and unquoted parts results in bracket pattern expansion. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout [""'a'""] - - STDOUT: - SUCCESS expected_to_not match_regex `[[]a]@` - FAILURE expected_to match_regex `^a@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/quoting/mixed/globbing/bracket-expansion/002-it-works-2 (FAILED) - - Description: - The purpose of this test is to check that an argument made with quoted and unquoted parts results in bracket pattern expansion. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout ["a"bc'def'gh] - - STDOUT: - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `b@` - FAILURE expected_to match_regex `c@` - FAILURE expected_to match_regex `d@` - FAILURE expected_to match_regex `e@` - FAILURE expected_to match_regex `f@` - FAILURE expected_to match_regex `g@` - FAILURE expected_to match_regex `h@` - SUCCESS expected_to_not match_regex `bc` - SUCCESS expected_to_not match_regex `def` - SUCCESS expected_to_not match_regex `gh` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/quoting/mixed/variable-expansion/001-it-does-not-expand-in-quotes (FAILED) - - Description: - The purpose of this test is to check if a local variable is display correctly inside simple and double quote. - - Before test: - 01: export "TOKEN201703241737_NAME=TOKEN201703241737_VALUE" - - STDIN: - 01: ./write_on_stdout "$TOKEN201703241737_NAME"$TOKEN201703241737_NAME'$TOKEN201703241737_NAME' - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703241737_VALUETOKEN201703241737_VALUE[$]TOKEN201703241737_NAME` - 01: TOKEN201703241737_VALUEE$TOKEN201703241737_NAME - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/002-it-does-not-expand-braces-2 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout {1..2}'{1..2}' - - STDOUT: - FAILURE expected_to match_regex `1[{]1..2}@2[{]1..2}@` - 01: {1..2}{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/003-it-does-not-expand-braces-3 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout '{1..2}'{1..2} - - STDOUT: - FAILURE expected_to match_regex `[{]1..2}1@[{]1..2}2@` - 01: {1..2}{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/004-it-does-not-expand-braces-4 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout '{1..2}'{1..2}'{1..2}'{1..2}'{1..2}'{1..2} - - STDOUT: - FAILURE expected_to match_regex `[{]1..2}1[{]1..2}1[{]1..2}1@[{]1..2}1[{]1..2}1[{]1..2}2@[{]1..2}1[{]1..2}2[{]1..2}1@[{]1..2}1[{]1..2}2[{]1..2}2@[{]1..2}2[{]1..2}1[{]1..2}1@[{]1..2}2[{]1..2}1[{]1..2}2@[{]1..2}2[{]1..2}2[{]1..2}1@[{]1..2}2[{]1..2}2[{]1..2}2@` - 01: {1..2}{1..2}{1..2}{1..2}{1..2}{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/simple-quotes/mixed/globbing/brace-expansion/005-it-does-not-expand-braces-5 (FAILED) - - Description: - The purpose of this test is to check that braces expansion is not processed within quoted part of the command line. - - STDIN: - 01: ./write_all_arguments_on_stdout '{1..2}' {1..2} '{1..2}' '{1..2}' - - STDOUT: - FAILURE expected_to match_regex `[{]1..2}@1@2@[{]1..2}@[{]1..2}@` - 01: {1..2}@{1..2}@{1..2}@{1..2}@ - - STDERR: - (no output) - ----------------------------------------------------------------- - -42sh/quoting/simple-quotes/mixed/globbing/bracket-expansion/001-it-works-1 (FAILED) - - Description: - The purpose of this test is to check that an argument made with quoted and unquoted parts results in bracket pattern expansion. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout ['a'] - - STDOUT: - SUCCESS expected_to_not match_regex `[[]a]@` - FAILURE expected_to match_regex `^a@$` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/quoting/simple-quotes/mixed/globbing/bracket-expansion/002-it-works-2 (FAILED) - - Description: - The purpose of this test is to check that an argument made with quoted and unquoted parts results in bracket pattern expansion. - - Before test: - 01: rm -rf "./test_globbing" - 02: mkdir "./test_globbing" - 03: cd "./test_globbing" - 04: touch 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' - - STDIN: - 01: /Users/ariard/Projects/42sh/42ShellTester/tmp/write_all_arguments_on_stdout ['a'bc'def'gh] - - STDOUT: - FAILURE expected_to match_regex `a@` - FAILURE expected_to match_regex `b@` - FAILURE expected_to match_regex `c@` - FAILURE expected_to match_regex `d@` - FAILURE expected_to match_regex `e@` - FAILURE expected_to match_regex `f@` - FAILURE expected_to match_regex `g@` - FAILURE expected_to match_regex `h@` - SUCCESS expected_to_not match_regex `bc` - SUCCESS expected_to_not match_regex `def` - SUCCESS expected_to_not match_regex `gh` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ./lib/main.sh: line 102: ../../42sh: No such file or directory - ----------------------------------------------------------------- - -42sh/subshell/mixed/inline-environment-variable/001-modifies-the-child-environment-only-1 (FAILED) - - Description: - The purpose of this test is to check that declaring a variable and specifying a binary in a subshell does not result in local variable declaration or a modified parent shell's environment, but only a modified child's environment. - - STDIN: - 01: (TOKEN201703241737_NAME=TOKEN201703241737_VALUE ./display_env) - 02: ./display_env - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737_NAME=TOKEN201703241737_VALUE$` once - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TERM=screen-256color - 04: SHELL=/bin/zsh - 05: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 06: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 07: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 08: TERM_PROGRAM_VERSION=3.0.10 - 09: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 10: ZSH=/Users/ariard/.oh-my-zsh - 11: USER=ariard - 12: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 13: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 14: PAGER=less - 15: TMUX=/private/tmp/tmux-18965/default,73780,2 - 16: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 17: LSCOLORS=Gxfxcxdxbxegedabagacad - 18: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 19: MAIL=ariard@student.42.fr - 20: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 21: LANG=en_US.UTF-8 - 22: ITERM_PROFILE=Default - 23: XPC_FLAGS=0x0 - 24: TMUX_PANE=%9 - 25: XPC_SERVICE_NAME=0 - 26: SHLVL=4 - 27: HOME=/Users/ariard - 28: COLORFGBG=7;0 - 29: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 30: LOGNAME=ariard - 31: LESS=-R - 32: LC_CTYPE=en_US.UTF-8 - 33: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 34: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 35: _=../../42sh - 36: ?=127 - 37: ------------------------------ - 38: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - FAILURE expected_to be_empty - 01: ../../42sh: command not found: TOKEN201703241737_NAME=TOKEN201703241737_VALUE - ----------------------------------------------------------------- - -42sh/subshell/mixed/inline-environment-variable/002-modifies-the-child-environment-only-2 (FAILED) - - Description: - The purpose of this test is to check that declaring a variable and specifying a binary in a subshell does not result in local variable declaration or a modified parent shell's environment, but only a modified child's environment. - - STDIN: - 01: ( (TOKEN201703241737_NAME=TOKEN201703241737_VALUE ./display_env) ; ./display_env) ; ./display_env - 02:  - - STDOUT: - FAILURE expected_to match_regex `^TOKEN201703241737_NAME=TOKEN201703241737_VALUE$` once - 01: ------------------------------ - 02: TERM_PROGRAM=iTerm.app - 03: TERM=screen-256color - 04: SHELL=/bin/zsh - 05: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 06: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 07: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 08: TERM_PROGRAM_VERSION=3.0.10 - 09: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 10: ZSH=/Users/ariard/.oh-my-zsh - 11: USER=ariard - 12: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 13: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 14: PAGER=less - 15: TMUX=/private/tmp/tmux-18965/default,73780,2 - 16: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 17: LSCOLORS=Gxfxcxdxbxegedabagacad - 18: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 19: MAIL=ariard@student.42.fr - 20: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 21: LANG=en_US.UTF-8 - 22: ITERM_PROFILE=Default - 23: XPC_FLAGS=0x0 - 24: TMUX_PANE=%9 - 25: XPC_SERVICE_NAME=0 - 26: SHLVL=4 - 27: HOME=/Users/ariard - 28: COLORFGBG=7;0 - 29: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 30: LOGNAME=ariard - 31: LESS=-R - 32: LC_CTYPE=en_US.UTF-8 - 33: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 34: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 35: _=../../42sh - 36: ?=127 - 37: ------------------------------ - 38: TOTAL ENVIRONMENT VARIABLES: 35 - 39: ------------------------------ - 40: TERM_PROGRAM=iTerm.app - 41: TERM=screen-256color - 42: SHELL=/bin/zsh - 43: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 44: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 45: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.LmcFivfwkY/Render - 46: TERM_PROGRAM_VERSION=3.0.10 - 47: TERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 48: ZSH=/Users/ariard/.oh-my-zsh - 49: USER=ariard - 50: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.u4JR4EZzBG/Listeners - 51: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 52: PAGER=less - 53: TMUX=/private/tmp/tmux-18965/default,73780,2 - 54: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 55: LSCOLORS=Gxfxcxdxbxegedabagacad - 56: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 57: MAIL=ariard@student.42.fr - 58: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 59: LANG=en_US.UTF-8 - 60: ITERM_PROFILE=Default - 61: XPC_FLAGS=0x0 - 62: TMUX_PANE=%9 - 63: XPC_SERVICE_NAME=0 - 64: SHLVL=4 - 65: HOME=/Users/ariard - 66: COLORFGBG=7;0 - 67: ITERM_SESSION_ID=w0t0p1:D3D230F7-7E75-4A5C-B793-6A5C4DAD3F83 - 68: LOGNAME=ariard - 69: LESS=-R - 70: LC_CTYPE=en_US.UTF-8 - 71: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 72: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester - 73: _=../../42sh - 74: ?=0 - 75: ------------------------------ - 76: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - FAILURE expected_to be_empty - 01: ../../42sh: command not found: TOKEN201703241737_NAME=TOKEN201703241737_VALUE - -Total tests: 162 -Total failed tests: 92 -Total pending tests: 0 diff --git a/42sh/auteur b/42sh/auteur index 127f9bf3..b0e9923f 100644 --- a/42sh/auteur +++ b/42sh/auteur @@ -1,5 +1 @@ -alao -ariard -gwojda jhalford -wescande diff --git a/42sh/donovan_segaults_06-02 b/42sh/donovan_segaults_06-02 deleted file mode 100644 index f8217daf..00000000 --- a/42sh/donovan_segaults_06-02 +++ /dev/null @@ -1,533 +0,0 @@ -ls -cat -`ls` -` -`ls` -`ls` -`ls` -cat * -ls * -echo "*" -echo * -echo */* -ls -make -make -ls -ls | cat -ls | cat -e -`ls` -`ls` -`ls` -`ls` -`ls` -`ls` -`ls` -`ls` -ls -`ls` -echo `ls -l` -(ls) -`ls` -` -`ls` -` -` -` -` -` -` -(ls)) -(ls)) -(ls)) -` -( -`ls` -`ls` -`ls` -ls -` -ls -`ls` -` -) -(vim)) -ls -`ls` -`l` -ls -ls -ls -`ls` -ls -`ls` -ls m -ls m 2>/dev/null -ls -ls >/dev/null -ls m -ls m 2>&1 -ls m -ls m >/dev/null -ls m 2>/dev/null -ls m 2>&- -ls m -ls m 2>&- -ls -ls 1>/dev/null -ls merde -ls merde 2>/dev/null -ls merde 1>/dev/null -ls merde 3>/dev/null -ls merde 2>/dev/null -ls 2>/dev/null -ls -ls >/dev/null -ls >/dev/null -ls >/dev/null -ls >/dev/null -ls >/dev/null -ls >/dev/null -ls 1>/dev/null -ls 1>/dev/null -ls merde -ls merde >/dev/null -ls merde 2>/dev/null -ls merde 2>&- -ls merde 2<&- -ls merde 2<&- -ls merde 2<&- -ls -ls >&- -ls >&- -ls 2>&- -ls m 2>&- -ls -ls 1>&2 2>&- -ls 2>&- 1>&2 -ls 2>&- 1>&2 -ls 1>&2 2>&- -ls 1>&2 2>&- -ls 2>&- 1>&2 -ls 1>&2 -ls 1>&2 1>&- -ls 1>&- 1>&2 -ls 2>&- 1>&2 -ls 1>&- 2>&- -ls 1>&2- 2>&- -ls 1>&2 2>&- -ls 2>&- 1>&2 -ls 1>&2- -ls 1>&2 -ls 1>&2 1>&- -ls 1>&- 1>&2 -ls 1>&- 1>&2 -ls 2>&- -ls 2>&- 1>&- -ls 2>&- 1>&2 -ls 2>&- 1>&2 -ls 2>&- 1>&2 -ls 2>&- 1>&2 -ls 2>&- 1>&- -ls 2>&- 1>&- -ls 2>&- 1>&2 -ls 1>&2 2>&- - -ls -ls 2>&- -ls 2>&- 1>&2 -ls - -ls - -ls - -ls - ls -ls - ls - ls - - - ls -ls - -ls - - - - - - ls - -`ls` -` ` -`` `` -echo `ls``ls` -echo `ls` `ls` -`ls``ls` -a`ls` -`ls`` -`ls``ls` -`` -``` -```` -`` ``` -`` `` -```` -`` -`` -` -`` -ls -`` -` -make -`` -```` -`` `` -```` -`` `` -` -`` -```` -`` `` -```` -`` -`` -```` -```` -```` -```` -a`ls` echo `ls` -echo `ls` -echo `ls` -a`ls` -a`ls` -a`ls` -a`ls` -a`ls` -a`ls | wc` -ls - ls - ls -ls | cat - - -ls - -`` -` ` -```` -`` `` -cd -ls -alalalalal`ls` - - - 1 - ` - `` - ` ` -(vim)& `ls` -jobs -fg -fg -jobs -l -kill -9 80401 -jobs -jobs -fg -vim& -jobs -ls -vim& -ls& -jobs -fg -jobs -ls& -jobs -jobs -l -ls -ls& -jobs -vim -jobs -jobs -ls -ls& -jobs -ls& -jobs -vim& -fg -ls -a`la` -ls - -ls -ls - - -```` ```` `` -ls - -ls -ls >&- -ls >&waf- -ls >&24- -ls -{} -{()} -({}) -{(ls)} -() -ls -read -n 4 -read -n 5 -echo $REPLY -read -n 4 -l -read -n 4 -read - n5 -read -n 5 -echo $REPLY | cat -e -echo $REPLY -read -n 5 -echo $REPLY -read -n 3 -echo $REPLY -read -n 3 -echo $REPLY -read -n -s -read -n 2 -s -read -s -ls -read -n 3 -echo $REPLY -echo $REPLY | cat -e -echo $PATH -read -n 10 -echo $REPLY -read -n 10 -echo $REPLY -(ls) -(ls)l -(ls) -(ls)l -(ls) -(ls)l -{()} -{} -42sh_cpy > wc -l < Makefile -42sh_cpy > wc -l > Makefile -wc -l < Makefile -cat out1 -ls out -ls < out -ls > out -ls < out -ls>out -lsout -lsout -lsout -lsout -lsout -cat out -lsout -lsout -lsout -cat out -ls>out -lsout -rm out -ls >out -ls -l -ls out -ls -lsout -lsout -cat out -ls>out -make -ls>out -ls&- -ls -ls >&2 2>&- -ls > out -rm out -ls > out -ls -l -ls >out -; -l -ls -ls>out -cat out -wc -l out -ls -l >out -catout -cat out -cat out -lsout -lsout -wc -l file1 -cat file1 -cat file1 -cat file1 -cat out -wc -l &- 1>&2 -cat -cat /dev/random|base64|head -c 8 & -cat /dev/random|base64|head -c 8 -ls -stty -stty -a -ls -cat -ls 'abc -def' -ls 'abc -' -ls >&- -ls 2>&- -ls mm 2>&- -ls mm 2>&- -cd >&- -./a.out -ls -./a.out -./42sh -pwd -/Users/jhalford/minishell/a.out -ls | /Users/jhalford/minishell/a.out -/a | cat /dev/random | base64 > /dev/null -./42sh -sleep 66666 & -jobs -echo '\ - -' -ls \ - -ls '\' -ls "\" -\ - -\ -\ -\ -\ -\\ -\\ -abc\ -def -l\ -s -ls 3>&- -ls >&3 -ls -- -1>file3 -ls -- 9>file3 -ls -- 10>file3 -ls -- 9999999999999999999999999999999999999999999999999999999>file3 -ls -- 2147483648>file3 -ls -- 2147483647>file3 -ls -- >&2147483648 -ls -- >&2147483649 -ulimit -a -& -\\ \ \\\ -${$(})} ${$((}))} ${`}`} ${${a}} -( ls # ) -ls&&ls;ls||ls; -ls&&ls;ls||ls -echo a && echo b; -echo a || echo b; -echo a ||; echo b; -echo a; || echo b; -(ls;) ; -ls ;; ls -` ( echo "(ls" )` -` ( echo "(ls(" )` -` ( echo "(ls((" )` -`echo "ls -l"` -` echo "ls `echo .`"` diff --git a/42sh/minishell_error b/42sh/minishell_error deleted file mode 100644 index 883caec1..00000000 --- a/42sh/minishell_error +++ /dev/null @@ -1,332 +0,0 @@ -...x...~......xx....~.~.~......x....x.....x........... - ----------------------------------------------------------------- - -minishell/binary/004-binary-test-empty-path (FAILED) - - Description: - The purpose of this test is to check that the Shell finds binaries that are located in the current directory when the environment variable PATH is empty. - - Before test: - 01: export PATH="" - - STDIN: - 01: write_on_stdout "TOKEN201703242314" - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703242314` - (no output) - - STDERR: - FAILURE expected_to be_empty - 01: ../../42sh: command not found: write_on_stdout - - MISC: - FAILURE expected_to exit_with_status `0` - ----------------------------------------------------------------- - -minishell/binary/008-binary-too-many-symbolic-links-encountered (WARNING) - - Description: - The purpose of this test is to check that trying to execute a path that encounters an infinite loop of symbolic link results in an error on standard error and a failure exit status. - - Before test: - 01: rm -rf ./symbolic_link1 ./symbolic_link2 ./symbolic_link3 - 02: ln -s ./symbolic_link1 ./symbolic_link2 - 03: ln -s ./symbolic_link2 ./symbolic_link3 - 04: ln -s ./symbolic_link3 ./symbolic_link1 - - STDIN: - 01: ./symbolic_link1 - - STDOUT: - SUCCESS might be_empty - (no output) - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Tt]oo many.*symbolic links` - 01: ../../42sh: ./symbolic_link1: no such file or directory - - MISC: - SUCCESS expected_to_not exit_with_status 0 - ----------------------------------------------------------------- - -minishell/builtins/cd/007-symbolic-link (FAILED) - - Description: - The purpose of this test is to check that using a symbolic link as first argument with the builtin `cd` results in moving the linked directory. - - Before test: - 01: rm -f "./symbolic_link" - 02: mkdir -p "./sub_directory" - 03: ln -s "./sub_directory" "./symbolic_link" - - STDIN: - 01: cd symbolic_link - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - 03: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_env - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD$` - FAILURE expected_to match_regex `^PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/symbolic_link$` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD - 02: ------------------------------ - 03: TERM_PROGRAM=iTerm.app - 04: TERM=screen-256color - 05: SHELL=/bin/zsh - 06: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 07: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 08: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.UJksyURLXc/Render - 09: TERM_PROGRAM_VERSION=3.0.10 - 10: TERM_SESSION_ID=w0t0p0:162D7F62-BEB1-405A-B3D5-E18A8A96E577 - 11: ZSH=/Users/ariard/.oh-my-zsh - 12: USER=ariard - 13: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.zEo8Maujhn/Listeners - 14: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 15: PAGER=less - 16: TMUX=/private/tmp/tmux-18965/default,22653,2 - 17: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 18: LSCOLORS=Gxfxcxdxbxegedabagacad - 19: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 20: MAIL=ariard@student.42.fr - 21: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory - 22: LANG=en_US.UTF-8 - 23: ITERM_PROFILE=Default - 24: XPC_FLAGS=0x0 - 25: TMUX_PANE=%9 - 26: XPC_SERVICE_NAME=0 - 27: SHLVL=4 - 28: HOME=/Users/ariard - 29: COLORFGBG=7;0 - 30: ITERM_SESSION_ID=w0t0p0:162D7F62-BEB1-405A-B3D5-E18A8A96E577 - 31: LOGNAME=ariard - 32: LESS=-R - 33: LC_CTYPE=en_US.UTF-8 - 34: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 35: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 36: _=../../42sh - 37: ?=0 - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -minishell/builtins/cd/008-symbolic-link-2 (FAILED) - - Description: - The purpose of this test is to check that using a symbolic link as first argument with the builtin `cd` results in moving to the linked directory. In this test, the directory is linked with to chained symbolic links. - - Before test: - 01: rm -f "./symbolic_link1" "./symbolic_link2" - 02: mkdir -p "./sub_directory" - 03: ln -s "./sub_directory" "./symbolic_link1" - 04: ln -s "./symbolic_link1" "./symbolic_link2" - - STDIN: - 01: cd symbolic_link2 - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - 03: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_env - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD$` - FAILURE expected_to match_regex `^PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/symbolic_link2$` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory:PWD - 02: ------------------------------ - 03: TERM_PROGRAM=iTerm.app - 04: TERM=screen-256color - 05: SHELL=/bin/zsh - 06: HOMEBREW_TEMP=/tmp/ariard/Homebrew/Temp - 07: TMPDIR=/var/folders/zz/zyxvpxvq6csfxvn_n0002_2m000khn/T/ - 08: Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.UJksyURLXc/Render - 09: TERM_PROGRAM_VERSION=3.0.10 - 10: TERM_SESSION_ID=w0t0p0:162D7F62-BEB1-405A-B3D5-E18A8A96E577 - 11: ZSH=/Users/ariard/.oh-my-zsh - 12: USER=ariard - 13: SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.zEo8Maujhn/Listeners - 14: __CF_USER_TEXT_ENCODING=0x4A15:0x0:0x0 - 15: PAGER=less - 16: TMUX=/private/tmp/tmux-18965/default,22653,2 - 17: HOMEBREW_CACHE=/tmp/ariard/Homebrew/Caches - 18: LSCOLORS=Gxfxcxdxbxegedabagacad - 19: PATH=/Users/ariard/.brew/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/munki://Users/ariard/local/bin - 20: MAIL=ariard@student.42.fr - 21: PWD=/Users/ariard/Projects/42sh/42ShellTester/tmp/sub_directory - 22: LANG=en_US.UTF-8 - 23: ITERM_PROFILE=Default - 24: XPC_FLAGS=0x0 - 25: TMUX_PANE=%9 - 26: XPC_SERVICE_NAME=0 - 27: SHLVL=4 - 28: HOME=/Users/ariard - 29: COLORFGBG=7;0 - 30: ITERM_SESSION_ID=w0t0p0:162D7F62-BEB1-405A-B3D5-E18A8A96E577 - 31: LOGNAME=ariard - 32: LESS=-R - 33: LC_CTYPE=en_US.UTF-8 - 34: TMUX_PLUGIN_MANAGER_PATH=/Users/ariard/.tmux/plugins/ - 35: OLDPWD=/Users/ariard/Projects/42sh/42ShellTester/tmp - 36: _=../../42sh - 37: ?=0 - 38: ------------------------------ - 39: TOTAL ENVIRONMENT VARIABLES: 35 - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -minishell/builtins/cd/errors/001-not-a-directory (WARNING) - - Description: - The purpose of this test is to check that using a file name as first argument with the builtin `cd` results in error and not changing current directory. - - Before test: - 01: touch "./not_a_directory" - - STDIN: - 01: cd not_a_directory - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Nn]ot a directory` - 01: ../../42sh: cd: no such file or directory: not_a_directory - ----------------------------------------------------------------- - -minishell/builtins/cd/errors/003-permission-denied (WARNING) - - Description: - The purpose of this test is to check that using a directory without any permission as first argument with the builtin `cd` results in error and not changing current directory. - - Before test: - 01: if [ -d "./permission_denied" ]; then chmod 777 "./permission_denied"; fi - 02: rm -rf "./permission_denied" - 03: mkdir -m 0 "./permission_denied" - - STDIN: - 01: cd permission_denied - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Pp]ermission denied` - 01: ../../42sh: cd: no such file or directory: permission_denied - - After test: - 01: if [ -d "./permission_denied" ]; then chmod 777 "./permission_denied"; fi - 02: rm -rf "./permission_denied" - ----------------------------------------------------------------- - -minishell/builtins/cd/errors/005-too-many-symbolic-links-encountered (WARNING) - - Description: - The purpose of this test is to check that using a symbolic link resulting in ELOOP error as first argument with the builtin `cd` results in error and not changing current directory. - - Before test: - 01: rm -f "./symbolic_link1" "./symbolic_link2" "./symbolic_link3" - 02: ln -s "./symbolic_link1" "./symbolic_link2" - 03: ln -s "./symbolic_link2" "./symbolic_link3" - 04: ln -s "./symbolic_link3" "./symbolic_link1" - - STDIN: - 01: cd symbolic_link1 - 02: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - - STDOUT: - SUCCESS expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD` - 01: PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Tt]oo many.*symbolic links` - 01: ../../42sh: cd: no such file or directory: symbolic_link1 - ----------------------------------------------------------------- - -minishell/builtins/cd/options/002-oldpwd (FAILED) - - Description: - The purpose of this test is to check that using `-` as first argument with the builtin `cd` results in moving the previous current directory. - - STDIN: - 01: cd / - 02: cd - - 03: /Users/ariard/Projects/42sh/42ShellTester/tmp/display_pwd - - STDOUT: - FAILURE expected_to match_regex `PWD:/Users/ariard/Projects/42sh/42ShellTester/tmp:PWD` - 01: /Users/ariard - 02: PWD:/Users/ariard:PWD - - STDERR: - SUCCESS expected_to be_empty - (no output) - ----------------------------------------------------------------- - -minishell/builtins/env/errors/001-command-not-found (FAILED) - - Description: - The purpose of this test is to check that using the builtin `env` with an invalid binary as argument results in an error and failure exit status. - - Before test: - 01: rm -f "./invalid_binary" - - STDIN: - 01: env ./invalid_binary - - STDOUT: - (no output) - - STDERR: - SUCCESS expected_to_not be_empty - WARNING might match_regex `[Cc]ommand not found` - 01: ../../42sh: env: ./invalid_binary: No such file or directory - - MISC: - FAILURE expected_to_not exit_with_status `0` - ----------------------------------------------------------------- - -minishell/builtins/exit/errors/001-too-many-args (FAILED) - - Description: - The purpose of this test is to check that using a wrong number of arguments with the builtin `exit` does not result in the Shell termination but an error on standard error. - - STDIN: - 01: exit 21 42 - 02: ./write_on_stdout TOKEN201703242314 - - STDOUT: - FAILURE expected_to match_regex `TOKEN201703242314` - (no output) - - STDERR: - FAILURE expected_to_not be_empty - WARNING might match_regex `([Tt]oo many arguments|[Aa]rgument list too long)` - (no output) - - MISC: - FAILURE expected_to exit_with_status `0` - -Total tests: 54 -Total failed tests: 6 -Total pending tests: 0 diff --git a/42sh/scriptheader.sh b/42sh/scriptheader.sh deleted file mode 100755 index aec703b0..00000000 --- a/42sh/scriptheader.sh +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/sh -verbose=0 -if [ "$1" = "-v" ] -then - verbose=1 -fi -word=$(git status -s | sed 's/.* //') -red="\033[38;5;1m" -gre="\033[38;5;2m" -cya="\033[38;5;6m" -res="\033[0m" - -elem_in_array () -{ - for cur in $2 - do - if [ "$1" = "$cur" ] - then - echo "1" - return 1 - fi - done - echo "0" - return 0 -} - -array_in_array () -{ - for cur in $1 - do - match=$(elem_in_array "$cur" "$2") - if [ "$match" -ne 1 ] - then - echo "0" - return 0 - fi - done - echo "1" - return 1 -} - -confirm () -{ - echo "$cya${1:-Are you sure? [y/N]}$res" - read -r -p " " response - case "$response" in - [yY][eE][sS]|[yY]) - true - ;; - *) - false - ;; - esac -} - -do_checkout () -{ - i_tmp=$(echo $i | sed 's/\//_/g') - cp $i "$HOME/Documents/.$i_tmp.back" - git checkout $i - if [ $verbose -eq 1 ] - then - echo "$gre D - O - N - E $res" - echo "$cya $i was checked out. A copy still exist in $HOME/Documents/.$i_tmp.back$res\n" - fi -} - -if [ $verbose -eq 1 ] -then - for i in $word - do - if [ -e $i ] - then - if [ -f $i ] - then - diff=$(git diff -U0 --exit-code --color $i) - if [ "$?" -eq 1 ] - then - nb_lines=$(echo "$diff" | wc -l) - if [ "$nb_lines" -eq 7 ] - then - match=$(array_in_array "-9 +9 Updated: by ### ########.fr" "$diff") - if [ $match -eq 1 ] - then - echo "\n$cya CHANGES on $i :$res" - echo "$diff" - confirm - if [ $? -eq 0 ] - then - do_checkout - else - echo "$cya Nothing done for $i$res\n" - fi - else - echo "$gre$i is not concerned (diff on the good lines)$res" - fi - else - echo "$gre$i is not concerned (diff is too big)$res" - fi - else - echo "$gre$i is not concerned (diff is null)$res" - fi - else - echo "$red$i is not a regular file$res" - fi - else - echo "$red$i doesn't exist$res" - fi - done -else - for i in $word - do - if [ -e $i ] - then - if [ -f $i ] - then - diff=$(git diff -U0 --exit-code --color $i) - if [ "$?" -eq 1 ] - then - nb_lines=$(echo "$diff" | wc -l) - if [ "$nb_lines" -eq 7 ] - then - match=$(array_in_array "-9 +9 Updated: by ### ########.fr" "$diff") - if [ $match -eq 1 ] - then - do_checkout - fi - fi - fi - fi - fi - done -fi diff --git a/42sh/update_makefile.sh b/42sh/update_makefile.sh deleted file mode 100755 index 0a4660f5..00000000 --- a/42sh/update_makefile.sh +++ /dev/null @@ -1,17 +0,0 @@ -MYPATH=$(pwd) -CUR_MAKEFILE=$MYPATH/Makefile -if [ -e $CUR_MAKEFILE ] -then - echo "regenerate Makefile" - sed "`grep -n 'SRC_BASE =' $CUR_MAKEFILE | sed 's/:.*//'`, \$d" $CUR_MAKEFILE > NEWMAKEFILE - grep 'SRC_BASE =' $CUR_MAKEFILE >> NEWMAKEFILE - expr "$(find ./src | grep "\.c$" | sed -e 's/src\///' -e 's/\.\///' -e 's/$/\\/')" : "\(.*\).$" >> NEWMAKEFILE - echo "" >> NEWMAKEFILE - grep 'SRCS =' $CUR_MAKEFILE >> NEWMAKEFILE - sed "1, `grep -n 'SRCS =' $CUR_MAKEFILE | sed 's/:.*//'`d" $CUR_MAKEFILE >> NEWMAKEFILE - mv $CUR_MAKEFILE ~/Documents/.OLDMakefile - mv NEWMAKEFILE $CUR_MAKEFILE - echo "Makefile done (copy still alive in ~/Documents/.OLDMakefile)" -else - echo "Makefile not found." -fi From 66990a201b88669e41fa37cd2c443ece28ffff43 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 21:34:15 +0100 Subject: [PATCH 03/17] removed sample scripts --- 42sh/sample/brace | 1 - 42sh/sample/case.sh | 8 -------- 42sh/sample/comment.sh | 2 -- 42sh/sample/for.sh | 4 ---- 42sh/sample/func.sh | 5 ----- 42sh/sample/if.sh | 9 --------- 42sh/sample/if/02_if_elif.sh | 10 ---------- 42sh/sample/if/03_if_else.sh | 5 ----- 42sh/sample/if/04_if_elseelsif.sh | 11 ----------- 42sh/sample/infinite.sh | 2 -- 42sh/sample/laurier.sh | 6 ------ 42sh/sample/ls | 1 - 42sh/sample/mix/mix.sh | 21 --------------------- 42sh/sample/multiredir | 3 --- 42sh/sample/redir/redir.sh | 1 - 42sh/sample/stack.sh | 3 --- 42sh/sample/subshell/subshell01.sh | 2 -- 42sh/sample/subshell_pipe | 10 ---------- 42sh/sample/until.sh | 8 -------- 42sh/sample/until/01_until.sh | 11 ----------- 42sh/sample/until2.sh | 11 ----------- 42sh/sample/var_01.sh | 1 - 42sh/sample/while.sh | 12 ------------ 42sh/sample/while/while01.sh | 11 ----------- 42sh/sample/while/while02.sh | 5 ----- 42sh/sample/while/while03.sh | 5 ----- 42sh/sample/while2.sh | 16 ---------------- 42sh/sample/while_error.sh | 6 ------ 42sh/sample/yale/yale0.ex | 1 - 42sh/sample/yale/yale1.ex | 1 - 42sh/sample/yale/yale2.ex | 1 - 42sh/sample/yale/yale3.ex | 1 - 42sh/sample/yale/yale5.ex | 1 - 42sh/sample/yale1.sh | 1 - 34 files changed, 196 deletions(-) delete mode 100644 42sh/sample/brace delete mode 100644 42sh/sample/case.sh delete mode 100644 42sh/sample/comment.sh delete mode 100644 42sh/sample/for.sh delete mode 100644 42sh/sample/func.sh delete mode 100644 42sh/sample/if.sh delete mode 100644 42sh/sample/if/02_if_elif.sh delete mode 100644 42sh/sample/if/03_if_else.sh delete mode 100644 42sh/sample/if/04_if_elseelsif.sh delete mode 100644 42sh/sample/infinite.sh delete mode 100644 42sh/sample/laurier.sh delete mode 100644 42sh/sample/ls delete mode 100644 42sh/sample/mix/mix.sh delete mode 100644 42sh/sample/multiredir delete mode 100644 42sh/sample/redir/redir.sh delete mode 100644 42sh/sample/stack.sh delete mode 100644 42sh/sample/subshell/subshell01.sh delete mode 100644 42sh/sample/subshell_pipe delete mode 100644 42sh/sample/until.sh delete mode 100644 42sh/sample/until/01_until.sh delete mode 100644 42sh/sample/until2.sh delete mode 100644 42sh/sample/var_01.sh delete mode 100644 42sh/sample/while.sh delete mode 100644 42sh/sample/while/while01.sh delete mode 100644 42sh/sample/while/while02.sh delete mode 100644 42sh/sample/while/while03.sh delete mode 100644 42sh/sample/while2.sh delete mode 100644 42sh/sample/while_error.sh delete mode 100644 42sh/sample/yale/yale0.ex delete mode 100644 42sh/sample/yale/yale1.ex delete mode 100644 42sh/sample/yale/yale2.ex delete mode 100644 42sh/sample/yale/yale3.ex delete mode 100644 42sh/sample/yale/yale5.ex delete mode 100644 42sh/sample/yale1.sh diff --git a/42sh/sample/brace b/42sh/sample/brace deleted file mode 100644 index 54b84d56..00000000 --- a/42sh/sample/brace +++ /dev/null @@ -1 +0,0 @@ -{ ls | cat } diff --git a/42sh/sample/case.sh b/42sh/sample/case.sh deleted file mode 100644 index 14b13108..00000000 --- a/42sh/sample/case.sh +++ /dev/null @@ -1,8 +0,0 @@ -case van in - ( "bus" ) echo Hello world ;; - ( "velo" ) echo Comment va ;; - ( "van" ) case tutu in - ( toto ) pwd ;; - ( tutu ) ls ;; - esac ;; -esac diff --git a/42sh/sample/comment.sh b/42sh/sample/comment.sh deleted file mode 100644 index 0680845f..00000000 --- a/42sh/sample/comment.sh +++ /dev/null @@ -1,2 +0,0 @@ -ls # Da comment -pwd diff --git a/42sh/sample/for.sh b/42sh/sample/for.sh deleted file mode 100644 index c38dab32..00000000 --- a/42sh/sample/for.sh +++ /dev/null @@ -1,4 +0,0 @@ -for i in hello bonjour salut comment -do - echo $i | cat -e -done diff --git a/42sh/sample/func.sh b/42sh/sample/func.sh deleted file mode 100644 index fefce167..00000000 --- a/42sh/sample/func.sh +++ /dev/null @@ -1,5 +0,0 @@ -hello() ( - echo HELLO -) - -hello diff --git a/42sh/sample/if.sh b/42sh/sample/if.sh deleted file mode 100644 index 198b0a62..00000000 --- a/42sh/sample/if.sh +++ /dev/null @@ -1,9 +0,0 @@ -if cat wef4eeef -then - echo Conditon 1 -elif cat yulu -then - echo Condition 2 -else - echo Condition 3 -fi diff --git a/42sh/sample/if/02_if_elif.sh b/42sh/sample/if/02_if_elif.sh deleted file mode 100644 index ae93a37e..00000000 --- a/42sh/sample/if/02_if_elif.sh +++ /dev/null @@ -1,10 +0,0 @@ -if ls ; -then - pwd -elif ls -then - pwd -elif ls -then - pwd -fi diff --git a/42sh/sample/if/03_if_else.sh b/42sh/sample/if/03_if_else.sh deleted file mode 100644 index a02520e0..00000000 --- a/42sh/sample/if/03_if_else.sh +++ /dev/null @@ -1,5 +0,0 @@ -if cat yolo ; -then - pwd -else ls -fi diff --git a/42sh/sample/if/04_if_elseelsif.sh b/42sh/sample/if/04_if_elseelsif.sh deleted file mode 100644 index a52c07e3..00000000 --- a/42sh/sample/if/04_if_elseelsif.sh +++ /dev/null @@ -1,11 +0,0 @@ -if cat yolo ; -then - pwd -elif ls -then - pwd -elif pwd -then - ls -else ls -fi diff --git a/42sh/sample/infinite.sh b/42sh/sample/infinite.sh deleted file mode 100644 index 740015ae..00000000 --- a/42sh/sample/infinite.sh +++ /dev/null @@ -1,2 +0,0 @@ -echo "echo hello" >> sample/infinite.sh -echo hello diff --git a/42sh/sample/laurier.sh b/42sh/sample/laurier.sh deleted file mode 100644 index 9e88cdd1..00000000 --- a/42sh/sample/laurier.sh +++ /dev/null @@ -1,6 +0,0 @@ -read -p "Quel est ton login ?" login -while [ 1 ] -do - echo "Tu es le meilleur codeur de l'ecole $login" - sleep 1 -done diff --git a/42sh/sample/ls b/42sh/sample/ls deleted file mode 100644 index 9e2740c6..00000000 --- a/42sh/sample/ls +++ /dev/null @@ -1 +0,0 @@ -ls diff --git a/42sh/sample/mix/mix.sh b/42sh/sample/mix/mix.sh deleted file mode 100644 index 795c1e37..00000000 --- a/42sh/sample/mix/mix.sh +++ /dev/null @@ -1,21 +0,0 @@ -if ls -then - pwd ; echo "Salut" - while ls - do - until pwd - do - echo KO SI JE M AFFICHE - done - if cat faux - then - echo BONJOUR MAKEFILE - elif [ -f Makefile ] - then - echo BONJOUR MAKEFILE - else - echo KO SI JE M M AFFICHE - fi - echo "Encore une" - done -fi diff --git a/42sh/sample/multiredir b/42sh/sample/multiredir deleted file mode 100644 index 0350bb6f..00000000 --- a/42sh/sample/multiredir +++ /dev/null @@ -1,3 +0,0 @@ -cat < file1 < file2 > file3 > file4 - - diff --git a/42sh/sample/redir/redir.sh b/42sh/sample/redir/redir.sh deleted file mode 100644 index 8b137891..00000000 --- a/42sh/sample/redir/redir.sh +++ /dev/null @@ -1 +0,0 @@ - diff --git a/42sh/sample/stack.sh b/42sh/sample/stack.sh deleted file mode 100644 index 5b2b1f27..00000000 --- a/42sh/sample/stack.sh +++ /dev/null @@ -1,3 +0,0 @@ -cat && ls || ls | cat && ls | cat || ls - - diff --git a/42sh/sample/subshell/subshell01.sh b/42sh/sample/subshell/subshell01.sh deleted file mode 100644 index f1f04671..00000000 --- a/42sh/sample/subshell/subshell01.sh +++ /dev/null @@ -1,2 +0,0 @@ -(ls | cat -pwd ; ls) diff --git a/42sh/sample/subshell_pipe b/42sh/sample/subshell_pipe deleted file mode 100644 index 36c34cd1..00000000 --- a/42sh/sample/subshell_pipe +++ /dev/null @@ -1,10 +0,0 @@ -echo aaa \ - | (echo bbb 1; cat -e ;echo ccc 1) \ - | (echo bbb 2; cat -e ;echo ccc 2) \ - | (echo bbb 3; cat -e ;echo ccc 3) \ - | (echo bbb 4; cat -e ;echo ccc 4) \ - | (echo bbb 5; cat -e ;echo ccc 5) \ - | (echo bbb 6; cat -e ;echo ccc 6) \ - | (echo bbb 7; cat -e ;echo ccc 7) \ - | (echo bbb 8; cat -e ;echo ccc 8) \ - | (echo bbb 9; cat -e ;echo ccc 9) diff --git a/42sh/sample/until.sh b/42sh/sample/until.sh deleted file mode 100644 index c9394c45..00000000 --- a/42sh/sample/until.sh +++ /dev/null @@ -1,8 +0,0 @@ -until [ 1 ] -do - echo LOOP1 - until [ 1 ] - do - echo hello - done -done > file1 diff --git a/42sh/sample/until/01_until.sh b/42sh/sample/until/01_until.sh deleted file mode 100644 index 2a531998..00000000 --- a/42sh/sample/until/01_until.sh +++ /dev/null @@ -1,11 +0,0 @@ -until cat wefwef -do - until ls - do - pwd ; ls - done - until cat eqwfewf - do - ls | cat - done -done diff --git a/42sh/sample/until2.sh b/42sh/sample/until2.sh deleted file mode 100644 index a8a568d1..00000000 --- a/42sh/sample/until2.sh +++ /dev/null @@ -1,11 +0,0 @@ -ONE=0 -while [ $ONE -le 10 ] -do - TWO=0 - while [ $TWO -le 10 ] - do - echo world - math TWO + 1; - done - math ONE + 1; -done > file1 diff --git a/42sh/sample/var_01.sh b/42sh/sample/var_01.sh deleted file mode 100644 index d77e8f12..00000000 --- a/42sh/sample/var_01.sh +++ /dev/null @@ -1 +0,0 @@ -HELLO=WORLD diff --git a/42sh/sample/while.sh b/42sh/sample/while.sh deleted file mode 100644 index d0fd226b..00000000 --- a/42sh/sample/while.sh +++ /dev/null @@ -1,12 +0,0 @@ -while - while - while ls | cat - do - ls - done - do - ls | cat - done -do - pwd -done diff --git a/42sh/sample/while/while01.sh b/42sh/sample/while/while01.sh deleted file mode 100644 index 403f8702..00000000 --- a/42sh/sample/while/while01.sh +++ /dev/null @@ -1,11 +0,0 @@ -while ls -do - while cat rwgwghe - do - echo Hello World - done - while pwd - do - echo Bonjour ca va - done -done diff --git a/42sh/sample/while/while02.sh b/42sh/sample/while/while02.sh deleted file mode 100644 index 49c24084..00000000 --- a/42sh/sample/while/while02.sh +++ /dev/null @@ -1,5 +0,0 @@ -ls -while [ 1 ] ; -do - ls | cat -done diff --git a/42sh/sample/while/while03.sh b/42sh/sample/while/while03.sh deleted file mode 100644 index 599bc530..00000000 --- a/42sh/sample/while/while03.sh +++ /dev/null @@ -1,5 +0,0 @@ -ls -for HELLLO in yolo ; -do - ls -done > file1 diff --git a/42sh/sample/while2.sh b/42sh/sample/while2.sh deleted file mode 100644 index 6549f933..00000000 --- a/42sh/sample/while2.sh +++ /dev/null @@ -1,16 +0,0 @@ -ONE=11 -while [ $ONE -gt 1 ] -do - TWO=11 - while [ $TWO -gt 1 ] - do - THREE=11 - while [ $THREE -gt 1 ] - do - echo hello - ((THREE--)) - done - ((TWO--)) - done - ((ONE--)) -done > file1 diff --git a/42sh/sample/while_error.sh b/42sh/sample/while_error.sh deleted file mode 100644 index c8102bb8..00000000 --- a/42sh/sample/while_error.sh +++ /dev/null @@ -1,6 +0,0 @@ -echo hello -while || -do - pwd ; -done -ls | cat diff --git a/42sh/sample/yale/yale0.ex b/42sh/sample/yale/yale0.ex deleted file mode 100644 index 8d12c570..00000000 --- a/42sh/sample/yale/yale0.ex +++ /dev/null @@ -1 +0,0 @@ -< A B | ( C 2> D & E < F ) > G ; H=I J K diff --git a/42sh/sample/yale/yale1.ex b/42sh/sample/yale/yale1.ex deleted file mode 100644 index 372d7e63..00000000 --- a/42sh/sample/yale/yale1.ex +++ /dev/null @@ -1 +0,0 @@ -< A B | C | D | E > F diff --git a/42sh/sample/yale/yale2.ex b/42sh/sample/yale/yale2.ex deleted file mode 100644 index 71e5a6d8..00000000 --- a/42sh/sample/yale/yale2.ex +++ /dev/null @@ -1 +0,0 @@ - A && B || C && D diff --git a/42sh/sample/yale/yale3.ex b/42sh/sample/yale/yale3.ex deleted file mode 100644 index 260a8b62..00000000 --- a/42sh/sample/yale/yale3.ex +++ /dev/null @@ -1 +0,0 @@ -A ; B & C ; D || E diff --git a/42sh/sample/yale/yale5.ex b/42sh/sample/yale/yale5.ex deleted file mode 100644 index 4cd3a71e..00000000 --- a/42sh/sample/yale/yale5.ex +++ /dev/null @@ -1 +0,0 @@ -(A ; B &) | (C || D) && E diff --git a/42sh/sample/yale1.sh b/42sh/sample/yale1.sh deleted file mode 100644 index 8b137891..00000000 --- a/42sh/sample/yale1.sh +++ /dev/null @@ -1 +0,0 @@ - From 372a665e8b2ea14b184d7805ca176a50615b501a Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 21:38:28 +0100 Subject: [PATCH 04/17] makefile --- 42sh/Makefile | 7 ++----- 42sh/update_makefile.sh | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) create mode 100755 42sh/update_makefile.sh diff --git a/42sh/Makefile b/42sh/Makefile index d4a7f423..b8b2cf0b 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -6,15 +6,14 @@ # By: wescande +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2016/08/29 21:32:58 by wescande #+# #+# # -# Updated: 2017/03/25 20:26:47 by jhalford ### ########.fr # +# Updated: 2017/03/25 21:38:21 by jhalford ### ########.fr # # # # **************************************************************************** # -NAME = 42sh +NAME = minishell CC = gcc FLAGS = -Wall -Wextra -Werror -FLAGS = -Wall -Wextra -Werror #-fsanitize=address#-fvisibility=hidden D_FLAGS = -g DELTA = $$(echo "$$(tput cols)-47"|bc) @@ -282,7 +281,6 @@ line_editing/resize.c\ main/data_exit.c\ main/data_init.c\ main/data_singleton.c\ -main/ft_putast.c\ main/main.c\ main/shell_init.c\ main/shell_reset.c\ @@ -308,7 +306,6 @@ parser/parser_init.c\ parser/pop_stack.c\ parser/produce_sym.c\ parser/push_stack.c\ -parser/read_stack.c\ parser/redir_init.c\ parser/stack_init.c\ parser/sym_free.c\ diff --git a/42sh/update_makefile.sh b/42sh/update_makefile.sh new file mode 100755 index 00000000..0a4660f5 --- /dev/null +++ b/42sh/update_makefile.sh @@ -0,0 +1,17 @@ +MYPATH=$(pwd) +CUR_MAKEFILE=$MYPATH/Makefile +if [ -e $CUR_MAKEFILE ] +then + echo "regenerate Makefile" + sed "`grep -n 'SRC_BASE =' $CUR_MAKEFILE | sed 's/:.*//'`, \$d" $CUR_MAKEFILE > NEWMAKEFILE + grep 'SRC_BASE =' $CUR_MAKEFILE >> NEWMAKEFILE + expr "$(find ./src | grep "\.c$" | sed -e 's/src\///' -e 's/\.\///' -e 's/$/\\/')" : "\(.*\).$" >> NEWMAKEFILE + echo "" >> NEWMAKEFILE + grep 'SRCS =' $CUR_MAKEFILE >> NEWMAKEFILE + sed "1, `grep -n 'SRCS =' $CUR_MAKEFILE | sed 's/:.*//'`d" $CUR_MAKEFILE >> NEWMAKEFILE + mv $CUR_MAKEFILE ~/Documents/.OLDMakefile + mv NEWMAKEFILE $CUR_MAKEFILE + echo "Makefile done (copy still alive in ~/Documents/.OLDMakefile)" +else + echo "Makefile not found." +fi From a4b3a659f305b7785c6a0745c29f34fc52c1fa05 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 21:41:42 +0100 Subject: [PATCH 05/17] token_print rm --- 42sh/src/lexer/token_print.c | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 42sh/src/lexer/token_print.c diff --git a/42sh/src/lexer/token_print.c b/42sh/src/lexer/token_print.c deleted file mode 100644 index 69ec2d07..00000000 --- a/42sh/src/lexer/token_print.c +++ /dev/null @@ -1,25 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* token_print.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2016/11/28 14:39:01 by jhalford #+# #+# */ -/* Updated: 2017/03/24 19:23:12 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -void token_print(t_list *lst) -{ - t_token *token; - - while (lst) - { - if ((token = lst->content)) - DG("token : %s data [%s]", read_state(token->type), token->data); - lst = lst->next; - } -} From d17643e8fe84ed1e5c79c63f1a8dad00c7107fb5 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 21:43:51 +0100 Subject: [PATCH 06/17] makefile --- 42sh/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/42sh/Makefile b/42sh/Makefile index b8b2cf0b..c211ff0f 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -246,7 +246,6 @@ lexer/token_append.c\ lexer/token_cmp_type.c\ lexer/token_free.c\ lexer/token_init.c\ -lexer/token_print.c\ line_editing/control_features.c\ line_editing/copy_cut_paste/copy_cut_paste.c\ line_editing/copy_cut_paste/underline_down.c\ From b52db9b55fd30a5751d900a242784ce07361b610 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 23:31:12 +0100 Subject: [PATCH 07/17] compile --- 42sh/Makefile | 470 +++++++++++++++++++++----------------------------- 1 file changed, 200 insertions(+), 270 deletions(-) diff --git a/42sh/Makefile b/42sh/Makefile index 5ca44678..2a2c7a0e 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -13,7 +13,7 @@ NAME = minishell CC = gcc -FLAGS = -Wall -Wextra -Werror -fsanitize=address#-fvisibility=hidden +FLAGS = -Wall -Wextra -Werror D_FLAGS = -g DELTA = $$(echo "$$(tput cols)-47"|bc) @@ -29,206 +29,222 @@ INC_DIR = includes/ OBJ_DIR = objs/ SRC_BASE = \ -completion/c_pathsolver.c\ -completion/c_init.c\ -completion/c_printer.c\ +builtin/bt_env_opt.c\ +builtin/bt_read_get.c\ +builtin/bt_read_term.c\ +builtin/builtin_cd.c\ +builtin/builtin_echo.c\ +builtin/builtin_env.c\ +builtin/builtin_exit.c\ +builtin/builtin_export.c\ +builtin/builtin_func.c\ +builtin/builtin_hash.c\ +builtin/builtin_history.c\ +builtin/builtin_math.c\ +builtin/builtin_read.c\ +builtin/builtin_setenv.c\ +builtin/builtin_unset.c\ +builtin/builtin_unsetenv.c\ +builtin/is_builtin.c\ +completion/c_arrow.c\ +completion/c_clear.c\ +completion/c_find_abspath.c\ completion/c_find_binary.c\ completion/c_find_env.c\ -completion/c_clear.c\ -completion/c_parser.c\ -completion/c_arrow.c\ -completion/c_sizing.c\ -completion/completion.c\ -completion/c_match_glob.c\ completion/c_find_files.c\ -completion/c_terminal.c\ -completion/c_output.c\ -completion/c_misc.c\ +completion/c_init.c\ completion/c_match.c\ +completion/c_match_glob.c\ completion/c_match_update.c\ -completion/c_find_abspath.c\ -history/surch_in_history.c\ -history/history_parsing_toolz_2.c\ -history/history_parsing_toolz.c\ -history/list_toolz.c\ -history/add_str_in_history.c\ -history/history_parsing.c\ -history/history.c\ -job_control/pprint_while.c\ -job_control/mark_job_as_running.c\ -job_control/pprint_case.c\ -job_control/job_notify_new.c\ -job_control/sigint_handler.c\ -job_control/job_update_status.c\ -job_control/job_format_head.c\ -job_control/job_is_completed.c\ -job_control/job_wait.c\ -job_control/sigtstp_handler.c\ -job_control/job_free.c\ -job_control/pprint_for.c\ -job_control/pprint_if.c\ -job_control/job_hup_all.c\ -job_control/put_job_in_foreground.c\ -job_control/job_is_stopped.c\ -job_control/process_free.c\ -job_control/sigttin_handler.c\ -job_control/sigttou_handler.c\ -job_control/builtin_jobs.c\ -job_control/process_cmp_pid.c\ -job_control/pprint_subshell.c\ -job_control/job_remove.c\ -job_control/builtin_bg.c\ -job_control/job_run.c\ -job_control/has_stopped_job.c\ -job_control/pprint_cmd.c\ -job_control/job_cmp_id.c\ -job_control/pprint_brace.c\ -job_control/job_addprocess.c\ -job_control/job_update_id.c\ -job_control/do_job_notification.c\ -job_control/job_getrank.c\ -job_control/has_running_job.c\ -job_control/process_format.c\ -job_control/job_getprocess.c\ -job_control/job_notify_change.c\ -job_control/job_format.c\ -job_control/put_job_in_background.c\ -job_control/pprint_until.c\ -job_control/pprint_function.c\ -job_control/builtin_fg.c\ -job_control/sigchld_handler.c\ -parser/tree_func_free.c\ -parser/parser_destroy.c\ -parser/tree_wrapper.c\ -parser/pop_stack.c\ -parser/add_cmd.c\ -parser/parser_init.c\ -parser/aggregate_sym.c\ -parser/redir_init.c\ -parser/do_parser_routine.c\ -parser/stack_init.c\ -parser/add_number.c\ -parser/add_func.c\ -parser/add_loop.c\ -parser/read_stack.c\ -parser/push_stack.c\ -parser/add_sep.c\ -parser/ft_parse.c\ -parser/add_condition.c\ -parser/produce_sym.c\ -parser/heredoc_parser.c\ -parser/add_case.c\ -parser/sym_free.c\ -parser/add_subshell.c\ -parser/build_tree.c\ -parser/eval_sym.c\ -parser/error_syntax.c\ -parser/add_bang.c\ -parser/add_redir.c\ -main/data_exit.c\ -main/ft_putast.c\ -main/main.c\ -main/shell_reset.c\ -main/data_singleton.c\ -main/data_init.c\ -main/shell_init.c\ -line_editing/lib_line_editing/toolz_termcaps.c\ -line_editing/lib_line_editing/tool_line_2.c\ -line_editing/lib_line_editing/tool_line.c\ -line_editing/lib_line_editing/toolz.c\ -line_editing/lib_line_editing/toolz_parseur.c\ -line_editing/lib_line_editing/ft_nb_line.c\ -line_editing/lib_line_editing/toolz2.c\ -line_editing/resize.c\ -line_editing/control_features.c\ -line_editing/print_del_completion/queue.c\ -line_editing/print_del_completion/completion.c\ -line_editing/print_del_completion/print_and_del.c\ -line_editing/get_key.c\ -line_editing/ft_prompt.c\ -line_editing/readline.c\ -line_editing/move_term/move_up_and_down.c\ -line_editing/move_term/home_end.c\ -line_editing/move_term/move_to_word.c\ -line_editing/move_term/move_left_and_right.c\ -line_editing/init_line/init_termcaps.c\ -line_editing/init_line/init_history.c\ -line_editing/init_line/init_line.c\ -line_editing/copy_cut_paste/underline_home.c\ -line_editing/copy_cut_paste/underline_down.c\ -line_editing/copy_cut_paste/underline_end.c\ -line_editing/copy_cut_paste/underline_reset.c\ -line_editing/copy_cut_paste/underline_function.c\ -line_editing/copy_cut_paste/copy_cut_paste.c\ -line_editing/copy_cut_paste/underline_right.c\ -line_editing/copy_cut_paste/underline_up.c\ -line_editing/copy_cut_paste/underline_left.c\ -glob/expand_home.c\ -glob/expand_bquote.c\ +completion/c_misc.c\ +completion/c_output.c\ +completion/c_parser.c\ +completion/c_pathsolver.c\ +completion/c_printer.c\ +completion/c_sizing.c\ +completion/c_terminal.c\ +completion/completion.c\ +exec/ast_free.c\ +exec/bad_fd.c\ +exec/exec_ampersand.c\ +exec/exec_and_if.c\ +exec/exec_bang.c\ +exec/exec_case_branch.c\ +exec/exec_elif.c\ +exec/exec_else.c\ +exec/exec_func.c\ +exec/exec_leaf.c\ +exec/exec_or_if.c\ +exec/exec_pipe.c\ +exec/exec_reset.c\ +exec/exec_semi.c\ +exec/exec_var.c\ +exec/fd_is_valid.c\ +exec/ft_exec.c\ +exec/ft_findexec.c\ +exec/is_function.c\ +exec/mark_process_status.c\ +exec/node_copy.c\ +exec/pfree_cmd.c\ +exec/pfree_cond.c\ +exec/pfree_func.c\ +exec/pfree_list.c\ +exec/pfree_subshell.c\ +exec/plaunch_brace.c\ +exec/plaunch_builtin.c\ +exec/plaunch_case.c\ +exec/plaunch_empty.c\ +exec/plaunch_file.c\ +exec/plaunch_for.c\ +exec/plaunch_function.c\ +exec/plaunch_if.c\ +exec/plaunch_subshell.c\ +exec/plaunch_until.c\ +exec/plaunch_while.c\ +exec/process_launch.c\ +exec/process_redirect.c\ +exec/process_set.c\ +exec/process_setgroup.c\ +exec/process_setsig.c\ +exec/pset_brace.c\ +exec/pset_case.c\ +exec/pset_cmd.c\ +exec/pset_for.c\ +exec/pset_if.c\ +exec/pset_subshell.c\ +exec/pset_until.c\ +exec/pset_while.c\ +exec/redir_copy.c\ +exec/redir_free.c\ +exec/redirect_dgreat.c\ +exec/redirect_dless.c\ +exec/redirect_great.c\ +exec/redirect_greatand.c\ +exec/redirect_less.c\ +exec/redirect_lessand.c\ +exec/set_exitstatus.c\ +exec/token_to_argv.c\ +glob/command_getoutput.c\ glob/dir_glob.c\ -glob/ft_strsplit_esc.c\ +glob/esc_print.c\ +glob/expand_bquote.c\ +glob/expand_brace.c\ +glob/expand_esc.c\ +glob/expand_home.c\ glob/expand_var.c\ +glob/ft_strsplit_esc.c\ +glob/ft_strsplit_spe.c\ +glob/gen_tab_esc.c\ glob/glob.c\ -glob/word_is_assignment.c\ -glob/match_pattern.c\ +glob/is_char_esc.c\ +glob/lib_perso/ft_ld_back.c\ +glob/lib_perso/ft_ld_clear.c\ +glob/lib_perso/ft_ld_copy.c\ +glob/lib_perso/ft_ld_del.c\ glob/lib_perso/ft_ld_front.c\ glob/lib_perso/ft_ld_new.c\ -glob/lib_perso/ft_ld_size.c\ -glob/lib_perso/ft_tablen.c\ -glob/lib_perso/ft_ld_pushfront.c\ -glob/lib_perso/ft_ld_swap.c\ glob/lib_perso/ft_ld_order.c\ -glob/lib_perso/ft_strsubf.c\ -glob/lib_perso/ft_ld_reverse.c\ -glob/lib_perso/ft_ld_to_tab.c\ -glob/lib_perso/ft_tabdel.c\ -glob/lib_perso/ft_strjoinf.c\ -glob/lib_perso/ft_ld_del.c\ -glob/lib_perso/ft_ld_back.c\ -glob/lib_perso/ft_memrealloc.c\ -glob/lib_perso/ft_ld_copy.c\ glob/lib_perso/ft_ld_pushback.c\ -glob/lib_perso/ft_ld_clear.c\ -glob/expand_brace.c\ +glob/lib_perso/ft_ld_pushfront.c\ +glob/lib_perso/ft_ld_reverse.c\ +glob/lib_perso/ft_ld_size.c\ +glob/lib_perso/ft_ld_swap.c\ +glob/lib_perso/ft_ld_to_tab.c\ +glob/lib_perso/ft_memrealloc.c\ +glob/lib_perso/ft_strjoinf.c\ +glob/lib_perso/ft_strsubf.c\ +glob/lib_perso/ft_tabdel.c\ +glob/lib_perso/ft_tablen.c\ +glob/match_pattern.c\ glob/tab_esc_copy.c\ -glob/ft_strsplit_spe.c\ -glob/esc_print.c\ -glob/expand_esc.c\ -glob/is_char_esc.c\ -glob/command_getoutput.c\ -glob/gen_tab_esc.c\ -lexer/lexer_delim.c\ -lexer/lexer_paren.c\ -lexer/get_state_redir.c\ -lexer/lexer_quote.c\ -lexer/lexer_dquote.c\ -lexer/token_free.c\ -lexer/token_cmp_type.c\ -lexer/lexer_sep.c\ -lexer/lexer_heredoc.c\ -lexer/token_init.c\ -lexer/lexer_less.c\ -lexer/insert_newline.c\ -lexer/get_lexer_stack2.c\ -lexer/lexer_init.c\ -lexer/keep_last_type.c\ -lexer/isrw_delim.c\ -lexer/lexer_lex.c\ -lexer/lexer_destroy.c\ -lexer/lexer_word.c\ -lexer/lexer_newline.c\ -lexer/get_lexer_stack.c\ -lexer/lexer_great.c\ -lexer/lexer_curly_braces.c\ -lexer/lexer_end.c\ -lexer/get_reserved_words.c\ +glob/word_is_assignment.c\ +hash_table/ft_add_hash.c\ +hash_table/hash.c\ +hash_table/hash_free.c\ +hash_table/hash_str.c\ +hash_table/is_hash.c\ +history/add_str_in_history.c\ +history/history.c\ +history/history_parsing.c\ +history/history_parsing_toolz.c\ +history/history_parsing_toolz_2.c\ +history/list_toolz.c\ +history/surch_in_history.c\ +job_control/builtin_bg.c\ +job_control/builtin_fg.c\ +job_control/builtin_jobs.c\ +job_control/do_job_notification.c\ +job_control/has_running_job.c\ +job_control/has_stopped_job.c\ +job_control/job_addprocess.c\ +job_control/job_cmp_id.c\ +job_control/job_format.c\ +job_control/job_format_head.c\ +job_control/job_free.c\ +job_control/job_getprocess.c\ +job_control/job_getrank.c\ +job_control/job_hup_all.c\ +job_control/job_is_completed.c\ +job_control/job_is_stopped.c\ +job_control/job_notify_change.c\ +job_control/job_notify_new.c\ +job_control/job_remove.c\ +job_control/job_run.c\ +job_control/job_update_id.c\ +job_control/job_update_status.c\ +job_control/job_wait.c\ +job_control/mark_job_as_running.c\ +job_control/pprint_brace.c\ +job_control/pprint_case.c\ +job_control/pprint_cmd.c\ +job_control/pprint_for.c\ +job_control/pprint_function.c\ +job_control/pprint_if.c\ +job_control/pprint_subshell.c\ +job_control/pprint_until.c\ +job_control/pprint_while.c\ +job_control/process_cmp_pid.c\ +job_control/process_format.c\ +job_control/process_free.c\ +job_control/put_job_in_background.c\ +job_control/put_job_in_foreground.c\ +job_control/sigchld_handler.c\ +job_control/sigint_handler.c\ +job_control/sigtstp_handler.c\ +job_control/sigttin_handler.c\ +job_control/sigttou_handler.c\ lexer/do_lexer_routine.c\ -lexer/token_append.c\ +lexer/get_lexer_stack.c\ +lexer/get_lexer_stack2.c\ +lexer/get_reserved_words.c\ lexer/get_state_global.c\ +lexer/get_state_redir.c\ +lexer/insert_newline.c\ +lexer/isrw_delim.c\ +lexer/keep_last_type.c\ +lexer/lexer_backslash.c\ lexer/lexer_bquote.c\ +lexer/lexer_curly_braces.c\ lexer/lexer_default.c\ -lexer/token_print.c\ -<<<<<<< HEAD +lexer/lexer_delim.c\ +lexer/lexer_destroy.c\ +lexer/lexer_dquote.c\ +lexer/lexer_end.c\ +lexer/lexer_great.c\ +lexer/lexer_heredoc.c\ +lexer/lexer_init.c\ +lexer/lexer_less.c\ +lexer/lexer_lex.c\ +lexer/lexer_newline.c\ +lexer/lexer_number.c\ +lexer/lexer_paren.c\ +lexer/lexer_quote.c\ +lexer/lexer_sep.c\ +lexer/lexer_word.c\ +lexer/token_append.c\ +lexer/token_cmp_type.c\ +lexer/token_free.c\ +lexer/token_init.c\ line_editing/control_features.c\ line_editing/copy_cut_paste/copy_cut_paste.c\ line_editing/copy_cut_paste/underline_down.c\ @@ -293,92 +309,6 @@ parser/stack_init.c\ parser/sym_free.c\ parser/tree_func_free.c\ parser/tree_wrapper.c -======= -lexer/lexer_backslash.c\ -lexer/lexer_number.c\ -builtin/builtin_func.c\ -builtin/builtin_export.c\ -builtin/builtin_unsetenv.c\ -builtin/builtin_setenv.c\ -builtin/builtin_unset.c\ -builtin/builtin_math.c\ -builtin/bt_read_term.c\ -builtin/builtin_echo.c\ -builtin/builtin_hash.c\ -builtin/bt_env_opt.c\ -builtin/builtin_exit.c\ -builtin/builtin_cd.c\ -builtin/builtin_read.c\ -builtin/is_builtin.c\ -builtin/bt_read_get.c\ -builtin/builtin_history.c\ -builtin/builtin_env.c\ -exec/pset_brace.c\ -exec/pset_if.c\ -exec/pfree_func.c\ -exec/plaunch_subshell.c\ -exec/pset_case.c\ -exec/exec_ampersand.c\ -exec/exec_and_if.c\ -exec/exec_var.c\ -exec/exec_case_branch.c\ -exec/redirect_greatand.c\ -exec/redir_copy.c\ -exec/redir_free.c\ -exec/token_to_argv.c\ -exec/exec_pipe.c\ -exec/pfree_cond.c\ -exec/pset_for.c\ -exec/pset_until.c\ -exec/exec_func.c\ -exec/exec_or_if.c\ -exec/node_copy.c\ -exec/pfree_list.c\ -exec/redirect_dless.c\ -exec/exec_bang.c\ -exec/redirect_dgreat.c\ -exec/mark_process_status.c\ -exec/plaunch_for.c\ -exec/is_function.c\ -exec/pset_while.c\ -exec/exec_else.c\ -exec/ast_free.c\ -exec/exec_semi.c\ -exec/plaunch_while.c\ -exec/bad_fd.c\ -exec/exec_leaf.c\ -exec/plaunch_if.c\ -exec/plaunch_case.c\ -exec/process_redirect.c\ -exec/process_setgroup.c\ -exec/ft_exec.c\ -exec/set_exitstatus.c\ -exec/plaunch_brace.c\ -exec/plaunch_empty.c\ -exec/redirect_great.c\ -exec/process_set.c\ -exec/exec_reset.c\ -exec/plaunch_until.c\ -exec/pset_cmd.c\ -exec/redirect_lessand.c\ -exec/ft_findexec.c\ -exec/redirect_less.c\ -exec/pset_subshell.c\ -exec/fd_is_valid.c\ -exec/exec_elif.c\ -exec/plaunch_builtin.c\ -exec/pfree_subshell.c\ -exec/plaunch_file.c\ -exec/process_setsig.c\ -exec/plaunch_function.c\ -exec/process_launch.c\ -exec/pfree_cmd.c\ -hash_table/ft_add_hash.c\ -hash_table/is_hash.c\ -hash_table/hash.c\ -hash_table/hash_free.c\ -hash_table/hash_str.c ->>>>>>> master SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) From 73e48982c62e1ba82ac9caf32869919919e279e0 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 25 Mar 2017 23:55:23 +0100 Subject: [PATCH 08/17] :fire: exec_destroy (#196 #198) --- 42sh/includes/exec.h | 1 + 42sh/libft/src/sys/open_access.c | 2 -- 42sh/src/exec/exec_reset.c | 16 ++++++++++++++++ 42sh/src/exec/process_launch.c | 1 + 42sh/src/main/data_exit.c | 4 ++-- 42sh/src/main/shell_init.c | 9 +++++++-- 6 files changed, 27 insertions(+), 6 deletions(-) diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 1bf1074b..b14e1d2d 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -140,6 +140,7 @@ struct s_exec }; int exec_reset(void); +int exec_destroy(void); int exec_pushfds(); int exec_popfds(); int process_fork(t_process *p); diff --git a/42sh/libft/src/sys/open_access.c b/42sh/libft/src/sys/open_access.c index 40811fe7..bc1ee88e 100644 --- a/42sh/libft/src/sys/open_access.c +++ b/42sh/libft/src/sys/open_access.c @@ -23,8 +23,6 @@ int open_access(char *file, t_flag a_flag, t_flag o_flag, t_flag o_perm) if (access(file, F_OK) == 0 && access(file, a_flag) != 0) return (-ERR_SET(E_SYS_NOPERM, file)); if ((fd = open(file, o_flag, o_perm)) < 0) - { exit(1); - } return (fd); } diff --git a/42sh/src/exec/exec_reset.c b/42sh/src/exec/exec_reset.c index b9330b38..0e55431e 100644 --- a/42sh/src/exec/exec_reset.c +++ b/42sh/src/exec/exec_reset.c @@ -62,3 +62,19 @@ int exec_reset(void) jobc->current_id = 1; return (0); } + +int exec_destroy(void) +{ + int i; + t_jobc *jobc; + t_exec *exec; + + exec = &data_singleton()->exec; + jobc = &data_singleton()->jobc; + ft_lstdel(&exec->op_stack, ft_lst_cfree); + ft_lstdel(&jobc->first_job, job_free); + i = -1; + while (++i < 10) + ft_lstdel(&exec->fd_save[i], ft_lst_cfree); + return (0); +} diff --git a/42sh/src/exec/process_launch.c b/42sh/src/exec/process_launch.c index ac107417..5a0b711b 100644 --- a/42sh/src/exec/process_launch.c +++ b/42sh/src/exec/process_launch.c @@ -26,6 +26,7 @@ int process_fork(t_process *p) exit(1); process_setgroup(p, 0); process_setsig(); + exec_destroy(); exec_reset(); data_singleton()->opts &= ~SH_INTERACTIVE; data_singleton()->opts &= ~SH_OPTS_JOBC; diff --git a/42sh/src/main/data_exit.c b/42sh/src/main/data_exit.c index 753ea33f..d8911c0f 100644 --- a/42sh/src/main/data_exit.c +++ b/42sh/src/main/data_exit.c @@ -19,13 +19,13 @@ void data_exit(void) data = data_singleton(); ft_strdel(&data->line.input); ft_strdel(&data->binary); - exec_popfds(); + /* exec_popfds(); */ ft_sstrfree(data->env); ft_sstrfree(data->local_var); ft_sstrfree(data->argv); lexer_destroy(&data->lexer); parser_destroy(&data->parser); - ft_lstdel(&data->jobc.first_job, &job_free); + exec_destroy(); ft_lstdel(&data->lst_func, &tree_func_free); ft_save_termios(-1); ft_free_hash_table(); diff --git a/42sh/src/main/shell_init.c b/42sh/src/main/shell_init.c index dc2bd6b8..ec68356f 100644 --- a/42sh/src/main/shell_init.c +++ b/42sh/src/main/shell_init.c @@ -11,7 +11,9 @@ /* ************************************************************************** */ #include "minishell.h" -#define SHELL_USAGE "42sh [-c command | [<]script] [--no-jobcontrol]" +#define SHELL_USAGE1 "usage: 42sh [--no-jobcontrol]" +#define SHELL_USAGE2 " or 42sh -c command" +#define SHELL_USAGE3 " or 42sh script" static t_cliopts g_opts[] = { @@ -87,7 +89,10 @@ int shell_init(int ac, char **av, char **env) if (data_init(ac, av, env) < 0) return (-1); if (cliopts_get(av, g_opts, data)) - return (ft_perror(NULL) && SH_ERR("usage: %s", SHELL_USAGE)); + return (ft_perror(NULL) + && SH_ERR("%s", SHELL_USAGE1) + && SH_ERR("%s", SHELL_USAGE2) + && SH_ERR("%s", SHELL_USAGE3)); if (!isatty(STDIN) || *data->av_data) data->opts &= ~(SH_INTERACTIVE | SH_OPTS_JOBC); if ((data->fd = get_input_fd(data, NULL)) < 0) From 49349c3adb48fd2c21d8eaee38c8e22361c51461 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 26 Mar 2017 14:15:50 +0200 Subject: [PATCH 09/17] norme --- 42sh/src/builtin/builtin_cd.c | 4 ++-- 42sh/src/main/data_exit.c | 3 +-- 42sh/src/main/shell_init.c | 10 +++++----- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index af086139..5c95e860 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/25 18:20:42 by ariard #+# #+# */ -/* Updated: 2017/03/25 21:23:11 by ariard ### ########.fr */ +/* Updated: 2017/03/26 14:11:03 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,7 +31,7 @@ static t_cliopts g_cdopts[] = {0, NULL, 0, 0, NULL, 0}, }; -int cd_file_autorisations(char *target, int flag) +int cd_file_autorisations(char *target, int flag) { (void)flag; if (access(target, F_OK)) diff --git a/42sh/src/main/data_exit.c b/42sh/src/main/data_exit.c index d8911c0f..b43d0b07 100644 --- a/42sh/src/main/data_exit.c +++ b/42sh/src/main/data_exit.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/07 18:07:50 by jhalford #+# #+# */ -/* Updated: 2017/03/25 20:27:32 by jhalford ### ########.fr */ +/* Updated: 2017/03/26 14:11:44 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,6 @@ void data_exit(void) data = data_singleton(); ft_strdel(&data->line.input); ft_strdel(&data->binary); - /* exec_popfds(); */ ft_sstrfree(data->env); ft_sstrfree(data->local_var); ft_sstrfree(data->argv); diff --git a/42sh/src/main/shell_init.c b/42sh/src/main/shell_init.c index ec68356f..e769df3c 100644 --- a/42sh/src/main/shell_init.c +++ b/42sh/src/main/shell_init.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2016/12/12 17:23:59 by jhalford #+# #+# */ -/* Updated: 2017/03/25 01:41:36 by wescande ### ########.fr */ +/* Updated: 2017/03/26 14:13:44 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -89,10 +89,10 @@ int shell_init(int ac, char **av, char **env) if (data_init(ac, av, env) < 0) return (-1); if (cliopts_get(av, g_opts, data)) - return (ft_perror(NULL) - && SH_ERR("%s", SHELL_USAGE1) - && SH_ERR("%s", SHELL_USAGE2) - && SH_ERR("%s", SHELL_USAGE3)); + { + return (ft_perror(NULL) && SH_ERR("%s", SHELL_USAGE1) + && SH_ERR("%s", SHELL_USAGE2) && SH_ERR("%s", SHELL_USAGE3)); + } if (!isatty(STDIN) || *data->av_data) data->opts &= ~(SH_INTERACTIVE | SH_OPTS_JOBC); if ((data->fd = get_input_fd(data, NULL)) < 0) From 26e1dfe2e9fbff5b910e7a5f4dca0df5ed93f960 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Tue, 28 Mar 2017 07:51:29 +0200 Subject: [PATCH 10/17] ca compile --- 42sh/src/parser/do_parser_routine.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/42sh/src/parser/do_parser_routine.c b/42sh/src/parser/do_parser_routine.c index 0f31fb20..cbb71929 100644 --- a/42sh/src/parser/do_parser_routine.c +++ b/42sh/src/parser/do_parser_routine.c @@ -6,7 +6,7 @@ /* By: wescande +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/19 14:24:14 by wescande #+# #+# */ -/* Updated: 2017/03/27 21:43:44 by gwojda ### ########.fr */ +/* Updated: 2017/03/28 07:50:46 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,7 +21,6 @@ int do_parser_routine(t_list **token, t_btree **ast) return (1); if (data->parser.state == SUCCESS && stack_init(&data->parser)) exit(1); - token_print(*token); if (ft_parse(ast, token, &data->parser)) exit(1); if (data->parser.state != ERROR && From 5547ac359d7370d92a13a6a6b36d242df2a341fc Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Tue, 28 Mar 2017 07:54:38 +0200 Subject: [PATCH 11/17] makefile name to 21sh --- 42sh/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/42sh/Makefile b/42sh/Makefile index 5eff7704..67a33c25 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -6,11 +6,11 @@ # By: wescande +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2016/08/29 21:32:58 by wescande #+# #+# # -# Updated: 2017/03/27 19:45:47 by jhalford ### ########.fr # +# Updated: 2017/03/28 07:54:25 by jhalford ### ########.fr # # # # **************************************************************************** # -NAME = minishell +NAME = 21sh CC = gcc FLAGS = -Wall -Wextra -Werror From e61f823c01425b1fbdf4a465190cd2e2a8c548c0 Mon Sep 17 00:00:00 2001 From: wescande Date: Tue, 28 Mar 2017 19:42:13 +0200 Subject: [PATCH 12/17] rectif msg cd --- 42sh/src/builtin/builtin_cd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index c9e2228f..e9a26980 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/25 18:20:42 by ariard #+# #+# */ -/* Updated: 2017/03/27 19:45:31 by jhalford ### ########.fr */ +/* Updated: 2017/03/28 19:41:52 by wescande ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,8 +20,8 @@ #define CDERR_0 "cd: too many arguments" #define CDERR_1 "cd %s not set" #define CDERR_2 "cd : %s: No such file or directory" -#define CDERR_3 "cd : %s: Permission denied" -#define CDERR_4 "cd : %s: Not a directory" +#define CDERR_3 "cd : %s: Not a directory" +#define CDERR_4 "cd : %s: Permission denied" #define CDERR_5 "cd : unable to proceed: %s" static t_cliopts g_cdopts[] = From 474c2f0af65738bf3870bb0caa77cdf7cb4c9c61 Mon Sep 17 00:00:00 2001 From: gwojda Date: Wed, 29 Mar 2017 11:09:27 +0200 Subject: [PATCH 13/17] norme ok, compilation ok, fichier auteur ok, nom binaire ok --- 42sh/Makefile | 4 ++-- 42sh/auteur | 4 ++++ 42sh/libft/Makefile | 5 ++--- 42sh/libft/update_makefile.sh | 17 ----------------- 42sh/src/hash_table/is_hash.c | 4 ++-- 42sh/update_makefile.sh | 17 ----------------- 6 files changed, 10 insertions(+), 41 deletions(-) delete mode 100755 42sh/libft/update_makefile.sh delete mode 100755 42sh/update_makefile.sh diff --git a/42sh/Makefile b/42sh/Makefile index f3adc478..747725f3 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -6,11 +6,11 @@ # By: wescande +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2016/08/29 21:32:58 by wescande #+# #+# # -# Updated: 2017/03/29 11:03:41 by gwojda ### ########.fr # +# Updated: 2017/03/29 11:09:04 by gwojda ### ########.fr # # # # **************************************************************************** # -NAME = 21sh +NAME = 42sh CC = gcc FLAGS = -Wall -Wextra -Werror diff --git a/42sh/auteur b/42sh/auteur index a68bfe60..e4cd2213 100644 --- a/42sh/auteur +++ b/42sh/auteur @@ -1 +1,5 @@ +alao +jhalford +ariard +gwojda wescande diff --git a/42sh/libft/Makefile b/42sh/libft/Makefile index 344a1d97..097f38e0 100644 --- a/42sh/libft/Makefile +++ b/42sh/libft/Makefile @@ -6,7 +6,7 @@ # By: jhalford +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2017/02/07 16:09:36 by jhalford #+# #+# # -# Updated: 2017/03/27 21:59:31 by gwojda ### ########.fr # +# Updated: 2017/03/29 11:08:06 by gwojda ### ########.fr # # # # **************************************************************************** # @@ -19,8 +19,7 @@ RM = /bin/rm -rf W_FLAGS = -Wall -Wextra -Werror -g D_FLAGS = -g -V_FLAGS = #-fvisibility=hidden -FLAGS = $(W_FLAGS) $(D_FLAGS) $(V_FLAGS) +FLAGS = $(W_FLAGS) $(D_FLAGS) DELTA = $$(echo "$$(tput cols)-47"|bc) diff --git a/42sh/libft/update_makefile.sh b/42sh/libft/update_makefile.sh deleted file mode 100755 index a1b3228d..00000000 --- a/42sh/libft/update_makefile.sh +++ /dev/null @@ -1,17 +0,0 @@ -MYPATH=$(pwd) -CUR_MAKEFILE=$MYPATH/Makefile -if [ -e $CUR_MAKEFILE ] -then - echo "regenerate Makefile" - sed "`grep -n 'SRC_BASE =' $CUR_MAKEFILE | sed 's/:.*//'`, \$d" $CUR_MAKEFILE > NEWMAKEFILE - grep 'SRC_BASE =' $CUR_MAKEFILE >> NEWMAKEFILE - expr "$(find ./src | grep "\.c" | sed -e 's/src\///' -e 's/\.\///' -e 's/$/\\/')" : "\(.*\).$" >> NEWMAKEFILE - echo "" >> NEWMAKEFILE - grep 'SRCS =' $CUR_MAKEFILE >> NEWMAKEFILE - sed "1, `grep -n 'SRCS =' $CUR_MAKEFILE | sed 's/:.*//'`d" $CUR_MAKEFILE >> NEWMAKEFILE - mv $CUR_MAKEFILE ~/Documents/.OLDMakefile - mv NEWMAKEFILE $CUR_MAKEFILE - echo "Makefile done (copy still alive in ~/Documents/.OLDMakefile)" -else - echo "Makefile not found." -fi diff --git a/42sh/src/hash_table/is_hash.c b/42sh/src/hash_table/is_hash.c index f237795f..6c1dc818 100644 --- a/42sh/src/hash_table/is_hash.c +++ b/42sh/src/hash_table/is_hash.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/18 11:08:40 by gwojda #+# #+# */ -/* Updated: 2017/03/21 17:40:20 by jhalford ### ########.fr */ +/* Updated: 2017/03/29 11:05:34 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,7 +24,7 @@ static char *h_free_one(t_list **head, t_list *list, t_list *ref) return (NULL); } -char *ft_is_hash(char *cmd) +char *ft_is_hash(char *cmd) { t_list *list; t_list *ref; diff --git a/42sh/update_makefile.sh b/42sh/update_makefile.sh deleted file mode 100755 index 0a4660f5..00000000 --- a/42sh/update_makefile.sh +++ /dev/null @@ -1,17 +0,0 @@ -MYPATH=$(pwd) -CUR_MAKEFILE=$MYPATH/Makefile -if [ -e $CUR_MAKEFILE ] -then - echo "regenerate Makefile" - sed "`grep -n 'SRC_BASE =' $CUR_MAKEFILE | sed 's/:.*//'`, \$d" $CUR_MAKEFILE > NEWMAKEFILE - grep 'SRC_BASE =' $CUR_MAKEFILE >> NEWMAKEFILE - expr "$(find ./src | grep "\.c$" | sed -e 's/src\///' -e 's/\.\///' -e 's/$/\\/')" : "\(.*\).$" >> NEWMAKEFILE - echo "" >> NEWMAKEFILE - grep 'SRCS =' $CUR_MAKEFILE >> NEWMAKEFILE - sed "1, `grep -n 'SRCS =' $CUR_MAKEFILE | sed 's/:.*//'`d" $CUR_MAKEFILE >> NEWMAKEFILE - mv $CUR_MAKEFILE ~/Documents/.OLDMakefile - mv NEWMAKEFILE $CUR_MAKEFILE - echo "Makefile done (copy still alive in ~/Documents/.OLDMakefile)" -else - echo "Makefile not found." -fi From 041ffc8c5f718965264b12b9b13647c25b3530f2 Mon Sep 17 00:00:00 2001 From: gwojda Date: Wed, 29 Mar 2017 13:34:36 +0200 Subject: [PATCH 14/17] le completion et le glob sont fix --- 42sh/src/completion/c_match_glob.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/42sh/src/completion/c_match_glob.c b/42sh/src/completion/c_match_glob.c index 43d2cf9c..42be1d1e 100644 --- a/42sh/src/completion/c_match_glob.c +++ b/42sh/src/completion/c_match_glob.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/08 17:20:01 by gwojda #+# #+# */ -/* Updated: 2017/03/23 00:06:08 by gwojda ### ########.fr */ +/* Updated: 2017/03/29 13:33:32 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -55,11 +55,11 @@ static int c_glob_pos(char *str, size_t pos) pos = data_singleton()->line.pos; if (!str) return (-1); - if (pos && str[pos] == ' ') + if (pos && (str[pos] == ' ' || str[pos] == ';')) --pos; - while (pos && str[pos] != ' ') + while (pos && str[pos] != ' ' && str[pos] != ';') --pos; - if (str[pos] == ' ') + if (str[pos] == ' ' || str[pos] == ';') ++pos; return (pos); } From 06c7d44c1a208f401e55a41f8cb9dbd217386f99 Mon Sep 17 00:00:00 2001 From: gwojda Date: Wed, 29 Mar 2017 16:04:44 +0200 Subject: [PATCH 15/17] norme --- 42sh/src/parser/build_tree.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/42sh/src/parser/build_tree.c b/42sh/src/parser/build_tree.c index 430eec61..f10c604d 100644 --- a/42sh/src/parser/build_tree.c +++ b/42sh/src/parser/build_tree.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/15 18:32:59 by ariard #+# #+# */ -/* Updated: 2017/03/29 15:40:57 by ariard ### ########.fr */ +/* Updated: 2017/03/29 16:04:00 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -77,10 +77,9 @@ static int check_cache(t_token *token, int cache) return (0); } -int build_tree(t_btree **ast, t_list **lst, t_parser *parser) +int build_tree(t_btree **ast, t_list **lst, t_parser *parser) { int i; -// static int cache; t_token *token; i = 0; @@ -88,7 +87,8 @@ int build_tree(t_btree **ast, t_list **lst, t_parser *parser) check_cache(token, parser->cache); while (g_treematch[i].type) { - if ((isseparator(token, parser->cache) && g_treematch[i].type == token->type)) + if ((isseparator(token, parser->cache) && + g_treematch[i].type == token->type)) { parser->cache = token->type; return (g_treematch[i].add(ast, lst)); From 77ee149fe91fa742e79dc10ca81b95d865405c5f Mon Sep 17 00:00:00 2001 From: gwojda Date: Wed, 29 Mar 2017 16:10:17 +0200 Subject: [PATCH 16/17] env glob completion ajout --- 42sh/.valgrind.supp | 10 -- 42sh/another_file | 243 ----------------------------- 42sh/file | 19 --- 42sh/src/completion/c_match_glob.c | 4 +- 4 files changed, 2 insertions(+), 274 deletions(-) delete mode 100644 42sh/.valgrind.supp delete mode 100644 42sh/another_file delete mode 100644 42sh/file diff --git a/42sh/.valgrind.supp b/42sh/.valgrind.supp deleted file mode 100644 index bbfa8f2b..00000000 --- a/42sh/.valgrind.supp +++ /dev/null @@ -1,10 +0,0 @@ -{ - tgetent_1 - Memcheck:Leak - obj:*ncurses* -} -{ - valgrind_1 - Memcheck:Leak - obj:*valgrind* -} diff --git a/42sh/another_file b/42sh/another_file deleted file mode 100644 index 4caf053f..00000000 --- a/42sh/another_file +++ /dev/null @@ -1,243 +0,0 @@ -src/builtin/bt_env_opt.c$$ -src/builtin/bt_read_get.c$$ -src/builtin/bt_read_term.c$$ -src/builtin/builtin_cd.c$$ -src/builtin/builtin_echo.c$$ -src/builtin/builtin_env.c$$ -src/builtin/builtin_exit.c$$ -src/builtin/builtin_export.c$$ -src/builtin/builtin_func.c$$ -src/builtin/builtin_hash.c$$ -src/builtin/builtin_history.c$$ -src/builtin/builtin_math.c$$ -src/builtin/builtin_read.c$$ -src/builtin/builtin_setenv.c$$ -src/builtin/builtin_unset.c$$ -src/builtin/builtin_unsetenv.c$$ -src/builtin/is_builtin.c$$ -src/completion/c_arrow.c$$ -src/completion/c_clear.c$$ -src/completion/c_find_abspath.c$$ -src/completion/c_find_binary.c$$ -src/completion/c_find_env.c$$ -src/completion/c_find_files.c$$ -src/completion/c_init.c$$ -src/completion/c_match.c$$ -src/completion/c_match_glob.c$$ -src/completion/c_match_update.c$$ -src/completion/c_misc.c$$ -src/completion/c_output.c$$ -src/completion/c_parser.c$$ -src/completion/c_pathsolver.c$$ -src/completion/c_printer.c$$ -src/completion/c_sizing.c$$ -src/completion/c_terminal.c$$ -src/completion/completion.c$$ -src/exec/ast_free.c$$ -src/exec/bad_fd.c$$ -src/exec/exec_ampersand.c$$ -src/exec/exec_and_if.c$$ -src/exec/exec_bang.c$$ -src/exec/exec_case_branch.c$$ -src/exec/exec_destroy.c$$ -src/exec/exec_elif.c$$ -src/exec/exec_else.c$$ -src/exec/exec_func.c$$ -src/exec/exec_init.c$$ -src/exec/exec_leaf.c$$ -src/exec/exec_or_if.c$$ -src/exec/exec_pipe.c$$ -src/exec/exec_semi.c$$ -src/exec/exec_var.c$$ -src/exec/fd_is_valid.c$$ -src/exec/ft_exec.c$$ -src/exec/ft_findexec.c$$ -src/exec/is_function.c$$ -src/exec/mark_process_status.c$$ -src/exec/node_copy.c$$ -src/exec/pfree_cmd.c$$ -src/exec/pfree_cond.c$$ -src/exec/pfree_func.c$$ -src/exec/pfree_list.c$$ -src/exec/pfree_subshell.c$$ -src/exec/plaunch_brace.c$$ -src/exec/plaunch_builtin.c$$ -src/exec/plaunch_case.c$$ -src/exec/plaunch_empty.c$$ -src/exec/plaunch_file.c$$ -src/exec/plaunch_for.c$$ -src/exec/plaunch_function.c$$ -src/exec/plaunch_if.c$$ -src/exec/plaunch_subshell.c$$ -src/exec/plaunch_until.c$$ -src/exec/plaunch_while.c$$ -src/exec/process_launch.c$$ -src/exec/process_redirect.c$$ -src/exec/process_set.c$$ -src/exec/process_setgroup.c$$ -src/exec/process_setsig.c$$ -src/exec/pset_brace.c$$ -src/exec/pset_case.c$$ -src/exec/pset_cmd.c$$ -src/exec/pset_for.c$$ -src/exec/pset_if.c$$ -src/exec/pset_subshell.c$$ -src/exec/pset_until.c$$ -src/exec/pset_while.c$$ -src/exec/redir_copy.c$$ -src/exec/redir_free.c$$ -src/exec/redirect_dgreat.c$$ -src/exec/redirect_dless.c$$ -src/exec/redirect_great.c$$ -src/exec/redirect_greatand.c$$ -src/exec/redirect_less.c$$ -src/exec/redirect_lessand.c$$ -src/exec/set_exitstatus.c$$ -src/exec/token_to_argv.c$$ -src/glob/command_getoutput.c$$ -src/glob/dir_glob.c$$ -src/glob/esc_print.c$$ -src/glob/expand_bquote.c$$ -src/glob/expand_brace.c$$ -src/glob/expand_esc.c$$ -src/glob/expand_home.c$$ -src/glob/expand_var.c$$ -src/glob/ft_strsplit_esc.c$$ -src/glob/ft_strsplit_spe.c$$ -src/glob/gen_tab_esc.c$$ -src/glob/glob.c$$ -src/glob/is_char_esc.c$$ -src/glob/match_pattern.c$$ -src/glob/tab_esc_copy.c$$ -src/glob/word_is_assignment.c$$ -src/hash_table/ft_add_hash.c$$ -src/hash_table/hash.c$$ -src/hash_table/hash_free.c$$ -src/hash_table/hash_str.c$$ -src/hash_table/is_hash.c$$ -src/history/add_str_in_history.c$$ -src/history/history.c$$ -src/history/history_parsing.c$$ -src/history/history_parsing_toolz.c$$ -src/history/history_parsing_toolz_2.c$$ -src/history/list_toolz.c$$ -src/history/surch_in_history.c$$ -src/job_control/builtin_bg.c$$ -src/job_control/builtin_fg.c$$ -src/job_control/builtin_jobs.c$$ -src/job_control/do_job_notification.c$$ -src/job_control/has_running_job.c$$ -src/job_control/has_stopped_job.c$$ -src/job_control/job_addprocess.c$$ -src/job_control/job_cmp_id.c$$ -src/job_control/job_format.c$$ -src/job_control/job_format_head.c$$ -src/job_control/job_free.c$$ -src/job_control/job_getprocess.c$$ -src/job_control/job_getrank.c$$ -src/job_control/job_hup_all.c$$ -src/job_control/job_is_completed.c$$ -src/job_control/job_is_stopped.c$$ -src/job_control/job_notify_change.c$$ -src/job_control/job_notify_new.c$$ -src/job_control/job_remove.c$$ -src/job_control/job_run.c$$ -src/job_control/job_update_id.c$$ -src/job_control/job_update_status.c$$ -src/job_control/job_wait.c$$ -src/job_control/jobc_destroy.c$$ -src/job_control/jobc_init.c$$ -src/job_control/mark_job_as_running.c$$ -src/job_control/pprint_brace.c$$ -src/job_control/pprint_case.c$$ -src/job_control/pprint_cmd.c$$ -src/job_control/pprint_for.c$$ -src/job_control/pprint_function.c$$ -src/job_control/pprint_if.c$$ -src/job_control/pprint_subshell.c$$ -src/job_control/pprint_until.c$$ -src/job_control/pprint_while.c$$ -src/job_control/process_cmp_pid.c$$ -src/job_control/process_format.c$$ -src/job_control/process_free.c$$ -src/job_control/put_job_in_background.c$$ -src/job_control/put_job_in_foreground.c$$ -src/job_control/sigchld_handler.c$$ -src/job_control/sigint_handler.c$$ -src/job_control/sigtstp_handler.c$$ -src/job_control/sigttin_handler.c$$ -src/job_control/sigttou_handler.c$$ -src/lexer/do_lexer_routine.c$$ -src/lexer/get_lexer_stack.c$$ -src/lexer/get_lexer_stack2.c$$ -src/lexer/get_reserved_words.c$$ -src/lexer/get_state_global.c$$ -src/lexer/get_state_redir.c$$ -src/lexer/insert_newline.c$$ -src/lexer/isrw_delim.c$$ -src/lexer/keep_last_type.c$$ -src/lexer/lexer_backslash.c$$ -src/lexer/lexer_bquote.c$$ -src/lexer/lexer_curly_braces.c$$ -src/lexer/lexer_default.c$$ -src/lexer/lexer_delim.c$$ -src/lexer/lexer_destroy.c$$ -src/lexer/lexer_dquote.c$$ -src/lexer/lexer_end.c$$ -src/lexer/lexer_great.c$$ -src/lexer/lexer_heredoc.c$$ -src/lexer/lexer_init.c$$ -src/lexer/lexer_less.c$$ -src/lexer/lexer_lex.c$$ -src/lexer/lexer_newline.c$$ -src/lexer/lexer_number.c$$ -src/lexer/lexer_paren.c$$ -src/lexer/lexer_quote.c$$ -src/lexer/lexer_sep.c$$ -src/lexer/lexer_word.c$$ -src/lexer/token_append.c$$ -src/lexer/token_cmp_type.c$$ -src/lexer/token_free.c$$ -src/lexer/token_init.c$$ -src/lexer/token_print.c$$ -src/line_editing/control_features.c$$ -src/line_editing/ft_prompt.c$$ -src/line_editing/get_key.c$$ -src/line_editing/readline.c$$ -src/line_editing/resize.c$$ -src/main/data_exit.c$$ -src/main/data_init.c$$ -src/main/data_singleton.c$$ -src/main/ft_putast.c$$ -src/main/main.c$$ -src/main/shell_fds.c$$ -src/main/shell_init.c$$ -src/main/shell_sig.c$$ -src/parser/add_bang.c$$ -src/parser/add_case.c$$ -src/parser/add_cmd.c$$ -src/parser/add_condition.c$$ -src/parser/add_func.c$$ -src/parser/add_loop.c$$ -src/parser/add_number.c$$ -src/parser/add_redir.c$$ -src/parser/add_sep.c$$ -src/parser/add_subshell.c$$ -src/parser/aggregate_sym.c$$ -src/parser/build_tree.c$$ -src/parser/do_parser_routine.c$$ -src/parser/error_syntax.c$$ -src/parser/eval_sym.c$$ -src/parser/ft_parse.c$$ -src/parser/heredoc_parser.c$$ -src/parser/parser_destroy.c$$ -src/parser/parser_init.c$$ -src/parser/pop_stack.c$$ -src/parser/produce_sym.c$$ -src/parser/push_stack.c$$ -src/parser/read_stack.c$$ -src/parser/redir_init.c$$ -src/parser/stack_init.c$$ -src/parser/sym_free.c$$ -src/parser/tree_func_free.c$$ -src/parser/tree_wrapper.c$$ diff --git a/42sh/file b/42sh/file deleted file mode 100644 index 72a3d290..00000000 --- a/42sh/file +++ /dev/null @@ -1,19 +0,0 @@ -/Users/ariard/Projects/42sh -/Users/ariard/Projects/42sh -42ShellTester -42sh -Makefile -README.md -STDBUG -another_file -auteur -donovan_segaults_06-02 -file -includes -libft -objs -pdf -sample -scriptheader.sh -src -update_makefile.sh diff --git a/42sh/src/completion/c_match_glob.c b/42sh/src/completion/c_match_glob.c index 8c01c1b7..955ec506 100644 --- a/42sh/src/completion/c_match_glob.c +++ b/42sh/src/completion/c_match_glob.c @@ -6,7 +6,7 @@ /* By: gwojda +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/08 17:20:01 by gwojda #+# #+# */ -/* Updated: 2017/03/29 15:25:41 by jhalford ### ########.fr */ +/* Updated: 2017/03/29 16:09:59 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -101,7 +101,7 @@ int c_glob_matching(void) if ((pos = c_glob_pos(NULL, 0)) == -1) return (0); current_word = ft_strdupi_w(str + pos); - if (current_word[0] == '$' || current_word[0] == '~') + if (current_word[0] == '~') { free(current_word); return (0); From 7201b22642305e4b02b4d1fce77fd737dfcf4f7b Mon Sep 17 00:00:00 2001 From: gwojda Date: Wed, 29 Mar 2017 16:34:33 +0200 Subject: [PATCH 17/17] compile --- 42sh/src/parser/eval_sym.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/42sh/src/parser/eval_sym.c b/42sh/src/parser/eval_sym.c index accde374..338747fb 100644 --- a/42sh/src/parser/eval_sym.c +++ b/42sh/src/parser/eval_sym.c @@ -6,7 +6,7 @@ /* By: ariard +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/03/11 16:11:21 by ariard #+# #+# */ -/* Updated: 2017/03/29 16:19:59 by ariard ### ########.fr */ +/* Updated: 2017/03/29 16:34:15 by gwojda ### ########.fr */ /* */ /* ************************************************************************** */ @@ -1285,7 +1285,6 @@ int eval_sym(t_list **stack, t_sym new_sym) return (1); head = (*stack)->content; i = 0; - DG("eval %s && %s", read_state(*head), read_state(new_sym)); while (g_stackmatch[i].top) { if (new_sym == g_stackmatch[i].top && *head == g_stackmatch[i].under)