bc: optimize bc_parse_pushIndex()
authorDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Dec 2018 15:44:34 +0000 (16:44 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Wed, 12 Dec 2018 15:44:34 +0000 (16:44 +0100)
function                                             old     new   delta
bc_parse_pushIndex                                    80      68     -12

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

index 73c801c4417e8aaf6f1d5b2b07d1f911f073f794..dc8e5c7612c0db8a43e4e32ef2d3c4d185f8e15e 100644 (file)
@@ -3460,16 +3460,23 @@ static void bc_parse_pushName(BcParse *p, char *name)
 
 static void bc_parse_pushIndex(BcParse *p, size_t idx)
 {
-       unsigned char amt, i, nums[sizeof(size_t)];
+       size_t mask;
+       unsigned amt;
 
-///oh boy
-       for (amt = 0; idx; ++amt) {
-               nums[amt] = (char) idx;
-               idx = (idx & ((unsigned long) ~(UCHAR_MAX))) >> sizeof(char) * CHAR_BIT;
-       }
+       mask = ((size_t)0xff) << (sizeof(idx) * 8 - 8);
+       amt = sizeof(idx);
+       do {
+               if (idx & mask) break;
+               mask >>= 8;
+               amt--;
+       } while (amt != 0);
 
        bc_parse_push(p, amt);
-       for (i = 0; i < amt; ++i) bc_parse_push(p, nums[i]);
+
+       while (idx != 0) {
+               bc_parse_push(p, (unsigned char)idx);
+               idx >>= 8;
+       }
 }
 
 static void bc_parse_number(BcParse *p, BcInst *prev, size_t *nexs)