diff --git a/src/builtins.c b/src/builtins.c index ce14126..8aac90b 100644 --- a/src/builtins.c +++ b/src/builtins.c @@ -39,6 +39,10 @@ bool is_builtin(char *command) { return true; } + if (strcmp(command, "echo") == 0) { + return true; + } + return false; } @@ -55,6 +59,9 @@ void run_builtin(StringArray *args) { else if (strcmp(args->array[0], "set") == 0) { set_variable(args); } + else if (strcmp(args->array[0], "echo") == 0) { + echo(args); + } else { fprintf(stderr, "Builtin %s does not exist!\n", args->array[0]); } @@ -174,7 +181,7 @@ void set_variable(StringArray *args) { free_string_array(chdir_args); free(variable); free(value); - // return without setting the variable because change directory will set it on success. + // Return without setting the variable because change directory will set it on success return; } @@ -183,3 +190,50 @@ void set_variable(StringArray *args) { free(variable); free(value); } + +void echo(StringArray *args) { + StringArray *no_variables = create_string_array(); + + for (size_t i = 1; i < args->size; i++) { + if (args->array[i][0] == '$') { + char *variable = malloc((strlen(args->array[i])) * sizeof(char *)); + if (variable == NULL) { + perror("malloc"); + exit(EXIT_FAILURE); + } + memset(variable, 0, strlen(args->array[i])); + + // Remove the $ symbol + for (size_t j = 0; j < strlen(args->array[i]); j++) { + variable[j] = args->array[i][j + 1]; + } + + char *value = get_array_list(variables, variable); + if (value == NULL) { + insert_string_array(no_variables, variable); + } + else { + if (i != 1) { + fprintf(stdout, " "); + } + fprintf(stdout, "%s", value); + } + } + else { + if (i != 1) { + fprintf(stdout, " "); + } + fprintf(stdout, "%s", args->array[i]); + } + } + if (args->size > 0) { + fprintf(stdout, "\n"); + } + + for (size_t i = 0; i < no_variables->size; i++) { + if (i == 0) { + fprintf(stderr, "\n"); + } + fprintf(stderr, "The variable %s doesn't exist!\n", no_variables->array[i]); + } +} diff --git a/src/include/builtins.h b/src/include/builtins.h index 5e0a1d0..1eeaba6 100644 --- a/src/include/builtins.h +++ b/src/include/builtins.h @@ -56,4 +56,10 @@ void print_environ(StringArray *args); */ void set_variable(StringArray *args); +/** + * Print a message or variable. + * @param args The arguments passed to echo. + */ +void echo(StringArray *args); + #endif