From 2a1d273bc0566cde85cc753587bd79bdc43fd81e Mon Sep 17 00:00:00 2001 From: nova Date: Thu, 13 Mar 2025 18:45:36 +0100 Subject: [PATCH] basic sorting implemented, segfaults in natural sort --- backend.c | 14 ++----------- defines.h | 7 +++++++ sorting.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ sorting.h | 11 +++++++++++ 4 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 sorting.c create mode 100644 sorting.h diff --git a/backend.c b/backend.c index 9ebd66b..5199125 100644 --- a/backend.c +++ b/backend.c @@ -5,6 +5,7 @@ #include #include #include "defines.h" +#include "sorting.h" extern unsigned int settings; extern unsigned int file_modifiers; @@ -13,6 +14,7 @@ extern char **content_m; extern char **content_r; extern char *path; + void get_dir_size(char *path, unsigned long *file_count, unsigned long *longest_name){ DIR *dir = opendir(path); *longest_name = 256; //magic number originates out of readdir(), unless i implement my own name size function, thisll do @@ -58,18 +60,6 @@ void print_dir(WINDOW *win, char **dir_content){ } } -// Comparison function to sort strings in ascending order -int compare(const void *a, const void *b) { - return strcasecmp(a, b); -} -void sort_dir(unsigned long *file_count, unsigned long *longest_name, char **dir_content){ - char content[*file_count][*longest_name]; - memset(content,0,sizeof(content)); - if ((file_modifiers & FILE_MODIFIERS_SORT_BITMASK) == 0) {//natural; first dirs, then files - qsort(dir_content, *file_count, *longest_name, compare); - } - -} void *populate_dir(void *which){ // 0=left, 1=main, 2=right char wh = (char)which; unsigned long file_count = 0; diff --git a/defines.h b/defines.h index c3c7bb9..284fca6 100644 --- a/defines.h +++ b/defines.h @@ -6,3 +6,10 @@ #define FILE_MODIFIERS_HIDDEN_FILES 1 #define FILE_MODIFIERS_SORT_BITMASK 126 // 00000000000000000000000001111110 +#define FILE_MODIFIERS_SORT_ALPHABETIC 2 +#define FILE_MODIFIERS_SORT_TYPE 4 +#define FILE_MODIFIERS_SORT_EXTENSION 8 +#define FILE_MODIFIERS_SORT_SIZE 16 +#define FILE_MODIFIERS_SORT_RANDOM 32 +#define FILE_MODIFIERS_SORT_REVERSE 64 + //FILE_MODIFIERS_SORT_NATURAL is when bitmask is 0 diff --git a/sorting.c b/sorting.c new file mode 100644 index 0000000..2806cf3 --- /dev/null +++ b/sorting.c @@ -0,0 +1,59 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "defines.h" + +extern unsigned int settings; +extern unsigned int file_modifiers; +extern unsigned short cpu_cores; //amount of cores/threads the host system reports to have +extern char **content_l; +extern char **content_m; +extern char **content_r; +extern char *path; + +int natural(const void *file0, const void *file1){ + const char *rec1 = *(char**)file0; + const char *rec2 = *(char**)file1; + int ret = 0; + struct stat f0; + struct stat f1; + stat(rec1, &f0); + stat(rec2, &f1); + + + if (S_ISDIR(f0.st_mode) > S_ISDIR(f1.st_mode)) { + ret = 1; + } else if (S_ISDIR(f0.st_mode) < S_ISDIR(f1.st_mode)) { + ret = -1; + } + + return ret; +} + +int alphabetic(const void *str1, const void *str2){ + const char *rec1 = *(char**)str1; + const char *rec2 = *(char**)str2; + int ret = strcmp(str1, rec2); + + return ret; +} + +void sort_dir(unsigned long *file_count, unsigned long *longest_name, char **dir_content){ + + if (file_modifiers & ~FILE_MODIFIERS_SORT_BITMASK) { + qsort(dir_content, *file_count, sizeof(longest_name), alphabetic); + qsort(dir_content, *file_count, sizeof(longest_name), natural); + + } else if (file_modifiers & FILE_MODIFIERS_SORT_ALPHABETIC) { + qsort(dir_content, *file_count, sizeof(longest_name), alphabetic); + } + + + +} diff --git a/sorting.h b/sorting.h new file mode 100644 index 0000000..c36f9b0 --- /dev/null +++ b/sorting.h @@ -0,0 +1,11 @@ +#include +#include +#include +#include +#include +#include +#include "defines.h" +#include "sorting.c" + +void sort_dir(unsigned long *file_count, unsigned long *longest_name, char **dir_content); +