From d13f1a485f0e35a6fbbd0a664f14acc3798d52a0 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Sun, 1 Mar 2009 17:55:59 +0000 Subject: Commit FS#8314. This adds strnat[case]cmp written by Martin Pool, which respects numbers within strings, and gives a more intuitive sorting. This also adds a setting, so that the sorting can be used in the file browser. The implementation is very generic, and can possibly be used in other places. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20155 a1c6a512-1295-4272-9138-f99709370657 --- apps/filetree.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'apps/filetree.c') diff --git a/apps/filetree.c b/apps/filetree.c index fc5e4d3934..0ceb5c0941 100644 --- a/apps/filetree.c +++ b/apps/filetree.c @@ -45,6 +45,7 @@ #include "cuesheet.h" #include "filetree.h" #include "misc.h" +#include "strnatcmp.h" #ifdef HAVE_LCD_BITMAP #include "keyboard.h" #endif @@ -242,12 +243,26 @@ static int compare(const void* p1, const void* p2) case SORT_ALPHA: case SORT_ALPHA_REVERSED: + { if (global_settings.sort_case) - return strncmp(e1->name, e2->name, MAX_PATH) - * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); + { + if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER) + return strnatcmp(e1->name, e2->name) + * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); + else + return strncmp(e1->name, e2->name, MAX_PATH) + * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); + } else - return strncasecmp(e1->name, e2->name, MAX_PATH) - * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); + { + if (global_settings.interpret_numbers == SORT_INTERPRET_AS_NUMBER) + return strnatcasecmp(e1->name, e2->name) + * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); + else + return strncasecmp(e1->name, e2->name, MAX_PATH) + * (criteria == SORT_ALPHA_REVERSED ? -1 : 1); + } + } } return 0; /* never reached */ -- cgit v1.2.3