blob: 24f1e3966fed2809c826804338eeab0e85f333eb [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 Hastings5c661892014-01-24 06:17:25 -0800183"compress(module, 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))
Larry Hastings46258262014-01-22 03:05:49 -0800208 goto exit;
Larry Hastingsebdcb502013-11-23 14:54:00 -0800209 break;
210 case 2:
211 if (!PyArg_ParseTuple(args, "y*i:compress", &bytes, &level))
Larry Hastings46258262014-01-22 03:05:49 -0800212 goto exit;
Larry Hastingsebdcb502013-11-23 14:54:00 -0800213 group_right_1 = 1;
214 break;
215 default:
216 PyErr_SetString(PyExc_TypeError, "zlib.compress requires 1 to 2 arguments");
Larry Hastings46258262014-01-22 03:05:49 -0800217 goto exit;
Larry Hastingsebdcb502013-11-23 14:54:00 -0800218 }
219 return_value = zlib_compress_impl(module, &bytes, group_right_1, level);
220
Larry Hastings46258262014-01-22 03:05:49 -0800221exit:
Larry Hastingsebdcb502013-11-23 14:54:00 -0800222 /* Cleanup for bytes */
Larry Hastings4a55fc52014-01-12 11:09:57 -0800223 if (bytes.obj)
Larry Hastingsebdcb502013-11-23 14:54:00 -0800224 PyBuffer_Release(&bytes);
225
226 return return_value;
227}
228
229static PyObject *
230zlib_compress_impl(PyModuleDef *module, Py_buffer *bytes, int group_right_1, int level)
Larry Hastings5c661892014-01-24 06:17:25 -0800231/*[clinic end generated code: checksum=ce8d4c0a17ecd79c3ffcc032dcdf8ac6830ded1e]*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000232{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000233 PyObject *ReturnVal = NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200234 Byte *input, *output = NULL;
235 unsigned int length;
Larry Hastingsebdcb502013-11-23 14:54:00 -0800236 int err;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000237 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000238
Larry Hastingsebdcb502013-11-23 14:54:00 -0800239 if (!group_right_1)
240 level = Z_DEFAULT_COMPRESSION;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200241
Larry Hastingsebdcb502013-11-23 14:54:00 -0800242 if ((size_t)bytes->len > UINT_MAX) {
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200243 PyErr_SetString(PyExc_OverflowError,
244 "Size does not fit in an unsigned int");
245 goto error;
246 }
Larry Hastingsebdcb502013-11-23 14:54:00 -0800247 input = bytes->buf;
248 length = (unsigned int)bytes->len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000249
Jeremy Hylton9714f992001-10-16 21:19:45 +0000250 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000251
Victor Stinnerb6404912013-07-07 16:21:41 +0200252 output = (Byte*)PyMem_Malloc(zst.avail_out);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000253 if (output == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000254 PyErr_SetString(PyExc_MemoryError,
255 "Can't allocate memory to compress data");
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200256 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000257 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000258
Jeremy Hylton9714f992001-10-16 21:19:45 +0000259 /* Past the point of no return. From here on out, we need to make sure
260 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000261
Victor Stinner5064a522013-07-07 16:50:27 +0200262 zst.opaque = NULL;
263 zst.zalloc = PyZlib_Malloc;
264 zst.zfree = PyZlib_Free;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000265 zst.next_out = (Byte *)output;
266 zst.next_in = (Byte *)input;
267 zst.avail_in = length;
268 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000269
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000270 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000271 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000272 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000273 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000274 PyErr_SetString(PyExc_MemoryError,
275 "Out of memory while compressing data");
276 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000277 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000278 PyErr_SetString(ZlibError,
279 "Bad compression level");
280 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000281 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000282 deflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000283 zlib_error(zst, err, "while compressing data");
284 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000285 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000286
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000287 Py_BEGIN_ALLOW_THREADS;
288 err = deflate(&zst, Z_FINISH);
289 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000290
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000291 if (err != Z_STREAM_END) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000292 zlib_error(zst, err, "while compressing data");
293 deflateEnd(&zst);
294 goto error;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000295 }
Tim Peters977e5402001-10-17 03:57:20 +0000296
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000297 err=deflateEnd(&zst);
298 if (err == Z_OK)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000299 ReturnVal = PyBytes_FromStringAndSize((char *)output,
Guido van Rossum776152b2007-05-22 22:44:07 +0000300 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000301 else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000302 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000303
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000304 error:
Victor Stinnerb6404912013-07-07 16:21:41 +0200305 PyMem_Free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000306
Jeremy Hylton9714f992001-10-16 21:19:45 +0000307 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000308}
309
Larry Hastings61272b72014-01-07 12:41:53 -0800310/*[python input]
Victor Stinnere079edd2013-11-21 22:33:21 +0100311
312class uint_converter(CConverter):
313 type = 'unsigned int'
314 converter = 'uint_converter'
315
Larry Hastings61272b72014-01-07 12:41:53 -0800316[python start generated code]*/
317/*[python end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/
Victor Stinnere079edd2013-11-21 22:33:21 +0100318
319static int
320uint_converter(PyObject *obj, void *ptr)
321{
322 long val;
323 unsigned long uval;
324
325 val = PyLong_AsLong(obj);
326 if (val == -1 && PyErr_Occurred()) {
327 uval = PyLong_AsUnsignedLong(obj);
328 if (uval == (unsigned long)-1 && PyErr_Occurred())
329 return 0;
Victor Stinnere079edd2013-11-21 22:33:21 +0100330 }
331 else {
332 if (val < 0) {
333 PyErr_SetString(PyExc_ValueError,
334 "value must be positive");
335 return 0;
336 }
337 uval = (unsigned long)val;
338 }
339
Victor Stinner5c867332014-01-03 12:26:12 +0100340 if (uval > UINT_MAX) {
341 PyErr_SetString(PyExc_OverflowError,
342 "Python int too large for C unsigned int");
343 return 0;
344 }
345
Victor Stinnere079edd2013-11-21 22:33:21 +0100346 *(unsigned int *)ptr = Py_SAFE_DOWNCAST(uval, unsigned long, unsigned int);
347 return 1;
348}
349
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000350PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000351"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
352"\n"
353"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000354"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000355
Guido van Rossumfb221561997-04-29 15:38:09 +0000356static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000357PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000358{
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200359 PyObject *result_str = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000360 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000361 Byte *input;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200362 unsigned int length;
363 int err;
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000364 int wsize=DEF_WBITS;
Victor Stinnere079edd2013-11-21 22:33:21 +0100365 unsigned int bufsize = DEFAULTALLOC, new_bufsize;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000366 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000367
Victor Stinnere079edd2013-11-21 22:33:21 +0100368 if (!PyArg_ParseTuple(args, "y*|iO&:decompress",
369 &pinput, &wsize, uint_converter, &bufsize))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000370 return NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200371
Victor Stinnere079edd2013-11-21 22:33:21 +0100372 if ((size_t)pinput.len > UINT_MAX) {
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200373 PyErr_SetString(PyExc_OverflowError,
374 "Size does not fit in an unsigned int");
375 goto error;
376 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000377 input = pinput.buf;
Victor Stinner56cb1252012-10-31 00:33:57 +0100378 length = (unsigned int)pinput.len;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000379
Victor Stinnere079edd2013-11-21 22:33:21 +0100380 if (bufsize == 0)
381 bufsize = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000382
Jeremy Hylton9714f992001-10-16 21:19:45 +0000383 zst.avail_in = length;
Victor Stinnere079edd2013-11-21 22:33:21 +0100384 zst.avail_out = bufsize;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000385
Victor Stinnere079edd2013-11-21 22:33:21 +0100386 if (!(result_str = PyBytes_FromStringAndSize(NULL, bufsize)))
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200387 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000388
Victor Stinner5064a522013-07-07 16:50:27 +0200389 zst.opaque = NULL;
390 zst.zalloc = PyZlib_Malloc;
391 zst.zfree = PyZlib_Free;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000392 zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000393 zst.next_in = (Byte *)input;
394 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000395
Jeremy Hylton9714f992001-10-16 21:19:45 +0000396 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000397 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000398 break;
Tim Peters977e5402001-10-17 03:57:20 +0000399 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000400 PyErr_SetString(PyExc_MemoryError,
401 "Out of memory while decompressing data");
402 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000403 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000404 inflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000405 zlib_error(zst, err, "while preparing to decompress data");
406 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000407 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000408
Jeremy Hylton9714f992001-10-16 21:19:45 +0000409 do {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000410 Py_BEGIN_ALLOW_THREADS
411 err=inflate(&zst, Z_FINISH);
412 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000413
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000414 switch(err) {
415 case(Z_STREAM_END):
416 break;
417 case(Z_BUF_ERROR):
418 /*
419 * If there is at least 1 byte of room according to zst.avail_out
420 * and we get this error, assume that it means zlib cannot
421 * process the inflate call() due to an error in the data.
422 */
423 if (zst.avail_out > 0) {
Antoine Pitrou96f212b2010-05-11 23:49:58 +0000424 zlib_error(zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000425 inflateEnd(&zst);
426 goto error;
427 }
428 /* fall through */
429 case(Z_OK):
430 /* need more memory */
Victor Stinnere079edd2013-11-21 22:33:21 +0100431 if (bufsize <= (UINT_MAX >> 1))
432 new_bufsize = bufsize << 1;
433 else
434 new_bufsize = UINT_MAX;
435 if (_PyBytes_Resize(&result_str, new_bufsize) < 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000436 inflateEnd(&zst);
437 goto error;
438 }
439 zst.next_out =
Victor Stinnere079edd2013-11-21 22:33:21 +0100440 (unsigned char *)PyBytes_AS_STRING(result_str) + bufsize;
441 zst.avail_out = bufsize;
442 bufsize = new_bufsize;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000443 break;
444 default:
445 inflateEnd(&zst);
446 zlib_error(zst, err, "while decompressing data");
447 goto error;
448 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000449 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000450
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000451 err = inflateEnd(&zst);
452 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200453 zlib_error(zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000454 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000455 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000456
Gregory P. Smith693fc462008-09-06 20:13:06 +0000457 if (_PyBytes_Resize(&result_str, zst.total_out) < 0)
Guido van Rossum776152b2007-05-22 22:44:07 +0000458 goto error;
459
Martin v. Löwis423be952008-08-13 15:53:07 +0000460 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000461 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000462
463 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000464 PyBuffer_Release(&pinput);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000465 Py_XDECREF(result_str);
466 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000467}
468
469static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200470PyZlib_compressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000471{
Victor Stinnere079edd2013-11-21 22:33:21 +0100472 compobject *self = NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000473 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
474 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200475 Py_buffer zdict;
476 static char *kwlist[] = {"level", "method", "wbits",
477 "memLevel", "strategy", "zdict", NULL};
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000478
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200479 zdict.buf = NULL; /* Sentinel, so we can tell whether zdict was supplied. */
480 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiiiy*:compressobj",
481 kwlist, &level, &method, &wbits,
482 &memLevel, &strategy, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000483 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000484
Victor Stinnere079edd2013-11-21 22:33:21 +0100485 if (zdict.buf != NULL && (size_t)zdict.len > UINT_MAX) {
486 PyErr_SetString(PyExc_OverflowError,
487 "zdict length does not fit in an unsigned int");
488 goto error;
489 }
490
Jeremy Hylton499000002001-10-16 21:59:35 +0000491 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000492 if (self==NULL)
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200493 goto error;
Victor Stinner5064a522013-07-07 16:50:27 +0200494 self->zst.opaque = NULL;
495 self->zst.zalloc = PyZlib_Malloc;
496 self->zst.zfree = PyZlib_Free;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000497 self->zst.next_in = NULL;
498 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000499 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
500 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000501 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000502 self->is_initialised = 1;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200503 if (zdict.buf == NULL) {
504 goto success;
505 } else {
Victor Stinnere079edd2013-11-21 22:33:21 +0100506 err = deflateSetDictionary(&self->zst,
507 zdict.buf, (unsigned int)zdict.len);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200508 switch (err) {
509 case (Z_OK):
510 goto success;
511 case (Z_STREAM_ERROR):
512 PyErr_SetString(PyExc_ValueError, "Invalid dictionary");
513 goto error;
514 default:
515 PyErr_SetString(PyExc_ValueError, "deflateSetDictionary()");
516 goto error;
517 }
518 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000519 case (Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000520 PyErr_SetString(PyExc_MemoryError,
521 "Can't allocate memory for compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200522 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000523 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000524 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200525 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000526 default:
527 zlib_error(self->zst, err, "while creating compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200528 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000529 }
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200530
531 error:
532 Py_XDECREF(self);
533 self = NULL;
534 success:
535 if (zdict.buf != NULL)
536 PyBuffer_Release(&zdict);
537 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000538}
539
540static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200541PyZlib_decompressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000542{
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200543 static char *kwlist[] = {"wbits", "zdict", NULL};
Jeremy Hylton499000002001-10-16 21:59:35 +0000544 int wbits=DEF_WBITS, err;
545 compobject *self;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200546 PyObject *zdict=NULL;
547
548 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iO:decompressobj",
549 kwlist, &wbits, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000550 return NULL;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200551 if (zdict != NULL && !PyObject_CheckBuffer(zdict)) {
552 PyErr_SetString(PyExc_TypeError,
553 "zdict argument must support the buffer protocol");
554 return NULL;
555 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000556
557 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000558 if (self == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000559 return(NULL);
Victor Stinner5064a522013-07-07 16:50:27 +0200560 self->zst.opaque = NULL;
561 self->zst.zalloc = PyZlib_Malloc;
562 self->zst.zfree = PyZlib_Free;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000563 self->zst.next_in = NULL;
564 self->zst.avail_in = 0;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200565 if (zdict != NULL) {
566 Py_INCREF(zdict);
567 self->zdict = zdict;
568 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000569 err = inflateInit2(&self->zst, wbits);
570 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000571 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000572 self->is_initialised = 1;
573 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000574 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000575 Py_DECREF(self);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000576 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
577 return NULL;
578 case (Z_MEM_ERROR):
579 Py_DECREF(self);
580 PyErr_SetString(PyExc_MemoryError,
581 "Can't allocate memory for decompression object");
582 return NULL;
583 default:
584 zlib_error(self->zst, err, "while creating decompression object");
585 Py_DECREF(self);
586 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000587 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000588}
589
590static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000591Dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000592{
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000593#ifdef WITH_THREAD
594 PyThread_free_lock(self->lock);
595#endif
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000596 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000597 Py_XDECREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200598 Py_XDECREF(self->zdict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000599 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000600}
601
602static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000603Comp_dealloc(compobject *self)
604{
605 if (self->is_initialised)
606 deflateEnd(&self->zst);
607 Dealloc(self);
608}
609
610static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000611Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000612{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000613 if (self->is_initialised)
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000614 inflateEnd(&self->zst);
615 Dealloc(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000616}
617
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000618PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000619"compress(data) -- Return a string containing data compressed.\n"
620"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000621"After calling this function, some of the input data may still\n"
622"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000623"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000624
625
Guido van Rossumfb221561997-04-29 15:38:09 +0000626static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000627PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000628{
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200629 int err;
630 unsigned int inplen;
Victor Stinnere079edd2013-11-21 22:33:21 +0100631 unsigned int length = DEFAULTALLOC, new_length;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200632 PyObject *RetVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000633 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000634 Byte *input;
635 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000636
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000637 if (!PyArg_ParseTuple(args, "y*:compress", &pinput))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000638 return NULL;
Victor Stinnere079edd2013-11-21 22:33:21 +0100639 if ((size_t)pinput.len > UINT_MAX) {
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200640 PyErr_SetString(PyExc_OverflowError,
641 "Size does not fit in an unsigned int");
642 goto error_outer;
643 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000644 input = pinput.buf;
Victor Stinnere079edd2013-11-21 22:33:21 +0100645 inplen = (unsigned int)pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000646
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;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000655 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 Hylton9714f992001-10-16 21:19:45 +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 = deflate(&(self->zst), Z_NO_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
Jeremy Hylton9714f992001-10-16 21:19:45 +0000662 /* while Z_OK and the output buffer is full, there might be more output,
663 so extend the output buffer and try again */
664 while (err == Z_OK && self->zst.avail_out == 0) {
Victor Stinnere079edd2013-11-21 22:33:21 +0100665 if (length <= (UINT_MAX >> 1))
666 new_length = length << 1;
667 else
668 new_length = UINT_MAX;
669 if (_PyBytes_Resize(&RetVal, new_length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200670 Py_CLEAR(RetVal);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000671 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000672 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000673 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000674 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000675 self->zst.avail_out = length;
Victor Stinnere079edd2013-11-21 22:33:21 +0100676 length = new_length;
Tim Peters977e5402001-10-17 03:57:20 +0000677
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000678 Py_BEGIN_ALLOW_THREADS
679 err = deflate(&(self->zst), Z_NO_FLUSH);
680 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000681 }
Tim Peters977e5402001-10-17 03:57:20 +0000682 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000683 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000684 condition.
685 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000686
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000687 if (err != Z_OK && err != Z_BUF_ERROR) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200688 zlib_error(self->zst, err, "while compressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000689 Py_DECREF(RetVal);
690 RetVal = NULL;
691 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000692 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000693 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200694 Py_CLEAR(RetVal);
Guido van Rossum776152b2007-05-22 22:44:07 +0000695 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000696
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000697 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000698 LEAVE_ZLIB(self);
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200699 error_outer:
Martin v. Löwis423be952008-08-13 15:53:07 +0000700 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000701 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000702}
703
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100704/* Helper for objdecompress() and unflush(). Saves any unconsumed input data in
705 self->unused_data or self->unconsumed_tail, as appropriate. */
706static int
707save_unconsumed_input(compobject *self, int err)
708{
709 if (err == Z_STREAM_END) {
710 /* The end of the compressed data has been reached. Store the leftover
711 input data in self->unused_data. */
712 if (self->zst.avail_in > 0) {
713 Py_ssize_t old_size = PyBytes_GET_SIZE(self->unused_data);
714 Py_ssize_t new_size;
715 PyObject *new_data;
Victor Stinnere079edd2013-11-21 22:33:21 +0100716 if ((size_t)self->zst.avail_in > (size_t)UINT_MAX - (size_t)old_size) {
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100717 PyErr_NoMemory();
718 return -1;
719 }
720 new_size = old_size + self->zst.avail_in;
721 new_data = PyBytes_FromStringAndSize(NULL, new_size);
722 if (new_data == NULL)
723 return -1;
724 Py_MEMCPY(PyBytes_AS_STRING(new_data),
725 PyBytes_AS_STRING(self->unused_data), old_size);
726 Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size,
727 self->zst.next_in, self->zst.avail_in);
728 Py_DECREF(self->unused_data);
729 self->unused_data = new_data;
730 self->zst.avail_in = 0;
731 }
732 }
733 if (self->zst.avail_in > 0 || PyBytes_GET_SIZE(self->unconsumed_tail)) {
734 /* This code handles two distinct cases:
735 1. Output limit was reached. Save leftover input in unconsumed_tail.
736 2. All input data was consumed. Clear unconsumed_tail. */
737 PyObject *new_data = PyBytes_FromStringAndSize(
738 (char *)self->zst.next_in, self->zst.avail_in);
739 if (new_data == NULL)
740 return -1;
741 Py_DECREF(self->unconsumed_tail);
742 self->unconsumed_tail = new_data;
743 }
744 return 0;
745}
746
Larry Hastings61272b72014-01-07 12:41:53 -0800747/*[clinic input]
Larry Hastings44e2eaa2013-11-23 15:37:55 -0800748
Larry Hastingsed4a1c52013-11-18 09:32:13 -0800749zlib.Decompress.decompress
Larry Hastings31826802013-10-19 00:09:25 -0700750
Larry Hastings78cf85c2014-01-04 12:44:57 -0800751 self: self(type="compobject *")
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800752
Larry Hastings31826802013-10-19 00:09:25 -0700753 data: Py_buffer
754 The binary data to decompress.
Victor Stinnere079edd2013-11-21 22:33:21 +0100755 max_length: uint = 0
Larry Hastings31826802013-10-19 00:09:25 -0700756 The maximum allowable length of the decompressed data.
757 Unconsumed input data will be stored in
758 the unconsumed_tail attribute.
759 /
760
761Return a string containing the decompressed version of the data.
762
763After calling this function, some of the input data may still be stored in
764internal buffers for later processing.
765Call the flush() method to clear these buffers.
Larry Hastings61272b72014-01-07 12:41:53 -0800766[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -0700767
Larry Hastingsed4a1c52013-11-18 09:32:13 -0800768PyDoc_STRVAR(zlib_Decompress_decompress__doc__,
Larry Hastings5c661892014-01-24 06:17:25 -0800769"decompress(self, data, max_length=0)\n"
Larry Hastings31826802013-10-19 00:09:25 -0700770"Return a string containing the decompressed version of the data.\n"
771"\n"
Larry Hastings31826802013-10-19 00:09:25 -0700772" data\n"
773" The binary data to decompress.\n"
774" max_length\n"
775" The maximum allowable length of the decompressed data.\n"
776" Unconsumed input data will be stored in\n"
777" the unconsumed_tail attribute.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000778"\n"
779"After calling this function, some of the input data may still be stored in\n"
780"internal buffers for later processing.\n"
Larry Hastings31826802013-10-19 00:09:25 -0700781"Call the flush() method to clear these buffers.");
782
Larry Hastingsed4a1c52013-11-18 09:32:13 -0800783#define ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF \
784 {"decompress", (PyCFunction)zlib_Decompress_decompress, METH_VARARGS, zlib_Decompress_decompress__doc__},
Guido van Rossum3c540301997-06-03 22:21:03 +0000785
Guido van Rossumfb221561997-04-29 15:38:09 +0000786static PyObject *
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800787zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, unsigned int max_length);
Larry Hastings31826802013-10-19 00:09:25 -0700788
789static PyObject *
Larry Hastings5c661892014-01-24 06:17:25 -0800790zlib_Decompress_decompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000791{
Larry Hastings31826802013-10-19 00:09:25 -0700792 PyObject *return_value = NULL;
Larry Hastings4a55fc52014-01-12 11:09:57 -0800793 Py_buffer data = {NULL, NULL};
Victor Stinnere079edd2013-11-21 22:33:21 +0100794 unsigned int max_length = 0;
Larry Hastings31826802013-10-19 00:09:25 -0700795
796 if (!PyArg_ParseTuple(args,
Victor Stinnere079edd2013-11-21 22:33:21 +0100797 "y*|O&:decompress",
798 &data, uint_converter, &max_length))
Larry Hastings31826802013-10-19 00:09:25 -0700799 goto exit;
Larry Hastings5c661892014-01-24 06:17:25 -0800800 return_value = zlib_Decompress_decompress_impl(self, &data, max_length);
Larry Hastings31826802013-10-19 00:09:25 -0700801
802exit:
803 /* Cleanup for data */
Larry Hastings4a55fc52014-01-12 11:09:57 -0800804 if (data.obj)
Larry Hastingsebdcb502013-11-23 14:54:00 -0800805 PyBuffer_Release(&data);
Larry Hastings31826802013-10-19 00:09:25 -0700806
807 return return_value;
808}
809
810static PyObject *
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800811zlib_Decompress_decompress_impl(compobject *self, Py_buffer *data, unsigned int max_length)
Larry Hastings5c661892014-01-24 06:17:25 -0800812/*[clinic end generated code: checksum=b7fd2e3b23430f57f5a84817189575bc46464901]*/
Larry Hastings31826802013-10-19 00:09:25 -0700813{
Larry Hastings31826802013-10-19 00:09:25 -0700814 int err;
Victor Stinnere079edd2013-11-21 22:33:21 +0100815 unsigned int old_length, length = DEFAULTALLOC;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200816 PyObject *RetVal = NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000817 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000818
Victor Stinnere079edd2013-11-21 22:33:21 +0100819 if ((size_t)data->len > UINT_MAX) {
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200820 PyErr_SetString(PyExc_OverflowError,
821 "Size does not fit in an unsigned int");
Larry Hastings31826802013-10-19 00:09:25 -0700822 return NULL;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200823 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000824
Jeremy Hylton9714f992001-10-16 21:19:45 +0000825 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000826 if (max_length && length > max_length)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000827 length = max_length;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200828 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Larry Hastings31826802013-10-19 00:09:25 -0700829 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000830
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800831 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000832
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800833 start_total_out = self->zst.total_out;
834 self->zst.avail_in = (unsigned int)data->len;
835 self->zst.next_in = data->buf;
836 self->zst.avail_out = length;
837 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000838
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000839 Py_BEGIN_ALLOW_THREADS
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800840 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000841 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000842
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800843 if (err == Z_NEED_DICT && self->zdict != NULL) {
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200844 Py_buffer zdict_buf;
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800845 if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200846 Py_DECREF(RetVal);
847 RetVal = NULL;
848 goto error;
849 }
Victor Stinnere079edd2013-11-21 22:33:21 +0100850
851 if ((size_t)zdict_buf.len > UINT_MAX) {
852 PyErr_SetString(PyExc_OverflowError,
853 "zdict length does not fit in an unsigned int");
854 PyBuffer_Release(&zdict_buf);
855 Py_CLEAR(RetVal);
856 goto error;
857 }
858
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800859 err = inflateSetDictionary(&(self->zst),
Victor Stinnere079edd2013-11-21 22:33:21 +0100860 zdict_buf.buf, (unsigned int)zdict_buf.len);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200861 PyBuffer_Release(&zdict_buf);
862 if (err != Z_OK) {
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800863 zlib_error(self->zst, err, "while decompressing data");
Victor Stinnere079edd2013-11-21 22:33:21 +0100864 Py_CLEAR(RetVal);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200865 goto error;
866 }
Nadeem Vawdacf5e1d82012-06-22 00:35:57 +0200867 /* Repeat the call to inflate. */
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200868 Py_BEGIN_ALLOW_THREADS
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800869 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200870 Py_END_ALLOW_THREADS
871 }
872
Jeremy Hylton9714f992001-10-16 21:19:45 +0000873 /* While Z_OK and the output buffer is full, there might be more output.
874 So extend the output buffer and try again.
875 */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800876 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000877 /* If max_length set, don't continue decompressing if we've already
878 reached the limit.
879 */
880 if (max_length && length >= max_length)
881 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000882
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000883 /* otherwise, ... */
884 old_length = length;
885 length = length << 1;
886 if (max_length && length > max_length)
887 length = max_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000888
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000889 if (_PyBytes_Resize(&RetVal, length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200890 Py_CLEAR(RetVal);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000891 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000892 }
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800893 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000894 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800895 self->zst.avail_out = length - old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000896
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000897 Py_BEGIN_ALLOW_THREADS
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800898 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000899 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000900 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000901
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800902 if (save_unconsumed_input(self, err) < 0) {
Nadeem Vawda7619e882011-05-14 14:05:20 +0200903 Py_DECREF(RetVal);
904 RetVal = NULL;
905 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000906 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000907
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000908 if (err == Z_STREAM_END) {
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100909 /* This is the logical place to call inflateEnd, but the old behaviour
910 of only calling it on flush() is preserved. */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800911 self->eof = 1;
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100912 } else if (err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000913 /* We will only get Z_BUF_ERROR if the output buffer was full
914 but there wasn't more output when we tried again, so it is
915 not an error condition.
916 */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800917 zlib_error(self->zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000918 Py_DECREF(RetVal);
919 RetVal = NULL;
920 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000921 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000922
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800923 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200924 Py_CLEAR(RetVal);
Guido van Rossum776152b2007-05-22 22:44:07 +0000925 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000926
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000927 error:
Larry Hastingsdc6aaec2013-11-24 04:41:57 -0800928 LEAVE_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000929 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000930}
931
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000932PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000933"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000934"\n"
935"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000936"default value used when mode is not specified is Z_FINISH.\n"
937"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000938"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000939
Guido van Rossumfb221561997-04-29 15:38:09 +0000940static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000941PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000942{
Victor Stinnere079edd2013-11-21 22:33:21 +0100943 int err;
944 unsigned int length = DEFAULTALLOC, new_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000945 PyObject *RetVal;
946 int flushmode = Z_FINISH;
947 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000948
Jeremy Hylton9714f992001-10-16 21:19:45 +0000949 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000950 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000951
Jeremy Hylton9714f992001-10-16 21:19:45 +0000952 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
953 doing any work at all; just return an empty string. */
954 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000955 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000956 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000957
Gregory P. Smith693fc462008-09-06 20:13:06 +0000958 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000959 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000960
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000961 ENTER_ZLIB(self);
Tim Peters977e5402001-10-17 03:57:20 +0000962
Jeremy Hylton9714f992001-10-16 21:19:45 +0000963 start_total_out = self->zst.total_out;
964 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000965 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000966 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000967
968 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000969 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000970 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000971
Jeremy Hylton9714f992001-10-16 21:19:45 +0000972 /* while Z_OK and the output buffer is full, there might be more output,
973 so extend the output buffer and try again */
974 while (err == Z_OK && self->zst.avail_out == 0) {
Victor Stinnere079edd2013-11-21 22:33:21 +0100975 if (length <= (UINT_MAX >> 1))
976 new_length = length << 1;
977 else
978 new_length = UINT_MAX;
979 if (_PyBytes_Resize(&RetVal, new_length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +0200980 Py_CLEAR(RetVal);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000981 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000982 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000983 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000984 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000985 self->zst.avail_out = length;
Victor Stinnere079edd2013-11-21 22:33:21 +0100986 length = new_length;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000987
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000988 Py_BEGIN_ALLOW_THREADS
989 err = deflate(&(self->zst), flushmode);
990 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000991 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000992
Jeremy Hylton9714f992001-10-16 21:19:45 +0000993 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000994 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000995 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000996 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000997 err = deflateEnd(&(self->zst));
998 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200999 zlib_error(self->zst, err, "while finishing compression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001000 Py_DECREF(RetVal);
1001 RetVal = NULL;
1002 goto error;
1003 }
1004 else
1005 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +00001006
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001007 /* We will only get Z_BUF_ERROR if the output buffer was full
1008 but there wasn't more output when we tried again, so it is
1009 not an error condition.
1010 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +00001011 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001012 zlib_error(self->zst, err, "while flushing");
1013 Py_DECREF(RetVal);
1014 RetVal = NULL;
1015 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +00001016 }
Tim Peters977e5402001-10-17 03:57:20 +00001017
Gregory P. Smith693fc462008-09-06 20:13:06 +00001018 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +02001019 Py_CLEAR(RetVal);
Guido van Rossum776152b2007-05-22 22:44:07 +00001020 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001021
Tim Peters977e5402001-10-17 03:57:20 +00001022 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001023 LEAVE_ZLIB(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +00001024
1025 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +00001026}
1027
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001028#ifdef HAVE_ZLIB_COPY
Larry Hastings31826802013-10-19 00:09:25 -07001029
Larry Hastings61272b72014-01-07 12:41:53 -08001030/*[clinic input]
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001031zlib.Compress.copy
Larry Hastings31826802013-10-19 00:09:25 -07001032
Larry Hastings78cf85c2014-01-04 12:44:57 -08001033 self: self(type="compobject *")
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001034
Larry Hastings31826802013-10-19 00:09:25 -07001035Return a copy of the compression object.
Larry Hastings61272b72014-01-07 12:41:53 -08001036[clinic start generated code]*/
Larry Hastings31826802013-10-19 00:09:25 -07001037
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001038PyDoc_STRVAR(zlib_Compress_copy__doc__,
Larry Hastings5c661892014-01-24 06:17:25 -08001039"copy(self)\n"
Larry Hastings44e2eaa2013-11-23 15:37:55 -08001040"Return a copy of the compression object.");
Larry Hastings31826802013-10-19 00:09:25 -07001041
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001042#define ZLIB_COMPRESS_COPY_METHODDEF \
1043 {"copy", (PyCFunction)zlib_Compress_copy, METH_NOARGS, zlib_Compress_copy__doc__},
Thomas Wouters477c8d52006-05-27 19:21:47 +00001044
1045static PyObject *
Larry Hastings3cceb382014-01-04 11:09:09 -08001046zlib_Compress_copy_impl(compobject *self);
1047
1048static PyObject *
Larry Hastings5c661892014-01-24 06:17:25 -08001049zlib_Compress_copy(compobject *self, PyObject *Py_UNUSED(ignored))
Larry Hastings3cceb382014-01-04 11:09:09 -08001050{
Larry Hastings5c661892014-01-24 06:17:25 -08001051 return zlib_Compress_copy_impl(self);
Larry Hastings3cceb382014-01-04 11:09:09 -08001052}
1053
1054static PyObject *
1055zlib_Compress_copy_impl(compobject *self)
Larry Hastings5c661892014-01-24 06:17:25 -08001056/*[clinic end generated code: checksum=7aa841ad51297eb83250f511a76872e88fdc737e]*/
Thomas Wouters477c8d52006-05-27 19:21:47 +00001057{
1058 compobject *retval = NULL;
1059 int err;
1060
1061 retval = newcompobject(&Comptype);
1062 if (!retval) return NULL;
1063
1064 /* Copy the zstream state
1065 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1066 */
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001067 ENTER_ZLIB(self);
1068 err = deflateCopy(&retval->zst, &self->zst);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001069 switch(err) {
1070 case(Z_OK):
1071 break;
1072 case(Z_STREAM_ERROR):
1073 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1074 goto error;
1075 case(Z_MEM_ERROR):
1076 PyErr_SetString(PyExc_MemoryError,
1077 "Can't allocate memory for compression object");
1078 goto error;
1079 default:
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001080 zlib_error(self->zst, err, "while copying compression object");
Thomas Wouters477c8d52006-05-27 19:21:47 +00001081 goto error;
1082 }
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001083 Py_INCREF(self->unused_data);
1084 Py_INCREF(self->unconsumed_tail);
1085 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001086 Py_XDECREF(retval->unused_data);
1087 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001088 Py_XDECREF(retval->zdict);
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001089 retval->unused_data = self->unused_data;
1090 retval->unconsumed_tail = self->unconsumed_tail;
1091 retval->zdict = self->zdict;
1092 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001093
1094 /* Mark it as being initialized */
1095 retval->is_initialised = 1;
1096
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001097 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001098 return (PyObject *)retval;
1099
1100error:
Larry Hastingsdc6aaec2013-11-24 04:41:57 -08001101 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001102 Py_XDECREF(retval);
1103 return NULL;
1104}
1105
1106PyDoc_STRVAR(decomp_copy__doc__,
1107"copy() -- Return a copy of the decompression object.");
1108
1109static PyObject *
1110PyZlib_uncopy(compobject *self)
1111{
1112 compobject *retval = NULL;
1113 int err;
1114
1115 retval = newcompobject(&Decomptype);
1116 if (!retval) return NULL;
1117
1118 /* Copy the zstream state
1119 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
1120 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001121 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001122 err = inflateCopy(&retval->zst, &self->zst);
1123 switch(err) {
1124 case(Z_OK):
1125 break;
1126 case(Z_STREAM_ERROR):
1127 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
1128 goto error;
1129 case(Z_MEM_ERROR):
1130 PyErr_SetString(PyExc_MemoryError,
1131 "Can't allocate memory for decompression object");
1132 goto error;
1133 default:
1134 zlib_error(self->zst, err, "while copying decompression object");
1135 goto error;
1136 }
1137
1138 Py_INCREF(self->unused_data);
1139 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001140 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001141 Py_XDECREF(retval->unused_data);
1142 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001143 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001144 retval->unused_data = self->unused_data;
1145 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001146 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +02001147 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001148
1149 /* Mark it as being initialized */
1150 retval->is_initialised = 1;
1151
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001152 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001153 return (PyObject *)retval;
1154
1155error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001156 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001157 Py_XDECREF(retval);
1158 return NULL;
1159}
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001160#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00001161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001162PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001163"flush( [length] ) -- Return a string containing any remaining\n"
1164"decompressed data. length, if given, is the initial size of the\n"
1165"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001166"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001167"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +00001168
Guido van Rossumfb221561997-04-29 15:38:09 +00001169static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001170PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001171{
Victor Stinnere079edd2013-11-21 22:33:21 +01001172 int err;
1173 unsigned int length = DEFAULTALLOC, new_length;
Jeremy Hylton9d620d02001-10-16 23:02:32 +00001174 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001175 unsigned long start_total_out;
Victor Stinnere079edd2013-11-21 22:33:21 +01001176 Py_ssize_t size;
Tim Peters977e5402001-10-17 03:57:20 +00001177
Victor Stinnere079edd2013-11-21 22:33:21 +01001178 if (!PyArg_ParseTuple(args, "|O&:flush", uint_converter, &length))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001179 return NULL;
Victor Stinnere079edd2013-11-21 22:33:21 +01001180 if (length == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001181 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
1182 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +00001183 }
Victor Stinnere079edd2013-11-21 22:33:21 +01001184
Gregory P. Smith693fc462008-09-06 20:13:06 +00001185 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001186 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001187
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001188
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001189 ENTER_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001190
Victor Stinnere079edd2013-11-21 22:33:21 +01001191 size = PyBytes_GET_SIZE(self->unconsumed_tail);
1192
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001193 start_total_out = self->zst.total_out;
Victor Stinnere079edd2013-11-21 22:33:21 +01001194 /* save_unconsumed_input() ensures that unconsumed_tail length is lesser
1195 or equal than UINT_MAX */
1196 self->zst.avail_in = Py_SAFE_DOWNCAST(size, Py_ssize_t, unsigned int);
Nadeem Vawda7ee95552012-11-11 03:15:32 +01001197 self->zst.next_in = (Byte *)PyBytes_AS_STRING(self->unconsumed_tail);
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001198 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +00001199 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001200
1201 Py_BEGIN_ALLOW_THREADS
1202 err = inflate(&(self->zst), Z_FINISH);
1203 Py_END_ALLOW_THREADS
1204
1205 /* while Z_OK and the output buffer is full, there might be more output,
1206 so extend the output buffer and try again */
1207 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Victor Stinnere079edd2013-11-21 22:33:21 +01001208 if (length <= (UINT_MAX >> 1))
1209 new_length = length << 1;
1210 else
1211 new_length = UINT_MAX;
1212 if (_PyBytes_Resize(&retval, new_length) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +02001213 Py_CLEAR(retval);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001214 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +00001215 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001216 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
1217 self->zst.avail_out = length;
Victor Stinnere079edd2013-11-21 22:33:21 +01001218 length = new_length;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001219
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001220 Py_BEGIN_ALLOW_THREADS
1221 err = inflate(&(self->zst), Z_FINISH);
1222 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +00001223 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001224
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001225 if (save_unconsumed_input(self, err) < 0) {
1226 Py_DECREF(retval);
1227 retval = NULL;
1228 goto error;
1229 }
1230
Nadeem Vawda3bf71c52011-08-13 15:42:50 +02001231 /* If at end of stream, clean up any memory allocated by zlib. */
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001232 if (err == Z_STREAM_END) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001233 self->eof = 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001234 self->is_initialised = 0;
Nadeem Vawda1c385462011-08-13 15:22:40 +02001235 err = inflateEnd(&(self->zst));
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001236 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001237 zlib_error(self->zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001238 Py_DECREF(retval);
1239 retval = NULL;
1240 goto error;
1241 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001242 }
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001243
Gregory P. Smith693fc462008-09-06 20:13:06 +00001244 if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
Victor Stinner79799262013-07-09 00:35:22 +02001245 Py_CLEAR(retval);
Guido van Rossum776152b2007-05-22 22:44:07 +00001246 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001247
1248error:
1249
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001250 LEAVE_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001251
Jeremy Hylton9714f992001-10-16 21:19:45 +00001252 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +00001253}
1254
1255static PyMethodDef comp_methods[] =
1256{
Tim Peters977e5402001-10-17 03:57:20 +00001257 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001258 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001259 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001260 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001261#ifdef HAVE_ZLIB_COPY
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001262 ZLIB_COMPRESS_COPY_METHODDEF
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001263#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001264 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001265};
1266
1267static PyMethodDef Decomp_methods[] =
1268{
Larry Hastingsed4a1c52013-11-18 09:32:13 -08001269 ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF
Tim Peters977e5402001-10-17 03:57:20 +00001270 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001271 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001272#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001273 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
1274 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001275#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001276 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001277};
1278
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001279#define COMP_OFF(x) offsetof(compobject, x)
1280static PyMemberDef Decomp_members[] = {
1281 {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
1282 {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
Nadeem Vawda1c385462011-08-13 15:22:40 +02001283 {"eof", T_BOOL, COMP_OFF(eof), READONLY},
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001284 {NULL},
1285};
Guido van Rossumfb221561997-04-29 15:38:09 +00001286
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001287PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001288"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
1289"\n"
1290"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001291"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +00001292
Guido van Rossumfb221561997-04-29 15:38:09 +00001293static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001294PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001295{
Christian Heimescc47b052008-03-25 14:56:36 +00001296 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001297 Py_buffer pbuf;
Tim Peters977e5402001-10-17 03:57:20 +00001298
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001299 if (!PyArg_ParseTuple(args, "y*|I:adler32", &pbuf, &adler32val))
1300 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001301 /* Releasing the GIL for very small buffers is inefficient
1302 and may lower performance */
1303 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001304 unsigned char *buf = pbuf.buf;
1305 Py_ssize_t len = pbuf.len;
1306
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001307 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001308 /* Avoid truncation of length for very large buffers. adler32() takes
1309 length as an unsigned int, which may be narrower than Py_ssize_t. */
Victor Stinnere079edd2013-11-21 22:33:21 +01001310 while ((size_t)len > UINT_MAX) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001311 adler32val = adler32(adler32val, buf, UINT_MAX);
1312 buf += (size_t) UINT_MAX;
1313 len -= (size_t) UINT_MAX;
1314 }
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001315 adler32val = adler32(adler32val, buf, (unsigned int)len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001316 Py_END_ALLOW_THREADS
1317 } else {
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001318 adler32val = adler32(adler32val, pbuf.buf, (unsigned int)pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001319 }
1320 PyBuffer_Release(&pbuf);
Gregory P. Smith27275032008-03-20 06:20:09 +00001321 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001322}
Tim Peters977e5402001-10-17 03:57:20 +00001323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001324PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001325"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
1326"\n"
1327"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001328"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +00001329
1330static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001331PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001332{
Christian Heimescc47b052008-03-25 14:56:36 +00001333 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +00001334 Py_buffer pbuf;
1335 int signed_val;
Christian Heimescc47b052008-03-25 14:56:36 +00001336
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001337 if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001338 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001339 /* Releasing the GIL for very small buffers is inefficient
1340 and may lower performance */
1341 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001342 unsigned char *buf = pbuf.buf;
1343 Py_ssize_t len = pbuf.len;
1344
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001345 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001346 /* Avoid truncation of length for very large buffers. crc32() takes
1347 length as an unsigned int, which may be narrower than Py_ssize_t. */
Victor Stinnere079edd2013-11-21 22:33:21 +01001348 while ((size_t)len > UINT_MAX) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001349 crc32val = crc32(crc32val, buf, UINT_MAX);
1350 buf += (size_t) UINT_MAX;
1351 len -= (size_t) UINT_MAX;
1352 }
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001353 signed_val = crc32(crc32val, buf, (unsigned int)len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001354 Py_END_ALLOW_THREADS
1355 } else {
Victor Stinnerbc8ccce2013-06-24 23:02:51 +02001356 signed_val = crc32(crc32val, pbuf.buf, (unsigned int)pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001357 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001358 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +00001359 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001360}
Tim Peters977e5402001-10-17 03:57:20 +00001361
Guido van Rossumfb221561997-04-29 15:38:09 +00001362
1363static PyMethodDef zlib_methods[] =
1364{
Tim Peters977e5402001-10-17 03:57:20 +00001365 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001366 adler32__doc__},
Larry Hastingsebdcb502013-11-23 14:54:00 -08001367 ZLIB_COMPRESS_METHODDEF
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001368 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001369 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001370 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
1371 crc32__doc__},
1372 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001373 decompress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001374 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001375 decompressobj__doc__},
1376 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001377};
1378
Tim Peters0c322792002-07-17 16:49:03 +00001379static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001380 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001381 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001382 sizeof(compobject),
1383 0,
1384 (destructor)Comp_dealloc, /*tp_dealloc*/
1385 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001386 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001387 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001388 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001389 0, /*tp_repr*/
1390 0, /*tp_as_number*/
1391 0, /*tp_as_sequence*/
1392 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001393 0, /*tp_hash*/
1394 0, /*tp_call*/
1395 0, /*tp_str*/
1396 0, /*tp_getattro*/
1397 0, /*tp_setattro*/
1398 0, /*tp_as_buffer*/
1399 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1400 0, /*tp_doc*/
1401 0, /*tp_traverse*/
1402 0, /*tp_clear*/
1403 0, /*tp_richcompare*/
1404 0, /*tp_weaklistoffset*/
1405 0, /*tp_iter*/
1406 0, /*tp_iternext*/
1407 comp_methods, /*tp_methods*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001408};
1409
Tim Peters0c322792002-07-17 16:49:03 +00001410static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001411 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001412 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001413 sizeof(compobject),
1414 0,
1415 (destructor)Decomp_dealloc, /*tp_dealloc*/
1416 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001417 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001418 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001419 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001420 0, /*tp_repr*/
1421 0, /*tp_as_number*/
1422 0, /*tp_as_sequence*/
1423 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001424 0, /*tp_hash*/
1425 0, /*tp_call*/
1426 0, /*tp_str*/
1427 0, /*tp_getattro*/
1428 0, /*tp_setattro*/
1429 0, /*tp_as_buffer*/
1430 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1431 0, /*tp_doc*/
1432 0, /*tp_traverse*/
1433 0, /*tp_clear*/
1434 0, /*tp_richcompare*/
1435 0, /*tp_weaklistoffset*/
1436 0, /*tp_iter*/
1437 0, /*tp_iternext*/
1438 Decomp_methods, /*tp_methods*/
1439 Decomp_members, /*tp_members*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001440};
1441
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001443"The functions in this module allow compression and decompression using the\n"
1444"zlib library, which is based on GNU zip.\n"
1445"\n"
1446"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
Nadeem Vawda19e568d2012-11-11 14:04:14 +01001447"compress(string[, level]) -- Compress string, with compression level in 0-9.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001448"compressobj([level[, ...]]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001449"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001450"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001451"decompressobj([wbits[, zdict]]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001452"\n"
1453"'wbits' is window buffer size.\n"
1454"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001455"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001456
Martin v. Löwis1a214512008-06-11 05:26:20 +00001457static struct PyModuleDef zlibmodule = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001458 PyModuleDef_HEAD_INIT,
1459 "zlib",
1460 zlib_module_documentation,
1461 -1,
1462 zlib_methods,
1463 NULL,
1464 NULL,
1465 NULL,
1466 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001467};
1468
Mark Hammond62b1ab12002-07-23 06:31:15 +00001469PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001470PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001471{
Fred Drake4baedc12002-04-01 14:53:37 +00001472 PyObject *m, *ver;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001473 if (PyType_Ready(&Comptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001474 return NULL;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001475 if (PyType_Ready(&Decomptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001476 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001477 m = PyModule_Create(&zlibmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001478 if (m == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001479 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001480
Fred Drake4baedc12002-04-01 14:53:37 +00001481 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1482 if (ZlibError != NULL) {
1483 Py_INCREF(ZlibError);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001484 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001485 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02001486 PyModule_AddIntMacro(m, MAX_WBITS);
1487 PyModule_AddIntMacro(m, DEFLATED);
1488 PyModule_AddIntMacro(m, DEF_MEM_LEVEL);
1489 PyModule_AddIntMacro(m, Z_BEST_SPEED);
1490 PyModule_AddIntMacro(m, Z_BEST_COMPRESSION);
1491 PyModule_AddIntMacro(m, Z_DEFAULT_COMPRESSION);
1492 PyModule_AddIntMacro(m, Z_FILTERED);
1493 PyModule_AddIntMacro(m, Z_HUFFMAN_ONLY);
1494 PyModule_AddIntMacro(m, Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001495
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02001496 PyModule_AddIntMacro(m, Z_FINISH);
1497 PyModule_AddIntMacro(m, Z_NO_FLUSH);
1498 PyModule_AddIntMacro(m, Z_SYNC_FLUSH);
1499 PyModule_AddIntMacro(m, Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001500
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001501 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001502 if (ver != NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001503 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001504
Nadeem Vawda64d25dd2011-09-12 00:04:13 +02001505 ver = PyUnicode_FromString(zlibVersion());
1506 if (ver != NULL)
1507 PyModule_AddObject(m, "ZLIB_RUNTIME_VERSION", ver);
1508
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001509 PyModule_AddStringConstant(m, "__version__", "1.0");
1510
Martin v. Löwis1a214512008-06-11 05:26:20 +00001511 return m;
Guido van Rossumfb221561997-04-29 15:38:09 +00001512}