blob: 035aa8e085da66b05ff5ca813a87be8be3117ad9 [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 v. Löwis14f8b4c2002-06-13 20:33:02 +0000104"Optional arg level is the compression level, in 1-9.");
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"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000135"Optional arg level is the compression level, in 1-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
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000470PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000471"decompress(data, max_length) -- Return a string containing the decompressed\n"
472"version of the data.\n"
473"\n"
474"After calling this function, some of the input data may still be stored in\n"
475"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000476"Call the flush() method to clear these buffers.\n"
477"If the max_length parameter is specified then the return value will be\n"
478"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000479"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000480
Guido van Rossumfb221561997-04-29 15:38:09 +0000481static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000482PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000483{
Antoine Pitrou3843cd82010-05-07 16:50:34 +0000484 int err, inplen, max_length = 0;
485 Py_ssize_t old_length, length = DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000486 PyObject *RetVal;
487 Byte *input;
488 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000489
Tim Peters977e5402001-10-17 03:57:20 +0000490 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000491 &inplen, &max_length))
492 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000493 if (max_length < 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000494 PyErr_SetString(PyExc_ValueError,
495 "max_length must be greater than zero");
496 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000497 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000498
Jeremy Hylton9714f992001-10-16 21:19:45 +0000499 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000500 if (max_length && length > max_length)
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000501 length = max_length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000502 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000503 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000504
505 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000506
Jeremy Hylton9714f992001-10-16 21:19:45 +0000507 start_total_out = self->zst.total_out;
508 self->zst.avail_in = inplen;
509 self->zst.next_in = input;
510 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000511 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000512
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000513 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000514 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000515 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000516
Jeremy Hylton9714f992001-10-16 21:19:45 +0000517 /* While Z_OK and the output buffer is full, there might be more output.
518 So extend the output buffer and try again.
519 */
Tim Peters977e5402001-10-17 03:57:20 +0000520 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000521 /* If max_length set, don't continue decompressing if we've already
522 reached the limit.
523 */
524 if (max_length && length >= max_length)
525 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000526
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000527 /* otherwise, ... */
528 old_length = length;
529 length = length << 1;
530 if (max_length && length > max_length)
531 length = max_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000532
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000533 if (_PyString_Resize(&RetVal, length) < 0)
534 goto error;
535 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
536 + old_length;
537 self->zst.avail_out = length - old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000538
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000539 Py_BEGIN_ALLOW_THREADS
540 err = inflate(&(self->zst), Z_SYNC_FLUSH);
541 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000542 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000543
Jeremy Hylton9714f992001-10-16 21:19:45 +0000544 if(max_length) {
Nadeem Vawda0cc4fd92011-05-14 14:29:07 +0200545 /* Not all of the compressed data could be accommodated in a buffer of
546 the specified size. Return the unconsumed tail in an attribute. */
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000547 Py_DECREF(self->unconsumed_tail);
548 self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in,
549 self->zst.avail_in);
Nadeem Vawda0cc4fd92011-05-14 14:29:07 +0200550 }
551 else if (PyString_GET_SIZE(self->unconsumed_tail) > 0) {
552 /* All of the compressed data was consumed. Clear unconsumed_tail. */
553 Py_DECREF(self->unconsumed_tail);
554 self->unconsumed_tail = PyString_FromStringAndSize("", 0);
555 }
556 if(!self->unconsumed_tail) {
557 Py_DECREF(RetVal);
558 RetVal = NULL;
559 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000560 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000561
Tim Peters977e5402001-10-17 03:57:20 +0000562 /* The end of the compressed data has been reached, so set the
563 unused_data attribute to a string containing the remainder of the
564 data in the string. Note that this is also a logical place to call
Jeremy Hylton9714f992001-10-16 21:19:45 +0000565 inflateEnd, but the old behaviour of only calling it on flush() is
566 preserved.
567 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000568 if (err == Z_STREAM_END) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000569 Py_XDECREF(self->unused_data); /* Free original empty string */
570 self->unused_data = PyString_FromStringAndSize(
571 (char *)self->zst.next_in, self->zst.avail_in);
572 if (self->unused_data == NULL) {
573 Py_DECREF(RetVal);
574 goto error;
575 }
576 /* We will only get Z_BUF_ERROR if the output buffer was full
577 but there wasn't more output when we tried again, so it is
578 not an error condition.
579 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000580 } else if (err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000581 zlib_error(self->zst, err, "while decompressing");
582 Py_DECREF(RetVal);
583 RetVal = NULL;
584 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000585 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000586
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000587 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000588
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000589 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000590 LEAVE_ZLIB
591
592 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000593}
594
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000595PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000596"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000597"\n"
598"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000599"default value used when mode is not specified is Z_FINISH.\n"
600"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000601"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000602
Guido van Rossumfb221561997-04-29 15:38:09 +0000603static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000604PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000605{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000606 int err, length = DEFAULTALLOC;
607 PyObject *RetVal;
608 int flushmode = Z_FINISH;
609 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000610
Jeremy Hylton9714f992001-10-16 21:19:45 +0000611 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000612 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000613
Jeremy Hylton9714f992001-10-16 21:19:45 +0000614 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
615 doing any work at all; just return an empty string. */
616 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000617 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000618 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000619
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000620 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000621 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000622
623 ENTER_ZLIB
Tim Peters977e5402001-10-17 03:57:20 +0000624
Jeremy Hylton9714f992001-10-16 21:19:45 +0000625 start_total_out = self->zst.total_out;
626 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000627 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000628 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000629
630 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000631 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000632 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000633
Jeremy Hylton9714f992001-10-16 21:19:45 +0000634 /* while Z_OK and the output buffer is full, there might be more output,
635 so extend the output buffer and try again */
636 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000637 if (_PyString_Resize(&RetVal, length << 1) < 0)
638 goto error;
639 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
640 + length;
641 self->zst.avail_out = length;
642 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000643
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000644 Py_BEGIN_ALLOW_THREADS
645 err = deflate(&(self->zst), flushmode);
646 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000647 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000648
Jeremy Hylton9714f992001-10-16 21:19:45 +0000649 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000650 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000651 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000652 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000653 err = deflateEnd(&(self->zst));
654 if (err != Z_OK) {
655 zlib_error(self->zst, err, "from deflateEnd()");
656 Py_DECREF(RetVal);
657 RetVal = NULL;
658 goto error;
659 }
660 else
661 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000662
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000663 /* We will only get Z_BUF_ERROR if the output buffer was full
664 but there wasn't more output when we tried again, so it is
665 not an error condition.
666 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000667 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000668 zlib_error(self->zst, err, "while flushing");
669 Py_DECREF(RetVal);
670 RetVal = NULL;
671 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000672 }
Tim Peters977e5402001-10-17 03:57:20 +0000673
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000674 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000675
Tim Peters977e5402001-10-17 03:57:20 +0000676 error:
Tim Petersb1a37c02001-10-17 03:56:45 +0000677 LEAVE_ZLIB
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000678
679 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000680}
681
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000682#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000683PyDoc_STRVAR(comp_copy__doc__,
684"copy() -- Return a copy of the compression object.");
685
686static PyObject *
687PyZlib_copy(compobject *self)
688{
689 compobject *retval = NULL;
690 int err;
691
692 retval = newcompobject(&Comptype);
693 if (!retval) return NULL;
694
695 /* Copy the zstream state
696 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
697 */
698 ENTER_ZLIB
699 err = deflateCopy(&retval->zst, &self->zst);
700 switch(err) {
701 case(Z_OK):
702 break;
703 case(Z_STREAM_ERROR):
704 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
705 goto error;
706 case(Z_MEM_ERROR):
707 PyErr_SetString(PyExc_MemoryError,
708 "Can't allocate memory for compression object");
709 goto error;
710 default:
711 zlib_error(self->zst, err, "while copying compression object");
712 goto error;
713 }
714
Tim Peters402cc242006-05-17 01:30:11 +0000715 Py_INCREF(self->unused_data);
716 Py_INCREF(self->unconsumed_tail);
717 Py_XDECREF(retval->unused_data);
718 Py_XDECREF(retval->unconsumed_tail);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000719 retval->unused_data = self->unused_data;
720 retval->unconsumed_tail = self->unconsumed_tail;
Georg Brandl8d3342b2006-05-16 07:38:27 +0000721
722 /* Mark it as being initialized */
723 retval->is_initialised = 1;
724
725 LEAVE_ZLIB
726 return (PyObject *)retval;
727
728error:
729 LEAVE_ZLIB
Tim Peters402cc242006-05-17 01:30:11 +0000730 Py_XDECREF(retval);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000731 return NULL;
732}
733
734PyDoc_STRVAR(decomp_copy__doc__,
735"copy() -- Return a copy of the decompression object.");
736
737static PyObject *
738PyZlib_uncopy(compobject *self)
739{
740 compobject *retval = NULL;
741 int err;
742
743 retval = newcompobject(&Decomptype);
744 if (!retval) return NULL;
745
746 /* Copy the zstream state
747 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
748 */
749 ENTER_ZLIB
750 err = inflateCopy(&retval->zst, &self->zst);
751 switch(err) {
752 case(Z_OK):
753 break;
754 case(Z_STREAM_ERROR):
755 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
756 goto error;
757 case(Z_MEM_ERROR):
758 PyErr_SetString(PyExc_MemoryError,
759 "Can't allocate memory for decompression object");
760 goto error;
761 default:
762 zlib_error(self->zst, err, "while copying decompression object");
763 goto error;
764 }
765
Tim Peters402cc242006-05-17 01:30:11 +0000766 Py_INCREF(self->unused_data);
767 Py_INCREF(self->unconsumed_tail);
768 Py_XDECREF(retval->unused_data);
769 Py_XDECREF(retval->unconsumed_tail);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000770 retval->unused_data = self->unused_data;
771 retval->unconsumed_tail = self->unconsumed_tail;
Georg Brandl8d3342b2006-05-16 07:38:27 +0000772
773 /* Mark it as being initialized */
774 retval->is_initialised = 1;
775
776 LEAVE_ZLIB
777 return (PyObject *)retval;
778
779error:
780 LEAVE_ZLIB
781 Py_XDECREF(retval);
782 return NULL;
783}
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000784#endif
Georg Brandl8d3342b2006-05-16 07:38:27 +0000785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000786PyDoc_STRVAR(decomp_flush__doc__,
Georg Brandl22a9dc82006-04-01 07:39:41 +0000787"flush( [length] ) -- Return a string containing any remaining\n"
788"decompressed data. length, if given, is the initial size of the\n"
789"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000790"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000791"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000792
Guido van Rossumfb221561997-04-29 15:38:09 +0000793static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000794PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000795{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000796 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000797 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000798 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000799
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000800 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000801 return NULL;
Gregory P. Smith79e42a02008-04-09 00:25:17 +0000802 if (length <= 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000803 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
804 return NULL;
Gregory P. Smith79e42a02008-04-09 00:25:17 +0000805 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000806 if (!(retval = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000807 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000808
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000809
Jeremy Hylton9714f992001-10-16 21:19:45 +0000810 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000811
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000812 start_total_out = self->zst.total_out;
813 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000814 self->zst.next_out = (Byte *)PyString_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000815
816 Py_BEGIN_ALLOW_THREADS
817 err = inflate(&(self->zst), Z_FINISH);
818 Py_END_ALLOW_THREADS
819
820 /* while Z_OK and the output buffer is full, there might be more output,
821 so extend the output buffer and try again */
822 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000823 if (_PyString_Resize(&retval, length << 1) < 0)
824 goto error;
825 self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length;
826 self->zst.avail_out = length;
827 length = length << 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000828
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000829 Py_BEGIN_ALLOW_THREADS
830 err = inflate(&(self->zst), Z_FINISH);
831 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000832 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000833
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000834 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
835 various data structures. Note we should only get Z_STREAM_END when
836 flushmode is Z_FINISH */
837 if (err == Z_STREAM_END) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000838 err = inflateEnd(&(self->zst));
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000839 self->is_initialised = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 if (err != Z_OK) {
841 zlib_error(self->zst, err, "from inflateEnd()");
842 Py_DECREF(retval);
843 retval = NULL;
844 goto error;
845 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000846 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000847 _PyString_Resize(&retval, self->zst.total_out - start_total_out);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000848
849error:
850
Jeremy Hylton9714f992001-10-16 21:19:45 +0000851 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000852
Jeremy Hylton9714f992001-10-16 21:19:45 +0000853 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000854}
855
856static PyMethodDef comp_methods[] =
857{
Tim Peters977e5402001-10-17 03:57:20 +0000858 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000859 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000860 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000861 comp_flush__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000862#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000863 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
864 comp_copy__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000865#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000866 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000867};
868
869static PyMethodDef Decomp_methods[] =
870{
Tim Peters977e5402001-10-17 03:57:20 +0000871 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000872 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000873 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000874 decomp_flush__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000875#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000876 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
877 decomp_copy__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000878#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000879 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000880};
881
882static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000883Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000884{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000885 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
886 internal data. */
887
888 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000889}
890
891static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000892Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000893{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000894 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000895
Jeremy Hylton9714f992001-10-16 21:19:45 +0000896 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000897
Tim Peters977e5402001-10-17 03:57:20 +0000898 if (strcmp(name, "unused_data") == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000899 Py_INCREF(self->unused_data);
900 retval = self->unused_data;
Tim Peters977e5402001-10-17 03:57:20 +0000901 } else if (strcmp(name, "unconsumed_tail") == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000902 Py_INCREF(self->unconsumed_tail);
903 retval = self->unconsumed_tail;
Tim Peters977e5402001-10-17 03:57:20 +0000904 } else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000905 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000906
Jeremy Hylton9714f992001-10-16 21:19:45 +0000907 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000908
Jeremy Hylton9714f992001-10-16 21:19:45 +0000909 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000910}
911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000912PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000913"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
914"\n"
915"An optional starting value can be specified. The returned checksum is\n"
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000916"a signed integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000917
Guido van Rossumfb221561997-04-29 15:38:09 +0000918static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000919PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000920{
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000921 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000922 Byte *buf;
Gregory P. Smith73f57b02008-03-23 20:31:23 +0000923 int len, signed_val;
Tim Peters977e5402001-10-17 03:57:20 +0000924
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000925 if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000926 return NULL;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000927 /* In Python 2.x we return a signed integer regardless of native platform
928 * long size (the 32bit unsigned long is treated as 32-bit signed and sign
929 * extended into a 64-bit long inside the integer object). 3.0 does the
930 * right thing and returns unsigned. http://bugs.python.org/issue1202 */
931 signed_val = adler32(adler32val, buf, len);
932 return PyInt_FromLong(signed_val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000933}
Tim Peters977e5402001-10-17 03:57:20 +0000934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000936"crc32(string[, start]) -- Compute a CRC-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 Rossumfb221561997-04-29 15:38:09 +0000940
941static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000942PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000943{
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000944 unsigned int crc32val = 0; /* crc32(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;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000947
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000948 if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
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 = crc32(crc32val, 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
Guido van Rossumfb221561997-04-29 15:38:09 +0000958
959static PyMethodDef zlib_methods[] =
960{
Tim Peters977e5402001-10-17 03:57:20 +0000961 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000962 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000963 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000964 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000965 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000966 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000967 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
968 crc32__doc__},
969 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000970 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000971 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000972 decompressobj__doc__},
973 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000974};
975
Tim Peters0c322792002-07-17 16:49:03 +0000976static PyTypeObject Comptype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000977 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000978 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000979 sizeof(compobject),
980 0,
981 (destructor)Comp_dealloc, /*tp_dealloc*/
982 0, /*tp_print*/
983 (getattrfunc)Comp_getattr, /*tp_getattr*/
984 0, /*tp_setattr*/
985 0, /*tp_compare*/
986 0, /*tp_repr*/
987 0, /*tp_as_number*/
988 0, /*tp_as_sequence*/
989 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000990};
991
Tim Peters0c322792002-07-17 16:49:03 +0000992static PyTypeObject Decomptype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000993 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000994 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000995 sizeof(compobject),
996 0,
997 (destructor)Decomp_dealloc, /*tp_dealloc*/
998 0, /*tp_print*/
999 (getattrfunc)Decomp_getattr, /*tp_getattr*/
1000 0, /*tp_setattr*/
1001 0, /*tp_compare*/
1002 0, /*tp_repr*/
1003 0, /*tp_as_number*/
1004 0, /*tp_as_sequence*/
1005 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001006};
1007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001008PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001009"The functions in this module allow compression and decompression using the\n"
1010"zlib library, which is based on GNU zip.\n"
1011"\n"
1012"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
1013"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001014"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001015"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001016"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001017"decompressobj([wbits]) -- Return a decompressor object.\n"
1018"\n"
1019"'wbits' is window buffer size.\n"
1020"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001021"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001022
Mark Hammond62b1ab12002-07-23 06:31:15 +00001023PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001024PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001025{
Fred Drake4baedc12002-04-01 14:53:37 +00001026 PyObject *m, *ver;
Christian Heimese93237d2007-12-19 02:37:44 +00001027 Py_TYPE(&Comptype) = &PyType_Type;
1028 Py_TYPE(&Decomptype) = &PyType_Type;
Jeremy Hylton9714f992001-10-16 21:19:45 +00001029 m = Py_InitModule4("zlib", zlib_methods,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001030 zlib_module_documentation,
1031 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001032 if (m == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001033 return;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001034
Fred Drake4baedc12002-04-01 14:53:37 +00001035 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1036 if (ZlibError != NULL) {
1037 Py_INCREF(ZlibError);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001038 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001039 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001040 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1041 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1042 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1043 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1044 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1045 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1046 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1047 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1048 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001049
Jeremy Hylton9714f992001-10-16 21:19:45 +00001050 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1051 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1052 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1053 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001054
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001055 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001056 if (ver != NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001057 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001058
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001059 PyModule_AddStringConstant(m, "__version__", "1.0");
1060
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001061#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +00001062 zlib_lock = PyThread_allocate_lock();
Sjoerd Mullender556a9382002-03-11 09:20:47 +00001063#endif /* WITH_THREAD */
Guido van Rossumfb221561997-04-29 15:38:09 +00001064}