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';