Index: firmware/common/strnatcmp.c =================================================================== --- firmware/common/strnatcmp.c (revision 20339) +++ firmware/common/strnatcmp.c (working copy) @@ -109,27 +109,66 @@ int ai, bi; int ca, cb; int result; + int lza, lzb, lzbias; assert(a && b); ai = bi = 0; + lzbias = 0; while (1) { + + /* count leading zeros */ + lza = lzb = 0; + ca = to_int(a[ai]); cb = to_int(b[bi]); /* skip over leading spaces or zeros */ while (nat_isspace(ca)) + { + if ('0' == ca) + lza++; + else + lza = 0; + ca = to_int(a[++ai]); + } + + /* have zero */ + if (lza && !nat_isdigit(ca)) + { + ca = to_int(a[--ai]); + } while (nat_isspace(cb)) + { + if ('0' == cb) + lzb++; + else + lzb = 0; + cb = to_int(b[++bi]); + } + + /* have zero */ + if (lzb && !nat_isdigit(cb)) + { + cb = to_int(b[--bi]); + } /* process run of digits */ if (nat_isdigit(ca) && nat_isdigit(cb)) { if ((result = compare_right(a+ai, b+bi)) != 0) return result; } + + if (lza != lzb && 0 == lzbias) + lzbias = lzb - lza; if (!ca && !cb) { + + if (0 != lzbias) + return lzbias; + /* The strings compare the same. Call str[case]cmp() to ensure consistent results. */ if(fold_case)