From f7f39c0b240767c5f6f55313d71ff3d88edd70df Mon Sep 17 00:00:00 2001 From: arthur Date: Thu, 21 May 2020 12:56:06 +0200 Subject: [PATCH 1/3] integration of basic echo --- Makefile | 1 + include/builtin.h | 1 + src/builtin/builtin_echo.c | 25 +++++++++++++++++++++++++ src/prompt.c | 1 + 4 files changed, 28 insertions(+) create mode 100644 src/builtin/builtin_echo.c diff --git a/Makefile b/Makefile index 45cb4f4..c304aa6 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ SRC = src/shell.c \ src/builtin/builtin_where.c \ src/builtin/builtin_alias.c \ src/builtin/builtin_unalias.c \ + src/builtin/builtin_echo.c \ src/signal.c \ src/free_env.c \ src/utility/same_var.c \ diff --git a/include/builtin.h b/include/builtin.h index 3d1d673..2ce7d3d 100644 --- a/include/builtin.h +++ b/include/builtin.h @@ -28,6 +28,7 @@ int builtin_source(char **argv, env_t *env); int builtin_history(char **args, env_t *env); int builtin_alias(char **args, env_t *env); int builtin_unalias(char **args, env_t *env); +int builtin_echo(char **args, env_t *env); //utility bool find_path_in_builtins(char *cmd); char **get_envpath(env_t *env); diff --git a/src/builtin/builtin_echo.c b/src/builtin/builtin_echo.c new file mode 100644 index 0000000..e57e73a --- /dev/null +++ b/src/builtin/builtin_echo.c @@ -0,0 +1,25 @@ +/* +** EPITECH PROJECT, 2020 +** builtin_echo.c +** File description: +** builtin_echo +*/ + +#include "builtin.h" +#include +#include +#include +#include + +int builtin_echo(char **argv, env_t *env) +{ + for (int i = 1; argv[i]; i++) { + printf("%s", argv[i]); + if (argv[i + 1]) + printf(" "); + } + printf("\n"); + fflush(stdout); + env->vars = my_setenv(env->vars, "?", "0"); + return (0); +} \ No newline at end of file diff --git a/src/prompt.c b/src/prompt.c index e6b7efe..f2c147b 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -27,6 +27,7 @@ const builtin builtins[] = { {"source", &builtin_source}, {"alias", &builtin_alias}, {"unalias", &builtin_unalias}, + {"echo", &builtin_echo}, {NULL, NULL} }; From e569815146ec95ae491ef7fe11270bb48d154111 Mon Sep 17 00:00:00 2001 From: arthur Date: Thu, 21 May 2020 13:36:53 +0200 Subject: [PATCH 2/3] echo: manage backslashes --- Makefile | 1 + src/builtin/builtin_echo.c | 6 +++++- tests/techo.c | 42 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/techo.c diff --git a/Makefile b/Makefile index c304aa6..c6ea97d 100644 --- a/Makefile +++ b/Makefile @@ -56,6 +56,7 @@ TESTS = tests/tenv.c \ tests/texecute.c \ tests/tcd.c \ tests/tsource.c \ + tests/techo.c \ COVERAGE = -lcriterion --coverage diff --git a/src/builtin/builtin_echo.c b/src/builtin/builtin_echo.c index e57e73a..5dab8c8 100644 --- a/src/builtin/builtin_echo.c +++ b/src/builtin/builtin_echo.c @@ -14,7 +14,11 @@ int builtin_echo(char **argv, env_t *env) { for (int i = 1; argv[i]; i++) { - printf("%s", argv[i]); + for (int j = 0; argv[i][j]; j++) { + if (argv[i][j] == '\\') + j++; + printf("%c", argv[i][j]); + } if (argv[i + 1]) printf(" "); } diff --git a/tests/techo.c b/tests/techo.c new file mode 100644 index 0000000..602867b --- /dev/null +++ b/tests/techo.c @@ -0,0 +1,42 @@ +/* +** EPITECH PROJECT, 2020 +** test_echo.c +** File description: +** techo +*/ + +#include +#include +#include "builtin.h" + +Test(echo, normal_message, .init = cr_redirect_stdout) +{ + env_t env = {}; + char *av[] = {"echo", "hello", NULL}; + builtin_echo(av, &env); + cr_assert_stdout_eq_str("hello\n"); +} + +Test(echo, with_simple_backslash, .init = cr_redirect_stdout) +{ + env_t env = {}; + char *av[] = {"echo", "\\n", NULL}; + builtin_echo(av, &env); + cr_assert_stdout_eq_str("n\n"); +} + +Test(echo, with_double_backslash, .init = cr_redirect_stdout) +{ + env_t env = {}; + char *av[] = {"echo", "\\\\n", NULL}; + builtin_echo(av, &env); + cr_assert_stdout_eq_str("\\n\n"); +} + +Test(echo, multiple_args, .init = cr_redirect_stdout) +{ + env_t env = {}; + char *av[] = {"echo", "Hello", "I\'m", "Marvin", NULL}; + builtin_echo(av, &env); + cr_assert_stdout_eq_str("Hello I\'m Marvin\n"); +} \ No newline at end of file From df8ded7b935f93e9c8e9f766f60dc5879695cba9 Mon Sep 17 00:00:00 2001 From: arthur Date: Fri, 22 May 2020 10:49:35 +0200 Subject: [PATCH 3/3] correct echo behavior --- include/builtin.h | 5 ++++- src/builtin/builtin_echo.c | 31 ++++++++++++++++++++++++++----- tests/techo.c | 8 ++++---- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/include/builtin.h b/include/builtin.h index 2ce7d3d..22465db 100644 --- a/include/builtin.h +++ b/include/builtin.h @@ -53,4 +53,7 @@ void print_aliases(alias_t *list); int add_alias_to_list(alias_t **list, alias_t *elem, char *alias); //unalias -void remove_alias(char *alias, alias_t **list); \ No newline at end of file +void remove_alias(char *alias, alias_t **list); + +//echo +int print_char(char *str, int i); \ No newline at end of file diff --git a/src/builtin/builtin_echo.c b/src/builtin/builtin_echo.c index 5dab8c8..0b76a82 100644 --- a/src/builtin/builtin_echo.c +++ b/src/builtin/builtin_echo.c @@ -14,11 +14,8 @@ int builtin_echo(char **argv, env_t *env) { for (int i = 1; argv[i]; i++) { - for (int j = 0; argv[i][j]; j++) { - if (argv[i][j] == '\\') - j++; - printf("%c", argv[i][j]); - } + for (int j = 0; argv[i][j]; j++) + j += print_char(argv[i], j); if (argv[i + 1]) printf(" "); } @@ -26,4 +23,28 @@ int builtin_echo(char **argv, env_t *env) fflush(stdout); env->vars = my_setenv(env->vars, "?", "0"); return (0); +} + +int print_char(char *str, int i) +{ + if (str[i] == '\\' && str[i + 1] == 'a') + return (printf("\a")); + if (str[i] == '\\' && str[i + 1] == 'b') + return (printf("\b")); + if (str[i] == '\\' && str[i + 1] == 't') + return (printf("\t")); + if (str[i] == '\\' && str[i + 1] == 'n') + return (printf("\n")); + if (str[i] == '\\' && str[i + 1] == 'v') + return (printf("\v")); + if (str[i] == '\\' && str[i + 1] == 'f') + return (printf("\f")); + if (str[i] == '\\' && str[i + 1] == 'r') + return (printf("\r")); + if (str[i] == '\\') { + printf("\\%c", str[i + 1]); + return (1); + } + printf("%c", str[i]); + return (0); } \ No newline at end of file diff --git a/tests/techo.c b/tests/techo.c index 602867b..e8edb8a 100644 --- a/tests/techo.c +++ b/tests/techo.c @@ -22,15 +22,15 @@ Test(echo, with_simple_backslash, .init = cr_redirect_stdout) env_t env = {}; char *av[] = {"echo", "\\n", NULL}; builtin_echo(av, &env); - cr_assert_stdout_eq_str("n\n"); + cr_assert_stdout_eq_str("\n\n"); } -Test(echo, with_double_backslash, .init = cr_redirect_stdout) +Test(echo, incorrect_ascii, .init = cr_redirect_stdout) { env_t env = {}; - char *av[] = {"echo", "\\\\n", NULL}; + char *av[] = {"echo", "\\q", NULL}; builtin_echo(av, &env); - cr_assert_stdout_eq_str("\\n\n"); + cr_assert_stdout_eq_str("\\q\n"); } Test(echo, multiple_args, .init = cr_redirect_stdout)