mirror of
https://github.com/jarun/nnn.git
synced 2024-11-28 05:41:31 +00:00
Order numeric file names (helps with /proc)
This commit is contained in:
parent
4d0bbcb26c
commit
d3797f21d1
93
nnn.c
93
nnn.c
|
@ -632,7 +632,6 @@ xdiraccess(char *path)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/*
|
/*
|
||||||
* We assume none of the strings are NULL.
|
* We assume none of the strings are NULL.
|
||||||
*
|
*
|
||||||
|
@ -640,53 +639,39 @@ xdiraccess(char *path)
|
||||||
* E.g., the order '1, 10, 2' doesn't make sense to human eyes.
|
* E.g., the order '1, 10, 2' doesn't make sense to human eyes.
|
||||||
*
|
*
|
||||||
* If the absolute numeric values are same, we fallback to alphasort.
|
* If the absolute numeric values are same, we fallback to alphasort.
|
||||||
*
|
|
||||||
* NOTE: This API is replaced by strcoll().
|
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
xstricmp(char *s1, char *s2)
|
xstricmp(char *s1, char *s2)
|
||||||
{
|
{
|
||||||
static char *str1, *str2, *c1, *c2;
|
static char *c1, *c2;
|
||||||
static int diff, nsyms1, nsyms2;
|
|
||||||
static bool symbolic1, symbolic2, numeric1, numeric2;
|
|
||||||
|
|
||||||
symbolic1 = symbolic2 = numeric1 = numeric2 = FALSE;
|
c1 = s1;
|
||||||
|
while (isspace(*c1))
|
||||||
|
++c1;
|
||||||
|
|
||||||
str1 = c1 = s1;
|
c2 = s2;
|
||||||
nsyms1 = 0;
|
while (isspace(*c2))
|
||||||
while (isspace(*c1) || ispunct(*c1)) { /* Same weight to spaces and punctuations */
|
++c2;
|
||||||
++nsyms1, ++c1;
|
|
||||||
if (!symbolic1)
|
|
||||||
symbolic1 = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
str2 = c2 = s2;
|
|
||||||
nsyms2 = 0;
|
|
||||||
while (isspace(*c2) || ispunct(*c2)) {
|
|
||||||
++nsyms2, ++c2;
|
|
||||||
if (!symbolic2)
|
|
||||||
symbolic2 = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!*c1 && *c2) {
|
|
||||||
if (symbolic1)
|
|
||||||
return -1;
|
|
||||||
} else if (*c1 && !*c2) {
|
|
||||||
if (symbolic2)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*c1 == '-' || *c1 == '+')
|
if (*c1 == '-' || *c1 == '+')
|
||||||
++c1;
|
++c1;
|
||||||
if (*c1 >= '0' && *c1 <= '9')
|
|
||||||
numeric1 = TRUE;
|
|
||||||
|
|
||||||
if (*c2 == '-' || *c2 == '+')
|
if (*c2 == '-' || *c2 == '+')
|
||||||
++c2;
|
++c2;
|
||||||
if (*c2 >= '0' && *c2 <= '9')
|
|
||||||
numeric2 = TRUE;
|
|
||||||
|
|
||||||
if (numeric1 && numeric2) {
|
if (isdigit(*c1) && isdigit(*c2)) {
|
||||||
|
while (*c1 >= '0' && *c1 <= '9')
|
||||||
|
++c1;
|
||||||
|
while (isspace(*c1))
|
||||||
|
++c1;
|
||||||
|
|
||||||
|
while (*c2 >= '0' && *c2 <= '9')
|
||||||
|
++c2;
|
||||||
|
while (isspace(*c2))
|
||||||
|
++c2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*c1 && !*c2) {
|
||||||
static long long num1, num2;
|
static long long num1, num2;
|
||||||
|
|
||||||
num1 = strtoll(s1, NULL, 10);
|
num1 = strtoll(s1, NULL, 10);
|
||||||
|
@ -697,44 +682,10 @@ xstricmp(char *s1, char *s2)
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (numeric1)
|
|
||||||
return -1;
|
|
||||||
else if (numeric2)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
} else if (*c1 == '\0' && *c2 != '\0')
|
|
||||||
return -1;
|
|
||||||
else if (*c1 != '\0' && *c2 == '\0')
|
|
||||||
return 1;
|
|
||||||
#endif
|
|
||||||
s1 = c1, s2 = c2;
|
|
||||||
|
|
||||||
while (*s2 && *s1 && 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) {
|
|
||||||
/* First compare ignoring symbols */
|
|
||||||
if (*c1 && *c2) {
|
|
||||||
diff = xstrcmp(c1, c2);
|
|
||||||
if (diff != 0)
|
|
||||||
return -diff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sort the string with lesser prefix symbols on top */
|
|
||||||
if (nsyms1 != nsyms2)
|
|
||||||
return (nsyms1 - nsyms2);
|
|
||||||
|
|
||||||
/* Same number of symbols in both strings */
|
|
||||||
return -xstrcmp(str1, str2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (int) (TOUPPER(*s1) - TOUPPER(*s2));
|
return strcoll(s1, s2);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Return the integer value of a char representing HEX */
|
/* Return the integer value of a char representing HEX */
|
||||||
static char
|
static char
|
||||||
|
@ -846,7 +797,7 @@ entrycmp(const void *va, const void *vb)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return strcoll(pa->name, pb->name);
|
return xstricmp(pa->name, pb->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue