Skip to content

Commit 0f98ce0

Browse files
committed
Add function to perform delta encoding.
1 parent 8362838 commit 0f98ce0

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/pylzma/pylzma.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,46 @@ pylzma_delta_decode(PyObject *self, PyObject *args)
310310
return result;
311311
}
312312

313+
const char
314+
doc_delta_encode[] =
315+
"delta_encode(data, delta) -- Encode Delta streams.";
316+
317+
static PyObject *
318+
pylzma_delta_encode(PyObject *self, PyObject *args)
319+
{
320+
char *data;
321+
PARSE_LENGTH_TYPE length;
322+
unsigned int delta;
323+
Byte state[DELTA_STATE_SIZE];
324+
Byte *tmp;
325+
PyObject *result;
326+
327+
if (!PyArg_ParseTuple(args, "s#I", &data, &length, &delta)) {
328+
return NULL;
329+
}
330+
331+
if (!delta) {
332+
PyErr_SetString(PyExc_TypeError, "delta must be non-zero");
333+
return NULL;
334+
}
335+
336+
if (!length) {
337+
return PyBytes_FromString("");
338+
}
339+
340+
result = PyBytes_FromStringAndSize(data, length);
341+
if (!result) {
342+
return NULL;
343+
}
344+
345+
Delta_Init(state);
346+
tmp = (Byte *) PyBytes_AS_STRING(result);
347+
Py_BEGIN_ALLOW_THREADS
348+
Delta_Encode(state, delta, tmp, length);
349+
Py_END_ALLOW_THREADS
350+
return result;
351+
}
352+
313353
PyMethodDef
314354
methods[] = {
315355
// exported functions
@@ -331,6 +371,7 @@ methods[] = {
331371
{"bcj2_decode", (PyCFunction)pylzma_bcj2_decode, METH_VARARGS, (char *)&doc_bcj2_decode},
332372
// Delta
333373
{"delta_decode", (PyCFunction)pylzma_delta_decode, METH_VARARGS, (char *)&doc_delta_decode},
374+
{"delta_encode", (PyCFunction)pylzma_delta_encode, METH_VARARGS, (char *)&doc_delta_encode},
334375
{NULL, NULL},
335376
};
336377

tests/test_pylzma.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,18 @@ def test_github_10(self):
245245
# prevent regression of github #10
246246
self.assertRaises(ValueError, pylzma.compress, bytes("foo", 'ascii'), dictionary=100)
247247

248+
def test_delta(self):
249+
for i in range(8, 18):
250+
size = 1 << i
251+
original = generate_random(size)
252+
delta = random.randint(1, 255)
253+
encoded = pylzma.delta_encode(original, delta)
254+
self.assertEqual(len(encoded), size)
255+
self.assertNotEqual(md5(original).hexdigest(), md5(encoded).hexdigest())
256+
result = pylzma.delta_decode(encoded, delta)
257+
self.assertEqual(len(result), size)
258+
self.assertEqual(md5(original).hexdigest(), md5(result).hexdigest())
259+
248260
def suite():
249261
suite = unittest.TestSuite()
250262

0 commit comments

Comments
 (0)