Skip to content

Commit a7316f7

Browse files
Export the new compress_fast method
1 parent fc0d81d commit a7316f7

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/python-lz4.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,40 @@ static inline uint32_t load_le32(const char *c) {
5555

5656
static const int hdr_size = sizeof(uint32_t);
5757

58+
59+
static PyObject *py_lz4_compress_fast(PyObject *self, PyObject *args) {
60+
PyObject *result;
61+
const char *source;
62+
int source_size;
63+
char *dest;
64+
int dest_size;
65+
int acceleration;
66+
67+
if (!PyArg_ParseTuple(args, "s#I", &source, &source_size, &acceleration))
68+
return NULL;
69+
70+
dest_size = hdr_size + LZ4_compressBound(source_size);
71+
result = PyBytes_FromStringAndSize(NULL, dest_size);
72+
if (result == NULL) {
73+
return NULL;
74+
}
75+
dest = PyBytes_AS_STRING(result);
76+
store_le32(dest, source_size);
77+
if (source_size > 0) {
78+
//int LZ4_compress_fast(const char* source, char* dest, int inputSize, int maxOutputSize, int acceleration)
79+
int osize = LZ4_compress_fast(source, dest + hdr_size, source_size, LZ4_compressBound(source_size), acceleration);
80+
int actual_size = hdr_size + osize;
81+
/* Resizes are expensive; tolerate some slop to avoid. */
82+
if (actual_size < (dest_size / 4) * 3) {
83+
_PyBytes_Resize(&result, actual_size);
84+
} else {
85+
Py_SIZE(result) = actual_size;
86+
}
87+
}
88+
return result;
89+
}
90+
91+
5892
static PyObject *compress_with(compressor compress, PyObject *self, PyObject *args) {
5993
PyObject *result;
6094
const char *source;
@@ -126,9 +160,11 @@ static PyObject *py_lz4_uncompress(PyObject *self, PyObject *args) {
126160
}
127161

128162
static PyMethodDef Lz4Methods[] = {
163+
{"LZ4_compress_fast", py_lz4_compress_fast, METH_VARARGS, COMPRESSFAST_DOCSTRING},
129164
{"LZ4_compress", py_lz4_compress, METH_VARARGS, COMPRESS_DOCSTRING},
130165
{"LZ4_uncompress", py_lz4_uncompress, METH_VARARGS, UNCOMPRESS_DOCSTRING},
131166
{"compress", py_lz4_compress, METH_VARARGS, COMPRESS_DOCSTRING},
167+
{"compress_fast", py_lz4_compress_fast, METH_VARARGS, COMPRESS_DOCSTRING},
132168
{"compressHC", py_lz4_compressHC, METH_VARARGS, COMPRESSHC_DOCSTRING},
133169
{"uncompress", py_lz4_uncompress, METH_VARARGS, UNCOMPRESS_DOCSTRING},
134170
{"decompress", py_lz4_uncompress, METH_VARARGS, UNCOMPRESS_DOCSTRING},

src/python-lz4.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@
3232
#include "Python.h"
3333

3434
static PyObject *py_lz4_compress(PyObject *self, PyObject *args);
35+
static PyObject *py_lz4_compress_fast(PyObject *self, PyObject *args);
3536
static PyObject *py_lz4_uncompress(PyObject *self, PyObject *args);
3637

3738
PyMODINIT_FUNC initlz4(void);
3839

3940
#define COMPRESS_DOCSTRING "Compress string, returning the compressed data.\nRaises an exception if any error occurs."
41+
#define COMPRESSFAST_DOCSTRING "Compress string with the given acceleration, returning the compressed data.\nRaises an exception if any error occurs."
4042
#define COMPRESSHC_DOCSTRING COMPRESS_DOCSTRING "\n\nCompared to compress, this gives a better compression ratio, but is much slower."
4143
#define UNCOMPRESS_DOCSTRING "Decompress string, returning the uncompressed data.\nRaises an exception if any error occurs."
4244

0 commit comments

Comments
 (0)