blob: 1d1072dcea136a1f94226695455a54d67df4f881 [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
Martin v. Löwis1dbce442001-10-09 10:54:31 +00002/* See http://www.gzip.org/zlib/ */
Mark Hammondae8c2682001-01-31 10:28:03 +00003
Tim Petersee826f82001-01-31 19:39:44 +00004/* Windows users: read Python's PCbuild\readme.txt */
Mark Hammondae8c2682001-01-31 10:28:03 +00005
Guido van Rossumfb221561997-04-29 15:38:09 +00006
Guido van Rossum97b54571997-06-03 22:21:47 +00007#include "Python.h"
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00008#include "structmember.h"
Guido van Rossum97b54571997-06-03 22:21:47 +00009#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +000010
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000011#ifdef WITH_THREAD
Antoine Pitrou31f30b12009-01-02 17:34:35 +000012 #include "pythread.h"
13 #define ENTER_ZLIB(obj) \
14 Py_BEGIN_ALLOW_THREADS; \
15 PyThread_acquire_lock((obj)->lock, 1); \
16 Py_END_ALLOW_THREADS;
17 #define LEAVE_ZLIB(obj) PyThread_release_lock((obj)->lock);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000018#else
Antoine Pitrou31f30b12009-01-02 17:34:35 +000019 #define ENTER_ZLIB(obj)
20 #define LEAVE_ZLIB(obj)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000021#endif
22
Guido van Rossumfb221561997-04-29 15:38:09 +000023/* The following parameters are copied from zutil.h, version 0.95 */
24#define DEFLATED 8
25#if MAX_MEM_LEVEL >= 8
26# define DEF_MEM_LEVEL 8
27#else
28# define DEF_MEM_LEVEL MAX_MEM_LEVEL
29#endif
30#define DEF_WBITS MAX_WBITS
31
Guido van Rossumb729a1d1999-04-07 20:23:17 +000032/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
33#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000034
Jeremy Hylton938ace62002-07-17 16:30:39 +000035static PyTypeObject Comptype;
36static PyTypeObject Decomptype;
Guido van Rossumfb221561997-04-29 15:38:09 +000037
38static PyObject *ZlibError;
39
Tim Peters977e5402001-10-17 03:57:20 +000040typedef struct
Guido van Rossumfb221561997-04-29 15:38:09 +000041{
Jeremy Hylton9714f992001-10-16 21:19:45 +000042 PyObject_HEAD
43 z_stream zst;
44 PyObject *unused_data;
45 PyObject *unconsumed_tail;
Nadeem Vawda1c385462011-08-13 15:22:40 +020046 char eof;
Jeremy Hylton9714f992001-10-16 21:19:45 +000047 int is_initialised;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020048 PyObject *zdict;
Antoine Pitrou31f30b12009-01-02 17:34:35 +000049 #ifdef WITH_THREAD
50 PyThread_type_lock lock;
51 #endif
Guido van Rossumfb221561997-04-29 15:38:09 +000052} compobject;
53
Jeremy Hylton0965e082001-10-16 21:56:09 +000054static void
55zlib_error(z_stream zst, int err, char *msg)
56{
Nadeem Vawda524148a2011-08-28 11:26:46 +020057 const char *zmsg = Z_NULL;
58 /* In case of a version mismatch, zst.msg won't be initialized.
59 Check for this case first, before looking at zst.msg. */
60 if (err == Z_VERSION_ERROR)
61 zmsg = "library version mismatch";
62 if (zmsg == Z_NULL)
63 zmsg = zst.msg;
Antoine Pitrou96f212b2010-05-11 23:49:58 +000064 if (zmsg == Z_NULL) {
65 switch (err) {
66 case Z_BUF_ERROR:
67 zmsg = "incomplete or truncated stream";
68 break;
69 case Z_STREAM_ERROR:
70 zmsg = "inconsistent stream state";
71 break;
72 case Z_DATA_ERROR:
73 zmsg = "invalid input data";
74 break;
75 }
76 }
77 if (zmsg == Z_NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000078 PyErr_Format(ZlibError, "Error %d %s", err, msg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000079 else
Antoine Pitrou96f212b2010-05-11 23:49:58 +000080 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000081}
82
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000083PyDoc_STRVAR(compressobj__doc__,
Nadeem Vawda2180c972012-06-22 01:40:49 +020084"compressobj(level=-1, method=DEFLATED, wbits=15, memlevel=8,\n"
85" strategy=Z_DEFAULT_STRATEGY[, zdict])\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020086" -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +000087"\n"
Nadeem Vawda2180c972012-06-22 01:40:49 +020088"level is the compression level (an integer in the range 0-9; default is 6).\n"
89"Higher compression levels are slower, but produce smaller results.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020090"\n"
Nadeem Vawda2180c972012-06-22 01:40:49 +020091"method is the compression algorithm. If given, this must be DEFLATED.\n"
92"\n"
93"wbits is the base two logarithm of the window size (range: 8..15).\n"
94"\n"
95"memlevel controls the amount of memory used for internal compression state.\n"
96"Valid values range from 1 to 9. Higher values result in higher memory usage,\n"
97"faster compression, and smaller output.\n"
98"\n"
99"strategy is used to tune the compression algorithm. Possible values are\n"
100"Z_DEFAULT_STRATEGY, Z_FILTERED, and Z_HUFFMAN_ONLY.\n"
101"\n"
102"zdict is the predefined compression dictionary - a sequence of bytes\n"
103"containing subsequences that are likely to occur in the input data.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000104
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105PyDoc_STRVAR(decompressobj__doc__,
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200106"decompressobj([wbits[, zdict]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000107"\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200108"Optional arg wbits is the window buffer size.\n"
109"\n"
110"Optional arg zdict is the predefined compression dictionary. This must be\n"
111"the same dictionary as used by the compressor that produced the input data.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000112
Guido van Rossumfb221561997-04-29 15:38:09 +0000113static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000114newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +0000115{
Tim Peters977e5402001-10-17 03:57:20 +0000116 compobject *self;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000117 self = PyObject_New(compobject, type);
118 if (self == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000119 return NULL;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200120 self->eof = 0;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000121 self->is_initialised = 0;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200122 self->zdict = NULL;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000123 self->unused_data = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000124 if (self->unused_data == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000125 Py_DECREF(self);
126 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000127 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000128 self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000129 if (self->unconsumed_tail == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000130 Py_DECREF(self);
131 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000132 }
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000133#ifdef WITH_THREAD
134 self->lock = PyThread_allocate_lock();
135#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000136 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000137}
138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000139PyDoc_STRVAR(compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000140"compress(string[, level]) -- Returned compressed string.\n"
141"\n"
Nadeem Vawda19e568d2012-11-11 14:04:14 +0100142"Optional arg level is the compression level, in 0-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000143
Guido van Rossumfb221561997-04-29 15:38:09 +0000144static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000145PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000146{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000147 PyObject *ReturnVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000148 Py_buffer pinput;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200149 Byte *input, *output = NULL;
150 unsigned int length;
151 int level=Z_DEFAULT_COMPRESSION, err;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000152 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000153
Jeremy Hylton9714f992001-10-16 21:19:45 +0000154 /* require Python string object, optional 'level' arg */
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000155 if (!PyArg_ParseTuple(args, "y*|i:compress", &pinput, &level))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000156 return NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200157
158 if (pinput.len > UINT_MAX) {
159 PyErr_SetString(PyExc_OverflowError,
160 "Size does not fit in an unsigned int");
161 goto error;
162 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000163 input = pinput.buf;
164 length = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000165
Jeremy Hylton9714f992001-10-16 21:19:45 +0000166 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000167
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000168 output = (Byte*)malloc(zst.avail_out);
169 if (output == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000170 PyErr_SetString(PyExc_MemoryError,
171 "Can't allocate memory to compress data");
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200172 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000173 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000174
Jeremy Hylton9714f992001-10-16 21:19:45 +0000175 /* Past the point of no return. From here on out, we need to make sure
176 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000177
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000178 zst.zalloc = (alloc_func)NULL;
179 zst.zfree = (free_func)Z_NULL;
180 zst.next_out = (Byte *)output;
181 zst.next_in = (Byte *)input;
182 zst.avail_in = length;
183 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000184
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000185 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000186 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000187 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000188 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000189 PyErr_SetString(PyExc_MemoryError,
190 "Out of memory while compressing data");
191 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000192 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000193 PyErr_SetString(ZlibError,
194 "Bad compression level");
195 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000196 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000197 deflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000198 zlib_error(zst, err, "while compressing data");
199 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000200 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000201
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000202 Py_BEGIN_ALLOW_THREADS;
203 err = deflate(&zst, Z_FINISH);
204 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000205
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000206 if (err != Z_STREAM_END) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000207 zlib_error(zst, err, "while compressing data");
208 deflateEnd(&zst);
209 goto error;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000210 }
Tim Peters977e5402001-10-17 03:57:20 +0000211
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000212 err=deflateEnd(&zst);
213 if (err == Z_OK)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000214 ReturnVal = PyBytes_FromStringAndSize((char *)output,
Guido van Rossum776152b2007-05-22 22:44:07 +0000215 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000216 else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000217 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000218
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000219 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000220 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000221 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000222
Jeremy Hylton9714f992001-10-16 21:19:45 +0000223 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000224}
225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000226PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000227"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
228"\n"
229"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000230"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000231
Guido van Rossumfb221561997-04-29 15:38:09 +0000232static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000233PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000234{
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200235 PyObject *result_str = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000236 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000237 Byte *input;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200238 unsigned int length;
239 int err;
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000240 int wsize=DEF_WBITS;
241 Py_ssize_t r_strlen=DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000242 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000243
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000244 if (!PyArg_ParseTuple(args, "y*|in:decompress",
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000245 &pinput, &wsize, &r_strlen))
246 return NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200247
248 if (pinput.len > UINT_MAX) {
249 PyErr_SetString(PyExc_OverflowError,
250 "Size does not fit in an unsigned int");
251 goto error;
252 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000253 input = pinput.buf;
254 length = pinput.len;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000255
Jeremy Hylton9714f992001-10-16 21:19:45 +0000256 if (r_strlen <= 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000257 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000258
Jeremy Hylton9714f992001-10-16 21:19:45 +0000259 zst.avail_in = length;
260 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000261
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200262 if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen)))
263 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000264
Jeremy Hylton9714f992001-10-16 21:19:45 +0000265 zst.zalloc = (alloc_func)NULL;
266 zst.zfree = (free_func)Z_NULL;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000267 zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000268 zst.next_in = (Byte *)input;
269 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000270
Jeremy Hylton9714f992001-10-16 21:19:45 +0000271 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000272 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000273 break;
Tim Peters977e5402001-10-17 03:57:20 +0000274 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000275 PyErr_SetString(PyExc_MemoryError,
276 "Out of memory while decompressing data");
277 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000278 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000279 inflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000280 zlib_error(zst, err, "while preparing to decompress data");
281 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000282 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000283
Jeremy Hylton9714f992001-10-16 21:19:45 +0000284 do {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000285 Py_BEGIN_ALLOW_THREADS
286 err=inflate(&zst, Z_FINISH);
287 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000288
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000289 switch(err) {
290 case(Z_STREAM_END):
291 break;
292 case(Z_BUF_ERROR):
293 /*
294 * If there is at least 1 byte of room according to zst.avail_out
295 * and we get this error, assume that it means zlib cannot
296 * process the inflate call() due to an error in the data.
297 */
298 if (zst.avail_out > 0) {
Antoine Pitrou96f212b2010-05-11 23:49:58 +0000299 zlib_error(zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000300 inflateEnd(&zst);
301 goto error;
302 }
303 /* fall through */
304 case(Z_OK):
305 /* need more memory */
306 if (_PyBytes_Resize(&result_str, r_strlen << 1) < 0) {
307 inflateEnd(&zst);
308 goto error;
309 }
310 zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000311 (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000312 zst.avail_out = r_strlen;
313 r_strlen = r_strlen << 1;
314 break;
315 default:
316 inflateEnd(&zst);
317 zlib_error(zst, err, "while decompressing data");
318 goto error;
319 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000320 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000321
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000322 err = inflateEnd(&zst);
323 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200324 zlib_error(zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000325 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000326 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000327
Gregory P. Smith693fc462008-09-06 20:13:06 +0000328 if (_PyBytes_Resize(&result_str, zst.total_out) < 0)
Guido van Rossum776152b2007-05-22 22:44:07 +0000329 goto error;
330
Martin v. Löwis423be952008-08-13 15:53:07 +0000331 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000332 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000333
334 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000335 PyBuffer_Release(&pinput);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000336 Py_XDECREF(result_str);
337 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000338}
339
340static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200341PyZlib_compressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000342{
Jeremy Hylton499000002001-10-16 21:59:35 +0000343 compobject *self;
344 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
345 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200346 Py_buffer zdict;
347 static char *kwlist[] = {"level", "method", "wbits",
348 "memLevel", "strategy", "zdict", NULL};
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000349
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200350 zdict.buf = NULL; /* Sentinel, so we can tell whether zdict was supplied. */
351 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiiiy*:compressobj",
352 kwlist, &level, &method, &wbits,
353 &memLevel, &strategy, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000354 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000355
Jeremy Hylton499000002001-10-16 21:59:35 +0000356 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000357 if (self==NULL)
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200358 goto error;
Jeremy Hylton499000002001-10-16 21:59:35 +0000359 self->zst.zalloc = (alloc_func)NULL;
360 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000361 self->zst.next_in = NULL;
362 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000363 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
364 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000365 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000366 self->is_initialised = 1;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200367 if (zdict.buf == NULL) {
368 goto success;
369 } else {
370 err = deflateSetDictionary(&self->zst, zdict.buf, zdict.len);
371 switch (err) {
372 case (Z_OK):
373 goto success;
374 case (Z_STREAM_ERROR):
375 PyErr_SetString(PyExc_ValueError, "Invalid dictionary");
376 goto error;
377 default:
378 PyErr_SetString(PyExc_ValueError, "deflateSetDictionary()");
379 goto error;
380 }
381 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000382 case (Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000383 PyErr_SetString(PyExc_MemoryError,
384 "Can't allocate memory for compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200385 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000386 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000387 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200388 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000389 default:
390 zlib_error(self->zst, err, "while creating compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200391 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000392 }
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200393
394 error:
Serhiy Storchaka505ff752014-02-09 13:33:53 +0200395 Py_CLEAR(self);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200396 success:
397 if (zdict.buf != NULL)
398 PyBuffer_Release(&zdict);
399 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000400}
401
402static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200403PyZlib_decompressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000404{
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200405 static char *kwlist[] = {"wbits", "zdict", NULL};
Jeremy Hylton499000002001-10-16 21:59:35 +0000406 int wbits=DEF_WBITS, err;
407 compobject *self;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200408 PyObject *zdict=NULL;
409
410 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iO:decompressobj",
411 kwlist, &wbits, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000412 return NULL;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200413 if (zdict != NULL && !PyObject_CheckBuffer(zdict)) {
414 PyErr_SetString(PyExc_TypeError,
415 "zdict argument must support the buffer protocol");
416 return NULL;
417 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000418
419 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000420 if (self == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000421 return(NULL);
Jeremy Hylton499000002001-10-16 21:59:35 +0000422 self->zst.zalloc = (alloc_func)NULL;
423 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000424 self->zst.next_in = NULL;
425 self->zst.avail_in = 0;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200426 if (zdict != NULL) {
427 Py_INCREF(zdict);
428 self->zdict = zdict;
429 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000430 err = inflateInit2(&self->zst, wbits);
431 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000432 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000433 self->is_initialised = 1;
434 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000435 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000436 Py_DECREF(self);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000437 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
438 return NULL;
439 case (Z_MEM_ERROR):
440 Py_DECREF(self);
441 PyErr_SetString(PyExc_MemoryError,
442 "Can't allocate memory for decompression object");
443 return NULL;
444 default:
445 zlib_error(self->zst, err, "while creating decompression object");
446 Py_DECREF(self);
447 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000448 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000449}
450
451static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000452Dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000453{
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000454#ifdef WITH_THREAD
455 PyThread_free_lock(self->lock);
456#endif
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000457 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000458 Py_XDECREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200459 Py_XDECREF(self->zdict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000460 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000461}
462
463static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000464Comp_dealloc(compobject *self)
465{
466 if (self->is_initialised)
467 deflateEnd(&self->zst);
468 Dealloc(self);
469}
470
471static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000472Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000473{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000474 if (self->is_initialised)
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000475 inflateEnd(&self->zst);
476 Dealloc(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000477}
478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000479PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000480"compress(data) -- Return a string containing data compressed.\n"
481"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000482"After calling this function, some of the input data may still\n"
483"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000484"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000485
486
Guido van Rossumfb221561997-04-29 15:38:09 +0000487static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000488PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000489{
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200490 int err;
491 unsigned int inplen;
Antoine Pitrou4b3fe142010-05-07 17:08:54 +0000492 Py_ssize_t length = DEFAULTALLOC;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200493 PyObject *RetVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000494 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000495 Byte *input;
496 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000497
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000498 if (!PyArg_ParseTuple(args, "y*:compress", &pinput))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000499 return NULL;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200500 if (pinput.len > UINT_MAX) {
501 PyErr_SetString(PyExc_OverflowError,
502 "Size does not fit in an unsigned int");
503 goto error_outer;
504 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000505 input = pinput.buf;
506 inplen = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000507
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200508 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
509 goto error_outer;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000510
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000511 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000512
Jeremy Hylton9714f992001-10-16 21:19:45 +0000513 start_total_out = self->zst.total_out;
514 self->zst.avail_in = inplen;
515 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000516 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000517 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000518
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000519 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000520 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000521 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000522
Jeremy Hylton9714f992001-10-16 21:19:45 +0000523 /* while Z_OK and the output buffer is full, there might be more output,
524 so extend the output buffer and try again */
525 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000526 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000527 Py_DECREF(RetVal);
528 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000529 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000530 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000531 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000532 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000533 self->zst.avail_out = length;
534 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000535
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000536 Py_BEGIN_ALLOW_THREADS
537 err = deflate(&(self->zst), Z_NO_FLUSH);
538 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000539 }
Tim Peters977e5402001-10-17 03:57:20 +0000540 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000541 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000542 condition.
543 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000544
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000545 if (err != Z_OK && err != Z_BUF_ERROR) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200546 zlib_error(self->zst, err, "while compressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000547 Py_DECREF(RetVal);
548 RetVal = NULL;
549 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000550 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000551 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000552 Py_DECREF(RetVal);
553 RetVal = NULL;
554 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000555
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000556 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000557 LEAVE_ZLIB(self);
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200558 error_outer:
Martin v. Löwis423be952008-08-13 15:53:07 +0000559 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000560 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000561}
562
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100563/* Helper for objdecompress() and unflush(). Saves any unconsumed input data in
564 self->unused_data or self->unconsumed_tail, as appropriate. */
565static int
566save_unconsumed_input(compobject *self, int err)
567{
568 if (err == Z_STREAM_END) {
569 /* The end of the compressed data has been reached. Store the leftover
570 input data in self->unused_data. */
571 if (self->zst.avail_in > 0) {
572 Py_ssize_t old_size = PyBytes_GET_SIZE(self->unused_data);
573 Py_ssize_t new_size;
574 PyObject *new_data;
575 if (self->zst.avail_in > PY_SSIZE_T_MAX - old_size) {
576 PyErr_NoMemory();
577 return -1;
578 }
579 new_size = old_size + self->zst.avail_in;
580 new_data = PyBytes_FromStringAndSize(NULL, new_size);
581 if (new_data == NULL)
582 return -1;
583 Py_MEMCPY(PyBytes_AS_STRING(new_data),
584 PyBytes_AS_STRING(self->unused_data), old_size);
585 Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size,
586 self->zst.next_in, self->zst.avail_in);
587 Py_DECREF(self->unused_data);
588 self->unused_data = new_data;
589 self->zst.avail_in = 0;
590 }
591 }
592 if (self->zst.avail_in > 0 || PyBytes_GET_SIZE(self->unconsumed_tail)) {
593 /* This code handles two distinct cases:
594 1. Output limit was reached. Save leftover input in unconsumed_tail.
595 2. All input data was consumed. Clear unconsumed_tail. */
596 PyObject *new_data = PyBytes_FromStringAndSize(
597 (char *)self->zst.next_in, self->zst.avail_in);
598 if (new_data == NULL)
599 return -1;
600 Py_DECREF(self->unconsumed_tail);
601 self->unconsumed_tail = new_data;
602 }
603 return 0;
604}
605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000606PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000607"decompress(data, max_length) -- Return a string containing the decompressed\n"
608"version of the data.\n"
609"\n"
610"After calling this function, some of the input data may still be stored in\n"
611"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000612"Call the flush() method to clear these buffers.\n"
613"If the max_length parameter is specified then the return value will be\n"
614"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000615"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000616
Guido van Rossumfb221561997-04-29 15:38:09 +0000617static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000618PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000619{
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200620 int err, max_length = 0;
621 unsigned int inplen;
Antoine Pitrou4b3fe142010-05-07 17:08:54 +0000622 Py_ssize_t old_length, length = DEFAULTALLOC;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200623 PyObject *RetVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000624 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000625 Byte *input;
626 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000627
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000628 if (!PyArg_ParseTuple(args, "y*|i:decompress", &pinput,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000629 &max_length))
630 return NULL;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200631 if (pinput.len > UINT_MAX) {
632 PyErr_SetString(PyExc_OverflowError,
633 "Size does not fit in an unsigned int");
634 goto error_outer;
635 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000636 input = pinput.buf;
637 inplen = pinput.len;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000638 if (max_length < 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000639 PyErr_SetString(PyExc_ValueError,
640 "max_length must be greater than zero");
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200641 goto error_outer;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000642 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000643
Jeremy Hylton9714f992001-10-16 21:19:45 +0000644 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000645 if (max_length && length > max_length)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000646 length = max_length;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200647 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
648 goto error_outer;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000649
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000650 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000651
Jeremy Hylton9714f992001-10-16 21:19:45 +0000652 start_total_out = self->zst.total_out;
653 self->zst.avail_in = inplen;
654 self->zst.next_in = input;
655 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000656 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000657
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000658 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000659 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000660 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000661
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200662 if (err == Z_NEED_DICT && self->zdict != NULL) {
663 Py_buffer zdict_buf;
664 if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
665 Py_DECREF(RetVal);
666 RetVal = NULL;
667 goto error;
668 }
669 err = inflateSetDictionary(&(self->zst), zdict_buf.buf, zdict_buf.len);
670 PyBuffer_Release(&zdict_buf);
671 if (err != Z_OK) {
672 zlib_error(self->zst, err, "while decompressing data");
673 Py_DECREF(RetVal);
674 RetVal = NULL;
675 goto error;
676 }
Nadeem Vawdacf5e1d82012-06-22 00:35:57 +0200677 /* Repeat the call to inflate. */
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200678 Py_BEGIN_ALLOW_THREADS
679 err = inflate(&(self->zst), Z_SYNC_FLUSH);
680 Py_END_ALLOW_THREADS
681 }
682
Jeremy Hylton9714f992001-10-16 21:19:45 +0000683 /* While Z_OK and the output buffer is full, there might be more output.
684 So extend the output buffer and try again.
685 */
Tim Peters977e5402001-10-17 03:57:20 +0000686 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000687 /* If max_length set, don't continue decompressing if we've already
688 reached the limit.
689 */
690 if (max_length && length >= max_length)
691 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000692
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000693 /* otherwise, ... */
694 old_length = length;
695 length = length << 1;
696 if (max_length && length > max_length)
697 length = max_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000698
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000699 if (_PyBytes_Resize(&RetVal, length) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000700 Py_DECREF(RetVal);
701 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000702 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000703 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000704 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000705 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000706 self->zst.avail_out = length - old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000707
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000708 Py_BEGIN_ALLOW_THREADS
709 err = inflate(&(self->zst), Z_SYNC_FLUSH);
710 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000711 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000712
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100713 if (save_unconsumed_input(self, err) < 0) {
Nadeem Vawda7619e882011-05-14 14:05:20 +0200714 Py_DECREF(RetVal);
715 RetVal = NULL;
716 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000717 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000718
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000719 if (err == Z_STREAM_END) {
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100720 /* This is the logical place to call inflateEnd, but the old behaviour
721 of only calling it on flush() is preserved. */
Nadeem Vawda1c385462011-08-13 15:22:40 +0200722 self->eof = 1;
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100723 } else if (err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000724 /* We will only get Z_BUF_ERROR if the output buffer was full
725 but there wasn't more output when we tried again, so it is
726 not an error condition.
727 */
Nadeem Vawda1c385462011-08-13 15:22:40 +0200728 zlib_error(self->zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000729 Py_DECREF(RetVal);
730 RetVal = NULL;
731 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000732 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000733
Gregory P. Smith693fc462008-09-06 20:13:06 +0000734 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000735 Py_DECREF(RetVal);
736 RetVal = NULL;
737 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000738
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000739 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000740 LEAVE_ZLIB(self);
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200741 error_outer:
Martin v. Löwis423be952008-08-13 15:53:07 +0000742 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000743 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000744}
745
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000746PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000747"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000748"\n"
749"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000750"default value used when mode is not specified is Z_FINISH.\n"
751"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000752"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000753
Guido van Rossumfb221561997-04-29 15:38:09 +0000754static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000755PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000756{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000757 int err, length = DEFAULTALLOC;
758 PyObject *RetVal;
759 int flushmode = Z_FINISH;
760 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000761
Jeremy Hylton9714f992001-10-16 21:19:45 +0000762 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000763 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000764
Jeremy Hylton9714f992001-10-16 21:19:45 +0000765 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
766 doing any work at all; just return an empty string. */
767 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000768 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000769 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000770
Gregory P. Smith693fc462008-09-06 20:13:06 +0000771 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000772 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000773
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000774 ENTER_ZLIB(self);
Tim Peters977e5402001-10-17 03:57:20 +0000775
Jeremy Hylton9714f992001-10-16 21:19:45 +0000776 start_total_out = self->zst.total_out;
777 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000778 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000779 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000780
781 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000782 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000783 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000784
Jeremy Hylton9714f992001-10-16 21:19:45 +0000785 /* while Z_OK and the output buffer is full, there might be more output,
786 so extend the output buffer and try again */
787 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000788 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000789 Py_DECREF(RetVal);
790 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000791 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000792 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000793 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000794 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000795 self->zst.avail_out = length;
796 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000797
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000798 Py_BEGIN_ALLOW_THREADS
799 err = deflate(&(self->zst), flushmode);
800 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000801 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000802
Jeremy Hylton9714f992001-10-16 21:19:45 +0000803 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000804 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000805 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000806 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000807 err = deflateEnd(&(self->zst));
808 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200809 zlib_error(self->zst, err, "while finishing compression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000810 Py_DECREF(RetVal);
811 RetVal = NULL;
812 goto error;
813 }
814 else
815 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000816
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000817 /* We will only get Z_BUF_ERROR if the output buffer was full
818 but there wasn't more output when we tried again, so it is
819 not an error condition.
820 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000821 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000822 zlib_error(self->zst, err, "while flushing");
823 Py_DECREF(RetVal);
824 RetVal = NULL;
825 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000826 }
Tim Peters977e5402001-10-17 03:57:20 +0000827
Gregory P. Smith693fc462008-09-06 20:13:06 +0000828 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000829 Py_DECREF(RetVal);
830 RetVal = NULL;
831 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000832
Tim Peters977e5402001-10-17 03:57:20 +0000833 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000834 LEAVE_ZLIB(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000835
836 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000837}
838
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000839#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000840PyDoc_STRVAR(comp_copy__doc__,
841"copy() -- Return a copy of the compression object.");
842
843static PyObject *
844PyZlib_copy(compobject *self)
845{
846 compobject *retval = NULL;
847 int err;
848
849 retval = newcompobject(&Comptype);
850 if (!retval) return NULL;
851
852 /* Copy the zstream state
853 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
854 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000855 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000856 err = deflateCopy(&retval->zst, &self->zst);
857 switch(err) {
858 case(Z_OK):
859 break;
860 case(Z_STREAM_ERROR):
861 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
862 goto error;
863 case(Z_MEM_ERROR):
864 PyErr_SetString(PyExc_MemoryError,
865 "Can't allocate memory for compression object");
866 goto error;
867 default:
868 zlib_error(self->zst, err, "while copying compression object");
869 goto error;
870 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000871 Py_INCREF(self->unused_data);
872 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200873 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000874 Py_XDECREF(retval->unused_data);
875 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200876 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000877 retval->unused_data = self->unused_data;
878 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200879 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200880 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000881
882 /* Mark it as being initialized */
883 retval->is_initialised = 1;
884
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000885 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000886 return (PyObject *)retval;
887
888error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000889 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000890 Py_XDECREF(retval);
891 return NULL;
892}
893
894PyDoc_STRVAR(decomp_copy__doc__,
895"copy() -- Return a copy of the decompression object.");
896
897static PyObject *
898PyZlib_uncopy(compobject *self)
899{
900 compobject *retval = NULL;
901 int err;
902
903 retval = newcompobject(&Decomptype);
904 if (!retval) return NULL;
905
906 /* Copy the zstream state
907 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
908 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000909 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000910 err = inflateCopy(&retval->zst, &self->zst);
911 switch(err) {
912 case(Z_OK):
913 break;
914 case(Z_STREAM_ERROR):
915 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
916 goto error;
917 case(Z_MEM_ERROR):
918 PyErr_SetString(PyExc_MemoryError,
919 "Can't allocate memory for decompression object");
920 goto error;
921 default:
922 zlib_error(self->zst, err, "while copying decompression object");
923 goto error;
924 }
925
926 Py_INCREF(self->unused_data);
927 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200928 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000929 Py_XDECREF(retval->unused_data);
930 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200931 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000932 retval->unused_data = self->unused_data;
933 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200934 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200935 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000936
937 /* Mark it as being initialized */
938 retval->is_initialised = 1;
939
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000940 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000941 return (PyObject *)retval;
942
943error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000944 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000945 Py_XDECREF(retval);
946 return NULL;
947}
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000948#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000950PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000951"flush( [length] ) -- Return a string containing any remaining\n"
952"decompressed data. length, if given, is the initial size of the\n"
953"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000954"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000955"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000956
Guido van Rossumfb221561997-04-29 15:38:09 +0000957static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000958PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000959{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000960 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000961 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000962 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000963
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000964 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000965 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000966 if (length <= 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000967 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
968 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000969 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000970 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000971 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000972
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000973
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000974 ENTER_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000975
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000976 start_total_out = self->zst.total_out;
Nadeem Vawda7ee95552012-11-11 03:15:32 +0100977 self->zst.avail_in = PyBytes_GET_SIZE(self->unconsumed_tail);
978 self->zst.next_in = (Byte *)PyBytes_AS_STRING(self->unconsumed_tail);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000979 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000980 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000981
982 Py_BEGIN_ALLOW_THREADS
983 err = inflate(&(self->zst), Z_FINISH);
984 Py_END_ALLOW_THREADS
985
986 /* while Z_OK and the output buffer is full, there might be more output,
987 so extend the output buffer and try again */
988 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000989 if (_PyBytes_Resize(&retval, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000990 Py_DECREF(retval);
991 retval = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000992 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000993 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000994 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
995 self->zst.avail_out = length;
996 length = length << 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000997
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000998 Py_BEGIN_ALLOW_THREADS
999 err = inflate(&(self->zst), Z_FINISH);
1000 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +00001001 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001002
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001003 if (save_unconsumed_input(self, err) < 0) {
1004 Py_DECREF(retval);
1005 retval = NULL;
1006 goto error;
1007 }
1008
Nadeem Vawda3bf71c52011-08-13 15:42:50 +02001009 /* If at end of stream, clean up any memory allocated by zlib. */
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001010 if (err == Z_STREAM_END) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001011 self->eof = 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001012 self->is_initialised = 0;
Nadeem Vawda1c385462011-08-13 15:22:40 +02001013 err = inflateEnd(&(self->zst));
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001014 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001015 zlib_error(self->zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001016 Py_DECREF(retval);
1017 retval = NULL;
1018 goto error;
1019 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001020 }
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001021
Gregory P. Smith693fc462008-09-06 20:13:06 +00001022 if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +00001023 Py_DECREF(retval);
1024 retval = NULL;
1025 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001026
1027error:
1028
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001029 LEAVE_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001030
Jeremy Hylton9714f992001-10-16 21:19:45 +00001031 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +00001032}
1033
1034static PyMethodDef comp_methods[] =
1035{
Tim Peters977e5402001-10-17 03:57:20 +00001036 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001037 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001038 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001039 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001040#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001041 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
1042 comp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001043#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001044 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001045};
1046
1047static PyMethodDef Decomp_methods[] =
1048{
Tim Peters977e5402001-10-17 03:57:20 +00001049 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001050 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001051 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001052 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001053#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001054 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
1055 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001056#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001057 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001058};
1059
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001060#define COMP_OFF(x) offsetof(compobject, x)
1061static PyMemberDef Decomp_members[] = {
1062 {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
1063 {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
Nadeem Vawda1c385462011-08-13 15:22:40 +02001064 {"eof", T_BOOL, COMP_OFF(eof), READONLY},
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001065 {NULL},
1066};
Guido van Rossumfb221561997-04-29 15:38:09 +00001067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001068PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001069"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
1070"\n"
1071"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001072"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +00001073
Guido van Rossumfb221561997-04-29 15:38:09 +00001074static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001075PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001076{
Christian Heimescc47b052008-03-25 14:56:36 +00001077 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001078 Py_buffer pbuf;
Tim Peters977e5402001-10-17 03:57:20 +00001079
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001080 if (!PyArg_ParseTuple(args, "y*|I:adler32", &pbuf, &adler32val))
1081 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001082 /* Releasing the GIL for very small buffers is inefficient
1083 and may lower performance */
1084 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001085 unsigned char *buf = pbuf.buf;
1086 Py_ssize_t len = pbuf.len;
1087
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001088 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001089 /* Avoid truncation of length for very large buffers. adler32() takes
1090 length as an unsigned int, which may be narrower than Py_ssize_t. */
1091 while (len > (size_t) UINT_MAX) {
1092 adler32val = adler32(adler32val, buf, UINT_MAX);
1093 buf += (size_t) UINT_MAX;
1094 len -= (size_t) UINT_MAX;
1095 }
1096 adler32val = adler32(adler32val, buf, len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001097 Py_END_ALLOW_THREADS
1098 } else {
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001099 adler32val = adler32(adler32val, pbuf.buf, pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001100 }
1101 PyBuffer_Release(&pbuf);
Gregory P. Smith27275032008-03-20 06:20:09 +00001102 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001103}
Tim Peters977e5402001-10-17 03:57:20 +00001104
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001105PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001106"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
1107"\n"
1108"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001109"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +00001110
1111static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001112PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001113{
Christian Heimescc47b052008-03-25 14:56:36 +00001114 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +00001115 Py_buffer pbuf;
1116 int signed_val;
Christian Heimescc47b052008-03-25 14:56:36 +00001117
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001118 if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001119 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001120 /* Releasing the GIL for very small buffers is inefficient
1121 and may lower performance */
1122 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001123 unsigned char *buf = pbuf.buf;
1124 Py_ssize_t len = pbuf.len;
1125
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001126 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001127 /* Avoid truncation of length for very large buffers. crc32() takes
1128 length as an unsigned int, which may be narrower than Py_ssize_t. */
1129 while (len > (size_t) UINT_MAX) {
1130 crc32val = crc32(crc32val, buf, UINT_MAX);
1131 buf += (size_t) UINT_MAX;
1132 len -= (size_t) UINT_MAX;
1133 }
1134 signed_val = crc32(crc32val, buf, len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001135 Py_END_ALLOW_THREADS
1136 } else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001137 signed_val = crc32(crc32val, pbuf.buf, pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001138 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001139 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +00001140 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001141}
Tim Peters977e5402001-10-17 03:57:20 +00001142
Guido van Rossumfb221561997-04-29 15:38:09 +00001143
1144static PyMethodDef zlib_methods[] =
1145{
Tim Peters977e5402001-10-17 03:57:20 +00001146 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001147 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001148 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001149 compress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001150 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001151 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001152 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
1153 crc32__doc__},
1154 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001155 decompress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001156 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001157 decompressobj__doc__},
1158 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001159};
1160
Tim Peters0c322792002-07-17 16:49:03 +00001161static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001162 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001163 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001164 sizeof(compobject),
1165 0,
1166 (destructor)Comp_dealloc, /*tp_dealloc*/
1167 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001168 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001169 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001170 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001171 0, /*tp_repr*/
1172 0, /*tp_as_number*/
1173 0, /*tp_as_sequence*/
1174 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001175 0, /*tp_hash*/
1176 0, /*tp_call*/
1177 0, /*tp_str*/
1178 0, /*tp_getattro*/
1179 0, /*tp_setattro*/
1180 0, /*tp_as_buffer*/
1181 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1182 0, /*tp_doc*/
1183 0, /*tp_traverse*/
1184 0, /*tp_clear*/
1185 0, /*tp_richcompare*/
1186 0, /*tp_weaklistoffset*/
1187 0, /*tp_iter*/
1188 0, /*tp_iternext*/
1189 comp_methods, /*tp_methods*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001190};
1191
Tim Peters0c322792002-07-17 16:49:03 +00001192static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001193 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001194 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001195 sizeof(compobject),
1196 0,
1197 (destructor)Decomp_dealloc, /*tp_dealloc*/
1198 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001199 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001200 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001201 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001202 0, /*tp_repr*/
1203 0, /*tp_as_number*/
1204 0, /*tp_as_sequence*/
1205 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001206 0, /*tp_hash*/
1207 0, /*tp_call*/
1208 0, /*tp_str*/
1209 0, /*tp_getattro*/
1210 0, /*tp_setattro*/
1211 0, /*tp_as_buffer*/
1212 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1213 0, /*tp_doc*/
1214 0, /*tp_traverse*/
1215 0, /*tp_clear*/
1216 0, /*tp_richcompare*/
1217 0, /*tp_weaklistoffset*/
1218 0, /*tp_iter*/
1219 0, /*tp_iternext*/
1220 Decomp_methods, /*tp_methods*/
1221 Decomp_members, /*tp_members*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001222};
1223
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001224PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001225"The functions in this module allow compression and decompression using the\n"
1226"zlib library, which is based on GNU zip.\n"
1227"\n"
1228"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
Nadeem Vawda19e568d2012-11-11 14:04:14 +01001229"compress(string[, level]) -- Compress string, with compression level in 0-9.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001230"compressobj([level[, ...]]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001231"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001232"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001233"decompressobj([wbits[, zdict]]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001234"\n"
1235"'wbits' is window buffer size.\n"
1236"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001237"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001238
Martin v. Löwis1a214512008-06-11 05:26:20 +00001239static struct PyModuleDef zlibmodule = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001240 PyModuleDef_HEAD_INIT,
1241 "zlib",
1242 zlib_module_documentation,
1243 -1,
1244 zlib_methods,
1245 NULL,
1246 NULL,
1247 NULL,
1248 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001249};
1250
Mark Hammond62b1ab12002-07-23 06:31:15 +00001251PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001252PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001253{
Fred Drake4baedc12002-04-01 14:53:37 +00001254 PyObject *m, *ver;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001255 if (PyType_Ready(&Comptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001256 return NULL;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001257 if (PyType_Ready(&Decomptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001258 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001259 m = PyModule_Create(&zlibmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001260 if (m == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001261 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001262
Fred Drake4baedc12002-04-01 14:53:37 +00001263 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1264 if (ZlibError != NULL) {
1265 Py_INCREF(ZlibError);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001266 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001267 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001268 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1269 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1270 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1271 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1272 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1273 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1274 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1275 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1276 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001277
Jeremy Hylton9714f992001-10-16 21:19:45 +00001278 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1279 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1280 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1281 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001282
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001283 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001284 if (ver != NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001285 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001286
Nadeem Vawda64d25dd2011-09-12 00:04:13 +02001287 ver = PyUnicode_FromString(zlibVersion());
1288 if (ver != NULL)
1289 PyModule_AddObject(m, "ZLIB_RUNTIME_VERSION", ver);
1290
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001291 PyModule_AddStringConstant(m, "__version__", "1.0");
1292
Martin v. Löwis1a214512008-06-11 05:26:20 +00001293 return m;
Guido van Rossumfb221561997-04-29 15:38:09 +00001294}