blob: 95e85b5aa1cc5ca183574c55e3f2ca951027caad [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) {
Nadeem Vawda6cad3712012-11-05 00:55:06 +0100569 if (self->zst.avail_in > 0) {
570 /* Append the leftover data to the existing value of unused_data. */
571 Py_ssize_t old_size = PyString_GET_SIZE(self->unused_data);
572 Py_ssize_t new_size = old_size + self->zst.avail_in;
573 PyObject *new_data;
574 if (new_size <= old_size) { /* Check for overflow. */
575 PyErr_NoMemory();
576 Py_DECREF(RetVal);
577 RetVal = NULL;
578 goto error;
579 }
580 new_data = PyString_FromStringAndSize(NULL, new_size);
581 if (new_data == NULL) {
582 Py_DECREF(RetVal);
583 RetVal = NULL;
584 goto error;
585 }
586 Py_MEMCPY(PyString_AS_STRING(new_data),
587 PyString_AS_STRING(self->unused_data), old_size);
588 Py_MEMCPY(PyString_AS_STRING(new_data) + old_size,
589 self->zst.next_in, self->zst.avail_in);
590 Py_DECREF(self->unused_data);
591 self->unused_data = new_data;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 }
593 /* We will only get Z_BUF_ERROR if the output buffer was full
594 but there wasn't more output when we tried again, so it is
595 not an error condition.
596 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000597 } else if (err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000598 zlib_error(self->zst, err, "while decompressing");
599 Py_DECREF(RetVal);
600 RetVal = NULL;
601 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000602 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000603
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000604 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000605
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000606 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000607 LEAVE_ZLIB
608
609 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000610}
611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000612PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000613"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000614"\n"
615"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000616"default value used when mode is not specified is Z_FINISH.\n"
617"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000618"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000619
Guido van Rossumfb221561997-04-29 15:38:09 +0000620static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000621PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000622{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000623 int err, length = DEFAULTALLOC;
624 PyObject *RetVal;
625 int flushmode = Z_FINISH;
626 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000627
Jeremy Hylton9714f992001-10-16 21:19:45 +0000628 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000629 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000630
Jeremy Hylton9714f992001-10-16 21:19:45 +0000631 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
632 doing any work at all; just return an empty string. */
633 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000634 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000635 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000636
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000637 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000638 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000639
640 ENTER_ZLIB
Tim Peters977e5402001-10-17 03:57:20 +0000641
Jeremy Hylton9714f992001-10-16 21:19:45 +0000642 start_total_out = self->zst.total_out;
643 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000644 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000645 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000646
647 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000648 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000649 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000650
Jeremy Hylton9714f992001-10-16 21:19:45 +0000651 /* while Z_OK and the output buffer is full, there might be more output,
652 so extend the output buffer and try again */
653 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000654 if (_PyString_Resize(&RetVal, length << 1) < 0)
655 goto error;
656 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
657 + length;
658 self->zst.avail_out = length;
659 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000660
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000661 Py_BEGIN_ALLOW_THREADS
662 err = deflate(&(self->zst), flushmode);
663 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000664 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000665
Jeremy Hylton9714f992001-10-16 21:19:45 +0000666 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000667 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000668 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000669 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000670 err = deflateEnd(&(self->zst));
671 if (err != Z_OK) {
672 zlib_error(self->zst, err, "from deflateEnd()");
673 Py_DECREF(RetVal);
674 RetVal = NULL;
675 goto error;
676 }
677 else
678 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000679
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000680 /* We will only get Z_BUF_ERROR if the output buffer was full
681 but there wasn't more output when we tried again, so it is
682 not an error condition.
683 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000684 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000685 zlib_error(self->zst, err, "while flushing");
686 Py_DECREF(RetVal);
687 RetVal = NULL;
688 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000689 }
Tim Peters977e5402001-10-17 03:57:20 +0000690
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000691 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000692
Tim Peters977e5402001-10-17 03:57:20 +0000693 error:
Tim Petersb1a37c02001-10-17 03:56:45 +0000694 LEAVE_ZLIB
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000695
696 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000697}
698
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000699#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000700PyDoc_STRVAR(comp_copy__doc__,
701"copy() -- Return a copy of the compression object.");
702
703static PyObject *
704PyZlib_copy(compobject *self)
705{
706 compobject *retval = NULL;
707 int err;
708
709 retval = newcompobject(&Comptype);
710 if (!retval) return NULL;
711
712 /* Copy the zstream state
713 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
714 */
715 ENTER_ZLIB
716 err = deflateCopy(&retval->zst, &self->zst);
717 switch(err) {
718 case(Z_OK):
719 break;
720 case(Z_STREAM_ERROR):
721 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
722 goto error;
723 case(Z_MEM_ERROR):
724 PyErr_SetString(PyExc_MemoryError,
725 "Can't allocate memory for compression object");
726 goto error;
727 default:
728 zlib_error(self->zst, err, "while copying compression object");
729 goto error;
730 }
731
Tim Peters402cc242006-05-17 01:30:11 +0000732 Py_INCREF(self->unused_data);
733 Py_INCREF(self->unconsumed_tail);
734 Py_XDECREF(retval->unused_data);
735 Py_XDECREF(retval->unconsumed_tail);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000736 retval->unused_data = self->unused_data;
737 retval->unconsumed_tail = self->unconsumed_tail;
Georg Brandl8d3342b2006-05-16 07:38:27 +0000738
739 /* Mark it as being initialized */
740 retval->is_initialised = 1;
741
742 LEAVE_ZLIB
743 return (PyObject *)retval;
744
745error:
746 LEAVE_ZLIB
Tim Peters402cc242006-05-17 01:30:11 +0000747 Py_XDECREF(retval);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000748 return NULL;
749}
750
751PyDoc_STRVAR(decomp_copy__doc__,
752"copy() -- Return a copy of the decompression object.");
753
754static PyObject *
755PyZlib_uncopy(compobject *self)
756{
757 compobject *retval = NULL;
758 int err;
759
760 retval = newcompobject(&Decomptype);
761 if (!retval) return NULL;
762
763 /* Copy the zstream state
764 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
765 */
766 ENTER_ZLIB
767 err = inflateCopy(&retval->zst, &self->zst);
768 switch(err) {
769 case(Z_OK):
770 break;
771 case(Z_STREAM_ERROR):
772 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
773 goto error;
774 case(Z_MEM_ERROR):
775 PyErr_SetString(PyExc_MemoryError,
776 "Can't allocate memory for decompression object");
777 goto error;
778 default:
779 zlib_error(self->zst, err, "while copying decompression object");
780 goto error;
781 }
782
Tim Peters402cc242006-05-17 01:30:11 +0000783 Py_INCREF(self->unused_data);
784 Py_INCREF(self->unconsumed_tail);
785 Py_XDECREF(retval->unused_data);
786 Py_XDECREF(retval->unconsumed_tail);
Georg Brandl8d3342b2006-05-16 07:38:27 +0000787 retval->unused_data = self->unused_data;
788 retval->unconsumed_tail = self->unconsumed_tail;
Georg Brandl8d3342b2006-05-16 07:38:27 +0000789
790 /* Mark it as being initialized */
791 retval->is_initialised = 1;
792
793 LEAVE_ZLIB
794 return (PyObject *)retval;
795
796error:
797 LEAVE_ZLIB
798 Py_XDECREF(retval);
799 return NULL;
800}
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000801#endif
Georg Brandl8d3342b2006-05-16 07:38:27 +0000802
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000803PyDoc_STRVAR(decomp_flush__doc__,
Georg Brandl22a9dc82006-04-01 07:39:41 +0000804"flush( [length] ) -- Return a string containing any remaining\n"
805"decompressed data. length, if given, is the initial size of the\n"
806"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000807"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000808"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000809
Guido van Rossumfb221561997-04-29 15:38:09 +0000810static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000811PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000812{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000813 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000814 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000815 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000816
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000817 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000818 return NULL;
Gregory P. Smith79e42a02008-04-09 00:25:17 +0000819 if (length <= 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000820 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
821 return NULL;
Gregory P. Smith79e42a02008-04-09 00:25:17 +0000822 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000823 if (!(retval = PyString_FromStringAndSize(NULL, length)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000824 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000825
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000826
Jeremy Hylton9714f992001-10-16 21:19:45 +0000827 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000828
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000829 start_total_out = self->zst.total_out;
830 self->zst.avail_out = length;
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000831 self->zst.next_out = (Byte *)PyString_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000832
833 Py_BEGIN_ALLOW_THREADS
834 err = inflate(&(self->zst), Z_FINISH);
835 Py_END_ALLOW_THREADS
836
837 /* while Z_OK and the output buffer is full, there might be more output,
838 so extend the output buffer and try again */
839 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000840 if (_PyString_Resize(&retval, length << 1) < 0)
841 goto error;
842 self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length;
843 self->zst.avail_out = length;
844 length = length << 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000845
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000846 Py_BEGIN_ALLOW_THREADS
847 err = inflate(&(self->zst), Z_FINISH);
848 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000849 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000850
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000851 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
852 various data structures. Note we should only get Z_STREAM_END when
853 flushmode is Z_FINISH */
854 if (err == Z_STREAM_END) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000855 err = inflateEnd(&(self->zst));
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000856 self->is_initialised = 0;
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 if (err != Z_OK) {
858 zlib_error(self->zst, err, "from inflateEnd()");
859 Py_DECREF(retval);
860 retval = NULL;
861 goto error;
862 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000863 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000864 _PyString_Resize(&retval, self->zst.total_out - start_total_out);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000865
866error:
867
Jeremy Hylton9714f992001-10-16 21:19:45 +0000868 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000869
Jeremy Hylton9714f992001-10-16 21:19:45 +0000870 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000871}
872
873static PyMethodDef comp_methods[] =
874{
Tim Peters977e5402001-10-17 03:57:20 +0000875 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000876 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000877 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000878 comp_flush__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000879#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000880 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
881 comp_copy__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000882#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000883 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000884};
885
886static PyMethodDef Decomp_methods[] =
887{
Tim Peters977e5402001-10-17 03:57:20 +0000888 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000889 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000890 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000891 decomp_flush__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000892#ifdef HAVE_ZLIB_COPY
Georg Brandl8d3342b2006-05-16 07:38:27 +0000893 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
894 decomp_copy__doc__},
Neal Norwitz6e73aaa2006-06-12 03:33:09 +0000895#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000896 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000897};
898
899static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000900Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000901{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000902 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
903 internal data. */
904
905 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000906}
907
908static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000909Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000910{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000911 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000912
Jeremy Hylton9714f992001-10-16 21:19:45 +0000913 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000914
Tim Peters977e5402001-10-17 03:57:20 +0000915 if (strcmp(name, "unused_data") == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000916 Py_INCREF(self->unused_data);
917 retval = self->unused_data;
Tim Peters977e5402001-10-17 03:57:20 +0000918 } else if (strcmp(name, "unconsumed_tail") == 0) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000919 Py_INCREF(self->unconsumed_tail);
920 retval = self->unconsumed_tail;
Tim Peters977e5402001-10-17 03:57:20 +0000921 } else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000922 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000923
Jeremy Hylton9714f992001-10-16 21:19:45 +0000924 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000925
Jeremy Hylton9714f992001-10-16 21:19:45 +0000926 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000927}
928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000929PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000930"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
931"\n"
932"An optional starting value can be specified. The returned checksum is\n"
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000933"a signed integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000934
Guido van Rossumfb221561997-04-29 15:38:09 +0000935static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000936PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000937{
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000938 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000939 Byte *buf;
Gregory P. Smith73f57b02008-03-23 20:31:23 +0000940 int len, signed_val;
Tim Peters977e5402001-10-17 03:57:20 +0000941
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000942 if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000943 return NULL;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000944 /* In Python 2.x we return a signed integer regardless of native platform
945 * long size (the 32bit unsigned long is treated as 32-bit signed and sign
946 * extended into a 64-bit long inside the integer object). 3.0 does the
947 * right thing and returns unsigned. http://bugs.python.org/issue1202 */
948 signed_val = adler32(adler32val, buf, len);
949 return PyInt_FromLong(signed_val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000950}
Tim Peters977e5402001-10-17 03:57:20 +0000951
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000952PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000953"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
954"\n"
955"An optional starting value can be specified. The returned checksum is\n"
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000956"a signed integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +0000957
958static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000959PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000960{
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000961 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000962 Byte *buf;
Gregory P. Smith73f57b02008-03-23 20:31:23 +0000963 int len, signed_val;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000964
Gregory P. Smith1fa588e2008-03-25 07:31:28 +0000965 if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000966 return NULL;
Gregory P. Smithf48f9d32008-03-17 18:48:05 +0000967 /* In Python 2.x we return a signed integer regardless of native platform
968 * long size (the 32bit unsigned long is treated as 32-bit signed and sign
969 * extended into a 64-bit long inside the integer object). 3.0 does the
970 * right thing and returns unsigned. http://bugs.python.org/issue1202 */
971 signed_val = crc32(crc32val, buf, len);
972 return PyInt_FromLong(signed_val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000973}
Tim Peters977e5402001-10-17 03:57:20 +0000974
Guido van Rossumfb221561997-04-29 15:38:09 +0000975
976static PyMethodDef zlib_methods[] =
977{
Tim Peters977e5402001-10-17 03:57:20 +0000978 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000979 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000980 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000981 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000982 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000983 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000984 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
985 crc32__doc__},
986 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000987 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000988 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000989 decompressobj__doc__},
990 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000991};
992
Tim Peters0c322792002-07-17 16:49:03 +0000993static PyTypeObject Comptype = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000994 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000995 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000996 sizeof(compobject),
997 0,
998 (destructor)Comp_dealloc, /*tp_dealloc*/
999 0, /*tp_print*/
1000 (getattrfunc)Comp_getattr, /*tp_getattr*/
1001 0, /*tp_setattr*/
1002 0, /*tp_compare*/
1003 0, /*tp_repr*/
1004 0, /*tp_as_number*/
1005 0, /*tp_as_sequence*/
1006 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001007};
1008
Tim Peters0c322792002-07-17 16:49:03 +00001009static PyTypeObject Decomptype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00001010 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001011 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001012 sizeof(compobject),
1013 0,
1014 (destructor)Decomp_dealloc, /*tp_dealloc*/
1015 0, /*tp_print*/
1016 (getattrfunc)Decomp_getattr, /*tp_getattr*/
1017 0, /*tp_setattr*/
1018 0, /*tp_compare*/
1019 0, /*tp_repr*/
1020 0, /*tp_as_number*/
1021 0, /*tp_as_sequence*/
1022 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001023};
1024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001025PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001026"The functions in this module allow compression and decompression using the\n"
1027"zlib library, which is based on GNU zip.\n"
1028"\n"
1029"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
1030"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001031"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001032"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001033"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001034"decompressobj([wbits]) -- Return a decompressor object.\n"
1035"\n"
1036"'wbits' is window buffer size.\n"
1037"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001038"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001039
Mark Hammond62b1ab12002-07-23 06:31:15 +00001040PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001041PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001042{
Fred Drake4baedc12002-04-01 14:53:37 +00001043 PyObject *m, *ver;
Christian Heimese93237d2007-12-19 02:37:44 +00001044 Py_TYPE(&Comptype) = &PyType_Type;
1045 Py_TYPE(&Decomptype) = &PyType_Type;
Jeremy Hylton9714f992001-10-16 21:19:45 +00001046 m = Py_InitModule4("zlib", zlib_methods,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001047 zlib_module_documentation,
1048 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001049 if (m == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001050 return;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001051
Fred Drake4baedc12002-04-01 14:53:37 +00001052 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1053 if (ZlibError != NULL) {
1054 Py_INCREF(ZlibError);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001055 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001056 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001057 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1058 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1059 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1060 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1061 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1062 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1063 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1064 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1065 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001066
Jeremy Hylton9714f992001-10-16 21:19:45 +00001067 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1068 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1069 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1070 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001071
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001072 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001073 if (ver != NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001074 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001075
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001076 PyModule_AddStringConstant(m, "__version__", "1.0");
1077
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001078#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +00001079 zlib_lock = PyThread_allocate_lock();
Sjoerd Mullender556a9382002-03-11 09:20:47 +00001080#endif /* WITH_THREAD */
Guido van Rossumfb221561997-04-29 15:38:09 +00001081}