diff --git a/src/filelist.c b/src/filelist.c index e7a2a9fc..6b93faed 100644 --- a/src/filelist.c +++ b/src/filelist.c @@ -421,12 +421,47 @@ void feh_file_dirname(char *dst, feh_file * f, int maxlen) dst[n] = '\0'; } +char *to_lower_str(const char *s) +{ + if (!s) + return NULL; + + char *lower = strdup(s); + if (!lower) { + return NULL; + } + for (char *ptr = lower; *ptr; ++ptr) { + *ptr = tolower(*ptr); + } + return lower; +} + static inline int strcmp_or_strverscmp(const char *s1, const char *s2) { - if (!opt.version_sort) - return(strcmp(s1, s2)); - else + if (!opt.version_sort) { + /* Version sort disabled */ + + if (!opt.ignore_case_sort) + return(strcmp(s1, s2)); + else + return(strcasecmp(s1, s2)); + } + + /* Version sort enabled */ + if (!opt.ignore_case_sort) { return(strverscmp(s1, s2)); + } else { + char *lower1 = to_lower_str(s1); + char *lower2 = to_lower_str(s2); + int result; + if (lower1 && lower2) + result = strverscmp(lower1, lower2); + else + result = strverscmp(s1, s2); + free(lower1); + free(lower2); + return(result); + } } int feh_cmp_filename(void *file1, void *file2) diff --git a/src/help.raw b/src/help.raw index 0e99c689..5416e70a 100644 --- a/src/help.raw +++ b/src/help.raw @@ -57,6 +57,7 @@ OPTIONS or format -n, --reverse Reverse sort order --version-sort Natural sort of (version) numbers within text + --ignore-case-sort Case-insensistive sort for name, filename and dirname -A, --action [;]ACTION Specify action to perform when pressing . Executed by /bin/sh, may contain FORMAT SPECIFIERS reloads image with \";\", switches to next otherwise diff --git a/src/options.c b/src/options.c index d38ce454..9388c331 100644 --- a/src/options.c +++ b/src/options.c @@ -438,6 +438,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) {"class" , 1, 0, OPTION_class}, {"no-conversion-cache", 0, 0, OPTION_no_conversion_cache}, {"window-id", 1, 0, OPTION_window_id}, + {"ignore-case-sort" , 0, 0, OPTION_ignore_case_sort}, {0, 0, 0, 0} }; int optch = 0, cmdx = 0; @@ -860,6 +861,9 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) opt.zoom_rate = 1 + ((float)opt.zoom_rate / 100); } break; + case OPTION_ignore_case_sort: + opt.ignore_case_sort = 1; + break; default: break; } diff --git a/src/options.h b/src/options.h index 74c12cdc..5fddb735 100644 --- a/src/options.h +++ b/src/options.h @@ -116,6 +116,7 @@ struct __fehoptions { double reload; int sort; int version_sort; + int ignore_case_sort; int debug; int geom_enabled; int geom_flags; @@ -256,6 +257,7 @@ OPTION_auto_reload, OPTION_class, OPTION_no_conversion_cache, OPTION_window_id, +OPTION_ignore_case_sort, }; //typedef enum __fehoption fehoption;