Mercurial > hg
diff mercurial/mpatch.c @ 29693:b9b9f9a92481
mpatch: split mpatch into two files
author | Maciej Fijalkowski <fijall@gmail.com> |
---|---|
date | Mon, 18 Jul 2016 19:02:30 +0200 |
parents | 6b3a8d034b69 |
children | 55dd12204b8e |
line wrap: on
line diff
--- a/mercurial/mpatch.c Mon Jul 18 16:25:14 2016 +0200 +++ b/mercurial/mpatch.c Mon Jul 18 19:02:30 2016 +0200 @@ -41,7 +41,7 @@ struct mpatch_frag *base, *head, *tail; }; -static struct mpatch_flist *lalloc(ssize_t size) +struct mpatch_flist *lalloc(ssize_t size) { struct mpatch_flist *a = NULL; @@ -63,7 +63,7 @@ return NULL; } -static void mpatch_lfree(struct mpatch_flist *a) +void mpatch_lfree(struct mpatch_flist *a) { if (a) { free(a->base); @@ -202,7 +202,7 @@ } /* decode a binary patch into a hunk list */ -static struct mpatch_flist *mpatch_decode(const char *bin, ssize_t len) +struct mpatch_flist *mpatch_decode(const char *bin, ssize_t len) { struct mpatch_flist *l; struct mpatch_frag *lt; @@ -238,7 +238,7 @@ } /* calculate the size of resultant text */ -static ssize_t mpatch_calcsize(ssize_t len, struct mpatch_flist *l) +ssize_t mpatch_calcsize(ssize_t len, struct mpatch_flist *l) { ssize_t outlen = 0, last = 0; struct mpatch_frag *f = l->head; @@ -260,7 +260,7 @@ return outlen; } -static int mpatch_apply(char *buf, const char *orig, ssize_t len, +int mpatch_apply(char *buf, const char *orig, ssize_t len, struct mpatch_flist *l) { struct mpatch_frag *f = l->head; @@ -286,7 +286,7 @@ } /* recursively generate a patch of all bins between start and end */ -static struct mpatch_flist *mpatch_fold(PyObject *bins, ssize_t start, +struct mpatch_flist *mpatch_fold(PyObject *bins, ssize_t start, ssize_t end) { ssize_t len, blen; @@ -308,121 +308,3 @@ mpatch_fold(bins, start + len, end)); } -static PyObject * -patches(PyObject *self, PyObject *args) -{ - PyObject *text, *bins, *result; - struct mpatch_flist *patch; - const char *in; - char *out; - Py_ssize_t len, outlen, inlen; - - if (!PyArg_ParseTuple(args, "OO:mpatch", &text, &bins)) - return NULL; - - len = PyList_Size(bins); - if (!len) { - /* nothing to do */ - Py_INCREF(text); - return text; - } - - if (PyObject_AsCharBuffer(text, &in, &inlen)) - return NULL; - - patch = mpatch_fold(bins, 0, len); - if (!patch) - return NULL; - - outlen = mpatch_calcsize(inlen, patch); - if (outlen < 0) { - result = NULL; - goto cleanup; - } - result = PyBytes_FromStringAndSize(NULL, outlen); - if (!result) { - result = NULL; - goto cleanup; - } - out = PyBytes_AsString(result); - if (!mpatch_apply(out, in, inlen, patch)) { - Py_DECREF(result); - result = NULL; - } -cleanup: - mpatch_lfree(patch); - return result; -} - -/* calculate size of a patched file directly */ -static PyObject * -patchedsize(PyObject *self, PyObject *args) -{ - long orig, start, end, len, outlen = 0, last = 0, pos = 0; - Py_ssize_t patchlen; - char *bin; - - if (!PyArg_ParseTuple(args, "ls#", &orig, &bin, &patchlen)) - return NULL; - - while (pos >= 0 && pos < patchlen) { - start = getbe32(bin + pos); - end = getbe32(bin + pos + 4); - len = getbe32(bin + pos + 8); - if (start > end) - break; /* sanity check */ - pos += 12 + len; - outlen += start - last; - last = end; - outlen += len; - } - - if (pos != patchlen) { - if (!PyErr_Occurred()) - PyErr_SetString(mpatch_Error, "patch cannot be decoded"); - return NULL; - } - - outlen += orig - last; - return Py_BuildValue("l", outlen); -} - -static PyMethodDef methods[] = { - {"patches", patches, METH_VARARGS, "apply a series of patches\n"}, - {"patchedsize", patchedsize, METH_VARARGS, "calculed patched size\n"}, - {NULL, NULL} -}; - -#ifdef IS_PY3K -static struct PyModuleDef mpatch_module = { - PyModuleDef_HEAD_INIT, - "mpatch", - mpatch_doc, - -1, - methods -}; - -PyMODINIT_FUNC PyInit_mpatch(void) -{ - PyObject *m; - - m = PyModule_Create(&mpatch_module); - if (m == NULL) - return NULL; - - mpatch_Error = PyErr_NewException("mercurial.mpatch.mpatchError", - NULL, NULL); - Py_INCREF(mpatch_Error); - PyModule_AddObject(m, "mpatchError", mpatch_Error); - - return m; -} -#else -PyMODINIT_FUNC -initmpatch(void) -{ - Py_InitModule3("mpatch", methods, mpatch_doc); - mpatch_Error = PyErr_NewException("mercurial.mpatch.mpatchError", - NULL, NULL); -} -#endif