mirror of
https://github.com/zoriya/ash.git
synced 2026-05-29 09:21:59 +00:00
correct echo behavior
This commit is contained in:
+4
-1
@@ -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);
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user