diff --git a/CMakeLists.txt b/CMakeLists.txt index 704702c..4c52234 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,8 +44,10 @@ include_directories( "${source_dir}/googlemock/include" ) + set(CMAKE_C_STANDARD 99) set(CMAKE_C_FLAGS "-Wall -Werror -pedantic -fpic -Wextra -Wshadow") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FALGS} -g") set(SOURCE_FILES fish_shell/main.c fish_shell/fish_types.h fish_shell/fish_core.h fish_shell/fish_core.c fish_shell/fish_commands.c fish_shell/fish_commands.h fish_shell/fish_globbing.c fish_shell/fish_globbing.h fish_shell/fish_utils.c fish_shell/fish_utils.h) add_executable(fish ${SOURCE_FILES}) diff --git a/fish_shell/fish_commands.c b/fish_shell/fish_commands.c index 1b64373..7c3e40d 100644 --- a/fish_shell/fish_commands.c +++ b/fish_shell/fish_commands.c @@ -37,12 +37,12 @@ int fishCd(WordArray *args) { perror("fish"); } } - return 0; + freeWordArray(args); + return EXIT_SUCCESS; } int fishHelp(WordArray *args) { int i; - args->size = args->size; printf("Bartuccio Antoine, Amalvy Arthur, Yann Chevanton\n"); printf("Tape tes putains de noms de programmes et tes arguments de merde et tabasse ENTER !\n"); printf("Les commandes suivantes sont internes :\n"); @@ -50,12 +50,13 @@ int fishHelp(WordArray *args) { printf("\t%s\n", builtinCommandsStr[i]); } printf("Et sinon pour le reste, RTFM !"); - return 0; + freeWordArray(args); + return EXIT_SUCCESS; } int fishExit(WordArray *args) { - args->size = args->size; - exit(EXIT_SUCCESS); + freeWordArray(args); + return EXIT_SIGNAL; } diff --git a/fish_shell/fish_core.c b/fish_shell/fish_core.c index 48dac22..922b4f6 100644 --- a/fish_shell/fish_core.c +++ b/fish_shell/fish_core.c @@ -20,14 +20,14 @@ void fishLoop(Settings * settings){ printf("%s", settings->PS1); line = fishReadLine(); - splited = split(line, (char*) FISH_TOKENS); + splited = split(line, (char*) FISH_TOKENS); splited = fishExpand(splited); status = fishExecute(splited); free(line); - } while(status); + } while(status != EXIT_SIGNAL); } int countSeparators(char *string, char *separators) { @@ -145,6 +145,7 @@ int fishLoad(WordArray *array) { } while (!WIFEXITED(status) && !WIFSIGNALED(status)); if (status) fprintf(stderr, "%s\n", getInsult()); } + freeWordArray(array); return status; } @@ -152,24 +153,32 @@ int fishExecute(WordList *list) { WordList *splited = NULL; shell_operator op = NONE; WordArray *array = NULL; + int signal = 1; splited = parseWordList(list, &op); array = wordListToWordArray(list); + signal = loadRightCommand(array); + if (signal == EXIT_SIGNAL){ + if (splited != NULL) freeWordList(splited); + if (array != NULL) freeWordArray(array); + return signal; + } switch (op) { case AND: - if (!loadRightCommand(array)) fishExecute(splited); - else freeWordList(splited); + if (!signal) signal = fishExecute(splited); + else { + if (splited != NULL) freeWordList(splited); + } break; case OR: - loadRightCommand(array); - fishExecute(splited); + signal = fishExecute(splited); break; default: - loadRightCommand(array); + break; } + return signal; - return 1; } int loadRightCommand(WordArray *array){ @@ -185,12 +194,12 @@ int loadRightCommand(WordArray *array){ WordList * parseWordList(WordList *list, shell_operator *an_operator) { char *op_str[] = { - (char*) "&&", - (char*) "||" + (char*) "||", + (char*) "&&" }; shell_operator op[] = { - AND, - OR + OR, + AND }; WordList *newList = NULL; int max = sizeof(op_str) / sizeof(char*); diff --git a/fish_shell/fish_types.h b/fish_shell/fish_types.h index 59afdb7..860efa5 100644 --- a/fish_shell/fish_types.h +++ b/fish_shell/fish_types.h @@ -5,6 +5,8 @@ #ifndef FISH_FISH_TYPES_H #define FISH_FISH_TYPES_H +#define EXIT_SIGNAL -100 + /* Custom types */ typedef enum { diff --git a/fish_shell/fish_utils.c b/fish_shell/fish_utils.c index b76511a..9876aff 100644 --- a/fish_shell/fish_utils.c +++ b/fish_shell/fish_utils.c @@ -30,7 +30,7 @@ char *getInsult(){ int picked = 0; char *insults[] = { (char *) "Apprend à écrire crétin !", - (char *) "Bolos !", + (char *) "Boloss !", (char *) "Mois aussi je sais écrire de la merde, pourtant je le fait pas !", (char *) "Oh ! Une erreur ! Comme ta vie en fait...", (char *) "Nul !", @@ -110,12 +110,11 @@ WordArray *wordListToWordArray(WordList *list) { if (array->words == NULL) crash(); while (current != NULL){ - array->words[i] = current->word; - current->word = NULL; + array->words[i] = strdup(current->word); current = current->next; i++; } - array->words[i] = NULL; + array->words[array->size] = NULL; } freeWordList(list); @@ -125,7 +124,7 @@ WordArray *wordListToWordArray(WordList *list) { WordList *wordArrayToWordList(WordArray *array) { WordList *list = createWordList(); - int i = 0; + int i; for (i=0; isize; i++) addWordList(list, array->words[i]);