| 317 | #define MAX_OP_SIZE (5 + 5 + 1 + RABIN_WINDOW + 7) |
| 318 | |
| 319 | void * |
| 320 | create_delta(const struct delta_index *index, |
| 321 | const void *trg_buf, unsigned long trg_size, |
| 322 | unsigned long *delta_size, unsigned long max_size) |
| 323 | { |
| 324 | unsigned int i, val; |
| 325 | off_t outpos, moff; |
| 326 | size_t l, outsize, msize; |
| 327 | int inscnt; |
| 328 | const unsigned char *ref_data, *ref_top, *data, *top; |
| 329 | unsigned char *out; |
| 330 | |
| 331 | *delta_size = 0; |
| 332 | |
| 333 | if (!trg_buf || !trg_size) |
| 334 | return NULL; |
| 335 | |
| 336 | outpos = 0; |
| 337 | outsize = 8192; |
| 338 | if (max_size && outsize >= max_size) |
| 339 | outsize = max_size + MAX_OP_SIZE + 1; |
| 340 | out = malloc(outsize); |
| 341 | if (!out) |
| 342 | return NULL; |
| 343 | |
| 344 | /* store reference buffer size */ |
| 345 | l = index->src_size; |
| 346 | while (l >= 0x80) { |
| 347 | out[outpos++] = l | 0x80; |
| 348 | l >>= 7; |
| 349 | } |
| 350 | out[outpos++] = l; |
| 351 | |
| 352 | /* store target buffer size */ |
| 353 | l = trg_size; |
| 354 | while (l >= 0x80) { |
| 355 | out[outpos++] = l | 0x80; |
| 356 | l >>= 7; |
| 357 | } |
| 358 | out[outpos++] = l; |
| 359 | |
| 360 | ref_data = index->src_buf; |
| 361 | ref_top = ref_data + index->src_size; |
| 362 | data = trg_buf; |
| 363 | top = (const unsigned char *) trg_buf + trg_size; |
| 364 | |
| 365 | outpos++; |
| 366 | val = 0; |
| 367 | for (i = 0; i < RABIN_WINDOW && data < top; i++, data++) { |
| 368 | out[outpos++] = *data; |
| 369 | val = ((val << 8) | *data) ^ T[val >> RABIN_SHIFT]; |
| 370 | } |
| 371 | inscnt = i; |
| 372 | |
| 373 | moff = 0; |
| 374 | msize = 0; |
| 375 | while (data < top) { |
| 376 | if (msize < 4096) { |
no outgoing calls
no test coverage detected