summaryrefslogtreecommitdiff
path: root/apps/filetree.c
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-03-01 17:55:59 +0000
committerThomas Martitz <kugel@rockbox.org>2009-03-01 17:55:59 +0000
commitd13f1a485f0e35a6fbbd0a664f14acc3798d52a0 (patch)
tree22cacb27b6ab481c0bfc250120dde404320811f2 /apps/filetree.c
parente6c023cb64dea599bb711b2b4ddb197efdb1d187 (diff)
downloadrockbox-d13f1a485f0e35a6fbbd0a664f14acc3798d52a0.zip
rockbox-d13f1a485f0e35a6fbbd0a664f14acc3798d52a0.tar.gz
rockbox-d13f1a485f0e35a6fbbd0a664f14acc3798d52a0.tar.bz2
rockbox-d13f1a485f0e35a6fbbd0a664f14acc3798d52a0.tar.xz
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
Diffstat (limited to 'apps/filetree.c')
-rw-r--r--apps/filetree.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/apps/filetree.c b/apps/filetree.c
index fc5e4d3..0ceb5c0 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 */