Index: apps/filetree.c
===================================================================
RCS file: /cvsroot/rockbox/apps/filetree.c,v
retrieving revision 1.38
diff -u -r1.38 filetree.c
--- apps/filetree.c	13 Nov 2006 00:45:19 -0000	1.38
+++ apps/filetree.c	20 Nov 2006 00:28:53 -0000
@@ -144,6 +144,61 @@
     closedir_cached(dir);
 }
 
+static const unsigned char charmap_latin1[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\141', '\141', '\141', '\141', '\141', '\305', '\306', '\143',
+	'\145', '\145', '\145', '\145', '\151', '\151', '\151', '\151',
+	'\145', '\156', '\157', '\157', '\157', '\157', '\157', '\327',
+	'\330', '\165', '\165', '\165', '\165', '\171', '\336', '\163',
+	'\141', '\141', '\141', '\141', '\141', '\345', '\346', '\143',
+	'\145', '\145', '\145', '\145', '\151', '\151', '\151', '\151',
+	'\145', '\156', '\157', '\157', '\157', '\157', '\157', '\367',
+	'\370', '\165', '\165', '\165', '\165', '\171', '\376', '\171',
+};
+
+int
+strncasecmp_latin1(s1, s2, n)
+	const char *s1, *s2;
+	register size_t n;
+{
+    register unsigned char u1, u2;
+
+    for (; n != 0; --n) {
+	u1 = (unsigned char) *s1++;
+	u2 = (unsigned char) *s2++;
+	if (charmap_latin1[u1] != charmap_latin1[u2]) {
+	    return charmap_latin1[u1] - charmap_latin1[u2];
+	}
+	if (u1 == '\0') {
+	    return 0;
+	}
+    }
+    return 0;
+}
+
 /* support function for qsort() */
 static int compare(const void* p1, const void* p2)
 {
@@ -190,13 +245,13 @@
             if (global_settings.sort_case)
                 return strncmp(e1->name, e2->name, MAX_PATH);
             else
-                return strncasecmp(e1->name, e2->name, MAX_PATH);
+                return strncasecmp_latin1(e1->name, e2->name, MAX_PATH);
 
         case 4: /* sort alphabetically desc */
             if (global_settings.sort_case)
                 return strncmp(e2->name, e1->name, MAX_PATH);
             else
-                return strncasecmp(e2->name, e1->name, MAX_PATH);
+                return strncasecmp_latin1(e2->name, e1->name, MAX_PATH);
 
         case 1: /* sort date */
             return e1->time_write - e2->time_write;
