diff options
Diffstat (limited to 'apps/tree.c')
-rw-r--r-- | apps/tree.c | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/apps/tree.c b/apps/tree.c index 09391b31b6..c68927be60 100644 --- a/apps/tree.c +++ b/apps/tree.c | |||
@@ -255,14 +255,46 @@ static int compare(const void* p1, const void* p2) | |||
255 | { | 255 | { |
256 | struct entry* e1 = (struct entry*)p1; | 256 | struct entry* e1 = (struct entry*)p1; |
257 | struct entry* e2 = (struct entry*)p2; | 257 | struct entry* e2 = (struct entry*)p2; |
258 | int criteria; | ||
258 | 259 | ||
259 | if (( e1->attr & ATTR_DIRECTORY ) == ( e2->attr & ATTR_DIRECTORY )) | 260 | if (e1->attr & ATTR_DIRECTORY && e2->attr & ATTR_DIRECTORY) |
261 | { /* two directories */ | ||
262 | criteria = global_settings.sort_dir; | ||
263 | } | ||
264 | else if (!(e1->attr & ATTR_DIRECTORY) && !(e2->attr & ATTR_DIRECTORY)) | ||
265 | { /* two files */ | ||
266 | criteria = global_settings.sort_file; | ||
267 | } | ||
268 | else /* dir and file, dir goes first */ | ||
269 | return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY ); | ||
270 | |||
271 | switch(criteria) | ||
272 | { | ||
273 | case 3: /* sort type */ | ||
274 | { | ||
275 | int t1 = e1->attr & TREE_ATTR_MASK; | ||
276 | int t2 = e2->attr & TREE_ATTR_MASK; | ||
277 | |||
278 | if (!t1) /* unknown type */ | ||
279 | t1 = 0x7FFFFFFF; /* gets a high number, to sort after known */ | ||
280 | if (!t2) /* unknown type */ | ||
281 | t2 = 0x7FFFFFFF; /* gets a high number, to sort after known */ | ||
282 | |||
283 | if (t1 - t2) /* if different */ | ||
284 | return t1 - t2; | ||
285 | /* else fall through to alphabetical sorting */ | ||
286 | } | ||
287 | case 0: /* sort alphabetically */ | ||
260 | if (global_settings.sort_case) | 288 | if (global_settings.sort_case) |
261 | return strncmp(e1->name, e2->name, MAX_PATH); | 289 | return strncmp(e1->name, e2->name, MAX_PATH); |
262 | else | 290 | else |
263 | return strncasecmp(e1->name, e2->name, MAX_PATH); | 291 | return strncasecmp(e1->name, e2->name, MAX_PATH); |
264 | else | 292 | case 1: /* sort date */ |
265 | return ( e2->attr & ATTR_DIRECTORY ) - ( e1->attr & ATTR_DIRECTORY ); | 293 | return e1->time_write - e2->time_write; |
294 | case 2: /* sort date, newest first */ | ||
295 | return e2->time_write - e1->time_write; | ||
296 | } | ||
297 | return 0; /* never reached */ | ||
266 | } | 298 | } |
267 | 299 | ||
268 | static void showfileline(int line, int direntry, bool scroll, int *dirfilter) | 300 | static void showfileline(int line, int direntry, bool scroll, int *dirfilter) |