correct echo behavior

This commit is contained in:
arthur
2020-05-22 10:49:35 +02:00
parent e569815146
commit df8ded7b93
3 changed files with 34 additions and 10 deletions
+4 -1
View File
@@ -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);
void remove_alias(char *alias, alias_t **list);
//echo
int print_char(char *str, int i);
+26 -5
View File
@@ -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);
}
+4 -4
View File
@@ -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)