aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-04-02 11:02:07 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-04-02 12:13:40 +0530
commit691291245a88d1c2277d8900a13f41b00685a72c (patch)
tree8aededeba8881ab3d1cd0760f965b7c794d1232a
parent90e98b832b7293b03248621f06e1431447c3b295 (diff)
downloadnnn-691291245a88d1c2277d8900a13f41b00685a72c.tar.gz
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.
-rw-r--r--nnn.c36
1 files changed, 10 insertions, 26 deletions
diff --git a/nnn.c b/nnn.c
index aa8dd56..b2155a6 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);
}