]> Sergey Matveev's repositories - nnn.git/commitdiff
Use standard function for numeric sort
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 2 Apr 2017 05:32:07 +0000 (11:02 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 2 Apr 2017 06:43:40 +0000 (12:13 +0530)
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

diff --git a/nnn.c b/nnn.c
index aa8dd5652153050a26390aa5153e8edcf2e10123..b2155a67c9bd3a3086505c539b69e14d8d1780a6 100644 (file)
--- 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);
 }