Skip to content

Commit 2cff8b4

Browse files
committed
Add function to decode Delta streams.
1 parent 778ee2c commit 2cff8b4

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ def build_extension(self, ext):
157157
'src/sdk/C/Bra86.c',
158158
'src/sdk/C/BraIA64.c',
159159
'src/sdk/C/CpuArch.c',
160+
'src/sdk/C/Delta.c',
160161
'src/sdk/C/LzFind.c',
161162
'src/sdk/C/LzmaDec.c',
162163
'src/sdk/C/LzmaEnc.c',

src/pylzma/pylzma.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "../sdk/C/Aes.h"
3131
#include "../sdk/C/Bra.h"
3232
#include "../sdk/C/Bcj2.h"
33+
#include "../sdk/C/Delta.h"
3334

3435
#include "pylzma.h"
3536
#include "pylzma_compress.h"
@@ -269,6 +270,46 @@ pylzma_bcj2_decode(PyObject *self, PyObject *args)
269270
return NULL;
270271
}
271272

273+
const char
274+
doc_delta_decode[] =
275+
"delta_decode(data, delta) -- Decode Delta streams.";
276+
277+
static PyObject *
278+
pylzma_delta_decode(PyObject *self, PyObject *args)
279+
{
280+
char *data;
281+
PARSE_LENGTH_TYPE length;
282+
unsigned int delta;
283+
Byte state[DELTA_STATE_SIZE];
284+
Byte *tmp;
285+
PyObject *result;
286+
287+
if (!PyArg_ParseTuple(args, "s#I", &data, &length, &delta)) {
288+
return NULL;
289+
}
290+
291+
if (!delta) {
292+
PyErr_SetString(PyExc_TypeError, "delta must be non-zero");
293+
return NULL;
294+
}
295+
296+
if (!length) {
297+
return PyBytes_FromString("");
298+
}
299+
300+
result = PyBytes_FromStringAndSize(data, length);
301+
if (!result) {
302+
return NULL;
303+
}
304+
305+
Delta_Init(state);
306+
tmp = (Byte *) PyBytes_AS_STRING(result);
307+
Py_BEGIN_ALLOW_THREADS
308+
Delta_Decode(state, delta, tmp, length);
309+
Py_END_ALLOW_THREADS
310+
return result;
311+
}
312+
272313
PyMethodDef
273314
methods[] = {
274315
// exported functions
@@ -288,6 +329,8 @@ methods[] = {
288329
{"bcj_sparc_convert", (PyCFunction)pylzma_bcj_sparc_convert, METH_VARARGS, (char *)&doc_bcj_sparc_convert},
289330
{"bcj_ia64_convert", (PyCFunction)pylzma_bcj_ia64_convert, METH_VARARGS, (char *)&doc_bcj_ia64_convert},
290331
{"bcj2_decode", (PyCFunction)pylzma_bcj2_decode, METH_VARARGS, (char *)&doc_bcj2_decode},
332+
// Delta
333+
{"delta_decode", (PyCFunction)pylzma_delta_decode, METH_VARARGS, (char *)&doc_delta_decode},
291334
{NULL, NULL},
292335
};
293336

0 commit comments

Comments
 (0)