- if (haszero==1 && (*l=='0' || *r=='0')) {
- haszero=0;
- }
- if ((isdigit(*l) && isdigit(*r) ) && haszero) {
- size_t lenl=0, lenr=0;
- while (isdigit(l[lenl]) ) lenl++;
- while (isdigit(r[lenr]) ) lenr++;
- if (lenl==lenr) {
- return (*l - *r);
- } else {
- return (lenl - lenr);
- }
- } else {
- return (*l - *r);
+
+ if (l[dp]!='0' && r[dp]!='0') {
+ /* If we're not looking at a digit sequence that began
+ * with a zero, longest digit string is greater. */
+ for (j=i; isdigit(l[j]); j++)
+ if (!isdigit(r[j])) return 1;
+ if (isdigit(r[j])) return -1;
+ } else if (z && dp<i && (isdigit(l[i]) || isdigit(r[i]))) {
+ /* Otherwise, if common prefix of digit sequence is
+ * all zeros, digits order less than non-digits. */
+ return (unsigned char)(l[i]-'0') - (unsigned char)(r[i]-'0');