X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/720b47f2611d277684b2ec35d11dc3feedb207fe..c6e7fcb42bc87660ece8d4dc9a1b10bd1fb7b0c5:/match.c diff --git a/match.c b/match.c index 1591fdc6..d7af159b 100644 --- a/match.c +++ b/match.c @@ -19,6 +19,8 @@ #include "rsync.h" +extern int csum_length; + extern int verbose; extern int am_server; @@ -83,25 +85,27 @@ static void build_hash_table(struct sum_struct *s) } - static off_t last_match; -static void matched(int f,struct sum_struct *s,char *buf,off_t len,int offset,int i) +static void matched(int f,struct sum_struct *s,struct map_struct *buf, + off_t len, + int offset,int i) { int n = offset - last_match; if (verbose > 2) if (i != -1) - fprintf(stderr,"match at %d last_match=%d j=%d len=%d n=%d\n", + fprintf(FERROR,"match at %d last_match=%d j=%d len=%d n=%d\n", (int)offset,(int)last_match,i,(int)s->sums[i].len,n); - if (n > 0) { - write_int(f,n); - write_buf(f,buf+last_match,n); - data_transfer += n; - } - write_int(f,-(i+1)); + send_token(f,i,buf,last_match,n); + + data_transfer += n; + + if (i != -1) + last_match = offset + s->sums[i].len; + if (i != -1) last_match = offset + s->sums[i].len; if (n > 0) @@ -109,36 +113,41 @@ static void matched(int f,struct sum_struct *s,char *buf,off_t len,int offset,in } -static void hash_search(int f,struct sum_struct *s,char *buf,off_t len) +static void hash_search(int f,struct sum_struct *s, + struct map_struct *buf,off_t len) { int offset,j,k; int end; char sum2[SUM_LENGTH]; - uint32 s1, s2, sum; + uint32 s1, s2, sum; + char *map; if (verbose > 2) - fprintf(stderr,"hash search b=%d len=%d\n",s->n,(int)len); + fprintf(FERROR,"hash search b=%d len=%d\n",s->n,(int)len); k = MIN(len, s->n); - sum = get_checksum1(buf, k); + + map = map_ptr(buf,0,k); + + sum = get_checksum1(map, k); s1 = sum & 0xFFFF; s2 = sum >> 16; if (verbose > 3) - fprintf(stderr, "sum=%.8x k=%d\n", sum, k); + fprintf(FERROR, "sum=%.8x k=%d\n", sum, k); offset = 0; end = len + 1 - s->sums[s->count-1].len; if (verbose > 3) - fprintf(stderr,"hash search s->n=%d len=%d count=%d\n", + fprintf(FERROR,"hash search s->n=%d len=%d count=%d\n", s->n,(int)len,s->count); do { tag t = gettag2(s1,s2); j = tag_table[t]; if (verbose > 4) - fprintf(stderr,"offset=%d sum=%08x\n", + fprintf(FERROR,"offset=%d sum=%08x\n", offset,sum); if (j != NULL_TAG) { @@ -151,18 +160,21 @@ static void hash_search(int f,struct sum_struct *s,char *buf,off_t len) if (sum == s->sums[i].sum1) { if (verbose > 3) - fprintf(stderr,"potential match at %d target=%d %d sum=%08x\n", + fprintf(FERROR,"potential match at %d target=%d %d sum=%08x\n", offset,j,i,sum); if (!done_csum2) { - get_checksum2(buf+offset,MIN(s->n,len-offset),sum2); + int l = MIN(s->n,len-offset); + map = map_ptr(buf,offset,l); + get_checksum2(map,l,sum2); done_csum2 = 1; } - if (memcmp(sum2,s->sums[i].sum2,SUM_LENGTH) == 0) { + if (memcmp(sum2,s->sums[i].sum2,csum_length) == 0) { matched(f,s,buf,len,offset,i); offset += s->sums[i].len - 1; k = MIN((len-offset), s->n); - sum = get_checksum1(buf+offset, k); + map = map_ptr(buf,offset,k); + sum = get_checksum1(map, k); s1 = sum & 0xFFFF; s2 = sum >> 16; ++matches; @@ -176,28 +188,25 @@ static void hash_search(int f,struct sum_struct *s,char *buf,off_t len) } /* Trim off the first byte from the checksum */ - s1 -= buf[offset]; - s2 -= k * buf[offset]; + map = map_ptr(buf,offset,k+1); + s1 -= map[0]; + s2 -= k * map[0]; /* Add on the next byte (if there is one) to the checksum */ if (k < (len-offset)) { - s1 += buf[offset+k]; + s1 += map[k]; s2 += s1; } else { --k; } - if (verbose > 3) - fprintf(stderr,"s2:s1 = %.4x%.4x sum=%.8x k=%d offset=%d took %x added %x\n", - s2&0xffff, s1&0xffff, get_checksum1(buf+offset+1,k), - k, (int)offset, buf[offset], buf[offset+k]); } while (++offset < end); matched(f,s,buf,len,len,-1); } -void match_sums(int f,struct sum_struct *s,char *buf,off_t len) +void match_sums(int f,struct sum_struct *s,struct map_struct *buf,off_t len) { last_match = 0; false_alarms = 0; @@ -209,12 +218,12 @@ void match_sums(int f,struct sum_struct *s,char *buf,off_t len) build_hash_table(s); if (verbose > 2) - fprintf(stderr,"built hash table\n"); + fprintf(FERROR,"built hash table\n"); hash_search(f,s,buf,len); if (verbose > 2) - fprintf(stderr,"done hash search\n"); + fprintf(FERROR,"done hash search\n"); } else { matched(f,s,buf,len,len,-1); } @@ -225,7 +234,7 @@ void match_sums(int f,struct sum_struct *s,char *buf,off_t len) } if (verbose > 2) - fprintf(stderr, "false_alarms=%d tag_hits=%d matches=%d\n", + fprintf(FERROR, "false_alarms=%d tag_hits=%d matches=%d\n", false_alarms, tag_hits, matches); total_tag_hits += tag_hits; @@ -239,7 +248,7 @@ void match_report(void) if (verbose <= 1) return; - fprintf(am_server?stderr:stdout, + fprintf(FINFO, "total: matches=%d tag_hits=%d false_alarms=%d data=%d\n", total_matches,total_tag_hits, total_false_alarms,total_data_transfer);