From df8ded7b935f93e9c8e9f766f60dc5879695cba9 Mon Sep 17 00:00:00 2001 From: arthur Date: Fri, 22 May 2020 10:49:35 +0200 Subject: [PATCH] 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)