Mercurial > blahgd
changeset 26:18373c0707b8
sorted_dir_loop: allow numeric sort
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Thu, 05 Feb 2009 16:25:19 -0500 |
parents | 9be67550f0bf |
children | b1eb4c8848fa |
files | dir.c dir.h |
diffstat | 2 files changed, 39 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/dir.c Thu Feb 05 16:15:43 2009 -0500 +++ b/dir.c Thu Feb 05 16:25:19 2009 -0500 @@ -11,20 +11,38 @@ #define LIST_BLOCK_SIZE 128 -static int cmp_asc(const void *a, const void *b) +static int cmp_str_asc(const void *a, const void *b) { char *as = *(char**)a, *bs = *(char**)b; return strcmp(as, bs); } -static int cmp_desc(const void *a, const void *b) +static int cmp_str_desc(const void *a, const void *b) { char *as = *(char**)a, *bs = *(char**)b; return -strcmp(as, bs); } +static int cmp_int_asc(const void *a, const void *b) +{ + int as = atoi(*(char**)a), bs = atoi(*(char**)b); + + if (as < bs) + return -1; + return as != bs; +} + +static int cmp_int_desc(const void *a, const void *b) +{ + int as = atoi(*(char**)a), bs = atoi(*(char**)b); + + if (as > bs) + return -1; + return as != bs; +} + int sorted_readdir_loop(DIR *dir, struct post *post, void(*f)(struct post*, char*, void*), void *data, int updown, int limit) @@ -53,10 +71,21 @@ count++; } - if (updown == SORT_ASC) - qsort(list, count, sizeof(char*), cmp_asc); - else - qsort(list, count, sizeof(char*), cmp_desc); + switch(updown) { + default: + case SORT_ASC | SORT_STRING: + qsort(list, count, sizeof(char*), cmp_str_asc); + break; + case SORT_DESC | SORT_STRING: + qsort(list, count, sizeof(char*), cmp_str_desc); + break; + case SORT_ASC | SORT_NUMERIC: + qsort(list, count, sizeof(char*), cmp_int_asc); + break; + case SORT_DESC | SORT_NUMERIC: + qsort(list, count, sizeof(char*), cmp_int_desc); + break; + } for(i=0; (i<count) && limit; i++) { f(post, list[i], data);
--- a/dir.h Thu Feb 05 16:15:43 2009 -0500 +++ b/dir.h Thu Feb 05 16:25:19 2009 -0500 @@ -3,8 +3,10 @@ #include "post.h" -#define SORT_ASC 0 -#define SORT_DESC 1 +#define SORT_ASC 0x00 /* default */ +#define SORT_DESC 0x01 +#define SORT_NUMERIC 0x00 /* default */ +#define SORT_STRING 0x02 extern int sorted_readdir_loop(DIR *dir, struct post *post, void(*f)(struct post*, char*, void*),