From 543e6f556885cb2ff53bcc9bdb4a50114896e41b Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 21 May 2020 19:43:05 +0200 Subject: [PATCH] added and args concatenated with quotes, exe mple in test --- Makefile | 1 + include/builtin.h | 2 + src/builtin/builtin_source_two.c | 49 ++++++++++++++++ tests/tsource.c | 95 ++++---------------------------- 4 files changed, 63 insertions(+), 84 deletions(-) diff --git a/Makefile b/Makefile index ba26895..06ac9ee 100644 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ TESTS = tests/tenv.c \ tests/targc.c \ tests/texecute.c \ tests/tcd.c \ + tests/tsource.c \ COVERAGE = -lcriterion --coverage diff --git a/include/builtin.h b/include/builtin.h index 303ad26..2f374d3 100644 --- a/include/builtin.h +++ b/include/builtin.h @@ -45,6 +45,8 @@ char **args, env_t *env); //source void init_source_args(char **argv, int len_argv, env_t *env); void reset_source_args(int len_argv, env_t *env); +char *get_special_arg_at(char **argv, int len_argv); +char *get_special_arg_star(char **argv, int len_argv); //alias int add_alias(alias_t **list, char *alias, char **command); char *concatenate(char **command); diff --git a/src/builtin/builtin_source_two.c b/src/builtin/builtin_source_two.c index 1d86763..32be7f6 100644 --- a/src/builtin/builtin_source_two.c +++ b/src/builtin/builtin_source_two.c @@ -13,10 +13,59 @@ #include #include +char *get_special_arg_at(char **argv, int len_argv) +{ + char *res = NULL; + int size = 0; + int str_index = 0; + + for (int i = 2; argv[i]; i++) { + size += strlen(argv[i]) + 2; + } + size += len_argv - 3; + res = malloc(sizeof(char) * (size + 1)); + for (int i = 2; i < len_argv; i++) { + res[str_index++] = '"'; + for (int j = 0; argv[i][j]; j++) + res[str_index++] = argv[i][j]; + res[str_index++] = '"'; + if (i != len_argv - 1) + res[str_index++] = ' '; + } + res[str_index] = 0; + return (res); +} + +char *get_special_arg_star(char **argv, int len_argv) +{ + char *res = NULL; + int size = 0; + int str_index = 0; + + for (int i = 2; argv[i]; i++) + size += strlen(argv[i]); + size += len_argv - 3; + res = malloc(sizeof(char) * (size + 1)); + res[str_index++] = '"'; + for (int i = 2; i < len_argv; i++) { + for (int j = 0; argv[i][j]; j++) + res[str_index++] = argv[i][j]; + if (i != len_argv - 1) + res[str_index++] = ' '; + } + res[str_index++] = '"'; + res[str_index] = 0; + return (res); +} + void init_source_args(char **argv, int len_argv, env_t *env) { char *str = NULL; + env->vars = my_setenv(env->vars, "*", + len_argv > 2 ? get_special_arg_at(argv, len_argv) : ""); + env->vars = my_setenv(env->vars, "@", + len_argv > 2 ? get_special_arg_star(argv, len_argv) : ""); env->vars = my_setenv(env->vars, "#", tostr(len_argv - 2)); for (int i = 1; i < len_argv - 1; i++) { str = tostr(i); diff --git a/tests/tsource.c b/tests/tsource.c index 4a5ba17..305be80 100644 --- a/tests/tsource.c +++ b/tests/tsource.c @@ -10,100 +10,27 @@ #include #include #include "shell.h" +#include "utility.h" #include "builtin.h" -Test(parse_source_cmd, no_args) +Test(get_special_arg_at, at_arg) { - char *cmd = strdup("echo wow"); - char **argv = get_argv(strdup("source source_file")); - int argv_len = 0; + char **argv = split_str(strdup("source file a b c"), ' '); + int argv_len = 5; char *res = NULL; for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, "echo wow"); + res = get_special_arg_at(argv, argv_len); + cr_assert_str_eq(res, "\"a\" \"b\" \"c\""); } -Test(parse_source_cmd, one_arg) +Test(get_special_arg_star, at_arg) { - char *cmd = strdup("echo $1"); - char **argv = get_argv(strdup("source source_file wow")); - int argv_len = 0; + char **argv = split_str(strdup("source file a b c"), ' '); + int argv_len = 5; char *res = NULL; for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, "echo wow"); -} - -Test(parse_source_cmd, two_args) -{ - char *cmd = strdup("$2 $1"); - char **argv = get_argv(strdup("source source_file wow echo")); - int argv_len = 0; - char *res = NULL; - - for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, "echo wow"); -} - -Test(parse_source_cmd, args_out_of_range) -{ - char *cmd = strdup("echo wow$1"); - char **argv = get_argv(strdup("source source_file")); - int argv_len = 0; - char *res = NULL; - - for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, "echo wow"); -} - -Test(parse_source_cmd, args_index_0) -{ - char *cmd = strdup("echo shell is: $0"); - char **argv = get_argv(strdup("source source_file")); - int argv_len = 0; - char *res = NULL; - - for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, "echo shell is: 42sh"); -} - -Test(parse_source_cmd, args_inside_cmd) -{ - char *cmd = strdup("e$1o wow"); - char **argv = get_argv(strdup("source source_file ch")); - int argv_len = 0; - char *res = NULL; - - for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, "echo wow"); -} - -Test(parse_source_cmd, invalid_arg) -{ - char *cmd = strdup("e$o wow"); - char **argv = get_argv(strdup("source source_file ch")); - int argv_len = 0; - char *res = NULL; - - for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, "e wow"); -} - -Test(parse_source_cmd, empty_str) -{ - char *cmd = strdup(""); - char **argv = get_argv(strdup("source source_file ch")); - int argv_len = 0; - char *res = NULL; - - for (; argv[argv_len]; argv_len++); - res = parse_source_cmd(cmd, argv, argv_len); - cr_assert_str_eq(res, ""); + res = get_special_arg_star(argv, argv_len); + cr_assert_str_eq(res, "\"a b c\""); } \ No newline at end of file