Skip to content

Commit

Permalink
[PATCH] denser delta header encoding
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Nicolas Pitre authored and Linus Torvalds committed Jun 29, 2005
1 parent 9d5ab96 commit 69a2d42
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 46 deletions.
21 changes: 9 additions & 12 deletions count-delta.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,13 @@
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;
Expand All @@ -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;
Expand Down
34 changes: 14 additions & 20 deletions diff-delta.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
28 changes: 14 additions & 14 deletions patch-delta.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 69a2d42

Please sign in to comment.