From 0b5cdd468b8147075cae30219a39f1af73c84fb9 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Sun, 21 Aug 2016 18:17:34 +0530 Subject: [PATCH] List alphabetically, case ignored (like 'ls -l'). --- noice.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/noice.c b/noice.c index 03b159c7..0e3eca7c 100644 --- a/noice.c +++ b/noice.c @@ -38,6 +38,8 @@ #define MIN(x, y) ((x) < (y) ? (x) : (y)) #define ISODD(x) ((x) & 1) #define CONTROL(c) ((c) ^ 0x40) +#define TOUPPER(ch) \ + (((ch) >= 'a' && (ch) <= 'z') ? ((ch) - 'a' + 'A') : (ch)) #define MAX_LEN 1024 struct assoc { @@ -203,6 +205,19 @@ xgetenv(char *name, char *fallback) return value && value[0] ? value : fallback; } +int +xstricmp(const char *s1, const char *s2) +{ + while (*s2 != 0 && TOUPPER(*s1) == TOUPPER(*s2)) + s1++, s2++; + + /* In case of alphabetically same names, make sure + lower case one comes before upper case one */ + if (!*s1 && !*s2) + return 1; + return (int) (TOUPPER(*s1) - TOUPPER(*s2)); +} + char * openwith(char *file) { @@ -254,7 +269,7 @@ entrycmp(const void *va, const void *vb) if (mtimeorder) return b->t - a->t; - return strcmp(a->name, b->name); + return xstricmp(a->name, b->name); } void