forked from len0rd/rockbox
Make sure that sorting works both for signed and unsigned char (it depends on the platform/compiler used)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20183 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
4a54fc0eec
commit
7389928d89
1 changed files with 19 additions and 9 deletions
|
|
@ -41,6 +41,12 @@
|
||||||
|
|
||||||
#define assert(x) /* nothing */
|
#define assert(x) /* nothing */
|
||||||
|
|
||||||
|
/* Convert char to int regardless of whether char is signed or not */
|
||||||
|
static inline int
|
||||||
|
to_int(char c)
|
||||||
|
{
|
||||||
|
return (int) ((unsigned char) c);
|
||||||
|
}
|
||||||
|
|
||||||
/* These are defined as macros to make it easier to adapt this code to
|
/* These are defined as macros to make it easier to adapt this code to
|
||||||
* different characters types or comparison functions. */
|
* different characters types or comparison functions. */
|
||||||
|
|
@ -70,25 +76,28 @@ static int
|
||||||
compare_right(char const *a, char const *b)
|
compare_right(char const *a, char const *b)
|
||||||
{
|
{
|
||||||
int bias = 0;
|
int bias = 0;
|
||||||
|
int ca, cb;
|
||||||
|
|
||||||
/* The longest run of digits wins. That aside, the greatest
|
/* The longest run of digits wins. That aside, the greatest
|
||||||
value wins, but we can't know that it will until we've scanned
|
value wins, but we can't know that it will until we've scanned
|
||||||
both numbers to know that they have the same magnitude, so we
|
both numbers to know that they have the same magnitude, so we
|
||||||
remember it in BIAS. */
|
remember it in BIAS. */
|
||||||
for (;; a++, b++) {
|
for (;; a++, b++) {
|
||||||
if (!nat_isdigit(*a) && !nat_isdigit(*b))
|
ca = to_int(*a);
|
||||||
|
cb = to_int(*b);
|
||||||
|
if (!nat_isdigit(ca) && !nat_isdigit(cb))
|
||||||
return bias;
|
return bias;
|
||||||
else if (!nat_isdigit(*a))
|
else if (!nat_isdigit(ca))
|
||||||
return -1;
|
return -1;
|
||||||
else if (!nat_isdigit(*b))
|
else if (!nat_isdigit(cb))
|
||||||
return +1;
|
return +1;
|
||||||
else if (*a < *b) {
|
else if (ca < cb) {
|
||||||
if (!bias)
|
if (!bias)
|
||||||
bias = -1;
|
bias = -1;
|
||||||
} else if (*a > *b) {
|
} else if (ca > cb) {
|
||||||
if (!bias)
|
if (!bias)
|
||||||
bias = +1;
|
bias = +1;
|
||||||
} else if (!*a && !*b)
|
} else if (!ca && !cb)
|
||||||
return bias;
|
return bias;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,14 +113,15 @@ static int strnatcmp0(char const *a, char const *b, int fold_case)
|
||||||
assert(a && b);
|
assert(a && b);
|
||||||
ai = bi = 0;
|
ai = bi = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
ca = a[ai]; cb = b[bi];
|
ca = to_int(a[ai]);
|
||||||
|
cb = to_int(b[bi]);
|
||||||
|
|
||||||
/* skip over leading spaces or zeros */
|
/* skip over leading spaces or zeros */
|
||||||
while (nat_isspace(ca))
|
while (nat_isspace(ca))
|
||||||
ca = a[++ai];
|
ca = to_int(a[++ai]);
|
||||||
|
|
||||||
while (nat_isspace(cb))
|
while (nat_isspace(cb))
|
||||||
cb = b[++bi];
|
cb = to_int(b[++bi]);
|
||||||
|
|
||||||
/* process run of digits */
|
/* process run of digits */
|
||||||
if (nat_isdigit(ca) && nat_isdigit(cb)) {
|
if (nat_isdigit(ca) && nat_isdigit(cb)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue