rprintf(FINFO,"match at %d last_match=%d j=%d len=%d n=%d\n",
(int)offset,(int)last_match,i,(int)s->sums[i].len,(int)n);
- send_token(f,i,buf,last_match,n,i==-1?0:s->sums[i].len);
+ send_token(f,i,buf,last_match,n,i<0?0:s->sums[i].len);
data_transfer += n;
if (n > 0)
} else {
--k;
}
-
+
+ /* By matching early we avoid re-reading the
+ data 3 times in the case where a token
+ match comes a long way after last
+ match. The 3 reads are caused by the
+ running match, the checksum update and the
+ literal send. */
+ if (offset-last_match >= CHUNK_SIZE+s->n &&
+ (end-offset > CHUNK_SIZE)) {
+ matched(f,s,buf,offset - s->n, -2);
+ }
} while (++offset < end);
matched(f,s,buf,len,-1);