[PATCH] denser delta header encoding
authorNicolas Pitre <nico@cam.org>
Wed, 29 Jun 2005 04:27:45 +0000 (00:27 -0400)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 29 Jun 2005 04:38:47 +0000 (21:38 -0700)
Since the delta data format is not tied to any actual git object
anymore, now is the time to add a small improvement to the delta data
header as it is been done for packed object header.  This patch allows
for reducing the delta header of about 2 bytes and makes for simpler
code.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
count-delta.c
diff-delta.c
patch-delta.c

index c7f3767880aa0e1e5f3922f96176e4dfad3fa296..8901034188c4d17be6676dd1fd532a23384cb5cb 100644 (file)
 static unsigned long get_hdr_size(const unsigned char **datap)
 {
        const unsigned char *data = *datap;
-       unsigned long size;
-       unsigned char cmd;
-       int i;
-       size = i = 0;
-       cmd = *data++;
-       while (cmd) {
-               if (cmd & 1)
-                       size |= *data++ << i;
-               i += 8;
-               cmd >>= 1;
+       unsigned char cmd = *data++;
+       unsigned long size = cmd & ~0x80;
+       int i = 7;
+       while (cmd & 0x80) {
+               cmd = *data++;
+               size |= (cmd & ~0x80) << i;
+               i += 7;
        }
        *datap = data;
        return size;
@@ -47,8 +44,8 @@ int count_delta(void *delta_buf, unsigned long delta_size,
        unsigned char cmd;
        unsigned long src_size, dst_size, out;
 
-       /* the smallest delta size possible is 6 bytes */
-       if (delta_size < 6)
+       /* the smallest delta size possible is 4 bytes */
+       if (delta_size < 4)
                return -1;
 
        data = delta_buf;
index fd9b37f4910e95faac206339e23b05312ba3a52d..67f60814b714493568add5a92df4a8acf8085a14 100644 (file)
@@ -228,28 +228,22 @@ void *diff_delta(void *from_buf, unsigned long from_size,
        top = to_buf + to_size;
 
        /* store reference buffer size */
-       orig = out + outpos++;
-       *orig = i = 0;
-       do {
-               if (from_size & 0xff) {
-                       *orig |= (1 << i);
-                       out[outpos++] = from_size;
-               }
-               i++;
-               from_size >>= 8;
-       } while (from_size);
+       out[outpos++] = from_size;
+       from_size >>= 7;
+       while (from_size) {
+               out[outpos - 1] |= 0x80;
+               out[outpos++] = from_size;
+               from_size >>= 7;
+       }
 
        /* store target buffer size */
-       orig = out + outpos++;
-       *orig = i = 0;
-       do {
-               if (to_size & 0xff) {
-                       *orig |= (1 << i);
-                       out[outpos++] = to_size;
-               }
-               i++;
-               to_size >>= 8;
-       } while (to_size);
+       out[outpos++] = to_size;
+       to_size >>= 7;
+       while (to_size) {
+               out[outpos - 1] |= 0x80;
+               out[outpos++] = to_size;
+               to_size >>= 7;
+       }
 
        inscnt = 0;
        moff = 0;
index a8d75ee1c8eab9cddcebd1e3ef5c6425e4181dbf..b68dd13c63be4a3834354916398b1ab4827334cc 100644 (file)
@@ -22,33 +22,33 @@ void *patch_delta(void *src_buf, unsigned long src_size,
        unsigned long size;
        int i;
 
-       /* the smallest delta size possible is 6 bytes */
-       if (delta_size < 6)
+       /* the smallest delta size possible is 4 bytes */
+       if (delta_size < 4)
                return NULL;
 
        data = delta_buf;
        top = delta_buf + delta_size;
 
        /* make sure the orig file size matches what we expect */
-       size = i = 0;
        cmd = *data++;
-       while (cmd) {
-               if (cmd & 1)
-                       size |= *data++ << i;
-               i += 8;
-               cmd >>= 1;
+       size = cmd & ~0x80;
+       i = 7;
+       while (cmd & 0x80) {
+               cmd = *data++;
+               size |= (cmd & ~0x80) << i;
+               i += 7;
        }
        if (size != src_size)
                return NULL;
 
        /* now the result size */
-       size = i = 0;
        cmd = *data++;
-       while (cmd) {
-               if (cmd & 1)
-                       size |= *data++ << i;
-               i += 8;
-               cmd >>= 1;
+       size = cmd & ~0x80;
+       i = 7;
+       while (cmd & 0x80) {
+               cmd = *data++;
+               size |= (cmd & ~0x80) << i;
+               i += 7;
        }
        dst_buf = malloc(size);
        if (!dst_buf)