1/* 2 * Copyright (C) 2005 Junio C Hamano 3 * The delta-parsing part is almost straight copy of patch-delta.c 4 * which is (C) 2005 Nicolas Pitre <nico@cam.org>. 5 */ 6#include <stdlib.h> 7#include <string.h> 8#include <limits.h> 9#include"delta.h" 10#include"count-delta.h" 11 12/* 13 * NOTE. We do not _interpret_ delta fully. As an approximation, we 14 * just count the number of bytes that are copied from the source, and 15 * the number of literal data bytes that are inserted. 16 * 17 * Number of bytes that are _not_ copied from the source is deletion, 18 * and number of inserted literal bytes are addition, so sum of them 19 * is the extent of damage. 20 */ 21intcount_delta(void*delta_buf,unsigned long delta_size, 22unsigned long*src_copied,unsigned long*literal_added) 23{ 24unsigned long copied_from_source, added_literal; 25const unsigned char*data, *top; 26unsigned char cmd; 27unsigned long src_size, dst_size, out; 28 29if(delta_size < DELTA_SIZE_MIN) 30return-1; 31 32 data = delta_buf; 33 top = delta_buf + delta_size; 34 35 src_size =get_delta_hdr_size(&data); 36 dst_size =get_delta_hdr_size(&data); 37 38 added_literal = copied_from_source = out =0; 39while(data < top) { 40 cmd = *data++; 41if(cmd &0x80) { 42unsigned long cp_off =0, cp_size =0; 43if(cmd &0x01) cp_off = *data++; 44if(cmd &0x02) cp_off |= (*data++ <<8); 45if(cmd &0x04) cp_off |= (*data++ <<16); 46if(cmd &0x08) cp_off |= (*data++ <<24); 47if(cmd &0x10) cp_size = *data++; 48if(cmd &0x20) cp_size |= (*data++ <<8); 49if(cmd &0x40) cp_size |= (*data++ <<16); 50if(cp_size ==0) cp_size =0x10000; 51 52 copied_from_source += cp_size; 53 out += cp_size; 54}else{ 55/* write literal into dst */ 56 added_literal += cmd; 57 out += cmd; 58 data += cmd; 59} 60} 61 62/* sanity check */ 63if(data != top || out != dst_size) 64return-1; 65 66/* delete size is what was _not_ copied from source. 67 * edit size is that and literal additions. 68 */ 69*src_copied = copied_from_source; 70*literal_added = added_literal; 71return0; 72}