typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned short ushort;
+typedef long long int ll;
/* STRUCTURES */
return ret;
}
-static int digit_compare(const char *a, const char *b)
-{
- while (*a && *b && *a == *b)
- ++a, ++b;
-
- return *a - *b;
-}
-
/*
* We assume none of the strings are NULL.
*
*/
static int xstricmp(const char * const s1, const char * const s2)
{
- const char *c1 = s1, *c2 = s2, *m1, *m2;
- int count1 = 0, count2 = 0, bias;
- char sign[2] = {'+', '+'};
-
- while (ISBLANK(*c1))
- ++c1;
-
- while (ISBLANK(*c2))
- ++c2;
-
- if (*c1 == '-' || *c1 == '+') {
- if (*c1 == '-')
- sign[0] = '-';
- ++c1;
- }
-
- if (*c2 == '-' || *c2 == '+') {
- if (*c2 == '-')
- sign[1] = '-';
- ++c2;
- }
-
- if (xisdigit(*c1) && xisdigit(*c2)) {
- while (*c1 == '0')
- ++c1;
- m1 = c1;
+ char *p1, *p2;
- while (*c2 == '0')
- ++c2;
- m2 = c2;
+ ll v1 = strtoll(s1, &p1, 10);
+ ll v2 = strtoll(s2, &p2, 10);
- while (xisdigit(*c1)) {
- ++count1;
- ++c1;
- }
- while (ISBLANK(*c1))
- ++c1;
+ /* Check if at least 1 string is numeric */
+ if (s1 != p1 || s2 != p2) {
+ /* Handle both pure numeric */
+ if (s1 != p1 && s2 != p2) {
+ if (v2 > v1)
+ return -1;
- while (xisdigit(*c2)) {
- ++count2;
- ++c2;
+ if (v1 > v2)
+ return 1;
}
- while (ISBLANK(*c2))
- ++c2;
- if (*c1 && !*c2)
+ /* Only first string non-numeric */
+ if (s1 == p1)
return 1;
- if (!*c1 && *c2)
+ /* Only second string non-numeric */
+ if (s2 == p2)
return -1;
-
- if (!*c1 && !*c2) {
- if (sign[0] != sign[1])
- return ((sign[0] == '+') ? 1 : -1);
-
- if (count1 > count2)
- return 1;
-
- if (count1 < count2)
- return -1;
-
- bias = digit_compare(m1, m2);
- if (bias)
- return bias;
- }
}
+ /* Handle 1. all non-numeric and 2. both same numeric value cases */
return strcoll(s1, s2);
}