From 23654741bc8437fd1f753e9bd8e5f173c2325947 Mon Sep 17 00:00:00 2001 From: nova Date: Mon, 13 Oct 2025 21:44:19 +0200 Subject: [PATCH] fixed sort_extension, changes too small to list to other sort methods --- config.h | 2 +- sorting.c | 55 ++++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/config.h b/config.h index 27f2295..23a4198 100644 --- a/config.h +++ b/config.h @@ -91,7 +91,7 @@ static const binding key_binding[] = { { "uz", cmd_on_selected, "unzip ", "unzip zip" }, { "on", order_by, sort_natural, "order natural" }, - { "oe", not_implemented, NULL, "order extension" }, + { "oe", order_by, sort_extension, "order extension" }, { "os", order_by, sort_size, "order size" }, { "ot", order_by, sort_type, "order type" }, { "or", order_by, sort_random, "order random" }, diff --git a/sorting.c b/sorting.c index 4eff683..34017d7 100644 --- a/sorting.c +++ b/sorting.c @@ -144,13 +144,13 @@ int sort_type(const void *file0, const void *file1){ return 1; } - if (((file*)file0)->file_type == ((file*)file1)->file_type) { - /*somehow relying on the else below, occasionaly trips either one of the checked for conditions*/ - return strcasecmp(((file*)file0)->file_name, ((file*)file1)->file_name); - } else if (((file*)file0)->file_type > ((file*)file1)->file_type) { + if (((file*)file0)->file_type > ((file*)file1)->file_type) { return -1; - } - return 1; + } else if (((file*)file0)->file_type < ((file*)file1)->file_type) { + return 1; + } else { + return sort_natural(file0, file1); + } } int sort_size(const void *file0, const void *file1){ @@ -161,10 +161,43 @@ int sort_size(const void *file0, const void *file1){ return 1; } - if (((file*)file0)->file_size == ((file*)file1)->file_size) { - return strcasecmp(((file*)file0)->file_name, ((file*)file1)->file_name); - } else if (((file*)file0)->file_size > ((file*)file1)->file_size) { + if (((file*)file0)->file_size > ((file*)file1)->file_size) { return -1; - } - return 1; + } else if (((file*)file0)->file_size < ((file*)file1)->file_size) { + return 1; + } else { + return sort_natural(file0, file1); + } +} +int sort_extension(const void *file0, const void *file1){ + + if ((((file*)file0)->file_type & FILE_TYPE_DIR) && !(((file*)file1)->file_type & FILE_TYPE_DIR)) { + return -1; + } + if (!(((file*)file0)->file_type & FILE_TYPE_DIR) && (((file*)file1)->file_type & FILE_TYPE_DIR)) { + return 1; + } + + char *extension0 = strrchr(((file*)file0)->file_name, '.'); + char *extension1 = strrchr(((file*)file1)->file_name, '.'); + + if (extension0 && extension1) { + if ((strcmp(extension0, extension1)) == 0) { + return sort_natural(file0, file1); + } else { + file f0; + file f1; + memcpy(&f0, file0, sizeof(file)); + memcpy(&f1, file1, sizeof(file)); + f0.file_name = extension0; + f1.file_name = extension1; + return sort_natural(&f0, &f1); + } + } else if (extension0 != NULL && extension1 == NULL) { + return 1; + } else if (extension0 == NULL && extension1 != NULL) { + return -1; + } else { + return sort_natural(file0, file1); + } }