Memmove is 11 bytes shorter than the unrolled loop, and Manuel Nova pointed
authorRob Landley <rob@landley.net>
Tue, 16 Jan 2007 19:25:12 +0000 (14:25 -0500)
committerRob Landley <rob@landley.net>
Tue, 16 Jan 2007 19:25:12 +0000 (14:25 -0500)
out how to turn an if/else into a multiply and subtract (saving 2 bytes).

lib/bunzip.c

index fbc6c8e..5cdc452 100644 (file)
@@ -182,7 +182,7 @@ int read_bunzip_data(bunzip_data *bd)
 
                // Decode MTF to get the next selector
                uc = mtfSymbol[j];
-               for (k=j; k; k--) mtfSymbol[k] = mtfSymbol[k-1];
+               memmove(mtfSymbol+1, mtfSymbol, j);
                mtfSymbol[0] = selectors[i] = uc;
        }
        // Read the huffman coding tables for each group, which code for symTotal
@@ -197,9 +197,8 @@ int read_bunzip_data(bunzip_data *bd)
                for (i = 0; i < symCount; i++) {
                        for(;;) {
                                if (MAX_HUFCODE_BITS < (unsigned)t-1) return RETVAL_DATA_ERROR;
-                               if(!get_bits(bd, 1)) break;
-                               if(!get_bits(bd, 1)) t++;
-                               else t--;
+                               if(!get_bits(bd, 1)) break;    // Stop yet?
+                               t += (1 - 2*get_bits(bd, 1));  // bit ? t-- : t++
                        }
                        length[i] = t;
                }