#include #include #include #include #include #include #include #include #include #include "array.h" #include "errno.h" #include "stdbool.h" void print_prompt(char const *const original_wd, char const *current_wd); // 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(); while (true) { 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 (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); } // Gotta cast to void otherwise we discard qualifiers free((void *)original_wd); free((void *)current_wd); } 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; } } 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; }