X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=count-delta.c;h=058a2aadb1475801ea7573837867fa79bf1766c1;hb=567ffeb7722eefab3991cb894c96548b92b57cc2;hp=3ee3a0ccf1b92f3f8838ca2e728bde9f60d1b8e8;hpb=b5233a61955772b4430abb0eb1d03b7fbdd33e6a;p=git.git diff --git a/count-delta.c b/count-delta.c index 3ee3a0cc..058a2aad 100644 --- a/count-delta.c +++ b/count-delta.c @@ -3,74 +3,11 @@ * The delta-parsing part is almost straight copy of patch-delta.c * which is (C) 2005 Nicolas Pitre . */ -#include "cache.h" -#include "delta.h" -#include "count-delta.h" #include #include #include - -struct span { - struct span *next; - unsigned long ofs; - unsigned long end; -}; - -static void touch_range(struct span **span, - unsigned long ofs, unsigned long end) -{ - struct span *e = *span; - struct span *p = NULL; - - while (e && e->ofs <= ofs) { - again: - if (ofs < e->end) { - while (e->end < end) { - if (e->next && e->next->ofs <= end) { - e->end = e->next->ofs; - e = e->next; - } - else { - e->end = end; - return; - } - } - return; - } - p = e; - e = e->next; - } - if (e && e->ofs <= end) { - e->ofs = ofs; - goto again; - } - else { - e = xmalloc(sizeof(*e)); - e->ofs = ofs; - e->end = end; - if (p) { - e->next = p->next; - p->next = e; - } - else { - e->next = *span; - *span = e; - } - } -} - -static unsigned long count_range(struct span *s) -{ - struct span *t; - unsigned long sz = 0; - while (s) { - t = s; - sz += s->end - s->ofs; - s = s->next; - free(t); - } - return sz; -} +#include "delta.h" +#include "count-delta.h" /* * NOTE. We do not _interpret_ delta fully. As an approximation, we @@ -84,11 +21,10 @@ static unsigned long count_range(struct span *s) int count_delta(void *delta_buf, unsigned long delta_size, unsigned long *src_copied, unsigned long *literal_added) { - unsigned long added_literal; + unsigned long copied_from_source, added_literal; const unsigned char *data, *top; unsigned char cmd; unsigned long src_size, dst_size, out; - struct span *span = NULL; if (delta_size < DELTA_SIZE_MIN) return -1; @@ -99,7 +35,7 @@ int count_delta(void *delta_buf, unsigned long delta_size, src_size = get_delta_hdr_size(&data); dst_size = get_delta_hdr_size(&data); - added_literal = out = 0; + added_literal = copied_from_source = out = 0; while (data < top) { cmd = *data++; if (cmd & 0x80) { @@ -113,7 +49,7 @@ int count_delta(void *delta_buf, unsigned long delta_size, if (cmd & 0x40) cp_size |= (*data++ << 16); if (cp_size == 0) cp_size = 0x10000; - touch_range(&span, cp_off, cp_off+cp_size); + copied_from_source += cp_size; out += cp_size; } else { /* write literal into dst */ @@ -123,8 +59,6 @@ int count_delta(void *delta_buf, unsigned long delta_size, } } - *src_copied = count_range(span); - /* sanity check */ if (data != top || out != dst_size) return -1; @@ -132,6 +66,7 @@ int count_delta(void *delta_buf, unsigned long delta_size, /* delete size is what was _not_ copied from source. * edit size is that and literal additions. */ + *src_copied = copied_from_source; *literal_added = added_literal; return 0; }