From 97fd6ce919e08b07d51fd875f172dede97a6177b Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Wed, 20 May 2020 17:03:56 +0200 Subject: [PATCH 01/17] Handling the resize of the terminal --- include/my_ncurses.h | 4 +++- src/my_ncurses/clear_utils.c | 14 -------------- src/my_ncurses/my_ncurses.c | 9 ++++++--- src/shell.c | 8 +++++++- 4 files changed, 16 insertions(+), 19 deletions(-) delete mode 100644 src/my_ncurses/clear_utils.c diff --git a/include/my_ncurses.h b/include/my_ncurses.h index fca6ba1..6778b87 100644 --- a/include/my_ncurses.h +++ b/include/my_ncurses.h @@ -63,4 +63,6 @@ my_addstr(window, str)) #define my_attron(attr, value) (printf("\x1B[%dm", attr + value)) #define my_attrreset() (printf("\x1B[0m")) -void my_clrtoeol(void); \ No newline at end of file + +#define my_clrtoeol() (printf("\x1B[K")) +#define my_clrtobot() (printf("\x1B[J")) \ No newline at end of file diff --git a/src/my_ncurses/clear_utils.c b/src/my_ncurses/clear_utils.c deleted file mode 100644 index 4cf98e7..0000000 --- a/src/my_ncurses/clear_utils.c +++ /dev/null @@ -1,14 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** ash -** File description: -** clear_utils -*/ - -#include "my_ncurses.h" -#include - -void my_clrtoeol(void) -{ - printf("\x1B[K"); -} \ No newline at end of file diff --git a/src/my_ncurses/my_ncurses.c b/src/my_ncurses/my_ncurses.c index a087899..9a9ede8 100644 --- a/src/my_ncurses/my_ncurses.c +++ b/src/my_ncurses/my_ncurses.c @@ -10,6 +10,7 @@ #include #include #include +#include #include my_window *stdwin; @@ -17,6 +18,8 @@ my_window *stdwin; void on_resize(int sig, siginfo_t *info, void *context) { my_getmaxyx(&stdwin->h, &stdwin->w); + my_getcuryx(&stdwin->y, &stdwin->x); + my_clrtobot(); } my_window *my_initwin(void) @@ -34,7 +37,7 @@ my_window *my_initwin(void) tcsetattr(0, TCSANOW, &term); sa.sa_sigaction = &on_resize; sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART | SA_SIGINFO; + sa.sa_flags = SA_SIGINFO; sigaction(SIGWINCH, &sa, NULL); my_getmaxyx(&window->h, &window->w); my_getcuryx(&window->y, &window->x); @@ -68,11 +71,11 @@ int my_getch(void) int ret = 0; if (size < 0) - return (-1); + return (errno == EINTR ? -2 : -1); if (size == 1 && c[0] == KEY_ESCAPE) size = read(1, &c[1], 3) + 1; if (size == 0) - return (-1); + return (errno == EINTR ? -2 : -1); for (int i = 0; i < size; i++) ret |= c[i] << (8u * i); return (ret); diff --git a/src/shell.c b/src/shell.c index bf966d7..c72d9d9 100644 --- a/src/shell.c +++ b/src/shell.c @@ -21,6 +21,8 @@ int process_key(int key, buffer_t *buffer, env_t *env) { + if (key <= 0) + return (0); for (int i = 0; env->bindings[i].func; i++) if (key == env->bindings[i].key) return (env->bindings[i].func(key, buffer, env)); @@ -47,7 +49,10 @@ int buf_getx(buffer_t *buffer, env_t *env) void shell_refresh(buffer_t *buffer, env_t *env) { static int oldbuffer_pos = 0; - int y = env->window->y - (oldbuffer_pos + buffer->startx) / env->window->w; + static int oldwidth = -1; + if (oldwidth == -1) + oldwidth = env->window->w; + int y = env->window->y - (oldbuffer_pos + buffer->startx) / oldwidth; int newy = y + (buffer->pos + buffer->startx) / env->window->w; if (buffer->buffer) @@ -56,6 +61,7 @@ void shell_refresh(buffer_t *buffer, env_t *env) my_move(env->window, newy, buf_getx(buffer, env)); my_refresh(); oldbuffer_pos = buffer->pos; + oldwidth = env->window->w; } void start_shell(env_t *env) From 34b70230ffbbe6c1db11ea0da400cc0c7592dd81 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Wed, 20 May 2020 17:10:52 +0200 Subject: [PATCH 02/17] Fixing null command without buffer --- src/key_bindings/basic_typing_functions.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 21e6f89..58a4187 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -60,14 +60,14 @@ int newline_command(int key, buffer_t *buffer, env_t *env) { int ret; - if (!buffer->buffer) - return (0); - add_to_history(buffer->buffer, env); if (env->window) my_addstr(env->window, "\n"); - ret = eval_raw_cmd(buffer->buffer, env); - buffer->buffer[0] = '\0'; - buffer->pos = 0; + if (buffer->buffer) { + add_to_history(buffer->buffer, env); + ret = eval_raw_cmd(buffer->buffer, env); + buffer->buffer[0] = '\0'; + buffer->pos = 0; + } if (env->window && ret >= 0) prompt_prepare(buffer, env); return (ret); From 3da9cfe9431015b876d28a28e020dfd1c4d2e60e Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Wed, 20 May 2020 18:06:10 +0200 Subject: [PATCH 03/17] Removing the pty and using a getcuryx at the end of the program --- Makefile | 2 - src/key_bindings/basic_typing_functions.c | 1 + src/my_ncurses/my_ncurses.c | 1 - src/prompt.c | 2 - src/redirections/pty_pipe.c | 102 ---------------------- 5 files changed, 1 insertion(+), 107 deletions(-) delete mode 100644 src/redirections/pty_pipe.c diff --git a/Makefile b/Makefile index 45cb4f4..78c0632 100644 --- a/Makefile +++ b/Makefile @@ -41,10 +41,8 @@ SRC = src/shell.c \ src/key_bindings/basic_typing_functions.c \ src/key_bindings/default_bindings.c \ src/key_bindings/control_commands.c \ - src/redirections/pty_pipe.c \ src/key_bindings/move_commands.c \ src/my_ncurses/my_ncurses.c \ - src/my_ncurses/clear_utils.c \ src/my_ncurses/string_utils.c OBJ = $(SRC:%.c=%.o) diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 58a4187..5d3f3a8 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -67,6 +67,7 @@ int newline_command(int key, buffer_t *buffer, env_t *env) ret = eval_raw_cmd(buffer->buffer, env); buffer->buffer[0] = '\0'; buffer->pos = 0; + my_getcuryx(&env->window->y, &env->window->x); } if (env->window && ret >= 0) prompt_prepare(buffer, env); diff --git a/src/my_ncurses/my_ncurses.c b/src/my_ncurses/my_ncurses.c index 9a9ede8..bc13b0c 100644 --- a/src/my_ncurses/my_ncurses.c +++ b/src/my_ncurses/my_ncurses.c @@ -19,7 +19,6 @@ void on_resize(int sig, siginfo_t *info, void *context) { my_getmaxyx(&stdwin->h, &stdwin->w); my_getcuryx(&stdwin->y, &stdwin->x); - my_clrtobot(); } my_window *my_initwin(void) diff --git a/src/prompt.c b/src/prompt.c index e6b7efe..e9f0235 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -43,8 +43,6 @@ int prompt_run(char *cmd, redirection *inout[2], env_t *env) argv = globbing(argv); if (!argv) return (0); - if (env->window && inout[1] == NULL) - inout[1] = new_ncurses_pty(); if (**argv == '!' && argv[0][1] && argv[0][1] != ' ') return (run_builtin(&builtins[5], argv, inout, env)); for (int i = 0; builtins[i].name; i++) diff --git a/src/redirections/pty_pipe.c b/src/redirections/pty_pipe.c deleted file mode 100644 index 059e25a..0000000 --- a/src/redirections/pty_pipe.c +++ /dev/null @@ -1,102 +0,0 @@ -/* -** EPITECH PROJECT, 2020 -** ash -** File description: -** pty_pipe -*/ - -#include "redirections.h" -#include "my_ncurses.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#define _XOPEN_SOURCE 600 -#define __USE_XOPEN_EXTENDED -#include - - -const struct redirection_map pty_type = { - .key = NULL, - .get_fd = &pyt_get_fd, - .run_cmd = &pty_get_output, - .type = OUTPUT | PIPE | EX_PIPE | PTY -}; - -int pty_open(char **slave_name) -{ - int master = open("/dev/ptmx", O_RDWR | O_NOCTTY); - int my_errno; - - *slave_name = NULL; - if (master < 0) - return (-1); - if (grantpt(master) < 0 || unlockpt(master) < 0 - || !(*slave_name = ptsname(master))) { - my_errno = errno; - close(master); - errno = my_errno; - return (-1); - } - return (master); -} - -struct redirection *new_ncurses_pty(void) -{ - struct redirection *pty = malloc(sizeof(*pty)); - char *slave; - - if (!pty) - return (NULL); - pty->type = &pty_type; - pty->fd = -1; - pty->extra_data = pty_open(&slave); - if (pty->extra_data < 0) { - perror(SHELL_NAME); - return (pty); - } - pty->fd = open(slave, O_RDWR); - if (pty->fd == -1) - perror(SHELL_NAME); - return (pty); -} - -int pyt_get_fd(redirection *pty) -{ - struct termios termios; - struct winsize winsize; - - tcgetattr(0, &termios); - tcsetattr(pty->fd, TCSANOW, &termios); - - ioctl(0, TIOCGWINSZ, &winsize); - ioctl(pty->fd, TIOCSWINSZ, &winsize); - dup2(pty->fd, 2); - return (pty->fd); -} - -void pty_get_output(redirection *pty, env_t *env) -{ - char *line = NULL; - size_t size = 0; - FILE *file = fdopen(pty->extra_data, "r"); - - close(pty->fd); - while (getline(&line, &size, file) > 0) - my_addstr(env->window, line); - if (line) { - if (line[0] && !strchr(line, '\n')) { - my_attron(BACKGROUND_COLOR, WHITE); - my_attron(COLOR, BLACK); - my_addstr(env->window, "%\n"); - my_attrreset(); - } - free(line); - } - fclose(file); -} \ No newline at end of file From 41f49d5d1589e4be57cc6ef9e77e8c80d57613a7 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 14:55:52 +0200 Subject: [PATCH 04/17] Restoring usual termios status before and after commands --- Makefile | 3 ++- include/my_ncurses.h | 6 +++++- src/key_bindings/basic_typing_functions.c | 2 ++ src/my_ncurses/pause_utils.c | 20 ++++++++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/my_ncurses/pause_utils.c diff --git a/Makefile b/Makefile index 78c0632..8980c7b 100644 --- a/Makefile +++ b/Makefile @@ -43,7 +43,8 @@ SRC = src/shell.c \ src/key_bindings/control_commands.c \ src/key_bindings/move_commands.c \ src/my_ncurses/my_ncurses.c \ - src/my_ncurses/string_utils.c + src/my_ncurses/string_utils.c \ + src/my_ncurses/pause_utils.c OBJ = $(SRC:%.c=%.o) OBJ += src/main.o diff --git a/include/my_ncurses.h b/include/my_ncurses.h index 6778b87..c33bb57 100644 --- a/include/my_ncurses.h +++ b/include/my_ncurses.h @@ -25,6 +25,7 @@ typedef struct { struct termios old_termios; + struct termios saved_termios; int x; int y; int w; @@ -65,4 +66,7 @@ my_addstr(window, str)) #define my_clrtoeol() (printf("\x1B[K")) -#define my_clrtobot() (printf("\x1B[J")) \ No newline at end of file +#define my_clrtobot() (printf("\x1B[J")) + +void my_npause(my_window *window); +void my_nresume(my_window *window); \ No newline at end of file diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 5d3f3a8..057d12b 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -64,7 +64,9 @@ int newline_command(int key, buffer_t *buffer, env_t *env) my_addstr(env->window, "\n"); if (buffer->buffer) { add_to_history(buffer->buffer, env); + my_npause(env->window); ret = eval_raw_cmd(buffer->buffer, env); + my_nresume(env->window); buffer->buffer[0] = '\0'; buffer->pos = 0; my_getcuryx(&env->window->y, &env->window->x); diff --git a/src/my_ncurses/pause_utils.c b/src/my_ncurses/pause_utils.c new file mode 100644 index 0000000..3c29566 --- /dev/null +++ b/src/my_ncurses/pause_utils.c @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2020 +** ash +** File description: +** pause_utils +*/ + +#include "my_ncurses.h" +#include + +void my_npause(my_window *window) +{ + tcgetattr(0, &window->saved_termios); + tcsetattr(0, TCSANOW, &window->old_termios); +} + +void my_nresume(my_window *window) +{ + tcsetattr(0, TCSANOW, &window->saved_termios); +} \ No newline at end of file From 683d501051c3d85180c8838594508dc91e77bffc Mon Sep 17 00:00:00 2001 From: arthur Date: Thu, 21 May 2020 14:58:00 +0200 Subject: [PATCH 05/17] functional tests --- test_shell/42sh.result | 0 test_shell/all_tests.sh | 25 +++++++++++++++++ test_shell/my_tests.sh | 62 +++++++++++++++++++++++++++++++++++++++++ test_shell/tcsh.result | 25 +++++++++++++++++ test_shell/tests/test1 | 2 ++ test_shell/tests/test10 | 4 +++ test_shell/tests/test11 | 1 + test_shell/tests/test12 | 1 + test_shell/tests/test13 | 16 +++++++++++ test_shell/tests/test14 | 4 +++ test_shell/tests/test15 | 8 ++++++ test_shell/tests/test16 | 1 + test_shell/tests/test17 | 7 +++++ test_shell/tests/test18 | 1 + test_shell/tests/test19 | 2 ++ test_shell/tests/test2 | 2 ++ test_shell/tests/test20 | 1 + test_shell/tests/test21 | 1 + test_shell/tests/test22 | 1 + test_shell/tests/test23 | 1 + test_shell/tests/test24 | 3 ++ test_shell/tests/test25 | 4 +++ test_shell/tests/test3 | 2 ++ test_shell/tests/test4 | 1 + test_shell/tests/test5 | 1 + test_shell/tests/test6 | 1 + test_shell/tests/test7 | 1 + test_shell/tests/test8 | 2 ++ test_shell/tests/test9 | 8 ++++++ 29 files changed, 188 insertions(+) create mode 100644 test_shell/42sh.result create mode 100755 test_shell/all_tests.sh create mode 100755 test_shell/my_tests.sh create mode 100644 test_shell/tcsh.result create mode 100644 test_shell/tests/test1 create mode 100644 test_shell/tests/test10 create mode 100644 test_shell/tests/test11 create mode 100644 test_shell/tests/test12 create mode 100644 test_shell/tests/test13 create mode 100644 test_shell/tests/test14 create mode 100644 test_shell/tests/test15 create mode 100644 test_shell/tests/test16 create mode 100644 test_shell/tests/test17 create mode 100644 test_shell/tests/test18 create mode 100644 test_shell/tests/test19 create mode 100644 test_shell/tests/test2 create mode 100644 test_shell/tests/test20 create mode 100644 test_shell/tests/test21 create mode 100644 test_shell/tests/test22 create mode 100644 test_shell/tests/test23 create mode 100644 test_shell/tests/test24 create mode 100644 test_shell/tests/test25 create mode 100644 test_shell/tests/test3 create mode 100644 test_shell/tests/test4 create mode 100644 test_shell/tests/test5 create mode 100644 test_shell/tests/test6 create mode 100644 test_shell/tests/test7 create mode 100644 test_shell/tests/test8 create mode 100644 test_shell/tests/test9 diff --git a/test_shell/42sh.result b/test_shell/42sh.result new file mode 100644 index 0000000..e69de29 diff --git a/test_shell/all_tests.sh b/test_shell/all_tests.sh new file mode 100755 index 0000000..5f6fe05 --- /dev/null +++ b/test_shell/all_tests.sh @@ -0,0 +1,25 @@ +./my_tests.sh tests/test1 +./my_tests.sh tests/test2 +./my_tests.sh tests/test3 +./my_tests.sh tests/test4 +./my_tests.sh tests/test5 +./my_tests.sh tests/test6 +./my_tests.sh tests/test7 +./my_tests.sh tests/test8 +./my_tests.sh tests/test9 +./my_tests.sh tests/test10 +./my_tests.sh tests/test11 +./my_tests.sh tests/test12 +./my_tests.sh tests/test13 +./my_tests.sh tests/test14 +./my_tests.sh tests/test15 +./my_tests.sh tests/test16 +./my_tests.sh tests/test17 +./my_tests.sh tests/test18 +./my_tests.sh tests/test19 +./my_tests.sh tests/test20 +./my_tests.sh tests/test21 +./my_tests.sh tests/test22 +./my_tests.sh tests/test23 +./my_tests.sh tests/test24 +./my_tests.sh tests/test25 \ No newline at end of file diff --git a/test_shell/my_tests.sh b/test_shell/my_tests.sh new file mode 100755 index 0000000..275b03e --- /dev/null +++ b/test_shell/my_tests.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +test_setup() +{ + if [ -f "$fictest".setup ] + then + . "$fictest".setup + fi +} + +test_unsetup() +{ + if [ -f "$fictest".unsetup ] + then + . "$fictest".unsetup + fi +} + +test_tcsh() +{ + test_setup + /bin/cat "$fictest" | /bin/tcsh -f 2>tcsh.result >tcsh.result + test_unsetup +} + +test_42sh() +{ + test_setup + /bin/cat "$fictest" | ./42sh 2> 42sh.result >42sh.result + test_unsetup +} + + +fictest="$1" +echo "*** Launch $fictest ***" +rm -f tcsh.result 42sh.result +if [ ! -f "$fictest" ] +then + echo "Test $fictest not found !" 1>&2 + exit 1 +fi +if [ ! -f "42sh" ] +then + echo "42sh not found !" 1>&2 + exit 1 +fi +if [ ! -f "/bin/tcsh" ] +then + echo "tcsh not found !" 1>&2 + exit 1 +fi +(test_tcsh "$fictest") +(test_42sh "$fictest") +diff 42sh.result tcsh.result >/dev/null 2>/dev/null +if [ $? -eq 0 ] +then + echo " => OK" + exit 0 +else + echo " => FAILED" + exit 1 +fi diff --git a/test_shell/tcsh.result b/test_shell/tcsh.result new file mode 100644 index 0000000..6296183 --- /dev/null +++ b/test_shell/tcsh.result @@ -0,0 +1,25 @@ +alias.c +alias.o +args.c +args.o +builtin +env.c +env.o +execute.c +execute.o +free_env.c +free_env.o +glob.c +glob.o +key_bindings +main.c +main.o +my_ncurses +prompt.c +prompt.o +redirections +shell.c +shell.o +signal.c +signal.o +utility diff --git a/test_shell/tests/test1 b/test_shell/tests/test1 new file mode 100644 index 0000000..3b1f437 --- /dev/null +++ b/test_shell/tests/test1 @@ -0,0 +1,2 @@ +cd .. +ls null; ls ok && ls; ls || ls -l; ls \ No newline at end of file diff --git a/test_shell/tests/test10 b/test_shell/tests/test10 new file mode 100644 index 0000000..e3a3a4f --- /dev/null +++ b/test_shell/tests/test10 @@ -0,0 +1,4 @@ +cd .. +alias history ls +history -la +unalias history diff --git a/test_shell/tests/test11 b/test_shell/tests/test11 new file mode 100644 index 0000000..6870771 --- /dev/null +++ b/test_shell/tests/test11 @@ -0,0 +1 @@ +unalias && ls \ No newline at end of file diff --git a/test_shell/tests/test12 b/test_shell/tests/test12 new file mode 100644 index 0000000..1fe6a93 --- /dev/null +++ b/test_shell/tests/test12 @@ -0,0 +1 @@ +unalias || ls .. \ No newline at end of file diff --git a/test_shell/tests/test13 b/test_shell/tests/test13 new file mode 100644 index 0000000..e9bec52 --- /dev/null +++ b/test_shell/tests/test13 @@ -0,0 +1,16 @@ +unalias ls +alias ls cd +alias +ls .. +unalias ls +ls +alias a a +alias b b +alias L L +alias +unalias b +alias +unalias a +alias +unalias L +alias \ No newline at end of file diff --git a/test_shell/tests/test14 b/test_shell/tests/test14 new file mode 100644 index 0000000..bb32768 --- /dev/null +++ b/test_shell/tests/test14 @@ -0,0 +1,4 @@ +alias ls cd .. +alias | grep cd +alias ls cd +alias | grep cd \ No newline at end of file diff --git a/test_shell/tests/test15 b/test_shell/tests/test15 new file mode 100644 index 0000000..93f81ef --- /dev/null +++ b/test_shell/tests/test15 @@ -0,0 +1,8 @@ +alias ls ls -l +alias +alias ls "ls -l" +alias +alias ls 'ls -l' +alias +alias ls ls\ -l +alias \ No newline at end of file diff --git a/test_shell/tests/test16 b/test_shell/tests/test16 new file mode 100644 index 0000000..d2ee4b8 --- /dev/null +++ b/test_shell/tests/test16 @@ -0,0 +1 @@ +ls ' \ No newline at end of file diff --git a/test_shell/tests/test17 b/test_shell/tests/test17 new file mode 100644 index 0000000..6523e3b --- /dev/null +++ b/test_shell/tests/test17 @@ -0,0 +1,7 @@ +cd ../../.. +cd 'Semestre 2' +ls; cd .. +cd "Semestre 2" +ls; cd .. +cd Semestre\ 2 +ls \ No newline at end of file diff --git a/test_shell/tests/test18 b/test_shell/tests/test18 new file mode 100644 index 0000000..a5f7224 --- /dev/null +++ b/test_shell/tests/test18 @@ -0,0 +1 @@ +echo ok bye diff --git a/test_shell/tests/test19 b/test_shell/tests/test19 new file mode 100644 index 0000000..63266c7 --- /dev/null +++ b/test_shell/tests/test19 @@ -0,0 +1,2 @@ +setenv ok lol +echo $ok bye diff --git a/test_shell/tests/test2 b/test_shell/tests/test2 new file mode 100644 index 0000000..136fc9c --- /dev/null +++ b/test_shell/tests/test2 @@ -0,0 +1,2 @@ +ls l && cd ok +ls && \ No newline at end of file diff --git a/test_shell/tests/test20 b/test_shell/tests/test20 new file mode 100644 index 0000000..d5a5c6f --- /dev/null +++ b/test_shell/tests/test20 @@ -0,0 +1 @@ +echo \n diff --git a/test_shell/tests/test21 b/test_shell/tests/test21 new file mode 100644 index 0000000..fa11a6a --- /dev/null +++ b/test_shell/tests/test21 @@ -0,0 +1 @@ +echo diff --git a/test_shell/tests/test22 b/test_shell/tests/test22 new file mode 100644 index 0000000..5627780 --- /dev/null +++ b/test_shell/tests/test22 @@ -0,0 +1 @@ +echo "\n" diff --git a/test_shell/tests/test23 b/test_shell/tests/test23 new file mode 100644 index 0000000..956a4bc --- /dev/null +++ b/test_shell/tests/test23 @@ -0,0 +1 @@ +echo "$" \ No newline at end of file diff --git a/test_shell/tests/test24 b/test_shell/tests/test24 new file mode 100644 index 0000000..5931018 --- /dev/null +++ b/test_shell/tests/test24 @@ -0,0 +1,3 @@ +echo "\t" +echo $ +echo $? diff --git a/test_shell/tests/test25 b/test_shell/tests/test25 new file mode 100644 index 0000000..2e4b5fe --- /dev/null +++ b/test_shell/tests/test25 @@ -0,0 +1,4 @@ +cd .. +setenv a s +setenv b rc +ls $a$b \ No newline at end of file diff --git a/test_shell/tests/test3 b/test_shell/tests/test3 new file mode 100644 index 0000000..e61c144 --- /dev/null +++ b/test_shell/tests/test3 @@ -0,0 +1,2 @@ +cd .. + && ls \ No newline at end of file diff --git a/test_shell/tests/test4 b/test_shell/tests/test4 new file mode 100644 index 0000000..60fa800 --- /dev/null +++ b/test_shell/tests/test4 @@ -0,0 +1 @@ +ls || \ No newline at end of file diff --git a/test_shell/tests/test5 b/test_shell/tests/test5 new file mode 100644 index 0000000..b56375c --- /dev/null +++ b/test_shell/tests/test5 @@ -0,0 +1 @@ + || ls diff --git a/test_shell/tests/test6 b/test_shell/tests/test6 new file mode 100644 index 0000000..450bc0d --- /dev/null +++ b/test_shell/tests/test6 @@ -0,0 +1 @@ + || diff --git a/test_shell/tests/test7 b/test_shell/tests/test7 new file mode 100644 index 0000000..08becee --- /dev/null +++ b/test_shell/tests/test7 @@ -0,0 +1 @@ + && \ No newline at end of file diff --git a/test_shell/tests/test8 b/test_shell/tests/test8 new file mode 100644 index 0000000..54d16aa --- /dev/null +++ b/test_shell/tests/test8 @@ -0,0 +1,2 @@ + && +ls ; || ; &&; ls \ No newline at end of file diff --git a/test_shell/tests/test9 b/test_shell/tests/test9 new file mode 100644 index 0000000..804b412 --- /dev/null +++ b/test_shell/tests/test9 @@ -0,0 +1,8 @@ +alias a a +alias b b +alias L L +alias +alias ok bye +alias a bye +alias +unalias ok;alias \ No newline at end of file From 1069fd383177edaf5ecec5507bd4ca919a7107e5 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:05:55 +0200 Subject: [PATCH 06/17] Adding a bad exit value when functional tests fails --- tests/tester/tester.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/tester/tester.sh b/tests/tester/tester.sh index f721879..7cf5cc5 100755 --- a/tests/tester/tester.sh +++ b/tests/tester/tester.sh @@ -17,6 +17,8 @@ EXPR=`which expr` MKDIR=`which mkdir` CP=`which cp` +ko=1 + for i in `env | grep BASH_FUNC_ | cut -d= -f1`; do f=`echo $i | sed s/BASH_FUNC_//g | sed s/%%//g` unset -f $f @@ -104,6 +106,7 @@ load_test() echo "OK" fi else + ko=0 if [ $debug -ge 1 ] then echo "Test $id ($NAME) : KO - Check output in /tmp/test.$$/$id/" @@ -169,3 +172,8 @@ else fi fi fi + +if [ $ko -eq 0 ] +then + exit 1 +fi \ No newline at end of file From b76d01c1b5947d2620c0af0ff44d41503aba4e8d Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:08:05 +0200 Subject: [PATCH 07/17] Disabling the pause when no window is oppened --- src/my_ncurses/pause_utils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/my_ncurses/pause_utils.c b/src/my_ncurses/pause_utils.c index 3c29566..930e2c5 100644 --- a/src/my_ncurses/pause_utils.c +++ b/src/my_ncurses/pause_utils.c @@ -10,11 +10,15 @@ void my_npause(my_window *window) { + if (!window) + return; tcgetattr(0, &window->saved_termios); tcsetattr(0, TCSANOW, &window->old_termios); } void my_nresume(my_window *window) { + if (!window) + return; tcsetattr(0, TCSANOW, &window->saved_termios); } \ No newline at end of file From e53c52b32aabf2959f6f1886fc1ffd02f10425fb Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:10:36 +0200 Subject: [PATCH 08/17] Solving a segfault with the newline_command when no window was openned --- src/key_bindings/basic_typing_functions.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 057d12b..7c58d4f 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -69,7 +69,8 @@ int newline_command(int key, buffer_t *buffer, env_t *env) my_nresume(env->window); buffer->buffer[0] = '\0'; buffer->pos = 0; - my_getcuryx(&env->window->y, &env->window->x); + if (env->window) + my_getcuryx(&env->window->y, &env->window->x); } if (env->window && ret >= 0) prompt_prepare(buffer, env); From d6d2dd34f0195ba9f27706cc110a35282fa64d73 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:33:14 +0200 Subject: [PATCH 09/17] Merging tests --- tests/test_convertor.sh | 14 +++ tests/tester/tests | 261 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 tests/test_convertor.sh diff --git a/tests/test_convertor.sh b/tests/test_convertor.sh new file mode 100644 index 0000000..4bb7b17 --- /dev/null +++ b/tests/test_convertor.sh @@ -0,0 +1,14 @@ +i=913 + +for file in test_shell/tests/*; do + echo "["$i"]" + echo "NAME=\"$i\"" + echo 'SETUP=""' + echo 'CLEAN=""' + echo "TESTS=" + cat $file | sed s/^/"echo '"/ | sed s/$/\'/ + echo "'" + echo "["$i"-END]" + echo "" + ((i++)) +done \ No newline at end of file diff --git a/tests/tester/tests b/tests/tester/tests index b78c6d1..b5a970c 100644 --- a/tests/tester/tests +++ b/tests/tester/tests @@ -122,4 +122,263 @@ TESTS= echo '/bin/ls | cd /usr' echo 'ls -l' echo 'exit 45|cat /etc/resolv.conf' -[912-END] +[912-END][913] +NAME="913" +SETUP="" +CLEAN="" +TESTS= +echo 'cd ..' +echo 'ls null; ls ok && ls; ls || ls -l; ls'' +[913-END] + +[914] +NAME="914" +SETUP="" +CLEAN="" +TESTS= +echo 'cd ..' +echo 'alias history ls' +echo 'history -la' +echo 'unalias history' +' +[914-END] + +[915] +NAME="915" +SETUP="" +CLEAN="" +TESTS= +echo 'unalias && ls'' +[915-END] + +[916] +NAME="916" +SETUP="" +CLEAN="" +TESTS= +echo 'unalias || ls ..'' +[916-END] + +[917] +NAME="917" +SETUP="" +CLEAN="" +TESTS= +echo 'unalias ls' +echo 'alias ls cd' +echo 'alias' +echo 'ls ..' +echo 'unalias ls' +echo 'ls' +echo 'alias a a' +echo 'alias b b' +echo 'alias L L' +echo 'alias' +echo 'unalias b' +echo 'alias' +echo 'unalias a' +echo 'alias' +echo 'unalias L' +echo 'alias'' +[917-END] + +[918] +NAME="918" +SETUP="" +CLEAN="" +TESTS= +echo 'alias ls cd ..' +echo 'alias | grep cd' +echo 'alias ls cd' +echo 'alias | grep cd'' +[918-END] + +[919] +NAME="919" +SETUP="" +CLEAN="" +TESTS= +echo 'alias ls ls -l' +echo 'alias' +echo 'alias ls "ls -l"' +echo 'alias' +echo 'alias ls 'ls -l'' +echo 'alias' +echo 'alias ls ls\ -l' +echo 'alias'' +[919-END] + +[920] +NAME="920" +SETUP="" +CLEAN="" +TESTS= +echo 'ls ''' +[920-END] + +[921] +NAME="921" +SETUP="" +CLEAN="" +TESTS= +echo 'cd ../../..' +echo 'cd 'Semestre 2'' +echo 'ls; cd ..' +echo 'cd "Semestre 2"' +echo 'ls; cd ..' +echo 'cd Semestre\ 2' +echo 'ls'' +[921-END] + +[922] +NAME="922" +SETUP="" +CLEAN="" +TESTS= +echo 'echo ok bye' +' +[922-END] + +[923] +NAME="923" +SETUP="" +CLEAN="" +TESTS= +echo 'setenv ok lol' +echo 'echo $ok bye' +' +[923-END] + +[924] +NAME="924" +SETUP="" +CLEAN="" +TESTS= +echo 'ls l && cd ok' +echo 'ls &&'' +[924-END] + +[925] +NAME="925" +SETUP="" +CLEAN="" +TESTS= +echo 'echo \n' +' +[925-END] + +[926] +NAME="926" +SETUP="" +CLEAN="" +TESTS= +echo 'echo' +' +[926-END] + +[927] +NAME="927" +SETUP="" +CLEAN="" +TESTS= +echo 'echo "\n"' +' +[927-END] + +[928] +NAME="928" +SETUP="" +CLEAN="" +TESTS= +echo 'echo "$"'' +[928-END] + +[929] +NAME="929" +SETUP="" +CLEAN="" +TESTS= +echo 'echo "\t"' +echo 'echo $' +echo 'echo $?' +' +[929-END] + +[930] +NAME="930" +SETUP="" +CLEAN="" +TESTS= +echo 'cd ..' +echo 'setenv a s' +echo 'setenv b rc' +echo 'ls $a$b'' +[930-END] + +[931] +NAME="931" +SETUP="" +CLEAN="" +TESTS= +echo 'cd ..' +echo ' && ls'' +[931-END] + +[932] +NAME="932" +SETUP="" +CLEAN="" +TESTS= +echo 'ls ||'' +[932-END] + +[933] +NAME="933" +SETUP="" +CLEAN="" +TESTS= +echo ' || ls' +' +[933-END] + +[934] +NAME="934" +SETUP="" +CLEAN="" +TESTS= +echo ' || ' +' +[934-END] + +[935] +NAME="935" +SETUP="" +CLEAN="" +TESTS= +echo ' && '' +[935-END] + +[936] +NAME="936" +SETUP="" +CLEAN="" +TESTS= +echo ' && ' +echo 'ls ; || ; &&; ls'' +[936-END] + +[937] +NAME="937" +SETUP="" +CLEAN="" +TESTS= +echo 'alias a a' +echo 'alias b b' +echo 'alias L L' +echo 'alias' +echo 'alias ok bye' +echo 'alias a bye' +echo 'alias' +echo 'unalias ok;alias'' +[937-END] + From 1b6ce9577f3b9257f22cd38e8001d2323471ea74 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:34:00 +0200 Subject: [PATCH 10/17] Removing old tests_format --- test_shell/42sh.result | 0 test_shell/all_tests.sh | 25 ----------------- test_shell/my_tests.sh | 62 ----------------------------------------- test_shell/tcsh.result | 25 ----------------- test_shell/tests/test1 | 2 -- test_shell/tests/test10 | 4 --- test_shell/tests/test11 | 1 - test_shell/tests/test12 | 1 - test_shell/tests/test13 | 16 ----------- test_shell/tests/test14 | 4 --- test_shell/tests/test15 | 8 ------ test_shell/tests/test16 | 1 - test_shell/tests/test17 | 7 ----- test_shell/tests/test18 | 1 - test_shell/tests/test19 | 2 -- test_shell/tests/test2 | 2 -- test_shell/tests/test20 | 1 - test_shell/tests/test21 | 1 - test_shell/tests/test22 | 1 - test_shell/tests/test23 | 1 - test_shell/tests/test24 | 3 -- test_shell/tests/test25 | 4 --- test_shell/tests/test3 | 2 -- test_shell/tests/test4 | 1 - test_shell/tests/test5 | 1 - test_shell/tests/test6 | 1 - test_shell/tests/test7 | 1 - test_shell/tests/test8 | 2 -- test_shell/tests/test9 | 8 ------ 29 files changed, 188 deletions(-) delete mode 100644 test_shell/42sh.result delete mode 100755 test_shell/all_tests.sh delete mode 100755 test_shell/my_tests.sh delete mode 100644 test_shell/tcsh.result delete mode 100644 test_shell/tests/test1 delete mode 100644 test_shell/tests/test10 delete mode 100644 test_shell/tests/test11 delete mode 100644 test_shell/tests/test12 delete mode 100644 test_shell/tests/test13 delete mode 100644 test_shell/tests/test14 delete mode 100644 test_shell/tests/test15 delete mode 100644 test_shell/tests/test16 delete mode 100644 test_shell/tests/test17 delete mode 100644 test_shell/tests/test18 delete mode 100644 test_shell/tests/test19 delete mode 100644 test_shell/tests/test2 delete mode 100644 test_shell/tests/test20 delete mode 100644 test_shell/tests/test21 delete mode 100644 test_shell/tests/test22 delete mode 100644 test_shell/tests/test23 delete mode 100644 test_shell/tests/test24 delete mode 100644 test_shell/tests/test25 delete mode 100644 test_shell/tests/test3 delete mode 100644 test_shell/tests/test4 delete mode 100644 test_shell/tests/test5 delete mode 100644 test_shell/tests/test6 delete mode 100644 test_shell/tests/test7 delete mode 100644 test_shell/tests/test8 delete mode 100644 test_shell/tests/test9 diff --git a/test_shell/42sh.result b/test_shell/42sh.result deleted file mode 100644 index e69de29..0000000 diff --git a/test_shell/all_tests.sh b/test_shell/all_tests.sh deleted file mode 100755 index 5f6fe05..0000000 --- a/test_shell/all_tests.sh +++ /dev/null @@ -1,25 +0,0 @@ -./my_tests.sh tests/test1 -./my_tests.sh tests/test2 -./my_tests.sh tests/test3 -./my_tests.sh tests/test4 -./my_tests.sh tests/test5 -./my_tests.sh tests/test6 -./my_tests.sh tests/test7 -./my_tests.sh tests/test8 -./my_tests.sh tests/test9 -./my_tests.sh tests/test10 -./my_tests.sh tests/test11 -./my_tests.sh tests/test12 -./my_tests.sh tests/test13 -./my_tests.sh tests/test14 -./my_tests.sh tests/test15 -./my_tests.sh tests/test16 -./my_tests.sh tests/test17 -./my_tests.sh tests/test18 -./my_tests.sh tests/test19 -./my_tests.sh tests/test20 -./my_tests.sh tests/test21 -./my_tests.sh tests/test22 -./my_tests.sh tests/test23 -./my_tests.sh tests/test24 -./my_tests.sh tests/test25 \ No newline at end of file diff --git a/test_shell/my_tests.sh b/test_shell/my_tests.sh deleted file mode 100755 index 275b03e..0000000 --- a/test_shell/my_tests.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh - -test_setup() -{ - if [ -f "$fictest".setup ] - then - . "$fictest".setup - fi -} - -test_unsetup() -{ - if [ -f "$fictest".unsetup ] - then - . "$fictest".unsetup - fi -} - -test_tcsh() -{ - test_setup - /bin/cat "$fictest" | /bin/tcsh -f 2>tcsh.result >tcsh.result - test_unsetup -} - -test_42sh() -{ - test_setup - /bin/cat "$fictest" | ./42sh 2> 42sh.result >42sh.result - test_unsetup -} - - -fictest="$1" -echo "*** Launch $fictest ***" -rm -f tcsh.result 42sh.result -if [ ! -f "$fictest" ] -then - echo "Test $fictest not found !" 1>&2 - exit 1 -fi -if [ ! -f "42sh" ] -then - echo "42sh not found !" 1>&2 - exit 1 -fi -if [ ! -f "/bin/tcsh" ] -then - echo "tcsh not found !" 1>&2 - exit 1 -fi -(test_tcsh "$fictest") -(test_42sh "$fictest") -diff 42sh.result tcsh.result >/dev/null 2>/dev/null -if [ $? -eq 0 ] -then - echo " => OK" - exit 0 -else - echo " => FAILED" - exit 1 -fi diff --git a/test_shell/tcsh.result b/test_shell/tcsh.result deleted file mode 100644 index 6296183..0000000 --- a/test_shell/tcsh.result +++ /dev/null @@ -1,25 +0,0 @@ -alias.c -alias.o -args.c -args.o -builtin -env.c -env.o -execute.c -execute.o -free_env.c -free_env.o -glob.c -glob.o -key_bindings -main.c -main.o -my_ncurses -prompt.c -prompt.o -redirections -shell.c -shell.o -signal.c -signal.o -utility diff --git a/test_shell/tests/test1 b/test_shell/tests/test1 deleted file mode 100644 index 3b1f437..0000000 --- a/test_shell/tests/test1 +++ /dev/null @@ -1,2 +0,0 @@ -cd .. -ls null; ls ok && ls; ls || ls -l; ls \ No newline at end of file diff --git a/test_shell/tests/test10 b/test_shell/tests/test10 deleted file mode 100644 index e3a3a4f..0000000 --- a/test_shell/tests/test10 +++ /dev/null @@ -1,4 +0,0 @@ -cd .. -alias history ls -history -la -unalias history diff --git a/test_shell/tests/test11 b/test_shell/tests/test11 deleted file mode 100644 index 6870771..0000000 --- a/test_shell/tests/test11 +++ /dev/null @@ -1 +0,0 @@ -unalias && ls \ No newline at end of file diff --git a/test_shell/tests/test12 b/test_shell/tests/test12 deleted file mode 100644 index 1fe6a93..0000000 --- a/test_shell/tests/test12 +++ /dev/null @@ -1 +0,0 @@ -unalias || ls .. \ No newline at end of file diff --git a/test_shell/tests/test13 b/test_shell/tests/test13 deleted file mode 100644 index e9bec52..0000000 --- a/test_shell/tests/test13 +++ /dev/null @@ -1,16 +0,0 @@ -unalias ls -alias ls cd -alias -ls .. -unalias ls -ls -alias a a -alias b b -alias L L -alias -unalias b -alias -unalias a -alias -unalias L -alias \ No newline at end of file diff --git a/test_shell/tests/test14 b/test_shell/tests/test14 deleted file mode 100644 index bb32768..0000000 --- a/test_shell/tests/test14 +++ /dev/null @@ -1,4 +0,0 @@ -alias ls cd .. -alias | grep cd -alias ls cd -alias | grep cd \ No newline at end of file diff --git a/test_shell/tests/test15 b/test_shell/tests/test15 deleted file mode 100644 index 93f81ef..0000000 --- a/test_shell/tests/test15 +++ /dev/null @@ -1,8 +0,0 @@ -alias ls ls -l -alias -alias ls "ls -l" -alias -alias ls 'ls -l' -alias -alias ls ls\ -l -alias \ No newline at end of file diff --git a/test_shell/tests/test16 b/test_shell/tests/test16 deleted file mode 100644 index d2ee4b8..0000000 --- a/test_shell/tests/test16 +++ /dev/null @@ -1 +0,0 @@ -ls ' \ No newline at end of file diff --git a/test_shell/tests/test17 b/test_shell/tests/test17 deleted file mode 100644 index 6523e3b..0000000 --- a/test_shell/tests/test17 +++ /dev/null @@ -1,7 +0,0 @@ -cd ../../.. -cd 'Semestre 2' -ls; cd .. -cd "Semestre 2" -ls; cd .. -cd Semestre\ 2 -ls \ No newline at end of file diff --git a/test_shell/tests/test18 b/test_shell/tests/test18 deleted file mode 100644 index a5f7224..0000000 --- a/test_shell/tests/test18 +++ /dev/null @@ -1 +0,0 @@ -echo ok bye diff --git a/test_shell/tests/test19 b/test_shell/tests/test19 deleted file mode 100644 index 63266c7..0000000 --- a/test_shell/tests/test19 +++ /dev/null @@ -1,2 +0,0 @@ -setenv ok lol -echo $ok bye diff --git a/test_shell/tests/test2 b/test_shell/tests/test2 deleted file mode 100644 index 136fc9c..0000000 --- a/test_shell/tests/test2 +++ /dev/null @@ -1,2 +0,0 @@ -ls l && cd ok -ls && \ No newline at end of file diff --git a/test_shell/tests/test20 b/test_shell/tests/test20 deleted file mode 100644 index d5a5c6f..0000000 --- a/test_shell/tests/test20 +++ /dev/null @@ -1 +0,0 @@ -echo \n diff --git a/test_shell/tests/test21 b/test_shell/tests/test21 deleted file mode 100644 index fa11a6a..0000000 --- a/test_shell/tests/test21 +++ /dev/null @@ -1 +0,0 @@ -echo diff --git a/test_shell/tests/test22 b/test_shell/tests/test22 deleted file mode 100644 index 5627780..0000000 --- a/test_shell/tests/test22 +++ /dev/null @@ -1 +0,0 @@ -echo "\n" diff --git a/test_shell/tests/test23 b/test_shell/tests/test23 deleted file mode 100644 index 956a4bc..0000000 --- a/test_shell/tests/test23 +++ /dev/null @@ -1 +0,0 @@ -echo "$" \ No newline at end of file diff --git a/test_shell/tests/test24 b/test_shell/tests/test24 deleted file mode 100644 index 5931018..0000000 --- a/test_shell/tests/test24 +++ /dev/null @@ -1,3 +0,0 @@ -echo "\t" -echo $ -echo $? diff --git a/test_shell/tests/test25 b/test_shell/tests/test25 deleted file mode 100644 index 2e4b5fe..0000000 --- a/test_shell/tests/test25 +++ /dev/null @@ -1,4 +0,0 @@ -cd .. -setenv a s -setenv b rc -ls $a$b \ No newline at end of file diff --git a/test_shell/tests/test3 b/test_shell/tests/test3 deleted file mode 100644 index e61c144..0000000 --- a/test_shell/tests/test3 +++ /dev/null @@ -1,2 +0,0 @@ -cd .. - && ls \ No newline at end of file diff --git a/test_shell/tests/test4 b/test_shell/tests/test4 deleted file mode 100644 index 60fa800..0000000 --- a/test_shell/tests/test4 +++ /dev/null @@ -1 +0,0 @@ -ls || \ No newline at end of file diff --git a/test_shell/tests/test5 b/test_shell/tests/test5 deleted file mode 100644 index b56375c..0000000 --- a/test_shell/tests/test5 +++ /dev/null @@ -1 +0,0 @@ - || ls diff --git a/test_shell/tests/test6 b/test_shell/tests/test6 deleted file mode 100644 index 450bc0d..0000000 --- a/test_shell/tests/test6 +++ /dev/null @@ -1 +0,0 @@ - || diff --git a/test_shell/tests/test7 b/test_shell/tests/test7 deleted file mode 100644 index 08becee..0000000 --- a/test_shell/tests/test7 +++ /dev/null @@ -1 +0,0 @@ - && \ No newline at end of file diff --git a/test_shell/tests/test8 b/test_shell/tests/test8 deleted file mode 100644 index 54d16aa..0000000 --- a/test_shell/tests/test8 +++ /dev/null @@ -1,2 +0,0 @@ - && -ls ; || ; &&; ls \ No newline at end of file diff --git a/test_shell/tests/test9 b/test_shell/tests/test9 deleted file mode 100644 index 804b412..0000000 --- a/test_shell/tests/test9 +++ /dev/null @@ -1,8 +0,0 @@ -alias a a -alias b b -alias L L -alias -alias ok bye -alias a bye -alias -unalias ok;alias \ No newline at end of file From 932dc5655a67ea3b98f566add59e9d1745616afe Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:39:51 +0200 Subject: [PATCH 11/17] Fixing a resize bug --- src/shell.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shell.c b/src/shell.c index c72d9d9..437b2f7 100644 --- a/src/shell.c +++ b/src/shell.c @@ -57,7 +57,7 @@ void shell_refresh(buffer_t *buffer, env_t *env) if (buffer->buffer) my_mvaddstr(env->window, y, buffer->startx, buffer->buffer); - my_clrtoeol(); + my_clrtobot(); my_move(env->window, newy, buf_getx(buffer, env)); my_refresh(); oldbuffer_pos = buffer->pos; From 1c8e8422b84f3de645e9d6ebb3b104e366068471 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:49:35 +0200 Subject: [PATCH 12/17] Fixing some tests --- tests/test_convertor.sh | 2 +- tests/tester/tests | 165 +++++++++++++++++++--------------------- 2 files changed, 80 insertions(+), 87 deletions(-) diff --git a/tests/test_convertor.sh b/tests/test_convertor.sh index 4bb7b17..3322f3d 100644 --- a/tests/test_convertor.sh +++ b/tests/test_convertor.sh @@ -7,7 +7,7 @@ for file in test_shell/tests/*; do echo 'CLEAN=""' echo "TESTS=" cat $file | sed s/^/"echo '"/ | sed s/$/\'/ - echo "'" + echo "" echo "["$i"-END]" echo "" ((i++)) diff --git a/tests/tester/tests b/tests/tester/tests index b5a970c..dcbde9a 100644 --- a/tests/tester/tests +++ b/tests/tester/tests @@ -122,13 +122,15 @@ TESTS= echo '/bin/ls | cd /usr' echo 'ls -l' echo 'exit 45|cat /etc/resolv.conf' -[912-END][913] +[912-END] + +[913] NAME="913" SETUP="" CLEAN="" TESTS= -echo 'cd ..' -echo 'ls null; ls ok && ls; ls || ls -l; ls'' + echo 'cd ..' + echo 'ls null; ls ok && ls; ls || ls -l; ls' [913-END] [914] @@ -136,11 +138,10 @@ NAME="914" SETUP="" CLEAN="" TESTS= -echo 'cd ..' -echo 'alias history ls' -echo 'history -la' -echo 'unalias history' -' + echo 'cd ..' + echo 'alias history ls' + echo 'history -la' + echo 'unalias history' [914-END] [915] @@ -148,7 +149,7 @@ NAME="915" SETUP="" CLEAN="" TESTS= -echo 'unalias && ls'' + echo 'unalias && ls' [915-END] [916] @@ -156,7 +157,7 @@ NAME="916" SETUP="" CLEAN="" TESTS= -echo 'unalias || ls ..'' + echo 'unalias || ls ..' [916-END] [917] @@ -164,22 +165,22 @@ NAME="917" SETUP="" CLEAN="" TESTS= -echo 'unalias ls' -echo 'alias ls cd' -echo 'alias' -echo 'ls ..' -echo 'unalias ls' -echo 'ls' -echo 'alias a a' -echo 'alias b b' -echo 'alias L L' -echo 'alias' -echo 'unalias b' -echo 'alias' -echo 'unalias a' -echo 'alias' -echo 'unalias L' -echo 'alias'' + echo 'unalias ls' + echo 'alias ls cd' + echo 'alias' + echo 'ls ..' + echo 'unalias ls' + echo 'ls' + echo 'alias a a' + echo 'alias b b' + echo 'alias L L' + echo 'alias' + echo 'unalias b' + echo 'alias' + echo 'unalias a' + echo 'alias' + echo 'unalias L' + echo 'alias' [917-END] [918] @@ -187,10 +188,10 @@ NAME="918" SETUP="" CLEAN="" TESTS= -echo 'alias ls cd ..' -echo 'alias | grep cd' -echo 'alias ls cd' -echo 'alias | grep cd'' + echo 'alias ls cd ..' + echo 'alias | grep cd' + echo 'alias ls cd' + echo 'alias | grep cd' [918-END] [919] @@ -198,14 +199,14 @@ NAME="919" SETUP="" CLEAN="" TESTS= -echo 'alias ls ls -l' -echo 'alias' -echo 'alias ls "ls -l"' -echo 'alias' -echo 'alias ls 'ls -l'' -echo 'alias' -echo 'alias ls ls\ -l' -echo 'alias'' + echo 'alias ls ls -l' + echo 'alias' + echo 'alias ls "ls -l"' + echo 'alias' + echo 'alias ls 'ls -l'' + echo 'alias' + echo 'alias ls ls\ -l' + echo 'alias' [919-END] [920] @@ -213,7 +214,7 @@ NAME="920" SETUP="" CLEAN="" TESTS= -echo 'ls ''' + echo 'ls '' [920-END] [921] @@ -221,13 +222,13 @@ NAME="921" SETUP="" CLEAN="" TESTS= -echo 'cd ../../..' -echo 'cd 'Semestre 2'' -echo 'ls; cd ..' -echo 'cd "Semestre 2"' -echo 'ls; cd ..' -echo 'cd Semestre\ 2' -echo 'ls'' + echo 'cd ../../..' + echo 'cd 'Semestre 2'' + echo 'ls; cd ..' + echo 'cd "Semestre 2"' + echo 'ls; cd ..' + echo 'cd Semestre\ 2' + echo 'ls' [921-END] [922] @@ -235,8 +236,7 @@ NAME="922" SETUP="" CLEAN="" TESTS= -echo 'echo ok bye' -' + echo 'echo ok bye' [922-END] [923] @@ -244,9 +244,8 @@ NAME="923" SETUP="" CLEAN="" TESTS= -echo 'setenv ok lol' -echo 'echo $ok bye' -' + echo 'setenv ok lol' + echo 'echo $ok bye' [923-END] [924] @@ -254,8 +253,8 @@ NAME="924" SETUP="" CLEAN="" TESTS= -echo 'ls l && cd ok' -echo 'ls &&'' + echo 'ls l && cd ok' + echo 'ls &&' [924-END] [925] @@ -263,8 +262,7 @@ NAME="925" SETUP="" CLEAN="" TESTS= -echo 'echo \n' -' + echo 'echo \n' [925-END] [926] @@ -272,8 +270,7 @@ NAME="926" SETUP="" CLEAN="" TESTS= -echo 'echo' -' + echo 'echo' [926-END] [927] @@ -281,8 +278,7 @@ NAME="927" SETUP="" CLEAN="" TESTS= -echo 'echo "\n"' -' + echo 'echo "\n"' [927-END] [928] @@ -290,7 +286,7 @@ NAME="928" SETUP="" CLEAN="" TESTS= -echo 'echo "$"'' + echo 'echo "$"' [928-END] [929] @@ -298,10 +294,9 @@ NAME="929" SETUP="" CLEAN="" TESTS= -echo 'echo "\t"' -echo 'echo $' -echo 'echo $?' -' + echo 'echo "\t"' + echo 'echo $' + echo 'echo $?' [929-END] [930] @@ -309,10 +304,10 @@ NAME="930" SETUP="" CLEAN="" TESTS= -echo 'cd ..' -echo 'setenv a s' -echo 'setenv b rc' -echo 'ls $a$b'' + echo 'cd ..' + echo 'setenv a s' + echo 'setenv b rc' + echo 'ls $a$b' [930-END] [931] @@ -320,8 +315,8 @@ NAME="931" SETUP="" CLEAN="" TESTS= -echo 'cd ..' -echo ' && ls'' + echo 'cd ..' + echo ' && ls' [931-END] [932] @@ -329,7 +324,7 @@ NAME="932" SETUP="" CLEAN="" TESTS= -echo 'ls ||'' + echo 'ls ||' [932-END] [933] @@ -337,8 +332,7 @@ NAME="933" SETUP="" CLEAN="" TESTS= -echo ' || ls' -' + echo ' || ls' [933-END] [934] @@ -346,8 +340,7 @@ NAME="934" SETUP="" CLEAN="" TESTS= -echo ' || ' -' + echo ' || ' [934-END] [935] @@ -355,7 +348,7 @@ NAME="935" SETUP="" CLEAN="" TESTS= -echo ' && '' + echo ' && ' [935-END] [936] @@ -363,8 +356,8 @@ NAME="936" SETUP="" CLEAN="" TESTS= -echo ' && ' -echo 'ls ; || ; &&; ls'' + echo ' && ' + echo 'ls ; || ; &&; ls' [936-END] [937] @@ -372,13 +365,13 @@ NAME="937" SETUP="" CLEAN="" TESTS= -echo 'alias a a' -echo 'alias b b' -echo 'alias L L' -echo 'alias' -echo 'alias ok bye' -echo 'alias a bye' -echo 'alias' -echo 'unalias ok;alias'' + echo 'alias a a' + echo 'alias b b' + echo 'alias L L' + echo 'alias' + echo 'alias ok bye' + echo 'alias a bye' + echo 'alias' + echo 'unalias ok;alias' [937-END] From 3853000fb979e21f6200e9c0efdf95c7cbf506e6 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:56:04 +0200 Subject: [PATCH 13/17] Trying to debug the ci --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 8980c7b..4153cdf 100644 --- a/Makefile +++ b/Makefile @@ -79,6 +79,7 @@ tests_run: clean $(UT) func: all + where bash cd tests/tester/ && cp ../../$(NAME) $(NAME) && ./tester.sh rm tests/tester/$(NAME) From 72ab01be71c38d5dff0c0d3070ed381d0342694b Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 15:58:14 +0200 Subject: [PATCH 14/17] Debug2 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 4153cdf..e4d2f19 100644 --- a/Makefile +++ b/Makefile @@ -79,7 +79,7 @@ tests_run: clean $(UT) func: all - where bash + ls /usr/bin cd tests/tester/ && cp ../../$(NAME) $(NAME) && ./tester.sh rm tests/tester/$(NAME) From 478cb53d24338c88c7d8df8c6b0a739604599edd Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 16:03:16 +0200 Subject: [PATCH 15/17] Installing tcsh on github --- .github/workflows/functional.yml | 2 +- Makefile | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/functional.yml b/.github/workflows/functional.yml index 51363ab..6d39695 100644 --- a/.github/workflows/functional.yml +++ b/.github/workflows/functional.yml @@ -9,6 +9,6 @@ jobs: steps: - uses: actions/checkout@v1 - name: Install the ncurses - run: sudo apt-get install --yes libncurses5-dev libncursesw5-dev + run: sudo apt-get install --yes libncurses5-dev libncursesw5-dev tcsh - name: Build with Makefile & Execute tests run: make func \ No newline at end of file diff --git a/Makefile b/Makefile index e4d2f19..8980c7b 100644 --- a/Makefile +++ b/Makefile @@ -79,7 +79,6 @@ tests_run: clean $(UT) func: all - ls /usr/bin cd tests/tester/ && cp ../../$(NAME) $(NAME) && ./tester.sh rm tests/tester/$(NAME) From ad878d8c8961c4e1e3c949660a4e59ac49558689 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 17:25:34 +0200 Subject: [PATCH 16/17] Handling up/down arrow keys for history --- include/key_functions.h | 3 ++ include/shell.h | 2 + src/key_bindings/basic_typing_functions.c | 1 + src/key_bindings/control_commands.c | 46 +++++++++++++++++++++++ src/key_bindings/default_bindings.c | 2 + src/shell.c | 6 ++- 6 files changed, 59 insertions(+), 1 deletion(-) diff --git a/include/key_functions.h b/include/key_functions.h index 894547d..ff31335 100644 --- a/include/key_functions.h +++ b/include/key_functions.h @@ -38,3 +38,6 @@ int forward_char_command(int key, buffer_t *buffer, env_t *env); int backward_char_command(int key, buffer_t *buffer, env_t *env); int beginning_of_line_command(int key, buffer_t *buffer, env_t *env); int end_of_line_command(int key, buffer_t *buffer, env_t *env); + +int up_history_command(int key, buffer_t *buffer, env_t *env); +int down_history_command(int key, buffer_t *buffer, env_t *env); diff --git a/include/shell.h b/include/shell.h index 2e06329..23de00a 100644 --- a/include/shell.h +++ b/include/shell.h @@ -31,6 +31,8 @@ typedef struct buffer int size; int pos; int startx; + int history_index; + char *saved_buffer; } buffer_t; typedef struct alias_s diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index 7c58d4f..cf5391a 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -69,6 +69,7 @@ int newline_command(int key, buffer_t *buffer, env_t *env) my_nresume(env->window); buffer->buffer[0] = '\0'; buffer->pos = 0; + buffer->history_index = 0; if (env->window) my_getcuryx(&env->window->y, &env->window->x); } diff --git a/src/key_bindings/control_commands.c b/src/key_bindings/control_commands.c index 9a6095d..01ad3e8 100644 --- a/src/key_bindings/control_commands.c +++ b/src/key_bindings/control_commands.c @@ -6,8 +6,54 @@ */ #include "shell.h" +#include +#include +#include int eof_command(int key, buffer_t *buffer, env_t *env) { return (-1); +} + +bool set_buffer_to_history(buffer_t *buffer, env_t *env) +{ + history_t *hist = env->history; + char *cmd = NULL; + int len; + + if (buffer->history_index == 0) + cmd = buffer->saved_buffer != NULL ? buffer->saved_buffer : ""; + else + for (int i = 1; i < buffer->history_index && hist; i++) + hist = hist->next; + if (!cmd && (!hist || !(cmd = hist->command))) + return (false); + if (!buffer->buffer || buffer->size < (len = strlen(cmd))) { + buffer->buffer = realloc(buffer->buffer, buffer->size + len); + buffer->size += len; + } + if (!buffer->buffer) + return (false); + strcpy(buffer->buffer, cmd); + buffer->pos = strlen(buffer->buffer); + return (true); +} + +int up_history_command(int key, buffer_t *buffer, env_t *env) +{ + if (buffer->buffer && buffer->history_index == 0) + buffer->saved_buffer = strdup(buffer->buffer); + buffer->history_index++; + if (!set_buffer_to_history(buffer, env)) + buffer->history_index--; + return (0); +} + +int down_history_command(int key, buffer_t *buffer, env_t *env) +{ + if (buffer->history_index <= 0) + return (0); + buffer->history_index--; + set_buffer_to_history(buffer, env); + return (0); } \ No newline at end of file diff --git a/src/key_bindings/default_bindings.c b/src/key_bindings/default_bindings.c index f70cf48..91595af 100644 --- a/src/key_bindings/default_bindings.c +++ b/src/key_bindings/default_bindings.c @@ -33,5 +33,7 @@ const binding_t emacs_bindings[] = { {KEY_RIGHT, &forward_char_command}, {KEY_HOME, &beginning_of_line_command}, {KEY_END, &end_of_line_command}, + {KEY_UP, &up_history_command}, + {KEY_DOWN, &down_history_command}, {0, NULL} }; \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 437b2f7..bb722c6 100644 --- a/src/shell.c +++ b/src/shell.c @@ -66,7 +66,7 @@ void shell_refresh(buffer_t *buffer, env_t *env) void start_shell(env_t *env) { - buffer_t buffer = {.size = 0, .buffer = NULL, .pos = 0, .startx = 0}; + buffer_t buffer = {NULL, 0, 0, 0, 0, NULL}; int key; if (isatty(0)) { @@ -80,5 +80,9 @@ void start_shell(env_t *env) } else key = fgetc(stdin); } while (key != -1 && process_key(key, &buffer, env) >= 0); + if (buffer.saved_buffer) + free(buffer.saved_buffer); + if (buffer.buffer) + free(buffer.buffer); my_endwin(env->window); } \ No newline at end of file From 5ce58010abdc258b8b0312dea1a985961e96ada1 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Thu, 21 May 2020 18:45:05 +0200 Subject: [PATCH 17/17] Fixing an invalid read --- src/key_bindings/basic_typing_functions.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/key_bindings/basic_typing_functions.c b/src/key_bindings/basic_typing_functions.c index cf5391a..9f5b728 100644 --- a/src/key_bindings/basic_typing_functions.c +++ b/src/key_bindings/basic_typing_functions.c @@ -21,13 +21,13 @@ int self_insert_command(int key, buffer_t *buffer, env_t *env) int charslen = strlen(chars); int len = (buffer->buffer ? strlen(buffer->buffer) : 0) + charslen; - if (len >= buffer->size || !buffer->buffer) { + if (len + 1 >= buffer->size || !buffer->buffer) { buffer->buffer = realloc(buffer->buffer, buffer->size + 100); buffer->size += 100; } if (!buffer->buffer) return (-1); - for (int i = len - 1; i > buffer->pos; i--) + for (int i = len - 1; i > buffer->pos && i > charslen; i--) buffer->buffer[i] = buffer->buffer[i - charslen]; memcpy(buffer->buffer + buffer->pos, chars, charslen); buffer->buffer[len] = '\0';