diff --git a/Makefile b/Makefile index ba26895..88dab43 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 \ @@ -54,6 +55,8 @@ TESTS = tests/tenv.c \ tests/targc.c \ tests/texecute.c \ tests/tcd.c \ + tests/tsource.c \ + tests/techo.c COVERAGE = -lcriterion --coverage diff --git a/include/builtin.h b/include/builtin.h index 303ad26..cd2c6fb 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); @@ -52,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 new file mode 100644 index 0000000..0b76a82 --- /dev/null +++ b/src/builtin/builtin_echo.c @@ -0,0 +1,50 @@ +/* +** 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++) { + for (int j = 0; argv[i][j]; j++) + j += print_char(argv[i], j); + if (argv[i + 1]) + printf(" "); + } + printf("\n"); + 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/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} }; diff --git a/tests/techo.c b/tests/techo.c new file mode 100644 index 0000000..e8edb8a --- /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, incorrect_ascii, .init = cr_redirect_stdout) +{ + env_t env = {}; + char *av[] = {"echo", "\\q", NULL}; + builtin_echo(av, &env); + cr_assert_stdout_eq_str("\\q\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