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*),