bc: code shrink in bc_num_cmp()
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Dec 2018 10:51:32 +0000 (11:51 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Dec 2018 10:51:32 +0000 (11:51 +0100)
function                                             old     new   delta
bc_num_cmp                                           275     231     -44

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/bc.c

index 8426998d076207528e2748245614f82875b2ca11..8f326d20e7db211308a068ad0603f950884206f0 100644 (file)
@@ -1601,46 +1601,44 @@ static ssize_t bc_num_cmp(BcNum *a, BcNum *b)
 {
        size_t i, min, a_int, b_int, diff;
        BcDig *max_num, *min_num;
-       bool a_max, neg = false;
+       bool a_max, neg;
        ssize_t cmp;
 
        if (a == b) return 0;
        if (a->len == 0) return BC_NUM_NEG(!!b->len, !b->neg);
        if (b->len == 0) return BC_NUM_NEG(1, a->neg);
-       if (a->neg) {
-               if (b->neg)
-                       neg = true;
-               else
-                       return -1;
-       }
-       else if (b->neg)
-               return 1;
+
+       if (a->neg != b->neg) // signs of a and b differ
+               // +a,-b = a>b = 1 or -a,+b = a<b = -1
+               return (int)b->neg - (int)a->neg;
+       neg = a->neg; // 1 if both negative, 0 if both positive
 
        a_int = BC_NUM_INT(a);
        b_int = BC_NUM_INT(b);
        a_int -= b_int;
-       a_max = (a->rdx > b->rdx);
 
        if (a_int != 0) return (ssize_t) a_int;
 
+       a_max = (a->rdx > b->rdx);
        if (a_max) {
                min = b->rdx;
                diff = a->rdx - b->rdx;
                max_num = a->num + diff;
                min_num = b->num;
-       }
-       else {
+               // neg = (a_max == neg); - NOP (maps 1->1 and 0->0)
+       else {
                min = a->rdx;
                diff = b->rdx - a->rdx;
                max_num = b->num + diff;
                min_num = a->num;
+               neg = !neg; // same as "neg = (a_max == neg)"
        }
 
        cmp = bc_num_compare(max_num, min_num, b_int + min);
-       if (cmp != 0) return BC_NUM_NEG(cmp, (!a_max) != neg);
+       if (cmp != 0) return BC_NUM_NEG(cmp, neg);
 
        for (max_num -= diff, i = diff - 1; i < diff; --i) {
-               if (max_num[i]) return BC_NUM_NEG(1, (!a_max) != neg);
+               if (max_num[i]) return BC_NUM_NEG(1, neg);
        }
 
        return 0;