diff --git a/CMakeLists.txt b/CMakeLists.txt index d2f20ed..5b70fdd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.7) +cmake_minimum_required(VERSION 3.5) project(fish_shell) # We need thread support @@ -47,12 +47,13 @@ include_directories( 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(CMAKE_EXE_LINKER_FLAGS "-lpcre") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -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) +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 fish_shell/fish_settings.c fish_shell/fish_settings.h) add_executable(fish ${SOURCE_FILES}) +target_link_libraries(fish pcre) + #add_subdirectory(fish_shell) add_subdirectory(fish_shell_tests) diff --git a/fish_shell/fish_core.c b/fish_shell/fish_core.c index 2c013ee..1fed8aa 100644 --- a/fish_shell/fish_core.c +++ b/fish_shell/fish_core.c @@ -103,23 +103,6 @@ char *fishReadLine() { return NULL; } -Settings *getSettings() { - Settings *s = (Settings*) malloc(sizeof(Settings)); - if (s == NULL){ - crash(); - } else { - s->PS1 = strdup("\n~>"); - } - - return s; -} - -void freeSettings(Settings *settings){ - if (settings != NULL){ - free(settings->PS1); - free(settings); - } -} int fishLoad(WordArray *array) { pid_t pid; diff --git a/fish_shell/fish_core.h b/fish_shell/fish_core.h index 27abdc5..e602ac8 100644 --- a/fish_shell/fish_core.h +++ b/fish_shell/fish_core.h @@ -13,15 +13,12 @@ #include "fish_types.h" #include "fish_commands.h" #include "fish_utils.h" +#include "fish_settings.h" /* WordArray functions */ WordList * split(char *string, char *separator); // Tested -/* Settings functions */ - -Settings * getSettings(); -void freeSettings(Settings *settings); /* General purpose functions */ diff --git a/fish_shell/fish_settings.c b/fish_shell/fish_settings.c new file mode 100644 index 0000000..a39c3bd --- /dev/null +++ b/fish_shell/fish_settings.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include "fish_settings.h" +#include "fish_core.h" + +Settings *getSettings() { + Settings *s = (Settings*) malloc(sizeof(Settings)); + if (s == NULL){ + crash(); + } + + uid_t uid; + struct passwd *user; + char* filename = NULL; + uid = getuid(); + user = getpwuid(uid); + + filename = (char*) malloc(sizeof(char*)*(strlen(user->pw_dir) + FISH_RC_FILE_SIZE + 1)); + + if (filename == NULL) crash(); + + filename[0] = '\0'; + filename = strcat(filename, user->pw_dir); + filename = strcat(filename, (char*) FISH_RC_FILE); + s->passwd = user; + s->PS1 = extractVariable(filename, (char*) "PS1"); + if (s->PS1 == NULL) s->PS1 = strdup("->"); + s->PS2 = extractVariable(filename, (char*) "PS2"); + if (s->PS2 == NULL) s->PS2 = strdup("->"); + + free(filename); + return s; +} + +void freeSettings(Settings *settings){ + if (settings != NULL){ + settings->PS1[0] = '\0'; + settings->PS2[0] = '\0'; + free(settings->PS1); + free(settings->PS2); + free(settings); + } +} + +char* extractVariable(char* filename, char* var){ + FILE *file = fopen ( filename, "r" ); + int var_size = strlen(var); + char *tmp = NULL; + char line[FISH_BUFFER_SIZE]; + int i = 0; + + if ( file != NULL ){ + + while ( fgets ( line, FISH_BUFFER_SIZE, file ) != NULL ) { + + if (!strncmp(line, var, var_size)) { + + tmp = (char*) malloc(sizeof(char*)* (strlen(line)-var_size)); + if (tmp == NULL) crash(); + + i = var_size + 1; + while(line[i] != '\n' && line[i] != '\0'){ + tmp[i-var_size-1] = line[i]; + i++; + } + tmp[i-var_size-1]='\0'; + } + } + + fclose(file); + return tmp; + } + else { + perror ( filename ); /* why didn't the file open? */ + } + return tmp; +} + + diff --git a/fish_shell/fish_settings.h b/fish_shell/fish_settings.h new file mode 100644 index 0000000..eac5988 --- /dev/null +++ b/fish_shell/fish_settings.h @@ -0,0 +1,14 @@ +#ifndef FISH_FISH_SETTINGS_H +#define FISH_FISH_SETTINGS_H + +#include "fish_core.h" + +#define FISH_RC_FILE "/.fishrc" +#define FISH_RC_FILE_SIZE 8 + +Settings * getSettings(); //TESTEDssssss +void freeSettings(Settings *settings); //TESTED +char* extractVariable(char* filename, char* var);//TESTED + +#endif //FISH_FISH_SETTINGS_H + diff --git a/fish_shell/fish_types.h b/fish_shell/fish_types.h index 958bdc4..818a9f0 100644 --- a/fish_shell/fish_types.h +++ b/fish_shell/fish_types.h @@ -5,6 +5,10 @@ #ifndef FISH_FISH_TYPES_H #define FISH_FISH_TYPES_H +#include +#include +#include + #define EXIT_SIGNAL -100 #define ERROR_STRING "\n" @@ -39,6 +43,8 @@ typedef struct { typedef struct { char *PS1; + char *PS2; + struct passwd* passwd; } Settings; diff --git a/fish_shell_tests/CMakeLists.txt b/fish_shell_tests/CMakeLists.txt index a634843..34532df 100644 --- a/fish_shell_tests/CMakeLists.txt +++ b/fish_shell_tests/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.7) +cmake_minimum_required(VERSION 3.5) project(fish_shell_tests) set(CMAKE_CXX_STANDARD 11) @@ -11,9 +11,9 @@ include_directories( "${source_dir}/googlemock/include" ) -set(SOURCE_FILES_TESTS main.cpp FishCoreTests.cpp FishUtilsTests.cpp) +set(SOURCE_FILES_TESTS main.cpp FishCoreTests.cpp FishUtilsTests.cpp FishSettingsTests.cpp ) add_executable(fish_tests ${SOURCE_FILES_TESTS}) -target_link_libraries(fish_tests libgtest libgmock) +target_link_libraries(fish_tests libgtest libgmock pcre) diff --git a/fish_shell_tests/FishSettingsTests.cpp b/fish_shell_tests/FishSettingsTests.cpp new file mode 100644 index 0000000..b2c122a --- /dev/null +++ b/fish_shell_tests/FishSettingsTests.cpp @@ -0,0 +1,27 @@ +#include "gtest/gtest.h" +#include "../fish_shell/fish_types.h" +#include "../fish_shell/fish_settings.h" + +TEST(free_settings_Test, freeSettings){ + Settings *s = getSettings(); + + ASSERT_STREQ(s->PS1, "->"); + + freeSettings(s); + + ASSERT_STRNE(s->PS1, "->"); +} + +TEST(extract_variable_Test, extractVariable){ + ASSERT_TRUE(extractVariable((char*) "P4T3", (char*) "PS1") == NULL); + ASSERT_STREQ(extractVariable((char*) "../fish_shell_tests/fishrc", (char*) "PS1"), "sli->"); + ASSERT_TRUE(extractVariable((char*) "../fish_shell_tests/fishrc", (char*) "P1ZZ4") == NULL); + +} + +TEST(get_settings_Test, getSettings){ + Settings* s = getSettings(); + ASSERT_FALSE(s ==NULL); + ASSERT_FALSE(s->passwd == NULL); + freeSettings(s); +} diff --git a/fish_shell_tests/fishrc b/fish_shell_tests/fishrc new file mode 100644 index 0000000..dcc591a --- /dev/null +++ b/fish_shell_tests/fishrc @@ -0,0 +1,2 @@ +PS1=sli-> +PS2=sony diff --git a/fish_shell_tests/main.cpp b/fish_shell_tests/main.cpp index 8260e08..ab4b889 100644 --- a/fish_shell_tests/main.cpp +++ b/fish_shell_tests/main.cpp @@ -7,6 +7,7 @@ #include "../fish_shell/fish_utils.c" #include "../fish_shell/fish_commands.c" #include "../fish_shell/fish_globbing.c" +#include "../fish_shell/fish_settings.c" int main(int argc, char **argv){ ::testing::InitGoogleTest(&argc, argv);