comparison mercurial/mpatch.c @ 2078:441ea218414e

Fill in the uncompressed size during revlog.addgroup This uses code from Matt to calculate the size change that would result from applying a delta to keep an accurate running total of the text size during revlog.addgroup
author mason@suse.com
date Tue, 04 Apr 2006 16:38:44 -0400
parents 10606ee61107
children 345107e167a0
comparison
equal deleted inserted replaced
2077:4d0700ae0991 2078:441ea218414e
352 cleanup: 352 cleanup:
353 lfree(patch); 353 lfree(patch);
354 return result; 354 return result;
355 } 355 }
356 356
357 /* calculate size of a patched file directly */
358 static PyObject *
359 patchedsize(PyObject *self, PyObject *args)
360 {
361 long orig, start, end, len, outlen = 0, last = 0;
362 int patchlen;
363 char *bin, *binend;
364 char decode[12]; /* for dealing with alignment issues */
365
366 if (!PyArg_ParseTuple(args, "ls#", &orig, &bin, &patchlen))
367 return NULL;
368
369 binend = bin + patchlen;
370
371 while (bin < binend) {
372 memcpy(decode, bin, 12);
373 start = ntohl(*(uint32_t *)decode);
374 end = ntohl(*(uint32_t *)(decode + 4));
375 len = ntohl(*(uint32_t *)(decode + 8));
376 bin += 12 + len;
377 outlen += start - last;
378 last = end;
379 outlen += len;
380 }
381
382 if (bin != binend) {
383 if (!PyErr_Occurred())
384 PyErr_SetString(mpatch_Error, "patch cannot be decoded");
385 return NULL;
386 }
387
388 outlen += orig - last;
389 return Py_BuildValue("l", outlen);
390 }
391
357 static PyMethodDef methods[] = { 392 static PyMethodDef methods[] = {
358 {"patches", patches, METH_VARARGS, "apply a series of patches\n"}, 393 {"patches", patches, METH_VARARGS, "apply a series of patches\n"},
394 {"patchedsize", patchedsize, METH_VARARGS, "calculed patched size\n"},
359 {NULL, NULL} 395 {NULL, NULL}
360 }; 396 };
361 397
362 PyMODINIT_FUNC 398 PyMODINIT_FUNC
363 initmpatch(void) 399 initmpatch(void)