blob: f3282b2eeb8425953737915c35b09973e1596d0d [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"
8#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +00009
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000010#ifdef WITH_THREAD
11#include "pythread.h"
12
13/* #defs ripped off from _tkinter.c, even though the situation here is much
14 simpler, because we don't have to worry about waiting for Tcl
15 events! And, since zlib itself is threadsafe, we don't need to worry
16 about re-entering zlib functions.
17
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000018 N.B.
19
20 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions
21 that modify the components of preexisting de/compress objects, it
22 could prove to be a performance gain on multiprocessor machines if
23 there was an de/compress object-specific lock. However, for the
24 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL
25 de/compress objects.
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000026 */
27
28static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */
29
30#define ENTER_ZLIB \
Antoine Pitrouc83ea132010-05-09 14:46:46 +000031 Py_BEGIN_ALLOW_THREADS \
32 PyThread_acquire_lock(zlib_lock, 1); \
33 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000034
35#define LEAVE_ZLIB \
Antoine Pitrouc83ea132010-05-09 14:46:46 +000036 PyThread_release_lock(zlib_lock);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000037
38#else
39
40#define ENTER_ZLIB
41#define LEAVE_ZLIB
42
43#endif
44
Guido van Rossumfb221561997-04-29 15:38:09 +000045/* The following parameters are copied from zutil.h, version 0.95 */
46#define DEFLATED 8
47#if MAX_MEM_LEVEL >= 8
48# define DEF_MEM_LEVEL 8
49#else
50# define DEF_MEM_LEVEL MAX_MEM_LEVEL
51#endif
52#define DEF_WBITS MAX_WBITS
53
Guido van Rossumb729a1d1999-04-07 20:23:17 +000054/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
55#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000056#define PyInit_zlib initzlib
57
Jeremy Hylton938ace62002-07-17 16:30:39 +000058static PyTypeObject Comptype;
59static PyTypeObject Decomptype;
Guido van Rossumfb221561997-04-29 15:38:09 +000060
61static PyObject *ZlibError;
62
Tim Peters977e5402001-10-17 03:57:20 +000063typedef struct
Guido van Rossumfb221561997-04-29 15:38:09 +000064{
Jeremy Hylton9714f992001-10-16 21:19:45 +000065 PyObject_HEAD
66 z_stream zst;
67 PyObject *unused_data;
68 PyObject *unconsumed_tail;
69 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000070} compobject;
71
Jeremy Hylton0965e082001-10-16 21:56:09 +000072static void
73zlib_error(z_stream zst, int err, char *msg)
74{
Nadeem Vawdabbabbae2011-08-28 11:23:57 +020075 const char *zmsg = Z_NULL;
76 /* In case of a version mismatch, zst.msg won't be initialized.
77 Check for this case first, before looking at zst.msg. */
78 if (err == Z_VERSION_ERROR)
79 zmsg = "library version mismatch";
80 if (zmsg == Z_NULL)
81 zmsg = zst.msg;
Antoine Pitroufc3bfad2010-05-11 23:42:28 +000082 if (zmsg == Z_NULL) {
83 switch (err) {
84 case Z_BUF_ERROR:
85 zmsg = "incomplete or truncated stream";
86 break;
87 case Z_STREAM_ERROR:
88 zmsg = "inconsistent stream state";
89 break;
90 case Z_DATA_ERROR:
91 zmsg = "invalid input data";
92 break;
93 }
94 }
95 if (zmsg == Z_NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +000096 PyErr_Format(ZlibError, "Error %d %s", err, msg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000097 else
Antoine Pitroufc3bfad2010-05-11 23:42:28 +000098 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000099}
100
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000101PyDoc_STRVAR(compressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000102"compressobj([level]) -- Return a compressor object.\n"
103"\n"
Martin Panter1d269c12016-02-03 07:06:33 +0000104"Optional arg level is the compression level, in 0-9 or -1.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000105
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000106PyDoc_STRVAR(decompressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000107"decompressobj([wbits]) -- Return a decompressor object.\n"
108"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000109"Optional arg wbits is the window buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000110
Guido van Rossumfb221561997-04-29 15:38:09 +0000111static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000112newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +0000113{
Tim Peters977e5402001-10-17 03:57:20 +0000114 compobject *self;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000115 self = PyObject_New(compobject, type);
116 if (self == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000117 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000118 self->is_initialised = 0;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000119 self->unused_data = PyString_FromString("");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000120 if (self->unused_data == NULL) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000121 Py_DECREF(self);
122 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000123 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000124 self->unconsumed_tail = PyString_FromString("");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000125 if (self->unconsumed_tail == NULL) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000126 Py_DECREF(self);
127 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000128 }
129 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000130}
131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000132PyDoc_STRVAR(compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000133"compress(string[, level]) -- Returned compressed string.\n"
134"\n"
Nadeem Vawda99f9b8d2012-11-11 14:01:23 +0100135"Optional arg level is the compression level, in 0-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000136
Guido van Rossumfb221561997-04-29 15:38:09 +0000137static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000138PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000139{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000140 PyObject *ReturnVal = NULL;
141 Byte *input, *output;
142 int length, level=Z_DEFAULT_COMPRESSION, err;
143 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000144
Jeremy Hylton9714f992001-10-16 21:19:45 +0000145 /* require Python string object, optional 'level' arg */
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000146 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000147 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000148
Jeremy Hylton9714f992001-10-16 21:19:45 +0000149 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000150
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000151 output = (Byte*)malloc(zst.avail_out);
152 if (output == NULL) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000153 PyErr_SetString(PyExc_MemoryError,
154 "Can't allocate memory to compress data");
155 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000156 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000157
Jeremy Hylton9714f992001-10-16 21:19:45 +0000158 /* Past the point of no return. From here on out, we need to make sure
159 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000160
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000161 zst.zalloc = (alloc_func)NULL;
162 zst.zfree = (free_func)Z_NULL;
163 zst.next_out = (Byte *)output;
164 zst.next_in = (Byte *)input;
165 zst.avail_in = length;
166 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000167
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000168 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000169 case(Z_OK):
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000170 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000171 case(Z_MEM_ERROR):
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000172 PyErr_SetString(PyExc_MemoryError,
173 "Out of memory while compressing data");
174 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000175 case(Z_STREAM_ERROR):
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000176 PyErr_SetString(ZlibError,
177 "Bad compression level");
178 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000179 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000180 deflateEnd(&zst);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000181 zlib_error(zst, err, "while compressing data");
182 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000183 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000184
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000185 Py_BEGIN_ALLOW_THREADS;
186 err = deflate(&zst, Z_FINISH);
187 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000188
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000189 if (err != Z_STREAM_END) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000190 zlib_error(zst, err, "while compressing data");
191 deflateEnd(&zst);
192 goto error;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000193 }
Tim Peters977e5402001-10-17 03:57:20 +0000194
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000195 err=deflateEnd(&zst);
196 if (err == Z_OK)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000197 ReturnVal = PyString_FromStringAndSize((char *)output,
198 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000199 else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000200 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000201
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000202 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000203 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000204
Jeremy Hylton9714f992001-10-16 21:19:45 +0000205 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000206}
207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000208PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000209"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
210"\n"
211"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000212"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000213
Guido van Rossumfb221561997-04-29 15:38:09 +0000214static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000215PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000216{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000217 PyObject *result_str;
218 Byte *input;
219 int length, err;
Christian Heimes901071b2007-11-21 00:46:21 +0000220 int wsize=DEF_WBITS;
221 Py_ssize_t r_strlen=DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000222 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000223
Christian Heimes901071b2007-11-21 00:46:21 +0000224 if (!PyArg_ParseTuple(args, "s#|in:decompress",
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000225 &input, &length, &wsize, &r_strlen))
226 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000227
Jeremy Hylton9714f992001-10-16 21:19:45 +0000228 if (r_strlen <= 0)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000229 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000230
Jeremy Hylton9714f992001-10-16 21:19:45 +0000231 zst.avail_in = length;
232 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000233
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000234 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000235 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000236
Jeremy Hylton9714f992001-10-16 21:19:45 +0000237 zst.zalloc = (alloc_func)NULL;
238 zst.zfree = (free_func)Z_NULL;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000239 zst.next_out = (Byte *)PyString_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000240 zst.next_in = (Byte *)input;
241 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000242
Jeremy Hylton9714f992001-10-16 21:19:45 +0000243 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000244 case(Z_OK):
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000245 break;
Tim Peters977e5402001-10-17 03:57:20 +0000246 case(Z_MEM_ERROR):
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000247 PyErr_SetString(PyExc_MemoryError,
248 "Out of memory while decompressing data");
249 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000250 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000251 inflateEnd(&zst);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000252 zlib_error(zst, err, "while preparing to decompress data");
253 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000254 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000255
Jeremy Hylton9714f992001-10-16 21:19:45 +0000256 do {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000257 Py_BEGIN_ALLOW_THREADS
258 err=inflate(&zst, Z_FINISH);
259 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000260
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000261 switch(err) {
262 case(Z_STREAM_END):
263 break;
264 case(Z_BUF_ERROR):
265 /*
266 * If there is at least 1 byte of room according to zst.avail_out
267 * and we get this error, assume that it means zlib cannot
268 * process the inflate call() due to an error in the data.
269 */
270 if (zst.avail_out > 0) {
Antoine Pitroufc3bfad2010-05-11 23:42:28 +0000271 zlib_error(zst, err, "while decompressing data");
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000272 inflateEnd(&zst);
273 goto error;
274 }
275 /* fall through */
276 case(Z_OK):
277 /* need more memory */
278 if (_PyString_Resize(&result_str, r_strlen << 1) < 0) {
279 inflateEnd(&zst);
280 goto error;
281 }
282 zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \
283 + r_strlen;
284 zst.avail_out = r_strlen;
285 r_strlen = r_strlen << 1;
286 break;
287 default:
288 inflateEnd(&zst);
289 zlib_error(zst, err, "while decompressing data");
290 goto error;
291 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000292 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000293
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000294 err = inflateEnd(&zst);
295 if (err != Z_OK) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000296 zlib_error(zst, err, "while finishing data decompression");
297 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000298 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000299
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000300 _PyString_Resize(&result_str, zst.total_out);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000301 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000302
303 error:
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000304 Py_XDECREF(result_str);
305 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000306}
307
308static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000309PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000310{
Jeremy Hylton499000002001-10-16 21:59:35 +0000311 compobject *self;
312 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
313 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000314
Jeremy Hylton499000002001-10-16 21:59:35 +0000315 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000316 &memLevel, &strategy))
317 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000318
Jeremy Hylton499000002001-10-16 21:59:35 +0000319 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000320 if (self==NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000321 return(NULL);
Jeremy Hylton499000002001-10-16 21:59:35 +0000322 self->zst.zalloc = (alloc_func)NULL;
323 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000324 self->zst.next_in = NULL;
325 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000326 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
327 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000328 case (Z_OK):
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000329 self->is_initialised = 1;
330 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000331 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000332 Py_DECREF(self);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000333 PyErr_SetString(PyExc_MemoryError,
334 "Can't allocate memory for compression object");
335 return NULL;
336 case(Z_STREAM_ERROR):
337 Py_DECREF(self);
338 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
339 return NULL;
340 default:
341 zlib_error(self->zst, err, "while creating compression object");
342 Py_DECREF(self);
343 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000344 }
345}
346
347static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000348PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000349{
Jeremy Hylton499000002001-10-16 21:59:35 +0000350 int wbits=DEF_WBITS, err;
351 compobject *self;
352 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000353 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000354
355 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000356 if (self == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000357 return(NULL);
Jeremy Hylton499000002001-10-16 21:59:35 +0000358 self->zst.zalloc = (alloc_func)NULL;
359 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000360 self->zst.next_in = NULL;
361 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000362 err = inflateInit2(&self->zst, wbits);
363 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000364 case (Z_OK):
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000365 self->is_initialised = 1;
366 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000367 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000368 Py_DECREF(self);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000369 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
370 return NULL;
371 case (Z_MEM_ERROR):
372 Py_DECREF(self);
373 PyErr_SetString(PyExc_MemoryError,
374 "Can't allocate memory for decompression object");
375 return NULL;
376 default:
377 zlib_error(self->zst, err, "while creating decompression object");
378 Py_DECREF(self);
379 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000380 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000381}
382
383static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000384Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000385{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000386 if (self->is_initialised)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000387 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000388 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000389 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000390 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000391}
392
393static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000394Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000395{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000396 if (self->is_initialised)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000397 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000398 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000399 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000400 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000401}
402
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000403PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000404"compress(data) -- Return a string containing data compressed.\n"
405"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000406"After calling this function, some of the input data may still\n"
407"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000408"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000409
410
Guido van Rossumfb221561997-04-29 15:38:09 +0000411static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000412PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000413{
Antoine Pitrou3843cd82010-05-07 16:50:34 +0000414 int err, inplen;
415 Py_ssize_t length = DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000416 PyObject *RetVal;
417 Byte *input;
418 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000419
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000420 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000421 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000422
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000423 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000424 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000425
426 ENTER_ZLIB
427
Jeremy Hylton9714f992001-10-16 21:19:45 +0000428 start_total_out = self->zst.total_out;
429 self->zst.avail_in = inplen;
430 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000431 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000432 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000433
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000434 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000435 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000436 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000437
Jeremy Hylton9714f992001-10-16 21:19:45 +0000438 /* while Z_OK and the output buffer is full, there might be more output,
439 so extend the output buffer and try again */
440 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000441 if (_PyString_Resize(&RetVal, length << 1) < 0)
442 goto error;
443 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
444 + length;
445 self->zst.avail_out = length;
446 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000447
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000448 Py_BEGIN_ALLOW_THREADS
449 err = deflate(&(self->zst), Z_NO_FLUSH);
450 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000451 }
Tim Peters977e5402001-10-17 03:57:20 +0000452 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000453 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000454 condition.
455 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000456
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000457 if (err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000458 zlib_error(self->zst, err, "while compressing");
459 Py_DECREF(RetVal);
460 RetVal = NULL;
461 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000462 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000463 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000464
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000465 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000466 LEAVE_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000467 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000468}
469
Nadeem Vawda252f4dc2012-11-11 02:14:15 +0100470/* Helper for objdecompress() and unflush(). Saves any unconsumed input data in
471 self->unused_data or self->unconsumed_tail, as appropriate. */
472static int
473save_unconsumed_input(compobject *self, int err)
474{
475 if (err == Z_STREAM_END) {
476 /* The end of the compressed data has been reached. Store the leftover
477 input data in self->unused_data. */
478 if (self->zst.avail_in > 0) {
479 Py_ssize_t old_size = PyString_GET_SIZE(self->unused_data);
480 Py_ssize_t new_size;
481 PyObject *new_data;
482 if (self->zst.avail_in > PY_SSIZE_T_MAX - old_size) {
483 PyErr_NoMemory();
484 return -1;
485 }
486 new_size = old_size + self->zst.avail_in;
487 new_data = PyString_FromStringAndSize(NULL, new_size);
488 if (new_data == NULL)
489 return -1;
490 Py_MEMCPY(PyString_AS_STRING(new_data),
491 PyString_AS_STRING(self->unused_data), old_size);
492 Py_MEMCPY(PyString_AS_STRING(new_data) + old_size,
493 self->zst.next_in, self->zst.avail_in);
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300494 Py_XSETREF(self->unused_data, new_data);
Nadeem Vawda252f4dc2012-11-11 02:14:15 +0100495 self->zst.avail_in = 0;
496 }
497 }
498 if (self->zst.avail_in > 0 || PyString_GET_SIZE(self->unconsumed_tail)) {
499 /* This code handles two distinct cases:
500 1. Output limit was reached. Save leftover input in unconsumed_tail.
501 2. All input data was consumed. Clear unconsumed_tail. */
502 PyObject *new_data = PyString_FromStringAndSize(
503 (char *)self->zst.next_in, self->zst.avail_in);
504 if (new_data == NULL)
505 return -1;
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300506 Py_XSETREF(self->unconsumed_tail, new_data);
Nadeem Vawda252f4dc2012-11-11 02:14:15 +0100507 }
508 return 0;
509}
510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000511PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000512"decompress(data, max_length) -- Return a string containing the decompressed\n"
513"version of the data.\n"
514"\n"
515"After calling this function, some of the input data may still be stored in\n"
516"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000517"Call the flush() method to clear these buffers.\n"
518"If the max_length parameter is specified then the return value will be\n"
519"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000520"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000521
Guido van Rossumfb221561997-04-29 15:38:09 +0000522static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000523PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000524{
Antoine Pitrou3843cd82010-05-07 16:50:34 +0000525 int err, inplen, max_length = 0;
526 Py_ssize_t old_length, length = DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000527 PyObject *RetVal;
528 Byte *input;
529 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000530
Tim Peters977e5402001-10-17 03:57:20 +0000531 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000532 &inplen, &max_length))
533 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000534 if (max_length < 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000535 PyErr_SetString(PyExc_ValueError,
536 "max_length must be greater than zero");
537 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000538 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000539
Jeremy Hylton9714f992001-10-16 21:19:45 +0000540 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000541 if (max_length && length > max_length)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000542 length = max_length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000543 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000544 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000545
546 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000547
Jeremy Hylton9714f992001-10-16 21:19:45 +0000548 start_total_out = self->zst.total_out;
549 self->zst.avail_in = inplen;
550 self->zst.next_in = input;
551 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000552 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000553
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000554 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000555 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000556 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000557
Jeremy Hylton9714f992001-10-16 21:19:45 +0000558 /* While Z_OK and the output buffer is full, there might be more output.
559 So extend the output buffer and try again.
560 */
Tim Peters977e5402001-10-17 03:57:20 +0000561 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 /* If max_length set, don't continue decompressing if we've already
563 reached the limit.
564 */
565 if (max_length && length >= max_length)
566 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000567
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000568 /* otherwise, ... */
569 old_length = length;
570 length = length << 1;
571 if (max_length && length > max_length)
572 length = max_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000573
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000574 if (_PyString_Resize(&RetVal, length) < 0)
575 goto error;
576 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
577 + old_length;
578 self->zst.avail_out = length - old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000579
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000580 Py_BEGIN_ALLOW_THREADS
581 err = inflate(&(self->zst), Z_SYNC_FLUSH);
582 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000583 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000584
Nadeem Vawda252f4dc2012-11-11 02:14:15 +0100585 if (save_unconsumed_input(self, err) < 0) {
Nadeem Vawda0cc4fd92011-05-14 14:29:07 +0200586 Py_DECREF(RetVal);
587 RetVal = NULL;
588 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000589 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000590
Nadeem Vawda252f4dc2012-11-11 02:14:15 +0100591 /* This is the logical place to call inflateEnd, but the old behaviour of
592 only calling it on flush() is preserved. */
593
594 if (err != Z_STREAM_END && err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000595 /* We will only get Z_BUF_ERROR if the output buffer was full
596 but there wasn't more output when we tried again, so it is
597 not an error condition.
598 */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000599 zlib_error(self->zst, err, "while decompressing");
600 Py_DECREF(RetVal);
601 RetVal = NULL;
602 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000603 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000604
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000605 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000606
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000607 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000608 LEAVE_ZLIB
609
610 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000611}
612
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000613PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000614"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000615"\n"
616"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000617"default value used when mode is not specified is Z_FINISH.\n"
618"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000619"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000620
Guido van Rossumfb221561997-04-29 15:38:09 +0000621static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000622PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000623{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000624 int err, length = DEFAULTALLOC;
625 PyObject *RetVal;
626 int flushmode = Z_FINISH;
627 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000628
Jeremy Hylton9714f992001-10-16 21:19:45 +0000629 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000630 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000631
Jeremy Hylton9714f992001-10-16 21:19:45 +0000632 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
633 doing any work at all; just return an empty string. */
634 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000635 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000636 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000637
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000638 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000639 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000640
641 ENTER_ZLIB
Tim Peters977e5402001-10-17 03:57:20 +0000642
Jeremy Hylton9714f992001-10-16 21:19:45 +0000643 start_total_out = self->zst.total_out;
644 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000645 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000646 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000647
648 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000649 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000650 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000651
Jeremy Hylton9714f992001-10-16 21:19:45 +0000652 /* while Z_OK and the output buffer is full, there might be more output,
653 so extend the output buffer and try again */
654 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000655 if (_PyString_Resize(&RetVal, length << 1) < 0)
656 goto error;
657 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
658 + length;
659 self->zst.avail_out = length;
660 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000661
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000662 Py_BEGIN_ALLOW_THREADS
663 err = deflate(&(self->zst), flushmode);
664 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000665 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000666
Jeremy Hylton9714f992001-10-16 21:19:45 +0000667 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000668 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000669 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000670 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000671 err = deflateEnd(&(self->zst));
672 if (err != Z_OK) {
673 zlib_error(self->zst, err, "from deflateEnd()");
674 Py_DECREF(RetVal);
675 RetVal = NULL;
676 goto error;
677 }
678 else
679 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000680
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000681 /* We will only get Z_BUF_ERROR if the output buffer was full
682 but there wasn't more output when we tried again, so it is
683 not an error condition.
684 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000685 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000686 zlib_error(self->zst, err, "while flushing");
687 Py_DECREF(RetVal);
688 RetVal = NULL;
689 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000690 }
Tim Peters977e5402001-10-17 03:57:20 +0000691
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000692 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000693
Tim Peters977e5402001-10-17 03:57:20 +0000694 error:
Tim Petersb1a37c02001-10-17 03:56:45 +0000695 LEAVE_ZLIB
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000696
697 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000698}
699
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000700#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000701PyDoc_STRVAR(comp_copy__doc__,
702"copy() -- Return a copy of the compression object.");
703
704static PyObject *
705PyZlib_copy(compobject *self)
706{
707 compobject *retval = NULL;
708 int err;
709
710 retval = newcompobject(&Comptype);
711 if (!retval) return NULL;
712
713 /* Copy the zstream state
714 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
715 */
716 ENTER_ZLIB
717 err = deflateCopy(&retval->zst, &self->zst);
718 switch(err) {
719 case(Z_OK):
720 break;
721 case(Z_STREAM_ERROR):
722 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
723 goto error;
724 case(Z_MEM_ERROR):
725 PyErr_SetString(PyExc_MemoryError,
726 "Can't allocate memory for compression object");
727 goto error;
728 default:
729 zlib_error(self->zst, err, "while copying compression object");
730 goto error;
731 }
732
Tim Peters402cc242006-05-17 01:30:11 +0000733 Py_INCREF(self->unused_data);
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300734 Py_XSETREF(retval->unused_data, self->unused_data);
Tim Peters402cc242006-05-17 01:30:11 +0000735 Py_INCREF(self->unconsumed_tail);
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300736 Py_XSETREF(retval->unconsumed_tail, self->unconsumed_tail);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000737
738 /* Mark it as being initialized */
739 retval->is_initialised = 1;
740
741 LEAVE_ZLIB
742 return (PyObject *)retval;
743
744error:
745 LEAVE_ZLIB
Tim Peters402cc242006-05-17 01:30:11 +0000746 Py_XDECREF(retval);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000747 return NULL;
748}
749
750PyDoc_STRVAR(decomp_copy__doc__,
751"copy() -- Return a copy of the decompression object.");
752
753static PyObject *
754PyZlib_uncopy(compobject *self)
755{
756 compobject *retval = NULL;
757 int err;
758
759 retval = newcompobject(&Decomptype);
760 if (!retval) return NULL;
761
762 /* Copy the zstream state
763 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
764 */
765 ENTER_ZLIB
766 err = inflateCopy(&retval->zst, &self->zst);
767 switch(err) {
768 case(Z_OK):
769 break;
770 case(Z_STREAM_ERROR):
771 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
772 goto error;
773 case(Z_MEM_ERROR):
774 PyErr_SetString(PyExc_MemoryError,
775 "Can't allocate memory for decompression object");
776 goto error;
777 default:
778 zlib_error(self->zst, err, "while copying decompression object");
779 goto error;
780 }
781
Tim Peters402cc242006-05-17 01:30:11 +0000782 Py_INCREF(self->unused_data);
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300783 Py_XSETREF(retval->unused_data, self->unused_data);
Tim Peters402cc242006-05-17 01:30:11 +0000784 Py_INCREF(self->unconsumed_tail);
Serhiy Storchakabc62af12016-04-06 09:51:18 +0300785 Py_XSETREF(retval->unconsumed_tail, self->unconsumed_tail);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000786
787 /* Mark it as being initialized */
788 retval->is_initialised = 1;
789
790 LEAVE_ZLIB
791 return (PyObject *)retval;
792
793error:
794 LEAVE_ZLIB
795 Py_XDECREF(retval);
796 return NULL;
797}
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000798#endif
Georg Brandl8d3342b2006-05-16 07:38:27 +0000799
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000800PyDoc_STRVAR(decomp_flush__doc__,
Georg Brandl22a9dc82006-04-01 07:39:41 +0000801"flush( [length] ) -- Return a string containing any remaining\n"
802"decompressed data. length, if given, is the initial size of the\n"
803"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000804"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000805"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000806
Guido van Rossumfb221561997-04-29 15:38:09 +0000807static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000808PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000809{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000810 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000811 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000812 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000813
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000814 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000815 return NULL;
Gregory P. Smith79e42a02008-04-09 00:25:17 +0000816 if (length <= 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000817 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
818 return NULL;
Gregory P. Smith79e42a02008-04-09 00:25:17 +0000819 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000820 if (!(retval = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000821 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000822
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000823
Jeremy Hylton9714f992001-10-16 21:19:45 +0000824 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000825
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000826 start_total_out = self->zst.total_out;
Nadeem Vawdaacfdfda2012-11-11 03:28:21 +0100827 self->zst.avail_in = PyString_GET_SIZE(self->unconsumed_tail);
828 self->zst.next_in = (Byte *)PyString_AS_STRING(self->unconsumed_tail);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000829 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000830 self->zst.next_out = (Byte *)PyString_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000831
832 Py_BEGIN_ALLOW_THREADS
833 err = inflate(&(self->zst), Z_FINISH);
834 Py_END_ALLOW_THREADS
835
836 /* while Z_OK and the output buffer is full, there might be more output,
837 so extend the output buffer and try again */
838 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000839 if (_PyString_Resize(&retval, length << 1) < 0)
840 goto error;
841 self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length;
842 self->zst.avail_out = length;
843 length = length << 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000844
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000845 Py_BEGIN_ALLOW_THREADS
846 err = inflate(&(self->zst), Z_FINISH);
847 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000848 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000849
Nadeem Vawda252f4dc2012-11-11 02:14:15 +0100850 if (save_unconsumed_input(self, err) < 0) {
851 Py_DECREF(retval);
852 retval = NULL;
853 goto error;
854 }
855
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000856 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
857 various data structures. Note we should only get Z_STREAM_END when
858 flushmode is Z_FINISH */
859 if (err == Z_STREAM_END) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000860 err = inflateEnd(&(self->zst));
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000861 self->is_initialised = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000862 if (err != Z_OK) {
863 zlib_error(self->zst, err, "from inflateEnd()");
864 Py_DECREF(retval);
865 retval = NULL;
866 goto error;
867 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000868 }
Nadeem Vawda252f4dc2012-11-11 02:14:15 +0100869
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000870 _PyString_Resize(&retval, self->zst.total_out - start_total_out);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000871
872error:
873
Jeremy Hylton9714f992001-10-16 21:19:45 +0000874 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000875
Jeremy Hylton9714f992001-10-16 21:19:45 +0000876 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000877}
878
879static PyMethodDef comp_methods[] =
880{
Tim Peters977e5402001-10-17 03:57:20 +0000881 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000882 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000883 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000884 comp_flush__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000885#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000886 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
887 comp_copy__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000888#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000889 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000890};
891
892static PyMethodDef Decomp_methods[] =
893{
Tim Peters977e5402001-10-17 03:57:20 +0000894 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000895 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000896 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000897 decomp_flush__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000898#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000899 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
900 decomp_copy__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000901#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000902 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000903};
904
905static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000906Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000907{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000908 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
909 internal data. */
910
911 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000912}
913
914static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000915Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000916{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000917 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000918
Jeremy Hylton9714f992001-10-16 21:19:45 +0000919 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000920
Tim Peters977e5402001-10-17 03:57:20 +0000921 if (strcmp(name, "unused_data") == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000922 Py_INCREF(self->unused_data);
923 retval = self->unused_data;
Tim Peters977e5402001-10-17 03:57:20 +0000924 } else if (strcmp(name, "unconsumed_tail") == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000925 Py_INCREF(self->unconsumed_tail);
926 retval = self->unconsumed_tail;
Tim Peters977e5402001-10-17 03:57:20 +0000927 } else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000928 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000929
Jeremy Hylton9714f992001-10-16 21:19:45 +0000930 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000931
Jeremy Hylton9714f992001-10-16 21:19:45 +0000932 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000933}
934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000936"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
937"\n"
938"An optional starting value can be specified. The returned checksum is\n"
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000939"a signed integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000940
Guido van Rossumfb221561997-04-29 15:38:09 +0000941static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000942PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000943{
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000944 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000945 Byte *buf;
Gregory P. Smith73f57b02008-03-23 20:31:23 +0000946 int len, signed_val;
Tim Peters977e5402001-10-17 03:57:20 +0000947
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000948 if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000949 return NULL;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000950 /* In Python 2.x we return a signed integer regardless of native platform
951 * long size (the 32bit unsigned long is treated as 32-bit signed and sign
952 * extended into a 64-bit long inside the integer object). 3.0 does the
953 * right thing and returns unsigned. http://bugs.python.org/issue1202 */
954 signed_val = adler32(adler32val, buf, len);
955 return PyInt_FromLong(signed_val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000956}
Tim Peters977e5402001-10-17 03:57:20 +0000957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000958PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000959"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
960"\n"
961"An optional starting value can be specified. The returned checksum is\n"
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000962"a signed integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +0000963
964static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000965PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000966{
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000967 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000968 Byte *buf;
Gregory P. Smith73f57b02008-03-23 20:31:23 +0000969 int len, signed_val;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000970
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000971 if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000972 return NULL;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000973 /* In Python 2.x we return a signed integer regardless of native platform
974 * long size (the 32bit unsigned long is treated as 32-bit signed and sign
975 * extended into a 64-bit long inside the integer object). 3.0 does the
976 * right thing and returns unsigned. http://bugs.python.org/issue1202 */
977 signed_val = crc32(crc32val, buf, len);
978 return PyInt_FromLong(signed_val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000979}
Tim Peters977e5402001-10-17 03:57:20 +0000980
Guido van Rossumfb221561997-04-29 15:38:09 +0000981
982static PyMethodDef zlib_methods[] =
983{
Tim Peters977e5402001-10-17 03:57:20 +0000984 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000985 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000986 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000987 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000988 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000989 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000990 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
991 crc32__doc__},
992 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000993 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000994 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000995 decompressobj__doc__},
996 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000997};
998
Tim Peters0c322792002-07-17 16:49:03 +0000999static PyTypeObject Comptype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001000 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001001 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001002 sizeof(compobject),
1003 0,
1004 (destructor)Comp_dealloc, /*tp_dealloc*/
1005 0, /*tp_print*/
1006 (getattrfunc)Comp_getattr, /*tp_getattr*/
1007 0, /*tp_setattr*/
1008 0, /*tp_compare*/
1009 0, /*tp_repr*/
1010 0, /*tp_as_number*/
1011 0, /*tp_as_sequence*/
1012 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001013};
1014
Tim Peters0c322792002-07-17 16:49:03 +00001015static PyTypeObject Decomptype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001016 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001017 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001018 sizeof(compobject),
1019 0,
1020 (destructor)Decomp_dealloc, /*tp_dealloc*/
1021 0, /*tp_print*/
1022 (getattrfunc)Decomp_getattr, /*tp_getattr*/
1023 0, /*tp_setattr*/
1024 0, /*tp_compare*/
1025 0, /*tp_repr*/
1026 0, /*tp_as_number*/
1027 0, /*tp_as_sequence*/
1028 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001029};
1030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001031PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001032"The functions in this module allow compression and decompression using the\n"
1033"zlib library, which is based on GNU zip.\n"
1034"\n"
1035"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
Nadeem Vawda99f9b8d2012-11-11 14:01:23 +01001036"compress(string[, level]) -- Compress string, with compression level in 0-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001037"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001038"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001039"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001040"decompressobj([wbits]) -- Return a decompressor object.\n"
1041"\n"
1042"'wbits' is window buffer size.\n"
1043"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001044"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001045
Mark Hammond62b1ab12002-07-23 06:31:15 +00001046PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001047PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001048{
Fred Drake4baedc12002-04-01 14:53:37 +00001049 PyObject *m, *ver;
Christian Heimese93237d2007-12-19 02:37:44 +00001050 Py_TYPE(&Comptype) = &PyType_Type;
1051 Py_TYPE(&Decomptype) = &PyType_Type;
Jeremy Hylton9714f992001-10-16 21:19:45 +00001052 m = Py_InitModule4("zlib", zlib_methods,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001053 zlib_module_documentation,
1054 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001055 if (m == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001056 return;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001057
Fred Drake4baedc12002-04-01 14:53:37 +00001058 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1059 if (ZlibError != NULL) {
1060 Py_INCREF(ZlibError);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001061 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001062 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001063 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1064 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1065 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1066 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1067 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1068 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1069 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1070 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1071 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001072
Jeremy Hylton9714f992001-10-16 21:19:45 +00001073 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1074 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1075 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1076 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001077
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001078 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001079 if (ver != NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001080 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001081
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001082 PyModule_AddStringConstant(m, "__version__", "1.0");
1083
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001084#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +00001085 zlib_lock = PyThread_allocate_lock();
Sjoerd Mullender556a9382002-03-11 09:20:47 +00001086#endif /* WITH_THREAD */
Guido van Rossumfb221561997-04-29 15:38:09 +00001087}