]> git.donarmstrong.com Git - samtools.git/commitdiff
updated the alphanum comparison function
authorHeng Li <lh3@me.com>
Sun, 18 Mar 2012 18:31:45 +0000 (14:31 -0400)
committerHeng Li <lh3@me.com>
Sun, 18 Mar 2012 18:31:45 +0000 (14:31 -0400)
bam_sort.c

index e3a6c472cb1b50ddb0eab7273433a438c6dabede..2c2b83d20d41047d3680a243762d0f1b95a0509d 100644 (file)
 
 static int g_is_by_qname = 0;
 
-static inline int strnum_cmp(const char *a, const char *b)
+static int strnum_cmp(const char *_a, const char *_b)
 {
-       char *pa, *pb;
-       pa = (char*)a; pb = (char*)b;
+       const unsigned char *a = (const unsigned char*)_a, *b = (const unsigned char*)_b;
+       const unsigned char *pa = a, *pb = b;
        while (*pa && *pb) {
                if (isdigit(*pa) && isdigit(*pb)) {
-                       long ai, bi;
-                       ai = strtol(pa, &pa, 10);
-                       bi = strtol(pb, &pb, 10);
-                       if (ai != bi) return ai<bi? -1 : ai>bi? 1 : 0;
+                       while (*pa == '0') ++pa;
+                       while (*pb == '0') ++pb;
+                       while (isdigit(*pa) && isdigit(*pb) && *pa == *pb) ++pa, ++pb;
+                       if (isdigit(*pa) && isdigit(*pb)) {
+                               int i = 0;
+                               while (isdigit(pa[i]) && isdigit(pb[i])) ++i;
+                               return isdigit(pa[i])? 1 : isdigit(pb[i])? -1 : (int)*pa - (int)*pb;
+                       } else if (isdigit(*pa)) return 1;
+                       else if (isdigit(*pb)) return -1;
+                       else if (pa - a != pb - b) return pa - a < pb - b? 1 : -1;
                } else {
-                       if (*pa != *pb) break;
+                       if (*pa != *pb) return (int)*pa - (int)*pb;
                        ++pa; ++pb;
                }
        }
-       if (*pa == *pb)
-               return (pa-a) < (pb-b)? -1 : (pa-a) > (pb-b)? 1 : 0;
-       return *pa<*pb? -1 : *pa>*pb? 1 : 0;
+       return *pa? 1 : *pb? -1 : 0;
 }
 
 #define HEAP_EMPTY 0xffffffffffffffffull