From 691291245a88d1c2277d8900a13f41b00685a72c Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Sun, 2 Apr 2017 11:02:07 +0530 Subject: [PATCH] Use standard function for numeric sort Numeric is numeric i.e., n, -n. +n. Other forms such as --n, ++n, -c, +c should not be considered numeric. If size is same (e.g. dirs), use alphanum sort. --- nnn.c | 36 ++++++++++-------------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/nnn.c b/nnn.c index aa8dd565..b2155a67 100644 --- a/nnn.c +++ b/nnn.c @@ -295,40 +295,23 @@ int xisdigit(const char c) { static int xstricmp(const char *s1, const char *s2) { - static int s1_num, s2_num; - static const char *ps1, *ps2; + static char *c1, *c2; static long long num1, num2; - s1_num = s2_num = 0; - - ps1 = s1; - if (*ps1 == '-') - ps1++; - while (*ps1 && xisdigit(*ps1)) - ps1++; - if (!*ps1) - s1_num = 1; - - - ps2 = s2; - if (*ps2 == '-') - ps2++; - while (*ps2 && xisdigit(*ps2)) - ps2++; - if (!*ps2) - s2_num = 1; - - if (s1_num && s2_num) { - num1 = strtoll(s1, NULL, 10); - num2 = strtoll(s2, NULL, 10); + num1 = strtoll(s1, &c1, 10); + num2 = strtoll(s2, &c2, 10); + if (*c1 == '\0' && *c2 == '\0') { if (num1 != num2) { if (num1 > num2) return 1; else return -1; } - } + } else if (*c1 == '\0' && *c2 != '\0') + return -1; + else if (*c1 != '\0' && *c2 == '\0') + return 1; while (*s2 && *s1 && TOUPPER(*s1) == TOUPPER(*s2)) s1++, s2++; @@ -410,7 +393,8 @@ entrycmp(const void *va, const void *vb) return pb->t - pa->t; if (sizeorder) - return pb->size - pa->size; + if (pb->size != pa->size) + return pb->size - pa->size; return xstricmp(pa->name, pb->name); }