blob: efa95e996a0dfaa07b0d2db04112c057b7e0505f [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
Larry Hastings31826802013-10-19 00:09:25 -070011
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000012#ifdef WITH_THREAD
Antoine Pitrou31f30b12009-01-02 17:34:35 +000013 #include "pythread.h"
14 #define ENTER_ZLIB(obj) \
15 Py_BEGIN_ALLOW_THREADS; \
16 PyThread_acquire_lock((obj)->lock, 1); \
17 Py_END_ALLOW_THREADS;
18 #define LEAVE_ZLIB(obj) PyThread_release_lock((obj)->lock);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000019#else
Antoine Pitrou31f30b12009-01-02 17:34:35 +000020 #define ENTER_ZLIB(obj)
21 #define LEAVE_ZLIB(obj)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000022#endif
23
Guido van Rossumfb221561997-04-29 15:38:09 +000024/* The following parameters are copied from zutil.h, version 0.95 */
25#define DEFLATED 8
26#if MAX_MEM_LEVEL >= 8
27# define DEF_MEM_LEVEL 8
28#else
29# define DEF_MEM_LEVEL MAX_MEM_LEVEL
30#endif
31#define DEF_WBITS MAX_WBITS
32
Guido van Rossumb729a1d1999-04-07 20:23:17 +000033/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
34#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000035
Jeremy Hylton938ace62002-07-17 16:30:39 +000036static PyTypeObject Comptype;
37static PyTypeObject Decomptype;
Guido van Rossumfb221561997-04-29 15:38:09 +000038
39static PyObject *ZlibError;
40
Tim Peters977e5402001-10-17 03:57:20 +000041typedef struct
Guido van Rossumfb221561997-04-29 15:38:09 +000042{
Jeremy Hylton9714f992001-10-16 21:19:45 +000043 PyObject_HEAD
44 z_stream zst;
45 PyObject *unused_data;
46 PyObject *unconsumed_tail;
Nadeem Vawda1c385462011-08-13 15:22:40 +020047 char eof;
Jeremy Hylton9714f992001-10-16 21:19:45 +000048 int is_initialised;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020049 PyObject *zdict;
Antoine Pitrou31f30b12009-01-02 17:34:35 +000050 #ifdef WITH_THREAD
51 PyThread_type_lock lock;
52 #endif
Guido van Rossumfb221561997-04-29 15:38:09 +000053} compobject;
54
Jeremy Hylton0965e082001-10-16 21:56:09 +000055static void
56zlib_error(z_stream zst, int err, char *msg)
57{
Nadeem Vawda524148a2011-08-28 11:26:46 +020058 const char *zmsg = Z_NULL;
59 /* In case of a version mismatch, zst.msg won't be initialized.
60 Check for this case first, before looking at zst.msg. */
61 if (err == Z_VERSION_ERROR)
62 zmsg = "library version mismatch";
63 if (zmsg == Z_NULL)
64 zmsg = zst.msg;
Antoine Pitrou96f212b2010-05-11 23:49:58 +000065 if (zmsg == Z_NULL) {
66 switch (err) {
67 case Z_BUF_ERROR:
68 zmsg = "incomplete or truncated stream";
69 break;
70 case Z_STREAM_ERROR:
71 zmsg = "inconsistent stream state";
72 break;
73 case Z_DATA_ERROR:
74 zmsg = "invalid input data";
75 break;
76 }
77 }
78 if (zmsg == Z_NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000079 PyErr_Format(ZlibError, "Error %d %s", err, msg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000080 else
Antoine Pitrou96f212b2010-05-11 23:49:58 +000081 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000082}
83
Larry Hastings61272b72014-01-07 12:41:53 -080084/*[clinic input]
Larry Hastingsebdcb502013-11-23 14:54:00 -080085module zlib
86class zlib.Compress
87class zlib.Decompress
Larry Hastings61272b72014-01-07 12:41:53 -080088[clinic start generated code]*/
89/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
Larry Hastingsebdcb502013-11-23 14:54:00 -080090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000091PyDoc_STRVAR(compressobj__doc__,
Nadeem Vawda2180c972012-06-22 01:40:49 +020092"compressobj(level=-1, method=DEFLATED, wbits=15, memlevel=8,\n"
93" strategy=Z_DEFAULT_STRATEGY[, zdict])\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020094" -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +000095"\n"
Nadeem Vawda2180c972012-06-22 01:40:49 +020096"level is the compression level (an integer in the range 0-9; default is 6).\n"
97"Higher compression levels are slower, but produce smaller results.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020098"\n"
Nadeem Vawda2180c972012-06-22 01:40:49 +020099"method is the compression algorithm. If given, this must be DEFLATED.\n"
100"\n"
101"wbits is the base two logarithm of the window size (range: 8..15).\n"
102"\n"
103"memlevel controls the amount of memory used for internal compression state.\n"
104"Valid values range from 1 to 9. Higher values result in higher memory usage,\n"
105"faster compression, and smaller output.\n"
106"\n"
107"strategy is used to tune the compression algorithm. Possible values are\n"
108"Z_DEFAULT_STRATEGY, Z_FILTERED, and Z_HUFFMAN_ONLY.\n"
109"\n"
110"zdict is the predefined compression dictionary - a sequence of bytes\n"
111"containing subsequences that are likely to occur in the input data.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000113PyDoc_STRVAR(decompressobj__doc__,
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200114"decompressobj([wbits[, zdict]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000115"\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200116"Optional arg wbits is the window buffer size.\n"
117"\n"
118"Optional arg zdict is the predefined compression dictionary. This must be\n"
119"the same dictionary as used by the compressor that produced the input data.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000120
Guido van Rossumfb221561997-04-29 15:38:09 +0000121static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000122newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +0000123{
Tim Peters977e5402001-10-17 03:57:20 +0000124 compobject *self;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000125 self = PyObject_New(compobject, type);
126 if (self == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000127 return NULL;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200128 self->eof = 0;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000129 self->is_initialised = 0;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200130 self->zdict = NULL;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000131 self->unused_data = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000132 if (self->unused_data == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000133 Py_DECREF(self);
134 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000135 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000136 self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000137 if (self->unconsumed_tail == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000138 Py_DECREF(self);
139 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000140 }
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000141#ifdef WITH_THREAD
142 self->lock = PyThread_allocate_lock();
Victor Stinnerbf2e2f92013-07-09 00:29:03 +0200143 if (self->lock == NULL) {
144 PyErr_SetString(PyExc_MemoryError, "Unable to allocate lock");
145 return NULL;
146 }
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000147#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000148 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000149}
150
Victor Stinner5064a522013-07-07 16:50:27 +0200151static void*
152PyZlib_Malloc(voidpf ctx, uInt items, uInt size)
153{
154 if (items > (size_t)PY_SSIZE_T_MAX / size)
155 return NULL;
156 /* PyMem_Malloc() cannot be used: the GIL is not held when
157 inflate() and deflate() are called */
158 return PyMem_RawMalloc(items * size);
159}
160
161static void
162PyZlib_Free(voidpf ctx, void *ptr)
163{
Victor Stinnerb7f1f652013-07-07 17:10:34 +0200164 PyMem_RawFree(ptr);
Victor Stinner5064a522013-07-07 16:50:27 +0200165}
166
Larry Hastings61272b72014-01-07 12:41:53 -0800167/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800168
Larry Hastingsebdcb502013-11-23 14:54:00 -0800169zlib.compress
170 bytes: Py_buffer
171 Binary data to be compressed.
172 [
173 level: int
174 Compression level, in 0-9.
175 ]
176 /
177
178Returns compressed string.
179
Larry Hastings61272b72014-01-07 12:41:53 -0800180[clinic start generated code]*/
Larry Hastingsebdcb502013-11-23 14:54:00 -0800181
182PyDoc_STRVAR(zlib_compress__doc__,
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800183"compress(bytes, [level])\n"
Larry Hastingsebdcb502013-11-23 14:54:00 -0800184"Returns compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000185"\n"
Larry Hastingsebdcb502013-11-23 14:54:00 -0800186" bytes\n"
187" Binary data to be compressed.\n"
188" level\n"
189" Compression level, in 0-9.");
190
191#define ZLIB_COMPRESS_METHODDEF \
192 {"compress", (PyCFunction)zlib_compress, METH_VARARGS, zlib_compress__doc__},
Guido van Rossum3c540301997-06-03 22:21:03 +0000193
Guido van Rossumfb221561997-04-29 15:38:09 +0000194static PyObject *
Larry Hastingsebdcb502013-11-23 14:54:00 -0800195zlib_compress_impl(PyModuleDef *module, Py_buffer *bytes, int group_right_1, int level);
196
197static PyObject *
198zlib_compress(PyModuleDef *module, PyObject *args)
199{
200 PyObject *return_value = NULL;
Larry Hastings4a55fc52014-01-12 11:09:57 -0800201 Py_buffer bytes = {NULL, NULL};
Larry Hastingsebdcb502013-11-23 14:54:00 -0800202 int group_right_1 = 0;
203 int level = 0;
204
Larry Hastings2a727912014-01-16 11:32:01 -0800205 switch (PyTuple_GET_SIZE(args)) {
Larry Hastingsebdcb502013-11-23 14:54:00 -0800206 case 1:
207 if (!PyArg_ParseTuple(args, "y*:compress", &bytes))
208 return NULL;
209 break;
210 case 2:
211 if (!PyArg_ParseTuple(args, "y*i:compress", &bytes, &level))
212 return NULL;
213 group_right_1 = 1;
214 break;
215 default:
216 PyErr_SetString(PyExc_TypeError, "zlib.compress requires 1 to 2 arguments");
217 return NULL;
218 }
219 return_value = zlib_compress_impl(module, &bytes, group_right_1, level);
220
221 /* Cleanup for bytes */
Larry Hastings4a55fc52014-01-12 11:09:57 -0800222 if (bytes.obj)
Larry Hastingsebdcb502013-11-23 14:54:00 -0800223 PyBuffer_Release(&bytes);
224
225 return return_value;
226}
227
228static PyObject *
229zlib_compress_impl(PyModuleDef *module, Py_buffer *bytes, int group_right_1, int level)
Larry Hastings2a727912014-01-16 11:32:01 -0800230/*[clinic end generated code: checksum=66c4d16d0b8b9dd423648d9ef00d6a89d3363665]*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000231{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000232 PyObject *ReturnVal = NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200233 Byte *input, *output = NULL;
234 unsigned int length;
Larry Hastingsebdcb502013-11-23 14:54:00 -0800235 int err;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000236 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000237
Larry Hastingsebdcb502013-11-23 14:54:00 -0800238 if (!group_right_1)
239 level = Z_DEFAULT_COMPRESSION;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200240
Larry Hastingsebdcb502013-11-23 14:54:00 -0800241 if ((size_t)bytes->len > UINT_MAX) {
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200242 PyErr_SetString(PyExc_OverflowError,
243 "Size does not fit in an unsigned int");
244 goto error;
245 }
Larry Hastingsebdcb502013-11-23 14:54:00 -0800246 input = bytes->buf;
247 length = (unsigned int)bytes->len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000248
Jeremy Hylton9714f992001-10-16 21:19:45 +0000249 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000250
Victor Stinnerb6404912013-07-07 16:21:41 +0200251 output = (Byte*)PyMem_Malloc(zst.avail_out);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000252 if (output == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000253 PyErr_SetString(PyExc_MemoryError,
254 "Can't allocate memory to compress data");
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200255 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000256 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000257
Jeremy Hylton9714f992001-10-16 21:19:45 +0000258 /* Past the point of no return. From here on out, we need to make sure
259 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000260
Victor Stinner5064a522013-07-07 16:50:27 +0200261 zst.opaque = NULL;
262 zst.zalloc = PyZlib_Malloc;
263 zst.zfree = PyZlib_Free;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000264 zst.next_out = (Byte *)output;
265 zst.next_in = (Byte *)input;
266 zst.avail_in = length;
267 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000268
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000269 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000270 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000271 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000272 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000273 PyErr_SetString(PyExc_MemoryError,
274 "Out of memory while compressing data");
275 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000276 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000277 PyErr_SetString(ZlibError,
278 "Bad compression level");
279 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000280 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000281 deflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000282 zlib_error(zst, err, "while compressing data");
283 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000284 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000285
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000286 Py_BEGIN_ALLOW_THREADS;
287 err = deflate(&zst, Z_FINISH);
288 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000289
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000290 if (err != Z_STREAM_END) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000291 zlib_error(zst, err, "while compressing data");
292 deflateEnd(&zst);
293 goto error;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000294 }
Tim Peters977e5402001-10-17 03:57:20 +0000295
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000296 err=deflateEnd(&zst);
297 if (err == Z_OK)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000298 ReturnVal = PyBytes_FromStringAndSize((char *)output,
Guido van Rossum776152b2007-05-22 22:44:07 +0000299 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000300 else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000301 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000302
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000303 error:
Victor Stinnerb6404912013-07-07 16:21:41 +0200304 PyMem_Free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000305
Jeremy Hylton9714f992001-10-16 21:19:45 +0000306 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000307}
308
Larry Hastings61272b72014-01-07 12:41:53 -0800309/*[python input]
Victor Stinnere079edd2013-11-21 22:33:21 +0100310
311class uint_converter(CConverter):
312 type = 'unsigned int'
313 converter = 'uint_converter'
314
Larry Hastings61272b72014-01-07 12:41:53 -0800315[python start generated code]*/
316/*[python end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
Victor Stinnere079edd2013-11-21 22:33:21 +0100317
318static int
319uint_converter(PyObject *obj, void *ptr)
320{
321 long val;
322 unsigned long uval;
323
324 val = PyLong_AsLong(obj);
325 if (val == -1 && PyErr_Occurred()) {
326 uval = PyLong_AsUnsignedLong(obj);
327 if (uval == (unsigned long)-1 && PyErr_Occurred())
328 return 0;
Victor Stinnere079edd2013-11-21 22:33:21 +0100329 }
330 else {
331 if (val < 0) {
332 PyErr_SetString(PyExc_ValueError,
333 "value must be positive");
334 return 0;
335 }
336 uval = (unsigned long)val;
337 }
338
Victor Stinner5c867332014-01-03 12:26:12 +0100339 if (uval > UINT_MAX) {
340 PyErr_SetString(PyExc_OverflowError,
341 "Python int too large for C unsigned int");
342 return 0;
343 }
344
Victor Stinnere079edd2013-11-21 22:33:21 +0100345 *(unsigned int *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned int);
346 return 1;
347}
348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000349PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000350"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
351"\n"
352"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000353"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000354
Guido van Rossumfb221561997-04-29 15:38:09 +0000355static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000356PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000357{
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200358 PyObject *result_str = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000359 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000360 Byte *input;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200361 unsigned int length;
362 int err;
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000363 int wsize=DEF_WBITS;
Victor Stinnere079edd2013-11-21 22:33:21 +0100364 unsigned int bufsize = DEFAULTALLOC, new_bufsize;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000365 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000366
Victor Stinnere079edd2013-11-21 22:33:21 +0100367 if (!PyArg_ParseTuple(args, "y*|iO&:decompress",
368 &pinput, &wsize, uint_converter, &bufsize))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000369 return NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200370
Victor Stinnere079edd2013-11-21 22:33:21 +0100371 if ((size_t)pinput.len > UINT_MAX) {
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200372 PyErr_SetString(PyExc_OverflowError,
373 "Size does not fit in an unsigned int");
374 goto error;
375 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000376 input = pinput.buf;
Victor Stinner56cb1252012-10-31 00:33:57 +0100377 length = (unsigned int)pinput.len;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000378
Victor Stinnere079edd2013-11-21 22:33:21 +0100379 if (bufsize == 0)
380 bufsize = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000381
Jeremy Hylton9714f992001-10-16 21:19:45 +0000382 zst.avail_in = length;
Victor Stinnere079edd2013-11-21 22:33:21 +0100383 zst.avail_out = bufsize;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000384
Victor Stinnere079edd2013-11-21 22:33:21 +0100385 if (!(result_str = PyBytes_FromStringAndSize(NULL, bufsize)))
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200386 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000387
Victor Stinner5064a522013-07-07 16:50:27 +0200388 zst.opaque = NULL;
389 zst.zalloc = PyZlib_Malloc;
390 zst.zfree = PyZlib_Free;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000391 zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000392 zst.next_in = (Byte *)input;
393 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000394
Jeremy Hylton9714f992001-10-16 21:19:45 +0000395 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000396 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000397 break;
Tim Peters977e5402001-10-17 03:57:20 +0000398 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000399 PyErr_SetString(PyExc_MemoryError,
400 "Out of memory while decompressing data");
401 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000402 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000403 inflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000404 zlib_error(zst, err, "while preparing to decompress data");
405 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000406 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000407
Jeremy Hylton9714f992001-10-16 21:19:45 +0000408 do {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000409 Py_BEGIN_ALLOW_THREADS
410 err=inflate(&zst, Z_FINISH);
411 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000412
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000413 switch(err) {
414 case(Z_STREAM_END):
415 break;
416 case(Z_BUF_ERROR):
417 /*
418 * If there is at least 1 byte of room according to zst.avail_out
419 * and we get this error, assume that it means zlib cannot
420 * process the inflate call() due to an error in the data.
421 */
422 if (zst.avail_out > 0) {
Antoine Pitrou96f212b2010-05-11 23:49:58 +0000423 zlib_error(zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000424 inflateEnd(&zst);
425 goto error;
426 }
427 /* fall through */
428 case(Z_OK):
429 /* need more memory */
Victor Stinnere079edd2013-11-21 22:33:21 +0100430 if (bufsize <= (UINT_MAX >> 1))
431 new_bufsize = bufsize << 1;
432 else
433 new_bufsize = UINT_MAX;
434 if (_PyBytes_Resize(&result_str, new_bufsize) < 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000435 inflateEnd(&zst);
436 goto error;
437 }
438 zst.next_out =
Victor Stinnere079edd2013-11-21 22:33:21 +0100439 (unsigned char *)PyBytes_AS_STRING(result_str) + bufsize;
440 zst.avail_out = bufsize;
441 bufsize = new_bufsize;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000442 break;
443 default:
444 inflateEnd(&zst);
445 zlib_error(zst, err, "while decompressing data");
446 goto error;
447 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000448 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000449
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000450 err = inflateEnd(&zst);
451 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200452 zlib_error(zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000453 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000454 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000455
Gregory P. Smith693fc462008-09-06 20:13:06 +0000456 if (_PyBytes_Resize(&result_str, zst.total_out) < 0)
Guido van Rossum776152b2007-05-22 22:44:07 +0000457 goto error;
458
Martin v. Löwis423be952008-08-13 15:53:07 +0000459 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000460 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000461
462 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000463 PyBuffer_Release(&pinput);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000464 Py_XDECREF(result_str);
465 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000466}
467
468static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200469PyZlib_compressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000470{
Victor Stinnere079edd2013-11-21 22:33:21 +0100471 compobject *self = NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000472 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
473 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200474 Py_buffer zdict;
475 static char *kwlist[] = {"level", "method", "wbits",
476 "memLevel", "strategy", "zdict", NULL};
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000477
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200478 zdict.buf = NULL; /* Sentinel, so we can tell whether zdict was supplied. */
479 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiiiy*:compressobj",
480 kwlist, &level, &method, &wbits,
481 &memLevel, &strategy, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000482 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000483
Victor Stinnere079edd2013-11-21 22:33:21 +0100484 if (zdict.buf != NULL && (size_t)zdict.len > UINT_MAX) {
485 PyErr_SetString(PyExc_OverflowError,
486 "zdict length does not fit in an unsigned int");
487 goto error;
488 }
489
Jeremy Hylton499000002001-10-16 21:59:35 +0000490 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000491 if (self==NULL)
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200492 goto error;
Victor Stinner5064a522013-07-07 16:50:27 +0200493 self->zst.opaque = NULL;
494 self->zst.zalloc = PyZlib_Malloc;
495 self->zst.zfree = PyZlib_Free;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000496 self->zst.next_in = NULL;
497 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000498 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
499 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000500 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000501 self->is_initialised = 1;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200502 if (zdict.buf == NULL) {
503 goto success;
504 } else {
Victor Stinnere079edd2013-11-21 22:33:21 +0100505 err = deflateSetDictionary(&self->zst,
506 zdict.buf, (unsigned int)zdict.len);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200507 switch (err) {
508 case (Z_OK):
509 goto success;
510 case (Z_STREAM_ERROR):
511 PyErr_SetString(PyExc_ValueError, "Invalid dictionary");
512 goto error;
513 default:
514 PyErr_SetString(PyExc_ValueError, "deflateSetDictionary()");
515 goto error;
516 }
517 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000518 case (Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000519 PyErr_SetString(PyExc_MemoryError,
520 "Can't allocate memory for compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200521 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000522 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000523 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200524 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000525 default:
526 zlib_error(self->zst, err, "while creating compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200527 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000528 }
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200529
530 error:
531 Py_XDECREF(self);
532 self = NULL;
533 success:
534 if (zdict.buf != NULL)
535 PyBuffer_Release(&zdict);
536 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000537}
538
539static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200540PyZlib_decompressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000541{
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200542 static char *kwlist[] = {"wbits", "zdict", NULL};
Jeremy Hylton499000002001-10-16 21:59:35 +0000543 int wbits=DEF_WBITS, err;
544 compobject *self;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200545 PyObject *zdict=NULL;
546
547 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iO:decompressobj",
548 kwlist, &wbits, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000549 return NULL;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200550 if (zdict != NULL && !PyObject_CheckBuffer(zdict)) {
551 PyErr_SetString(PyExc_TypeError,
552 "zdict argument must support the buffer protocol");
553 return NULL;
554 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000555
556 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000557 if (self == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000558 return(NULL);
Victor Stinner5064a522013-07-07 16:50:27 +0200559 self->zst.opaque = NULL;
560 self->zst.zalloc = PyZlib_Malloc;
561 self->zst.zfree = PyZlib_Free;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000562 self->zst.next_in = NULL;
563 self->zst.avail_in = 0;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200564 if (zdict != NULL) {
565 Py_INCREF(zdict);
566 self->zdict = zdict;
567 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000568 err = inflateInit2(&self->zst, wbits);
569 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000570 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000571 self->is_initialised = 1;
572 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000573 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000574 Py_DECREF(self);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000575 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
576 return NULL;
577 case (Z_MEM_ERROR):
578 Py_DECREF(self);
579 PyErr_SetString(PyExc_MemoryError,
580 "Can't allocate memory for decompression object");
581 return NULL;
582 default:
583 zlib_error(self->zst, err, "while creating decompression object");
584 Py_DECREF(self);
585 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000586 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000587}
588
589static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000590Dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000591{
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000592#ifdef WITH_THREAD
593 PyThread_free_lock(self->lock);
594#endif
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000595 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000596 Py_XDECREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200597 Py_XDECREF(self->zdict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000598 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000599}
600
601static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000602Comp_dealloc(compobject *self)
603{
604 if (self->is_initialised)
605 deflateEnd(&self->zst);
606 Dealloc(self);
607}
608
609static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000610Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000611{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000612 if (self->is_initialised)
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000613 inflateEnd(&self->zst);
614 Dealloc(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000615}
616
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000617PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000618"compress(data) -- Return a string containing data compressed.\n"
619"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000620"After calling this function, some of the input data may still\n"
621"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000622"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000623
624
Guido van Rossumfb221561997-04-29 15:38:09 +0000625static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000626PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000627{
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200628 int err;
629 unsigned int inplen;
Victor Stinnere079edd2013-11-21 22:33:21 +0100630 unsigned int length = DEFAULTALLOC, new_length;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200631 PyObject *RetVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000632 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000633 Byte *input;
634 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000635
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000636 if (!PyArg_ParseTuple(args, "y*:compress", &pinput))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000637 return NULL;
Victor Stinnere079edd2013-11-21 22:33:21 +0100638 if ((size_t)pinput.len > UINT_MAX) {
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200639 PyErr_SetString(PyExc_OverflowError,
640 "Size does not fit in an unsigned int");
641 goto error_outer;
642 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000643 input = pinput.buf;
Victor Stinnere079edd2013-11-21 22:33:21 +0100644 inplen = (unsigned int)pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000645
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200646 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
647 goto error_outer;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000648
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000649 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000650
Jeremy Hylton9714f992001-10-16 21:19:45 +0000651 start_total_out = self->zst.total_out;
652 self->zst.avail_in = inplen;
653 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000654 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000655 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000656
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000657 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000658 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000659 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000660
Jeremy Hylton9714f992001-10-16 21:19:45 +0000661 /* while Z_OK and the output buffer is full, there might be more output,
662 so extend the output buffer and try again */
663 while (err == Z_OK && self->zst.avail_out == 0) {
Victor Stinnere079edd2013-11-21 22:33:21 +0100664 if (length <= (UINT_MAX >> 1))
665 new_length = length << 1;
666 else
667 new_length = UINT_MAX;
668 if (_PyBytes_Resize(&RetVal, new_length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200669 Py_CLEAR(RetVal);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000670 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000671 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000672 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000673 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000674 self->zst.avail_out = length;
Victor Stinnere079edd2013-11-21 22:33:21 +0100675 length = new_length;
Tim Peters977e5402001-10-17 03:57:20 +0000676
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000677 Py_BEGIN_ALLOW_THREADS
678 err = deflate(&(self->zst), Z_NO_FLUSH);
679 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000680 }
Tim Peters977e5402001-10-17 03:57:20 +0000681 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000682 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000683 condition.
684 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000685
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000686 if (err != Z_OK && err != Z_BUF_ERROR) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200687 zlib_error(self->zst, err, "while compressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000688 Py_DECREF(RetVal);
689 RetVal = NULL;
690 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000691 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000692 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200693 Py_CLEAR(RetVal);
Guido van Rossum776152b2007-05-22 22:44:07 +0000694 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000695
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000696 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000697 LEAVE_ZLIB(self);
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200698 error_outer:
Martin v. Löwis423be952008-08-13 15:53:07 +0000699 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000700 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000701}
702
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100703/* Helper for objdecompress() and unflush(). Saves any unconsumed input data in
704 self->unused_data or self->unconsumed_tail, as appropriate. */
705static int
706save_unconsumed_input(compobject *self, int err)
707{
708 if (err == Z_STREAM_END) {
709 /* The end of the compressed data has been reached. Store the leftover
710 input data in self->unused_data. */
711 if (self->zst.avail_in > 0) {
712 Py_ssize_t old_size = PyBytes_GET_SIZE(self->unused_data);
713 Py_ssize_t new_size;
714 PyObject *new_data;
Victor Stinnere079edd2013-11-21 22:33:21 +0100715 if ((size_t)self->zst.avail_in > (size_t)UINT_MAX - (size_t)old_size) {
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100716 PyErr_NoMemory();
717 return -1;
718 }
719 new_size = old_size + self->zst.avail_in;
720 new_data = PyBytes_FromStringAndSize(NULL, new_size);
721 if (new_data == NULL)
722 return -1;
723 Py_MEMCPY(PyBytes_AS_STRING(new_data),
724 PyBytes_AS_STRING(self->unused_data), old_size);
725 Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size,
726 self->zst.next_in, self->zst.avail_in);
727 Py_DECREF(self->unused_data);
728 self->unused_data = new_data;
729 self->zst.avail_in = 0;
730 }
731 }
732 if (self->zst.avail_in > 0 || PyBytes_GET_SIZE(self->unconsumed_tail)) {
733 /* This code handles two distinct cases:
734 1. Output limit was reached. Save leftover input in unconsumed_tail.
735 2. All input data was consumed. Clear unconsumed_tail. */
736 PyObject *new_data = PyBytes_FromStringAndSize(
737 (char *)self->zst.next_in, self->zst.avail_in);
738 if (new_data == NULL)
739 return -1;
740 Py_DECREF(self->unconsumed_tail);
741 self->unconsumed_tail = new_data;
742 }
743 return 0;
744}
745
Larry Hastings61272b72014-01-07 12:41:53 -0800746/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800747
Larry Hastingsed4a1c52013-11-18 09:32:13 -0800748zlib.Decompress.decompress
Larry Hastings31826802013-10-19 00:09:25 -0700749
Larry Hastings78cf85c2014-01-04 12:44:57 -0800750 self: self(type="compobject *")
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800751
Larry Hastings31826802013-10-19 00:09:25 -0700752 data: Py_buffer
753 The binary data to decompress.
Victor Stinnere079edd2013-11-21 22:33:21 +0100754 max_length: uint = 0
Larry Hastings31826802013-10-19 00:09:25 -0700755 The maximum allowable length of the decompressed data.
756 Unconsumed input data will be stored in
757 the unconsumed_tail attribute.
758 /
759
760Return a string containing the decompressed version of the data.
761
762After calling this function, some of the input data may still be stored in
763internal buffers for later processing.
764Call the flush() method to clear these buffers.
Larry Hastings61272b72014-01-07 12:41:53 -0800765[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700766
Larry Hastingsed4a1c52013-11-18 09:32:13 -0800767PyDoc_STRVAR(zlib_Decompress_decompress__doc__,
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800768"decompress(data, max_length=0)\n"
Larry Hastings31826802013-10-19 00:09:25 -0700769"Return a string containing the decompressed version of the data.\n"
770"\n"
Larry Hastings31826802013-10-19 00:09:25 -0700771" data\n"
772" The binary data to decompress.\n"
773" max_length\n"
774" The maximum allowable length of the decompressed data.\n"
775" Unconsumed input data will be stored in\n"
776" the unconsumed_tail attribute.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000777"\n"
778"After calling this function, some of the input data may still be stored in\n"
779"internal buffers for later processing.\n"
Larry Hastings31826802013-10-19 00:09:25 -0700780"Call the flush() method to clear these buffers.");
781
Larry Hastingsed4a1c52013-11-18 09:32:13 -0800782#define ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF \
783 {"decompress", (PyCFunction)zlib_Decompress_decompress, METH_VARARGS, zlib_Decompress_decompress__doc__},
Guido van Rossum3c540301997-06-03 22:21:03 +0000784
Guido van Rossumfb221561997-04-29 15:38:09 +0000785static PyObject *
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800786zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, unsigned int max_length);
Larry Hastings31826802013-10-19 00:09:25 -0700787
788static PyObject *
Larry Hastingsed4a1c52013-11-18 09:32:13 -0800789zlib_Decompress_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000790{
Larry Hastings31826802013-10-19 00:09:25 -0700791 PyObject *return_value = NULL;
Larry Hastings4a55fc52014-01-12 11:09:57 -0800792 Py_buffer data = {NULL, NULL};
Victor Stinnere079edd2013-11-21 22:33:21 +0100793 unsigned int max_length = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700794
795 if (!PyArg_ParseTuple(args,
Victor Stinnere079edd2013-11-21 22:33:21 +0100796 "y*|O&:decompress",
797 &data, uint_converter, &max_length))
Larry Hastings31826802013-10-19 00:09:25 -0700798 goto exit;
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800799 return_value = zlib_Decompress_decompress_impl((compobject *)self, &data, max_length);
Larry Hastings31826802013-10-19 00:09:25 -0700800
801exit:
802 /* Cleanup for data */
Larry Hastings4a55fc52014-01-12 11:09:57 -0800803 if (data.obj)
Larry Hastingsebdcb502013-11-23 14:54:00 -0800804 PyBuffer_Release(&data);
Larry Hastings31826802013-10-19 00:09:25 -0700805
806 return return_value;
807}
808
809static PyObject *
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800810zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, unsigned int max_length)
Larry Hastings4a55fc52014-01-12 11:09:57 -0800811/*[clinic end generated code: checksum=e0058024c4a97b411d2e2197791b89fde175f76f]*/
Larry Hastings31826802013-10-19 00:09:25 -0700812{
Larry Hastings31826802013-10-19 00:09:25 -0700813 int err;
Victor Stinnere079edd2013-11-21 22:33:21 +0100814 unsigned int old_length, length = DEFAULTALLOC;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200815 PyObject *RetVal = NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000816 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000817
Victor Stinnere079edd2013-11-21 22:33:21 +0100818 if ((size_t)data->len > UINT_MAX) {
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200819 PyErr_SetString(PyExc_OverflowError,
820 "Size does not fit in an unsigned int");
Larry Hastings31826802013-10-19 00:09:25 -0700821 return NULL;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200822 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000823
Jeremy Hylton9714f992001-10-16 21:19:45 +0000824 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000825 if (max_length && length > max_length)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000826 length = max_length;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200827 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Larry Hastings31826802013-10-19 00:09:25 -0700828 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000829
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800830 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000831
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800832 start_total_out = self->zst.total_out;
833 self->zst.avail_in = (unsigned int)data->len;
834 self->zst.next_in = data->buf;
835 self->zst.avail_out = length;
836 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000837
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000838 Py_BEGIN_ALLOW_THREADS
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800839 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000840 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000841
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800842 if (err == Z_NEED_DICT && self->zdict != NULL) {
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200843 Py_buffer zdict_buf;
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800844 if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200845 Py_DECREF(RetVal);
846 RetVal = NULL;
847 goto error;
848 }
Victor Stinnere079edd2013-11-21 22:33:21 +0100849
850 if ((size_t)zdict_buf.len > UINT_MAX) {
851 PyErr_SetString(PyExc_OverflowError,
852 "zdict length does not fit in an unsigned int");
853 PyBuffer_Release(&zdict_buf);
854 Py_CLEAR(RetVal);
855 goto error;
856 }
857
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800858 err = inflateSetDictionary(&(self->zst),
Victor Stinnere079edd2013-11-21 22:33:21 +0100859 zdict_buf.buf, (unsigned int)zdict_buf.len);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200860 PyBuffer_Release(&zdict_buf);
861 if (err != Z_OK) {
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800862 zlib_error(self->zst, err, "while decompressing data");
Victor Stinnere079edd2013-11-21 22:33:21 +0100863 Py_CLEAR(RetVal);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200864 goto error;
865 }
Nadeem Vawdacf5e1d82012-06-22 00:35:57 +0200866 /* Repeat the call to inflate. */
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200867 Py_BEGIN_ALLOW_THREADS
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800868 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200869 Py_END_ALLOW_THREADS
870 }
871
Jeremy Hylton9714f992001-10-16 21:19:45 +0000872 /* While Z_OK and the output buffer is full, there might be more output.
873 So extend the output buffer and try again.
874 */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800875 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000876 /* If max_length set, don't continue decompressing if we've already
877 reached the limit.
878 */
879 if (max_length && length >= max_length)
880 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000881
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000882 /* otherwise, ... */
883 old_length = length;
884 length = length << 1;
885 if (max_length && length > max_length)
886 length = max_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000887
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000888 if (_PyBytes_Resize(&RetVal, length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200889 Py_CLEAR(RetVal);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000890 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000891 }
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800892 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000893 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800894 self->zst.avail_out = length - old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000895
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000896 Py_BEGIN_ALLOW_THREADS
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800897 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000898 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000899 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000900
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800901 if (save_unconsumed_input(self, err) < 0) {
Nadeem Vawda7619e882011-05-14 14:05:20 +0200902 Py_DECREF(RetVal);
903 RetVal = NULL;
904 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000905 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000906
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000907 if (err == Z_STREAM_END) {
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100908 /* This is the logical place to call inflateEnd, but the old behaviour
909 of only calling it on flush() is preserved. */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800910 self->eof = 1;
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100911 } else if (err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000912 /* We will only get Z_BUF_ERROR if the output buffer was full
913 but there wasn't more output when we tried again, so it is
914 not an error condition.
915 */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800916 zlib_error(self->zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000917 Py_DECREF(RetVal);
918 RetVal = NULL;
919 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000920 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000921
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800922 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200923 Py_CLEAR(RetVal);
Guido van Rossum776152b2007-05-22 22:44:07 +0000924 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000925
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000926 error:
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800927 LEAVE_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000928 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000929}
930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000931PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000932"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000933"\n"
934"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000935"default value used when mode is not specified is Z_FINISH.\n"
936"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000937"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000938
Guido van Rossumfb221561997-04-29 15:38:09 +0000939static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000940PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000941{
Victor Stinnere079edd2013-11-21 22:33:21 +0100942 int err;
943 unsigned int length = DEFAULTALLOC, new_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000944 PyObject *RetVal;
945 int flushmode = Z_FINISH;
946 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000947
Jeremy Hylton9714f992001-10-16 21:19:45 +0000948 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000949 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000950
Jeremy Hylton9714f992001-10-16 21:19:45 +0000951 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
952 doing any work at all; just return an empty string. */
953 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000954 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000955 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000956
Gregory P. Smith693fc462008-09-06 20:13:06 +0000957 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000958 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000959
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000960 ENTER_ZLIB(self);
Tim Peters977e5402001-10-17 03:57:20 +0000961
Jeremy Hylton9714f992001-10-16 21:19:45 +0000962 start_total_out = self->zst.total_out;
963 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000964 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000965 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000966
967 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000968 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000969 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000970
Jeremy Hylton9714f992001-10-16 21:19:45 +0000971 /* while Z_OK and the output buffer is full, there might be more output,
972 so extend the output buffer and try again */
973 while (err == Z_OK && self->zst.avail_out == 0) {
Victor Stinnere079edd2013-11-21 22:33:21 +0100974 if (length <= (UINT_MAX >> 1))
975 new_length = length << 1;
976 else
977 new_length = UINT_MAX;
978 if (_PyBytes_Resize(&RetVal, new_length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200979 Py_CLEAR(RetVal);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000980 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000981 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000982 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000983 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000984 self->zst.avail_out = length;
Victor Stinnere079edd2013-11-21 22:33:21 +0100985 length = new_length;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000986
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000987 Py_BEGIN_ALLOW_THREADS
988 err = deflate(&(self->zst), flushmode);
989 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000990 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000991
Jeremy Hylton9714f992001-10-16 21:19:45 +0000992 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000993 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000994 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000995 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000996 err = deflateEnd(&(self->zst));
997 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200998 zlib_error(self->zst, err, "while finishing compression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000999 Py_DECREF(RetVal);
1000 RetVal = NULL;
1001 goto error;
1002 }
1003 else
1004 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +00001005
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001006 /* We will only get Z_BUF_ERROR if the output buffer was full
1007 but there wasn't more output when we tried again, so it is
1008 not an error condition.
1009 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +00001010 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001011 zlib_error(self->zst, err, "while flushing");
1012 Py_DECREF(RetVal);
1013 RetVal = NULL;
1014 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +00001015 }
Tim Peters977e5402001-10-17 03:57:20 +00001016
Gregory P. Smith693fc462008-09-06 20:13:06 +00001017 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +02001018 Py_CLEAR(RetVal);
Guido van Rossum776152b2007-05-22 22:44:07 +00001019 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001020
Tim Peters977e5402001-10-17 03:57:20 +00001021 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001022 LEAVE_ZLIB(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +00001023
1024 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +00001025}
1026
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001027#ifdef HAVE_ZLIB_COPY
Larry Hastings31826802013-10-19 00:09:25 -07001028
Larry Hastings61272b72014-01-07 12:41:53 -08001029/*[clinic input]
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001030zlib.Compress.copy
Larry Hastings31826802013-10-19 00:09:25 -07001031
Larry Hastings78cf85c2014-01-04 12:44:57 -08001032 self: self(type="compobject *")
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001033
Larry Hastings31826802013-10-19 00:09:25 -07001034Return a copy of the compression object.
Larry Hastings61272b72014-01-07 12:41:53 -08001035[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07001036
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001037PyDoc_STRVAR(zlib_Compress_copy__doc__,
Larry Hastings44e2eaa2013-11-23 15:37:55 -08001038"copy()\n"
1039"Return a copy of the compression object.");
Larry Hastings31826802013-10-19 00:09:25 -07001040
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001041#define ZLIB_COMPRESS_COPY_METHODDEF \
1042 {"copy", (PyCFunction)zlib_Compress_copy, METH_NOARGS, zlib_Compress_copy__doc__},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001043
1044static PyObject *
Larry Hastings3cceb382014-01-04 11:09:09 -08001045zlib_Compress_copy_impl(compobject *self);
1046
1047static PyObject *
1048zlib_Compress_copy(PyObject *self, PyObject *Py_UNUSED(ignored))
1049{
Larry Hastingsbebf7352014-01-17 17:47:17 -08001050 return zlib_Compress_copy_impl((compobject *)self);
Larry Hastings3cceb382014-01-04 11:09:09 -08001051}
1052
1053static PyObject *
1054zlib_Compress_copy_impl(compobject *self)
Larry Hastingsbebf7352014-01-17 17:47:17 -08001055/*[clinic end generated code: checksum=d57a7911deb7940e85a8d7e65af20b6e2df69000]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001056{
1057 compobject *retval = NULL;
1058 int err;
1059
1060 retval = newcompobject(&Comptype);
1061 if (!retval) return NULL;
1062
1063 /* Copy the zstream state
1064 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1065 */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001066 ENTER_ZLIB(self);
1067 err = deflateCopy(&retval->zst, &self->zst);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001068 switch(err) {
1069 case(Z_OK):
1070 break;
1071 case(Z_STREAM_ERROR):
1072 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1073 goto error;
1074 case(Z_MEM_ERROR):
1075 PyErr_SetString(PyExc_MemoryError,
1076 "Can't allocate memory for compression object");
1077 goto error;
1078 default:
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001079 zlib_error(self->zst, err, "while copying compression object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001080 goto error;
1081 }
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001082 Py_INCREF(self->unused_data);
1083 Py_INCREF(self->unconsumed_tail);
1084 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001085 Py_XDECREF(retval->unused_data);
1086 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001087 Py_XDECREF(retval->zdict);
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001088 retval->unused_data = self->unused_data;
1089 retval->unconsumed_tail = self->unconsumed_tail;
1090 retval->zdict = self->zdict;
1091 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001092
1093 /* Mark it as being initialized */
1094 retval->is_initialised = 1;
1095
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001096 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001097 return (PyObject *)retval;
1098
1099error:
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001100 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001101 Py_XDECREF(retval);
1102 return NULL;
1103}
1104
1105PyDoc_STRVAR(decomp_copy__doc__,
1106"copy() -- Return a copy of the decompression object.");
1107
1108static PyObject *
1109PyZlib_uncopy(compobject *self)
1110{
1111 compobject *retval = NULL;
1112 int err;
1113
1114 retval = newcompobject(&Decomptype);
1115 if (!retval) return NULL;
1116
1117 /* Copy the zstream state
1118 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1119 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001120 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001121 err = inflateCopy(&retval->zst, &self->zst);
1122 switch(err) {
1123 case(Z_OK):
1124 break;
1125 case(Z_STREAM_ERROR):
1126 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1127 goto error;
1128 case(Z_MEM_ERROR):
1129 PyErr_SetString(PyExc_MemoryError,
1130 "Can't allocate memory for decompression object");
1131 goto error;
1132 default:
1133 zlib_error(self->zst, err, "while copying decompression object");
1134 goto error;
1135 }
1136
1137 Py_INCREF(self->unused_data);
1138 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001139 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001140 Py_XDECREF(retval->unused_data);
1141 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001142 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001143 retval->unused_data = self->unused_data;
1144 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001145 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +02001146 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001147
1148 /* Mark it as being initialized */
1149 retval->is_initialised = 1;
1150
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001151 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001152 return (PyObject *)retval;
1153
1154error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001155 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001156 Py_XDECREF(retval);
1157 return NULL;
1158}
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001159#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001160
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001161PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001162"flush( [length] ) -- Return a string containing any remaining\n"
1163"decompressed data. length, if given, is the initial size of the\n"
1164"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001165"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001166"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +00001167
Guido van Rossumfb221561997-04-29 15:38:09 +00001168static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001169PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001170{
Victor Stinnere079edd2013-11-21 22:33:21 +01001171 int err;
1172 unsigned int length = DEFAULTALLOC, new_length;
Jeremy Hylton9d620d02001-10-16 23:02:32 +00001173 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001174 unsigned long start_total_out;
Victor Stinnere079edd2013-11-21 22:33:21 +01001175 Py_ssize_t size;
Tim Peters977e5402001-10-17 03:57:20 +00001176
Victor Stinnere079edd2013-11-21 22:33:21 +01001177 if (!PyArg_ParseTuple(args, "|O&:flush", uint_converter, &length))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001178 return NULL;
Victor Stinnere079edd2013-11-21 22:33:21 +01001179 if (length == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001180 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
1181 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +00001182 }
Victor Stinnere079edd2013-11-21 22:33:21 +01001183
Gregory P. Smith693fc462008-09-06 20:13:06 +00001184 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001185 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001186
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001187
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001188 ENTER_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001189
Victor Stinnere079edd2013-11-21 22:33:21 +01001190 size = PyBytes_GET_SIZE(self->unconsumed_tail);
1191
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001192 start_total_out = self->zst.total_out;
Victor Stinnere079edd2013-11-21 22:33:21 +01001193 /* save_unconsumed_input() ensures that unconsumed_tail length is lesser
1194 or equal than UINT_MAX */
1195 self->zst.avail_in = Py_SAFE_DOWNCAST(size, Py_ssize_t, unsigned int);
Nadeem Vawda7ee95552012-11-11 03:15:32 +01001196 self->zst.next_in = (Byte *)PyBytes_AS_STRING(self->unconsumed_tail);
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001197 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +00001198 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001199
1200 Py_BEGIN_ALLOW_THREADS
1201 err = inflate(&(self->zst), Z_FINISH);
1202 Py_END_ALLOW_THREADS
1203
1204 /* while Z_OK and the output buffer is full, there might be more output,
1205 so extend the output buffer and try again */
1206 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Victor Stinnere079edd2013-11-21 22:33:21 +01001207 if (length <= (UINT_MAX >> 1))
1208 new_length = length << 1;
1209 else
1210 new_length = UINT_MAX;
1211 if (_PyBytes_Resize(&retval, new_length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +02001212 Py_CLEAR(retval);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001213 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +00001214 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001215 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
1216 self->zst.avail_out = length;
Victor Stinnere079edd2013-11-21 22:33:21 +01001217 length = new_length;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001218
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001219 Py_BEGIN_ALLOW_THREADS
1220 err = inflate(&(self->zst), Z_FINISH);
1221 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +00001222 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001223
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001224 if (save_unconsumed_input(self, err) < 0) {
1225 Py_DECREF(retval);
1226 retval = NULL;
1227 goto error;
1228 }
1229
Nadeem Vawda3bf71c52011-08-13 15:42:50 +02001230 /* If at end of stream, clean up any memory allocated by zlib. */
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001231 if (err == Z_STREAM_END) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001232 self->eof = 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001233 self->is_initialised = 0;
Nadeem Vawda1c385462011-08-13 15:22:40 +02001234 err = inflateEnd(&(self->zst));
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001235 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001236 zlib_error(self->zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001237 Py_DECREF(retval);
1238 retval = NULL;
1239 goto error;
1240 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001241 }
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001242
Gregory P. Smith693fc462008-09-06 20:13:06 +00001243 if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +02001244 Py_CLEAR(retval);
Guido van Rossum776152b2007-05-22 22:44:07 +00001245 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001246
1247error:
1248
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001249 LEAVE_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001250
Jeremy Hylton9714f992001-10-16 21:19:45 +00001251 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +00001252}
1253
1254static PyMethodDef comp_methods[] =
1255{
Tim Peters977e5402001-10-17 03:57:20 +00001256 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001257 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001258 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001259 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001260#ifdef HAVE_ZLIB_COPY
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001261 ZLIB_COMPRESS_COPY_METHODDEF
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001262#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001263 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001264};
1265
1266static PyMethodDef Decomp_methods[] =
1267{
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001268 ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF
Tim Peters977e5402001-10-17 03:57:20 +00001269 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001270 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001271#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001272 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
1273 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001274#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001275 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001276};
1277
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001278#define COMP_OFF(x) offsetof(compobject, x)
1279static PyMemberDef Decomp_members[] = {
1280 {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
1281 {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
Nadeem Vawda1c385462011-08-13 15:22:40 +02001282 {"eof", T_BOOL, COMP_OFF(eof), READONLY},
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001283 {NULL},
1284};
Guido van Rossumfb221561997-04-29 15:38:09 +00001285
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001286PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001287"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
1288"\n"
1289"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001290"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +00001291
Guido van Rossumfb221561997-04-29 15:38:09 +00001292static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001293PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001294{
Christian Heimescc47b052008-03-25 14:56:36 +00001295 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001296 Py_buffer pbuf;
Tim Peters977e5402001-10-17 03:57:20 +00001297
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001298 if (!PyArg_ParseTuple(args, "y*|I:adler32", &pbuf, &adler32val))
1299 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001300 /* Releasing the GIL for very small buffers is inefficient
1301 and may lower performance */
1302 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001303 unsigned char *buf = pbuf.buf;
1304 Py_ssize_t len = pbuf.len;
1305
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001306 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001307 /* Avoid truncation of length for very large buffers. adler32() takes
1308 length as an unsigned int, which may be narrower than Py_ssize_t. */
Victor Stinnere079edd2013-11-21 22:33:21 +01001309 while ((size_t)len > UINT_MAX) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001310 adler32val = adler32(adler32val, buf, UINT_MAX);
1311 buf += (size_t) UINT_MAX;
1312 len -= (size_t) UINT_MAX;
1313 }
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001314 adler32val = adler32(adler32val, buf, (unsigned int)len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001315 Py_END_ALLOW_THREADS
1316 } else {
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001317 adler32val = adler32(adler32val, pbuf.buf, (unsigned int)pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001318 }
1319 PyBuffer_Release(&pbuf);
Gregory P. Smith27275032008-03-20 06:20:09 +00001320 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001321}
Tim Peters977e5402001-10-17 03:57:20 +00001322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001323PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001324"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
1325"\n"
1326"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001327"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +00001328
1329static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001330PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001331{
Christian Heimescc47b052008-03-25 14:56:36 +00001332 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +00001333 Py_buffer pbuf;
1334 int signed_val;
Christian Heimescc47b052008-03-25 14:56:36 +00001335
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001336 if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001337 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001338 /* Releasing the GIL for very small buffers is inefficient
1339 and may lower performance */
1340 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001341 unsigned char *buf = pbuf.buf;
1342 Py_ssize_t len = pbuf.len;
1343
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001344 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001345 /* Avoid truncation of length for very large buffers. crc32() takes
1346 length as an unsigned int, which may be narrower than Py_ssize_t. */
Victor Stinnere079edd2013-11-21 22:33:21 +01001347 while ((size_t)len > UINT_MAX) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001348 crc32val = crc32(crc32val, buf, UINT_MAX);
1349 buf += (size_t) UINT_MAX;
1350 len -= (size_t) UINT_MAX;
1351 }
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001352 signed_val = crc32(crc32val, buf, (unsigned int)len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001353 Py_END_ALLOW_THREADS
1354 } else {
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001355 signed_val = crc32(crc32val, pbuf.buf, (unsigned int)pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001356 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001357 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +00001358 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001359}
Tim Peters977e5402001-10-17 03:57:20 +00001360
Guido van Rossumfb221561997-04-29 15:38:09 +00001361
1362static PyMethodDef zlib_methods[] =
1363{
Tim Peters977e5402001-10-17 03:57:20 +00001364 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001365 adler32__doc__},
Larry Hastingsebdcb502013-11-23 14:54:00 -08001366 ZLIB_COMPRESS_METHODDEF
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001367 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001368 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001369 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
1370 crc32__doc__},
1371 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001372 decompress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001373 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001374 decompressobj__doc__},
1375 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001376};
1377
Tim Peters0c322792002-07-17 16:49:03 +00001378static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001379 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001380 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001381 sizeof(compobject),
1382 0,
1383 (destructor)Comp_dealloc, /*tp_dealloc*/
1384 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001385 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001386 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001387 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001388 0, /*tp_repr*/
1389 0, /*tp_as_number*/
1390 0, /*tp_as_sequence*/
1391 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001392 0, /*tp_hash*/
1393 0, /*tp_call*/
1394 0, /*tp_str*/
1395 0, /*tp_getattro*/
1396 0, /*tp_setattro*/
1397 0, /*tp_as_buffer*/
1398 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1399 0, /*tp_doc*/
1400 0, /*tp_traverse*/
1401 0, /*tp_clear*/
1402 0, /*tp_richcompare*/
1403 0, /*tp_weaklistoffset*/
1404 0, /*tp_iter*/
1405 0, /*tp_iternext*/
1406 comp_methods, /*tp_methods*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001407};
1408
Tim Peters0c322792002-07-17 16:49:03 +00001409static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001410 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001411 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001412 sizeof(compobject),
1413 0,
1414 (destructor)Decomp_dealloc, /*tp_dealloc*/
1415 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001416 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001417 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001418 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001419 0, /*tp_repr*/
1420 0, /*tp_as_number*/
1421 0, /*tp_as_sequence*/
1422 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001423 0, /*tp_hash*/
1424 0, /*tp_call*/
1425 0, /*tp_str*/
1426 0, /*tp_getattro*/
1427 0, /*tp_setattro*/
1428 0, /*tp_as_buffer*/
1429 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1430 0, /*tp_doc*/
1431 0, /*tp_traverse*/
1432 0, /*tp_clear*/
1433 0, /*tp_richcompare*/
1434 0, /*tp_weaklistoffset*/
1435 0, /*tp_iter*/
1436 0, /*tp_iternext*/
1437 Decomp_methods, /*tp_methods*/
1438 Decomp_members, /*tp_members*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001439};
1440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001441PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001442"The functions in this module allow compression and decompression using the\n"
1443"zlib library, which is based on GNU zip.\n"
1444"\n"
1445"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
Nadeem Vawda19e568d2012-11-11 14:04:14 +01001446"compress(string[, level]) -- Compress string, with compression level in 0-9.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001447"compressobj([level[, ...]]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001448"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001449"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001450"decompressobj([wbits[, zdict]]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001451"\n"
1452"'wbits' is window buffer size.\n"
1453"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001454"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001455
Martin v. Löwis1a214512008-06-11 05:26:20 +00001456static struct PyModuleDef zlibmodule = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001457 PyModuleDef_HEAD_INIT,
1458 "zlib",
1459 zlib_module_documentation,
1460 -1,
1461 zlib_methods,
1462 NULL,
1463 NULL,
1464 NULL,
1465 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001466};
1467
Mark Hammond62b1ab12002-07-23 06:31:15 +00001468PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001469PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001470{
Fred Drake4baedc12002-04-01 14:53:37 +00001471 PyObject *m, *ver;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001472 if (PyType_Ready(&Comptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001473 return NULL;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001474 if (PyType_Ready(&Decomptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001475 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001476 m = PyModule_Create(&zlibmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001477 if (m == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001478 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001479
Fred Drake4baedc12002-04-01 14:53:37 +00001480 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1481 if (ZlibError != NULL) {
1482 Py_INCREF(ZlibError);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001483 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001484 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02001485 PyModule_AddIntMacro(m, MAX_WBITS);
1486 PyModule_AddIntMacro(m, DEFLATED);
1487 PyModule_AddIntMacro(m, DEF_MEM_LEVEL);
1488 PyModule_AddIntMacro(m, Z_BEST_SPEED);
1489 PyModule_AddIntMacro(m, Z_BEST_COMPRESSION);
1490 PyModule_AddIntMacro(m, Z_DEFAULT_COMPRESSION);
1491 PyModule_AddIntMacro(m, Z_FILTERED);
1492 PyModule_AddIntMacro(m, Z_HUFFMAN_ONLY);
1493 PyModule_AddIntMacro(m, Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001494
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02001495 PyModule_AddIntMacro(m, Z_FINISH);
1496 PyModule_AddIntMacro(m, Z_NO_FLUSH);
1497 PyModule_AddIntMacro(m, Z_SYNC_FLUSH);
1498 PyModule_AddIntMacro(m, Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001499
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001500 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001501 if (ver != NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001502 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001503
Nadeem Vawda64d25dd2011-09-12 00:04:13 +02001504 ver = PyUnicode_FromString(zlibVersion());
1505 if (ver != NULL)
1506 PyModule_AddObject(m, "ZLIB_RUNTIME_VERSION", ver);
1507
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001508 PyModule_AddStringConstant(m, "__version__", "1.0");
1509
Martin v. Löwis1a214512008-06-11 05:26:20 +00001510 return m;
Guido van Rossumfb221561997-04-29 15:38:09 +00001511}