From 08d6167988a0bbec72d84ff12f8857f0b4d0b42a Mon Sep 17 00:00:00 2001 From: Stefan Zabka Date: Wed, 13 May 2020 20:38:21 +0200 Subject: Changing dirs kinda works --- 02_exercise/shell.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) (limited to '02_exercise/shell.c') diff --git a/02_exercise/shell.c b/02_exercise/shell.c index 88b17fd..2594d6b 100644 --- a/02_exercise/shell.c +++ b/02_exercise/shell.c @@ -10,12 +10,16 @@ #include #include "array.h" +#include "errno.h" #include "stdbool.h" void print_prompt(char const *const original_wd, char const *current_wd); -int main(void) { +// Returns the return code of the executed programm +int exec_command(char *command); +int main(void) { + // the directory is specified without a / at the end char const *const original_wd = get_current_dir_name(); char const *current_wd = get_current_dir_name(); @@ -23,12 +27,21 @@ int main(void) { char *command = NULL; size_t cap = 0; size_t length = 0; + print_prompt(original_wd, current_wd); if ((length = getline(&command, &cap, stdin)) < 0) { fprintf(stderr, "Failed to read from STDIN"); + exit(-1); } - if (strcmp(command, "exit\n") == 0) { + if (strstr(command, "cd") != NULL) { + printf("Changing dirs \n"); + chdir("beispiele"); + free((void *) current_wd); + current_wd = get_current_dir_name(); + } else if (strcmp(command, "exit\n") == 0) { exit(0); + } else { + exec_command(command); } free((void *)command); } @@ -37,10 +50,33 @@ int main(void) { free((void *)current_wd); } -void print_prompt(char const *const original_wd, char const *current_wd) { - - int result = strcmp(original_wd, current_wd); - if (result == 0) { - printf("./ > "); +void print_prompt(char const *const original_wd, char const *const current_wd) { + // easiest case first + { + int result = strcmp(original_wd, current_wd); + if (result == 0) { + printf(".> "); + return; + } } -} \ No newline at end of file + printf("%s > ", current_wd); + // Now checking for substrings aka are we in a subdir + { + size_t dirlen = strlen(original_wd); + char *const orig_dir_with_slash = malloc(dirlen + 2); + if (orig_dir_with_slash == NULL) { + fprintf(stderr, "Failed to allocate for prompt"); + exit(ENOMEM); + } + memcpy(orig_dir_with_slash, original_wd, dirlen); + orig_dir_with_slash[dirlen] = '/'; + orig_dir_with_slash[dirlen + 1] = '\0'; + char const *const result = strstr(current_wd, original_wd); + if (result != NULL) { + printf(".%s > ", current_wd + dirlen); + return; + } + } +} + +int exec_command(char *command) { return 0; } -- cgit v1.2.3-54-g00ecf