From 355e76a4a3c5e49ae15a642806457bce10fe2ef4 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 3 Jun 2005 01:36:03 -0700 Subject: [PATCH] Tweak count-delta interface Make it return copied source and insertion separately, so that later implementation of heuristics can use them more flexibly. This does not change the heuristics implemented in diffcore-rename nor diffcore-break in any way. Signed-off-by: Junio C Hamano Signed-off-by: Linus Torvalds --- count-delta.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'count-delta.c') diff --git a/count-delta.c b/count-delta.c index e10c832a7..c7f376788 100644 --- a/count-delta.c +++ b/count-delta.c @@ -29,15 +29,18 @@ static unsigned long get_hdr_size(const unsigned char **datap) /* * NOTE. We do not _interpret_ delta fully. As an approximation, we * just count the number of bytes that are copied from the source, and - * the number of literal data bytes that are inserted. Number of - * bytes that are _not_ copied from the source is deletion, and number - * of inserted literal bytes are addition, so sum of them is what we - * return. xdelta can express an edit that copies data inside of the - * destination which originally came from the source. We do not count - * that in the following routine, so we are undercounting the source - * material that remains in the final output that way. + * the number of literal data bytes that are inserted. + * + * Number of bytes that are _not_ copied from the source is deletion, + * and number of inserted literal bytes are addition, so sum of them + * is the extent of damage. xdelta can express an edit that copies + * data inside of the destination which originally came from the + * source. We do not count that in the following routine, so we are + * undercounting the source material that remains in the final output + * that way. */ -unsigned long count_delta(void *delta_buf, unsigned long delta_size) +int count_delta(void *delta_buf, unsigned long delta_size, + unsigned long *src_copied, unsigned long *literal_added) { unsigned long copied_from_source, added_literal; const unsigned char *data, *top; @@ -46,7 +49,7 @@ unsigned long count_delta(void *delta_buf, unsigned long delta_size) /* the smallest delta size possible is 6 bytes */ if (delta_size < 6) - return UINT_MAX; + return -1; data = delta_buf; top = delta_buf + delta_size; @@ -83,13 +86,12 @@ unsigned long count_delta(void *delta_buf, unsigned long delta_size) /* sanity check */ if (data != top || out != dst_size) - return UINT_MAX; + return -1; /* delete size is what was _not_ copied from source. * edit size is that and literal additions. */ - if (src_size + added_literal < copied_from_source) - /* we ended up overcounting and underflowed */ - return 0; - return (src_size - copied_from_source) + added_literal; + *src_copied = copied_from_source; + *literal_added = added_literal; + return 0; } -- cgit v1.2.1