extern int am_server;
extern int do_progress;
extern int checksum_seed;
+extern int append_mode;
int updating_basis_file;
typedef unsigned short tag;
#define TABLESIZE (1<<16)
-#define NULL_TAG ((size_t)-1)
+#define NULL_TAG (-1)
static int false_alarms;
static int tag_hits;
struct target {
tag t;
- size_t i;
+ int32 i;
};
static struct target *targets;
-static size_t *tag_table;
+static int32 *tag_table;
#define gettag2(s1,s2) (((s1) + (s2)) & 0xFFFF)
#define gettag(sum) gettag2((sum)&0xFFFF,(sum)>>16)
static void build_hash_table(struct sum_struct *s)
{
- size_t i;
+ int32 i;
if (!tag_table)
- tag_table = new_array(size_t, TABLESIZE);
+ tag_table = new_array(int32, TABLESIZE);
targets = new_array(struct target, s->count);
if (!tag_table || !targets)
* have only literal data.
**/
static void matched(int f, struct sum_struct *s, struct map_struct *buf,
- OFF_T offset, int i)
+ OFF_T offset, int32 i)
{
int32 n = offset - last_match; /* max value: block_size (int32) */
int32 j;
sum_update(map_ptr(buf, last_match + j, n1), n1);
}
-
if (i >= 0)
last_match = offset + s->sums[i].len;
else
last_match = offset;
- if (buf && do_progress) {
+ if (buf && do_progress)
show_progress(last_match, buf->file_size);
-
- if (i == -1)
- end_progress(buf->file_size);
- }
}
struct map_struct *buf, OFF_T len)
{
OFF_T offset, end, backup;
- int32 k;
- size_t want_i;
+ int32 k, want_i;
char sum2[SUM_LENGTH];
uint32 s1, s2, sum;
int more;
do {
tag t = gettag2(s1,s2);
int done_csum2 = 0;
- size_t j = tag_table[t];
+ int32 j = tag_table[t];
if (verbose > 4)
rprintf(FINFO,"offset=%.0f sum=%08x\n",(double)offset,sum);
sum = (s1 & 0xffff) | (s2 << 16);
tag_hits++;
do {
- int32 l;
- size_t i = targets[j].i;
+ int32 l, i = targets[j].i;
if (sum != s->sums[i].sum1)
continue;
* the following want_i optimization. */
if (updating_basis_file) {
do {
- size_t i2 = targets[j].i;
+ int32 i2 = targets[j].i;
if (s->sums[i2].offset != offset)
continue;
if (i2 != i) {
sum_init(checksum_seed);
+ if (append_mode) {
+ OFF_T j = 0;
+ for (j = CHUNK_SIZE; j < s->flength; j += CHUNK_SIZE) {
+ if (buf && do_progress)
+ show_progress(last_match, buf->file_size);
+ sum_update(map_ptr(buf, last_match, CHUNK_SIZE),
+ CHUNK_SIZE);
+ last_match = j;
+ }
+ if (last_match < s->flength) {
+ int32 len = s->flength - last_match;
+ if (buf && do_progress)
+ show_progress(last_match, buf->file_size);
+ sum_update(map_ptr(buf, last_match, len), len);
+ last_match = s->flength;
+ }
+ s->count = 0;
+ }
+
if (len > 0 && s->count > 0) {
build_hash_table(s);
} else {
OFF_T j;
/* by doing this in pieces we avoid too many seeks */
- for (j = CHUNK_SIZE; j < len; j += CHUNK_SIZE)
+ for (j = last_match + CHUNK_SIZE; j < len; j += CHUNK_SIZE)
matched(f, s, buf, j, -2);
matched(f, s, buf, len, -1);
}