From b44ab16dd17df8667bfdffdaa465455c1d91199f Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Sat, 27 Feb 2021 16:40:05 +0100 Subject: [PATCH] refactored project structure --- CMakeLists.txt | 50 ++++--- src/fastfetch.c | 188 +----------------------- src/fastfetch.h | 3 +- src/{ => modules}/battery.c | 0 src/{ => modules}/break.c | 0 src/{ => modules}/colors.c | 0 src/{ => modules}/cpu.c | 0 src/{ => modules}/desktopenvironment.c | 0 src/{ => modules}/disk.c | 0 src/{ => modules}/font.c | 0 src/{ => modules}/gpu.c | 0 src/{ => modules}/host.c | 0 src/{ => modules}/icons.c | 0 src/{ => modules}/kernel.c | 0 src/{ => modules}/locale.c | 0 src/{ => modules}/memory.c | 0 src/{ => modules}/os.c | 0 src/{ => modules}/packages.c | 0 src/{ => modules}/resolution.c | 0 src/{ => modules}/seperator.c | 0 src/{ => modules}/shell.c | 0 src/{ => modules}/terminal.c | 0 src/{ => modules}/theme.c | 0 src/{ => modules}/title.c | 0 src/{ => modules}/uptime.c | 0 src/util.c | 189 +++++++++++++++++++++++++ 26 files changed, 219 insertions(+), 211 deletions(-) rename src/{ => modules}/battery.c (100%) rename src/{ => modules}/break.c (100%) rename src/{ => modules}/colors.c (100%) rename src/{ => modules}/cpu.c (100%) rename src/{ => modules}/desktopenvironment.c (100%) rename src/{ => modules}/disk.c (100%) rename src/{ => modules}/font.c (100%) rename src/{ => modules}/gpu.c (100%) rename src/{ => modules}/host.c (100%) rename src/{ => modules}/icons.c (100%) rename src/{ => modules}/kernel.c (100%) rename src/{ => modules}/locale.c (100%) rename src/{ => modules}/memory.c (100%) rename src/{ => modules}/os.c (100%) rename src/{ => modules}/packages.c (100%) rename src/{ => modules}/resolution.c (100%) rename src/{ => modules}/seperator.c (100%) rename src/{ => modules}/shell.c (100%) rename src/{ => modules}/terminal.c (100%) rename src/{ => modules}/theme.c (100%) rename src/{ => modules}/title.c (100%) rename src/{ => modules}/uptime.c (100%) create mode 100644 src/util.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 666856c3b..6076b3f53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,33 +20,37 @@ set(PROJECT_VERSION "r${GIT_REV_LIST}.${GIT_REV_PARSE}") # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -march=native -O3 -pipe -fno-plt") # for testing configure_file(src/fastfetch_config.h.in fastfetch_config.h) -include_directories(${PROJECT_BINARY_DIR}) +include_directories( + ${PROJECT_BINARY_DIR} + ${PROJECT_SOURCE_DIR}/src +) add_executable(${PROJECT_NAME} src/fastfetch.c - src/break.c + src/util.c src/logo.c - src/title.c - src/seperator.c - src/os.c - src/host.c - src/kernel.c - src/uptime.c - src/packages.c - src/shell.c - src/resolution.c - src/desktopenvironment.c - src/theme.c - src/icons.c - src/font.c - src/terminal.c - src/cpu.c - src/gpu.c - src/memory.c - src/disk.c - src/battery.c - src/locale.c - src/colors.c + src/modules/break.c + src/modules/title.c + src/modules/seperator.c + src/modules/os.c + src/modules/host.c + src/modules/kernel.c + src/modules/uptime.c + src/modules/packages.c + src/modules/shell.c + src/modules/resolution.c + src/modules/desktopenvironment.c + src/modules/theme.c + src/modules/icons.c + src/modules/font.c + src/modules/terminal.c + src/modules/cpu.c + src/modules/gpu.c + src/modules/memory.c + src/modules/disk.c + src/modules/battery.c + src/modules/locale.c + src/modules/colors.c ) target_link_libraries(${PROJECT_NAME} diff --git a/src/fastfetch.c b/src/fastfetch.c index 9576acb6b..582157d01 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -2,178 +2,6 @@ #include "fastfetch_config.h" #include -#include -#include -#include -#include - -void ffPrintKey(FFstate* state, const char* key) -{ - printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET": ", state->color, key); -} - -void ffPrintLogoAndKey(FFstate* state, const char* key) -{ - ffPrintLogoLine(state); - ffPrintKey(state, key); -} - -void ffParsePropFile(const char* fileName, const char* regex, char* buffer) -{ - buffer[0] = '\0'; //If an error occures, this is the indicator - - char* line = NULL; - size_t len; - - FILE* file = fopen(fileName, "r"); - if(file == NULL) - return; // handle errors in higher functions - - while (getline(&line, &len, file) != -1) - { - if (sscanf(line, regex, buffer) > 0) - break; - } - - fclose(file); - free(line); -} - -void ffParsePropFileHome(FFstate* state, const char* relativeFile, const char* regex, char* buffer) -{ - char absolutePath[512]; - strcpy(absolutePath, state->passwd->pw_dir); - strcat(absolutePath, "/"); - strcat(absolutePath, relativeFile); - - ffParsePropFile(absolutePath, regex, buffer); -} - -static inline bool strSet(const char* str) -{ - return str != NULL && str[0] != '\0'; -} - -void ffPrintGtkPretty(const char* gtk2, const char* gtk3, const char* gtk4) -{ - if(strSet(gtk2) && strSet(gtk3) && strSet(gtk4)) - { - if((strcmp(gtk2, gtk3) == 0) && (strcmp(gtk2, gtk4) == 0)) - printf("%s [GTK2/3/4]", gtk2); - else if(strcmp(gtk2, gtk3) == 0) - printf("%s [GTK2/3], %s [GTK4]", gtk2, gtk4); - else if(strcmp(gtk3, gtk4) == 0) - printf("%s [GTK2], %s [GTK3/4]", gtk2, gtk3); - else - printf("%s [GTK2], %s [GTK3], %s [GTK4]", gtk2, gtk3, gtk4); - } - else if(strSet(gtk2) && strSet(gtk3)) - { - if(strcmp(gtk2, gtk3) == 0) - printf("%s [GTK2/3]", gtk2); - else - printf("%s [GTK2], %s [GTK3]", gtk2, gtk3); - } - else if(strSet(gtk3) && strSet(gtk4)) - { - if(strcmp(gtk3, gtk4) == 0) - printf("%s [GTK3/4]", gtk3); - else - printf("%s [GTK3], %s [GTK4]", gtk3, gtk4); - } - else if(strSet(gtk2)) - { - printf("%s [GTK2]", gtk2); - } - else if(strSet(gtk3)) - { - printf("%s [GTK3]", gtk3); - } - else if(strSet(gtk4)) - { - printf("%s [GTK4]", gtk4); - } -} - -void ffPrintError(FFstate* state, const char* key, const char* message) -{ - if(!state->showErrors) - return; - - ffPrintLogoAndKey(state, key); - printf(FASTFETCH_TEXT_MODIFIER_ERROR"%s\n"FASTFETCH_TEXT_MODIFIER_RESET, message); -} - -static void getCacheFileName(FFstate* state, const char* key, char* buffer) -{ - const char* xdgCache = getenv("XDG_CACHE_HOME"); - if(xdgCache == NULL) - { - strcpy(buffer, state->passwd->pw_dir); - strcat(buffer, "/.cache"); - } - else - { - strcpy(buffer, xdgCache); - } - - mkdir(buffer, S_IRWXU | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH); //I hope everybody has a cache folder but whow knews - - strcat(buffer, "/fastfetch/"); - mkdir(buffer, S_IRWXU | S_IRGRP | S_IROTH); - - strcat(buffer, key); -} - -bool ffPrintCachedValue(FFstate* state, const char* key) -{ - if(state->recache) - return false; - - char fileName[256]; - getCacheFileName(state, key, fileName); - - int fd = open(fileName, O_RDONLY); - if(fd == -1) - return false; - - char value[1024]; - - ssize_t readed = read(fd, value, sizeof(value) - 1); - if(readed < 1) - return false; - - close(fd); - - value[readed] = '\0'; //Somehow read doesn't alway do this - - ffPrintLogoAndKey(state, key); - puts(value); - - return true; -} - -void ffPrintAndSaveCachedValue(FFstate* state, const char* key, const char* value) -{ - ffPrintLogoAndKey(state, key); - puts(value); - - char fileName[256]; - getCacheFileName(state, key, fileName); - - int fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); - if(fd == -1) - return; - - size_t len = strlen(value); - - bool failed = write(fd, value, len) != len; - - close(fd); - - if(failed) - unlink(fileName); -} static void printHelp() { @@ -219,20 +47,6 @@ static void printCommandHelp(const char* command) printf("No specific help for command %s provided\n", command); } -static void initState(FFstate* state) -{ - state->current_row = 0; - state->passwd = getpwuid(getuid()); - uname(&state->utsname); - sysinfo(&state->sysinfo); - state->logo_seperator = 4; - state->offsetx = 0; - state->titleLength = 20; // This is overwritten by ffPrintTitle - state->colorLogo = true; - state->showErrors = false; - state->recache = false; -} - static void parseArguments(int argc, char** argv, FFstate* state) { bool colorText = true; @@ -352,7 +166,7 @@ static void parseArguments(int argc, char** argv, FFstate* state) int main(int argc, char** argv) { FFstate state; - initState(&state); + ffInitState(&state); parseArguments(argc, argv, &state); //Start the printing diff --git a/src/fastfetch.h b/src/fastfetch.h index 40052f3c9..9187ebed9 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -49,7 +49,8 @@ typedef struct FFstate struct sysinfo sysinfo; } FFstate; -//Helper functions +//Util functions +void ffInitState(FFstate* state); void ffPrintLogoLine(FFstate* state); void ffPrintKey(FFstate* state, const char* key); void ffPrintLogoAndKey(FFstate* state, const char* key); diff --git a/src/battery.c b/src/modules/battery.c similarity index 100% rename from src/battery.c rename to src/modules/battery.c diff --git a/src/break.c b/src/modules/break.c similarity index 100% rename from src/break.c rename to src/modules/break.c diff --git a/src/colors.c b/src/modules/colors.c similarity index 100% rename from src/colors.c rename to src/modules/colors.c diff --git a/src/cpu.c b/src/modules/cpu.c similarity index 100% rename from src/cpu.c rename to src/modules/cpu.c diff --git a/src/desktopenvironment.c b/src/modules/desktopenvironment.c similarity index 100% rename from src/desktopenvironment.c rename to src/modules/desktopenvironment.c diff --git a/src/disk.c b/src/modules/disk.c similarity index 100% rename from src/disk.c rename to src/modules/disk.c diff --git a/src/font.c b/src/modules/font.c similarity index 100% rename from src/font.c rename to src/modules/font.c diff --git a/src/gpu.c b/src/modules/gpu.c similarity index 100% rename from src/gpu.c rename to src/modules/gpu.c diff --git a/src/host.c b/src/modules/host.c similarity index 100% rename from src/host.c rename to src/modules/host.c diff --git a/src/icons.c b/src/modules/icons.c similarity index 100% rename from src/icons.c rename to src/modules/icons.c diff --git a/src/kernel.c b/src/modules/kernel.c similarity index 100% rename from src/kernel.c rename to src/modules/kernel.c diff --git a/src/locale.c b/src/modules/locale.c similarity index 100% rename from src/locale.c rename to src/modules/locale.c diff --git a/src/memory.c b/src/modules/memory.c similarity index 100% rename from src/memory.c rename to src/modules/memory.c diff --git a/src/os.c b/src/modules/os.c similarity index 100% rename from src/os.c rename to src/modules/os.c diff --git a/src/packages.c b/src/modules/packages.c similarity index 100% rename from src/packages.c rename to src/modules/packages.c diff --git a/src/resolution.c b/src/modules/resolution.c similarity index 100% rename from src/resolution.c rename to src/modules/resolution.c diff --git a/src/seperator.c b/src/modules/seperator.c similarity index 100% rename from src/seperator.c rename to src/modules/seperator.c diff --git a/src/shell.c b/src/modules/shell.c similarity index 100% rename from src/shell.c rename to src/modules/shell.c diff --git a/src/terminal.c b/src/modules/terminal.c similarity index 100% rename from src/terminal.c rename to src/modules/terminal.c diff --git a/src/theme.c b/src/modules/theme.c similarity index 100% rename from src/theme.c rename to src/modules/theme.c diff --git a/src/title.c b/src/modules/title.c similarity index 100% rename from src/title.c rename to src/modules/title.c diff --git a/src/uptime.c b/src/modules/uptime.c similarity index 100% rename from src/uptime.c rename to src/modules/uptime.c diff --git a/src/util.c b/src/util.c new file mode 100644 index 000000000..ca663fedb --- /dev/null +++ b/src/util.c @@ -0,0 +1,189 @@ +#include "fastfetch.h" + +#include +#include +#include +#include +#include + +void ffInitState(FFstate* state) +{ + state->current_row = 0; + state->passwd = getpwuid(getuid()); + uname(&state->utsname); + sysinfo(&state->sysinfo); + state->logo_seperator = 4; + state->offsetx = 0; + state->titleLength = 20; // This is overwritten by ffPrintTitle + state->colorLogo = true; + state->showErrors = false; + state->recache = false; +} + +void ffPrintKey(FFstate* state, const char* key) +{ + printf(FASTFETCH_TEXT_MODIFIER_BOLT"%s%s"FASTFETCH_TEXT_MODIFIER_RESET": ", state->color, key); +} + +void ffPrintLogoAndKey(FFstate* state, const char* key) +{ + ffPrintLogoLine(state); + ffPrintKey(state, key); +} + +void ffParsePropFile(const char* fileName, const char* regex, char* buffer) +{ + buffer[0] = '\0'; //If an error occures, this is the indicator + + char* line = NULL; + size_t len; + + FILE* file = fopen(fileName, "r"); + if(file == NULL) + return; // handle errors in higher functions + + while (getline(&line, &len, file) != -1) + { + if (sscanf(line, regex, buffer) > 0) + break; + } + + fclose(file); + free(line); +} + +void ffParsePropFileHome(FFstate* state, const char* relativeFile, const char* regex, char* buffer) +{ + char absolutePath[512]; + strcpy(absolutePath, state->passwd->pw_dir); + strcat(absolutePath, "/"); + strcat(absolutePath, relativeFile); + + ffParsePropFile(absolutePath, regex, buffer); +} + +static inline bool strSet(const char* str) +{ + return str != NULL && str[0] != '\0'; +} + +void ffPrintGtkPretty(const char* gtk2, const char* gtk3, const char* gtk4) +{ + if(strSet(gtk2) && strSet(gtk3) && strSet(gtk4)) + { + if((strcmp(gtk2, gtk3) == 0) && (strcmp(gtk2, gtk4) == 0)) + printf("%s [GTK2/3/4]", gtk2); + else if(strcmp(gtk2, gtk3) == 0) + printf("%s [GTK2/3], %s [GTK4]", gtk2, gtk4); + else if(strcmp(gtk3, gtk4) == 0) + printf("%s [GTK2], %s [GTK3/4]", gtk2, gtk3); + else + printf("%s [GTK2], %s [GTK3], %s [GTK4]", gtk2, gtk3, gtk4); + } + else if(strSet(gtk2) && strSet(gtk3)) + { + if(strcmp(gtk2, gtk3) == 0) + printf("%s [GTK2/3]", gtk2); + else + printf("%s [GTK2], %s [GTK3]", gtk2, gtk3); + } + else if(strSet(gtk3) && strSet(gtk4)) + { + if(strcmp(gtk3, gtk4) == 0) + printf("%s [GTK3/4]", gtk3); + else + printf("%s [GTK3], %s [GTK4]", gtk3, gtk4); + } + else if(strSet(gtk2)) + { + printf("%s [GTK2]", gtk2); + } + else if(strSet(gtk3)) + { + printf("%s [GTK3]", gtk3); + } + else if(strSet(gtk4)) + { + printf("%s [GTK4]", gtk4); + } +} + +void ffPrintError(FFstate* state, const char* key, const char* message) +{ + if(!state->showErrors) + return; + + ffPrintLogoAndKey(state, key); + printf(FASTFETCH_TEXT_MODIFIER_ERROR"%s\n"FASTFETCH_TEXT_MODIFIER_RESET, message); +} + +static void getCacheFileName(FFstate* state, const char* key, char* buffer) +{ + const char* xdgCache = getenv("XDG_CACHE_HOME"); + if(xdgCache == NULL) + { + strcpy(buffer, state->passwd->pw_dir); + strcat(buffer, "/.cache"); + } + else + { + strcpy(buffer, xdgCache); + } + + mkdir(buffer, S_IRWXU | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH); //I hope everybody has a cache folder but whow knews + + strcat(buffer, "/fastfetch/"); + mkdir(buffer, S_IRWXU | S_IRGRP | S_IROTH); + + strcat(buffer, key); +} + +bool ffPrintCachedValue(FFstate* state, const char* key) +{ + if(state->recache) + return false; + + char fileName[256]; + getCacheFileName(state, key, fileName); + + int fd = open(fileName, O_RDONLY); + if(fd == -1) + return false; + + char value[1024]; + + ssize_t readed = read(fd, value, sizeof(value) - 1); + if(readed < 1) + return false; + + close(fd); + + value[readed] = '\0'; //Somehow read doesn't alway do this + + ffPrintLogoAndKey(state, key); + puts(value); + + return true; +} + +void ffPrintAndSaveCachedValue(FFstate* state, const char* key, const char* value) +{ + ffPrintLogoAndKey(state, key); + puts(value); + + char fileName[256]; + getCacheFileName(state, key, fileName); + + int fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if(fd == -1) + return; + + size_t len = strlen(value); + + bool failed = write(fd, value, len) != len; + + close(fd); + + if(failed) + unlink(fileName); +}