git-pack-objects: add "--stdout" flag to write the pack file to stdout
[gitweb.git] / count-delta.c
index dd81e9296591d463a7b06570bc24dc201a836b2e..c7f3767880aa0e1e5f3922f96176e4dfad3fa296 100644 (file)
@@ -6,7 +6,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
-#include "delta.h"
 #include "count-delta.h"
 
 static unsigned long get_hdr_size(const unsigned char **datap)
@@ -30,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;
@@ -47,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;
@@ -84,10 +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.
         */
-       return (src_size - copied_from_source) + added_literal;
+       *src_copied = copied_from_source;
+       *literal_added = added_literal;
+       return 0;
 }