blob: cecb9cf38bbb50fe4bbb685c2bd1686337acf969 [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 \
Tim Peters6605c642001-10-17 03:43:54 +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 \
Tim Peters6605c642001-10-17 03:43:54 +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{
75 if (zst.msg == Z_NULL)
76 PyErr_Format(ZlibError, "Error %d %s", err, msg);
77 else
78 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
79}
80
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000081PyDoc_STRVAR(compressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +000082"compressobj([level]) -- Return a compressor object.\n"
83"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000084"Optional arg level is the compression level, in 1-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +000085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000086PyDoc_STRVAR(decompressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +000087"decompressobj([wbits]) -- Return a decompressor object.\n"
88"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000089"Optional arg wbits is the window buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +000090
Guido van Rossumfb221561997-04-29 15:38:09 +000091static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000092newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +000093{
Tim Peters977e5402001-10-17 03:57:20 +000094 compobject *self;
Jeremy Hylton9714f992001-10-16 21:19:45 +000095 self = PyObject_New(compobject, type);
96 if (self == NULL)
97 return NULL;
98 self->is_initialised = 0;
Guido van Rossum776152b2007-05-22 22:44:07 +000099 self->unused_data = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000100 if (self->unused_data == NULL) {
101 Py_DECREF(self);
102 return NULL;
103 }
Guido van Rossum776152b2007-05-22 22:44:07 +0000104 self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000105 if (self->unconsumed_tail == NULL) {
106 Py_DECREF(self);
107 return NULL;
108 }
109 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000110}
111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000112PyDoc_STRVAR(compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000113"compress(string[, level]) -- Returned compressed string.\n"
114"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000115"Optional arg level is the compression level, in 1-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000116
Guido van Rossumfb221561997-04-29 15:38:09 +0000117static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000118PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000119{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000120 PyObject *ReturnVal = NULL;
121 Byte *input, *output;
122 int length, level=Z_DEFAULT_COMPRESSION, err;
123 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000124
Jeremy Hylton9714f992001-10-16 21:19:45 +0000125 /* require Python string object, optional 'level' arg */
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000126 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000127 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000128
Jeremy Hylton9714f992001-10-16 21:19:45 +0000129 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000130
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000131 output = (Byte*)malloc(zst.avail_out);
132 if (output == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000133 PyErr_SetString(PyExc_MemoryError,
134 "Can't allocate memory to compress data");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000135 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000136 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000137
Jeremy Hylton9714f992001-10-16 21:19:45 +0000138 /* Past the point of no return. From here on out, we need to make sure
139 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000140
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000141 zst.zalloc = (alloc_func)NULL;
142 zst.zfree = (free_func)Z_NULL;
143 zst.next_out = (Byte *)output;
144 zst.next_in = (Byte *)input;
145 zst.avail_in = length;
146 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000147
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000148 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000149 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000150 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000151 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000152 PyErr_SetString(PyExc_MemoryError,
153 "Out of memory while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000154 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000155 case(Z_STREAM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000156 PyErr_SetString(ZlibError,
157 "Bad compression level");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000158 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000159 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000160 deflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000161 zlib_error(zst, err, "while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000162 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000163 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000164
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000165 Py_BEGIN_ALLOW_THREADS;
166 err = deflate(&zst, Z_FINISH);
167 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000168
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000169 if (err != Z_STREAM_END) {
170 zlib_error(zst, err, "while compressing data");
171 deflateEnd(&zst);
172 goto error;
173 }
Tim Peters977e5402001-10-17 03:57:20 +0000174
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000175 err=deflateEnd(&zst);
176 if (err == Z_OK)
Guido van Rossum776152b2007-05-22 22:44:07 +0000177 ReturnVal = PyBytes_FromStringAndSize((char *)output,
178 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000179 else
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000180 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000181
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000182 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000183 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000184
Jeremy Hylton9714f992001-10-16 21:19:45 +0000185 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000186}
187
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000188PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000189"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
190"\n"
191"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000192"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000193
Guido van Rossumfb221561997-04-29 15:38:09 +0000194static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000195PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000196{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000197 PyObject *result_str;
198 Byte *input;
199 int length, err;
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000200 int wsize=DEF_WBITS;
201 Py_ssize_t r_strlen=DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000202 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000203
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000204 if (!PyArg_ParseTuple(args, "s#|in:decompress",
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000205 &input, &length, &wsize, &r_strlen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000206 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000207
Jeremy Hylton9714f992001-10-16 21:19:45 +0000208 if (r_strlen <= 0)
209 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000210
Jeremy Hylton9714f992001-10-16 21:19:45 +0000211 zst.avail_in = length;
212 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000213
Guido van Rossum776152b2007-05-22 22:44:07 +0000214 if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000215 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000216
Jeremy Hylton9714f992001-10-16 21:19:45 +0000217 zst.zalloc = (alloc_func)NULL;
218 zst.zfree = (free_func)Z_NULL;
Guido van Rossum776152b2007-05-22 22:44:07 +0000219 zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000220 zst.next_in = (Byte *)input;
221 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000222
Jeremy Hylton9714f992001-10-16 21:19:45 +0000223 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000224 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000225 break;
Tim Peters977e5402001-10-17 03:57:20 +0000226 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000227 PyErr_SetString(PyExc_MemoryError,
228 "Out of memory while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000229 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000230 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000231 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000232 zlib_error(zst, err, "while preparing to decompress data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000233 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000234 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000235
Jeremy Hylton9714f992001-10-16 21:19:45 +0000236 do {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000237 Py_BEGIN_ALLOW_THREADS
238 err=inflate(&zst, Z_FINISH);
239 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000240
Jeremy Hylton9714f992001-10-16 21:19:45 +0000241 switch(err) {
242 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000243 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000244 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000245 /*
246 * If there is at least 1 byte of room according to zst.avail_out
247 * and we get this error, assume that it means zlib cannot
248 * process the inflate call() due to an error in the data.
249 */
Jeremy Hylton0965e082001-10-16 21:56:09 +0000250 if (zst.avail_out > 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000251 PyErr_Format(ZlibError, "Error %i while decompressing data",
252 err);
253 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000254 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000255 }
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000256 /* fall through */
257 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000258 /* need more memory */
Guido van Rossum776152b2007-05-22 22:44:07 +0000259 if (PyBytes_Resize(result_str, r_strlen << 1) < 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000260 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000261 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000262 }
Guido van Rossum776152b2007-05-22 22:44:07 +0000263 zst.next_out =
264 (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000265 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000266 r_strlen = r_strlen << 1;
267 break;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000268 default:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000269 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000270 zlib_error(zst, err, "while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000271 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000272 }
273 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000274
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000275 err = inflateEnd(&zst);
276 if (err != Z_OK) {
277 zlib_error(zst, err, "while finishing data decompression");
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000278 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000279 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000280
Guido van Rossum776152b2007-05-22 22:44:07 +0000281 if (PyBytes_Resize(result_str, zst.total_out) < 0)
282 goto error;
283
Jeremy Hylton9714f992001-10-16 21:19:45 +0000284 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000285
286 error:
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000287 Py_XDECREF(result_str);
288 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000289}
290
291static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000292PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000293{
Jeremy Hylton499000002001-10-16 21:59:35 +0000294 compobject *self;
295 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
296 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000297
Jeremy Hylton499000002001-10-16 21:59:35 +0000298 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
299 &memLevel, &strategy))
300 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000301
Jeremy Hylton499000002001-10-16 21:59:35 +0000302 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000303 if (self==NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000304 return(NULL);
305 self->zst.zalloc = (alloc_func)NULL;
306 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000307 self->zst.next_in = NULL;
308 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000309 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
310 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000311 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000312 self->is_initialised = 1;
313 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000314 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000315 Py_DECREF(self);
316 PyErr_SetString(PyExc_MemoryError,
317 "Can't allocate memory for compression object");
318 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000319 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000320 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000321 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000322 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000323 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000324 zlib_error(self->zst, err, "while creating compression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000325 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000326 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000327 }
328}
329
330static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000331PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000332{
Jeremy Hylton499000002001-10-16 21:59:35 +0000333 int wbits=DEF_WBITS, err;
334 compobject *self;
335 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
336 return NULL;
337
338 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000339 if (self == NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000340 return(NULL);
341 self->zst.zalloc = (alloc_func)NULL;
342 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000343 self->zst.next_in = NULL;
344 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000345 err = inflateInit2(&self->zst, wbits);
346 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000347 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000348 self->is_initialised = 1;
349 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000350 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000351 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000352 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000353 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000354 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000355 Py_DECREF(self);
356 PyErr_SetString(PyExc_MemoryError,
357 "Can't allocate memory for decompression object");
358 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000359 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000360 zlib_error(self->zst, err, "while creating decompression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000361 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000362 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000363 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000364}
365
366static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000367Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000368{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000369 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000370 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000371 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000372 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000373 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000374}
375
376static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000377Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000378{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000379 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000380 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000381 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000382 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000383 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000384}
385
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000386PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000387"compress(data) -- Return a string containing data compressed.\n"
388"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000389"After calling this function, some of the input data may still\n"
390"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000391"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000392
393
Guido van Rossumfb221561997-04-29 15:38:09 +0000394static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000395PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000396{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000397 int err, inplen, length = DEFAULTALLOC;
398 PyObject *RetVal;
399 Byte *input;
400 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000401
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000402 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000403 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000404
Guido van Rossum776152b2007-05-22 22:44:07 +0000405 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000406 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000407
408 ENTER_ZLIB
409
Jeremy Hylton9714f992001-10-16 21:19:45 +0000410 start_total_out = self->zst.total_out;
411 self->zst.avail_in = inplen;
412 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000413 self->zst.avail_out = length;
Guido van Rossum776152b2007-05-22 22:44:07 +0000414 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000415
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000416 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000417 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000418 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000419
Jeremy Hylton9714f992001-10-16 21:19:45 +0000420 /* while Z_OK and the output buffer is full, there might be more output,
421 so extend the output buffer and try again */
422 while (err == Z_OK && self->zst.avail_out == 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000423 if (PyBytes_Resize(RetVal, length << 1) < 0) {
424 Py_DECREF(RetVal);
425 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000426 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000427 }
428 self->zst.next_out =
429 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000430 self->zst.avail_out = length;
431 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000432
Jeremy Hylton9714f992001-10-16 21:19:45 +0000433 Py_BEGIN_ALLOW_THREADS
434 err = deflate(&(self->zst), Z_NO_FLUSH);
435 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000436 }
Tim Peters977e5402001-10-17 03:57:20 +0000437 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000438 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000439 condition.
440 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000441
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000442 if (err != Z_OK && err != Z_BUF_ERROR) {
443 zlib_error(self->zst, err, "while compressing");
444 Py_DECREF(RetVal);
445 RetVal = NULL;
446 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000447 }
Guido van Rossum776152b2007-05-22 22:44:07 +0000448 if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) {
449 Py_DECREF(RetVal);
450 RetVal = NULL;
451 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000452
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000453 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000454 LEAVE_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000455 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000456}
457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000458PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000459"decompress(data, max_length) -- Return a string containing the decompressed\n"
460"version of the data.\n"
461"\n"
462"After calling this function, some of the input data may still be stored in\n"
463"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000464"Call the flush() method to clear these buffers.\n"
465"If the max_length parameter is specified then the return value will be\n"
466"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000467"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000468
Guido van Rossumfb221561997-04-29 15:38:09 +0000469static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000470PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000471{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000472 int err, inplen, old_length, length = DEFAULTALLOC;
473 int max_length = 0;
474 PyObject *RetVal;
475 Byte *input;
476 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000477
Tim Peters977e5402001-10-17 03:57:20 +0000478 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000479 &inplen, &max_length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000480 return NULL;
481 if (max_length < 0) {
482 PyErr_SetString(PyExc_ValueError,
483 "max_length must be greater than zero");
484 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000485 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000486
Jeremy Hylton9714f992001-10-16 21:19:45 +0000487 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000488 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000489 length = max_length;
Guido van Rossum776152b2007-05-22 22:44:07 +0000490 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000491 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000492
493 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000494
Jeremy Hylton9714f992001-10-16 21:19:45 +0000495 start_total_out = self->zst.total_out;
496 self->zst.avail_in = inplen;
497 self->zst.next_in = input;
498 self->zst.avail_out = length;
Guido van Rossum776152b2007-05-22 22:44:07 +0000499 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000500
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000501 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000502 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000503 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000504
Jeremy Hylton9714f992001-10-16 21:19:45 +0000505 /* While Z_OK and the output buffer is full, there might be more output.
506 So extend the output buffer and try again.
507 */
Tim Peters977e5402001-10-17 03:57:20 +0000508 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000509 /* If max_length set, don't continue decompressing if we've already
510 reached the limit.
511 */
512 if (max_length && length >= max_length)
513 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000514
Jeremy Hylton9714f992001-10-16 21:19:45 +0000515 /* otherwise, ... */
516 old_length = length;
517 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000518 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000519 length = max_length;
520
Guido van Rossum776152b2007-05-22 22:44:07 +0000521 if (PyBytes_Resize(RetVal, length) < 0) {
522 Py_DECREF(RetVal);
523 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000524 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000525 }
526 self->zst.next_out =
527 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000528 self->zst.avail_out = length - old_length;
529
530 Py_BEGIN_ALLOW_THREADS
531 err = inflate(&(self->zst), Z_SYNC_FLUSH);
532 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000533 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000534
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000535 /* Not all of the compressed data could be accommodated in the output buffer
Jeremy Hylton9714f992001-10-16 21:19:45 +0000536 of specified size. Return the unconsumed tail in an attribute.*/
537 if(max_length) {
538 Py_DECREF(self->unconsumed_tail);
Guido van Rossum776152b2007-05-22 22:44:07 +0000539 self->unconsumed_tail = PyBytes_FromStringAndSize((char *)self->zst.next_in,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000540 self->zst.avail_in);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000541 if(!self->unconsumed_tail) {
542 Py_DECREF(RetVal);
543 RetVal = NULL;
544 goto error;
545 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000546 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000547
Tim Peters977e5402001-10-17 03:57:20 +0000548 /* The end of the compressed data has been reached, so set the
549 unused_data attribute to a string containing the remainder of the
550 data in the string. Note that this is also a logical place to call
Jeremy Hylton9714f992001-10-16 21:19:45 +0000551 inflateEnd, but the old behaviour of only calling it on flush() is
552 preserved.
553 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000554 if (err == Z_STREAM_END) {
555 Py_XDECREF(self->unused_data); /* Free original empty string */
Guido van Rossum776152b2007-05-22 22:44:07 +0000556 self->unused_data = PyBytes_FromStringAndSize(
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000557 (char *)self->zst.next_in, self->zst.avail_in);
558 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000559 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000560 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000561 }
Tim Peters977e5402001-10-17 03:57:20 +0000562 /* We will only get Z_BUF_ERROR if the output buffer was full
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000563 but there wasn't more output when we tried again, so it is
564 not an error condition.
565 */
566 } else if (err != Z_OK && err != Z_BUF_ERROR) {
567 zlib_error(self->zst, err, "while decompressing");
568 Py_DECREF(RetVal);
569 RetVal = NULL;
570 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000571 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000572
Guido van Rossum776152b2007-05-22 22:44:07 +0000573 if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) {
574 Py_DECREF(RetVal);
575 RetVal = NULL;
576 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000577
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000578 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000579 LEAVE_ZLIB
580
581 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000582}
583
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000584PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000585"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000586"\n"
587"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000588"default value used when mode is not specified is Z_FINISH.\n"
589"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000590"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000591
Guido van Rossumfb221561997-04-29 15:38:09 +0000592static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000593PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000594{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000595 int err, length = DEFAULTALLOC;
596 PyObject *RetVal;
597 int flushmode = Z_FINISH;
598 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000599
Jeremy Hylton9714f992001-10-16 21:19:45 +0000600 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
601 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000602
Jeremy Hylton9714f992001-10-16 21:19:45 +0000603 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
604 doing any work at all; just return an empty string. */
605 if (flushmode == Z_NO_FLUSH) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000606 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000607 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000608
Guido van Rossum776152b2007-05-22 22:44:07 +0000609 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000610 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000611
612 ENTER_ZLIB
Tim Peters977e5402001-10-17 03:57:20 +0000613
Jeremy Hylton9714f992001-10-16 21:19:45 +0000614 start_total_out = self->zst.total_out;
615 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000616 self->zst.avail_out = length;
Guido van Rossum776152b2007-05-22 22:44:07 +0000617 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000618
619 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000620 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000621 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000622
Jeremy Hylton9714f992001-10-16 21:19:45 +0000623 /* while Z_OK and the output buffer is full, there might be more output,
624 so extend the output buffer and try again */
625 while (err == Z_OK && self->zst.avail_out == 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000626 if (PyBytes_Resize(RetVal, length << 1) < 0) {
627 Py_DECREF(RetVal);
628 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000629 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000630 }
631 self->zst.next_out =
632 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000633 self->zst.avail_out = length;
634 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000635
Jeremy Hylton9714f992001-10-16 21:19:45 +0000636 Py_BEGIN_ALLOW_THREADS
637 err = deflate(&(self->zst), flushmode);
638 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000639 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000640
Jeremy Hylton9714f992001-10-16 21:19:45 +0000641 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000642 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000643 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000644 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
645 err = deflateEnd(&(self->zst));
646 if (err != Z_OK) {
647 zlib_error(self->zst, err, "from deflateEnd()");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000648 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000649 RetVal = NULL;
650 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000651 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000652 else
653 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000654
655 /* We will only get Z_BUF_ERROR if the output buffer was full
656 but there wasn't more output when we tried again, so it is
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000657 not an error condition.
658 */
659 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
660 zlib_error(self->zst, err, "while flushing");
661 Py_DECREF(RetVal);
662 RetVal = NULL;
Jeremy Hyltonc72737e2002-04-19 14:37:07 +0000663 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000664 }
Tim Peters977e5402001-10-17 03:57:20 +0000665
Guido van Rossum776152b2007-05-22 22:44:07 +0000666 if (PyBytes_Resize(RetVal, self->zst.total_out - start_total_out) < 0) {
667 Py_DECREF(RetVal);
668 RetVal = NULL;
669 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000670
Tim Peters977e5402001-10-17 03:57:20 +0000671 error:
Tim Petersb1a37c02001-10-17 03:56:45 +0000672 LEAVE_ZLIB
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000673
674 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000675}
676
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000677#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000678PyDoc_STRVAR(comp_copy__doc__,
679"copy() -- Return a copy of the compression object.");
680
681static PyObject *
682PyZlib_copy(compobject *self)
683{
684 compobject *retval = NULL;
685 int err;
686
687 retval = newcompobject(&Comptype);
688 if (!retval) return NULL;
689
690 /* Copy the zstream state
691 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
692 */
693 ENTER_ZLIB
694 err = deflateCopy(&retval->zst, &self->zst);
695 switch(err) {
696 case(Z_OK):
697 break;
698 case(Z_STREAM_ERROR):
699 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
700 goto error;
701 case(Z_MEM_ERROR):
702 PyErr_SetString(PyExc_MemoryError,
703 "Can't allocate memory for compression object");
704 goto error;
705 default:
706 zlib_error(self->zst, err, "while copying compression object");
707 goto error;
708 }
709
710 Py_INCREF(self->unused_data);
711 Py_INCREF(self->unconsumed_tail);
712 Py_XDECREF(retval->unused_data);
713 Py_XDECREF(retval->unconsumed_tail);
714 retval->unused_data = self->unused_data;
715 retval->unconsumed_tail = self->unconsumed_tail;
716
717 /* Mark it as being initialized */
718 retval->is_initialised = 1;
719
720 LEAVE_ZLIB
721 return (PyObject *)retval;
722
723error:
724 LEAVE_ZLIB
725 Py_XDECREF(retval);
726 return NULL;
727}
728
729PyDoc_STRVAR(decomp_copy__doc__,
730"copy() -- Return a copy of the decompression object.");
731
732static PyObject *
733PyZlib_uncopy(compobject *self)
734{
735 compobject *retval = NULL;
736 int err;
737
738 retval = newcompobject(&Decomptype);
739 if (!retval) return NULL;
740
741 /* Copy the zstream state
742 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
743 */
744 ENTER_ZLIB
745 err = inflateCopy(&retval->zst, &self->zst);
746 switch(err) {
747 case(Z_OK):
748 break;
749 case(Z_STREAM_ERROR):
750 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
751 goto error;
752 case(Z_MEM_ERROR):
753 PyErr_SetString(PyExc_MemoryError,
754 "Can't allocate memory for decompression object");
755 goto error;
756 default:
757 zlib_error(self->zst, err, "while copying decompression object");
758 goto error;
759 }
760
761 Py_INCREF(self->unused_data);
762 Py_INCREF(self->unconsumed_tail);
763 Py_XDECREF(retval->unused_data);
764 Py_XDECREF(retval->unconsumed_tail);
765 retval->unused_data = self->unused_data;
766 retval->unconsumed_tail = self->unconsumed_tail;
767
768 /* Mark it as being initialized */
769 retval->is_initialised = 1;
770
771 LEAVE_ZLIB
772 return (PyObject *)retval;
773
774error:
775 LEAVE_ZLIB
776 Py_XDECREF(retval);
777 return NULL;
778}
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000779#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000780
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000781PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000782"flush( [length] ) -- Return a string containing any remaining\n"
783"decompressed data. length, if given, is the initial size of the\n"
784"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000785"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000786"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000787
Guido van Rossumfb221561997-04-29 15:38:09 +0000788static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000789PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000790{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000791 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000792 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000793 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000794
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000795 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000796 return NULL;
Guido van Rossum776152b2007-05-22 22:44:07 +0000797 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000798 return NULL;
799
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000800
Jeremy Hylton9714f992001-10-16 21:19:45 +0000801 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000802
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000803 start_total_out = self->zst.total_out;
804 self->zst.avail_out = length;
Guido van Rossum776152b2007-05-22 22:44:07 +0000805 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000806
807 Py_BEGIN_ALLOW_THREADS
808 err = inflate(&(self->zst), Z_FINISH);
809 Py_END_ALLOW_THREADS
810
811 /* while Z_OK and the output buffer is full, there might be more output,
812 so extend the output buffer and try again */
813 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000814 if (PyBytes_Resize(retval, length << 1) < 0) {
815 Py_DECREF(retval);
816 retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000817 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000818 }
819 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000820 self->zst.avail_out = length;
821 length = length << 1;
822
823 Py_BEGIN_ALLOW_THREADS
824 err = inflate(&(self->zst), Z_FINISH);
825 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000826 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000827
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000828 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
829 various data structures. Note we should only get Z_STREAM_END when
830 flushmode is Z_FINISH */
831 if (err == Z_STREAM_END) {
832 err = inflateEnd(&(self->zst));
833 self->is_initialised = 0;
834 if (err != Z_OK) {
835 zlib_error(self->zst, err, "from inflateEnd()");
836 Py_DECREF(retval);
837 retval = NULL;
838 goto error;
839 }
840 }
Guido van Rossum776152b2007-05-22 22:44:07 +0000841 if (PyBytes_Resize(retval, self->zst.total_out - start_total_out) < 0) {
842 Py_DECREF(retval);
843 retval = NULL;
844 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000845
846error:
847
Jeremy Hylton9714f992001-10-16 21:19:45 +0000848 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000849
Jeremy Hylton9714f992001-10-16 21:19:45 +0000850 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000851}
852
853static PyMethodDef comp_methods[] =
854{
Tim Peters977e5402001-10-17 03:57:20 +0000855 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000856 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000857 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000858 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000859#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000860 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
861 comp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000862#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000863 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000864};
865
866static PyMethodDef Decomp_methods[] =
867{
Tim Peters977e5402001-10-17 03:57:20 +0000868 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000869 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000870 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000871 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000872#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000873 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
874 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000875#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000876 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000877};
878
879static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000880Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000881{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000882 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
883 internal data. */
884
885 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000886}
887
888static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000889Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000890{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000891 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000892
Jeremy Hylton9714f992001-10-16 21:19:45 +0000893 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000894
Tim Peters977e5402001-10-17 03:57:20 +0000895 if (strcmp(name, "unused_data") == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000896 Py_INCREF(self->unused_data);
897 retval = self->unused_data;
Tim Peters977e5402001-10-17 03:57:20 +0000898 } else if (strcmp(name, "unconsumed_tail") == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000899 Py_INCREF(self->unconsumed_tail);
900 retval = self->unconsumed_tail;
Tim Peters977e5402001-10-17 03:57:20 +0000901 } else
Jeremy Hylton9714f992001-10-16 21:19:45 +0000902 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000903
Jeremy Hylton9714f992001-10-16 21:19:45 +0000904 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000905
Jeremy Hylton9714f992001-10-16 21:19:45 +0000906 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000907}
908
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000909PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000910"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
911"\n"
912"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000913"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000914
Guido van Rossumfb221561997-04-29 15:38:09 +0000915static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000916PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000917{
Christian Heimes1dc54002008-03-24 02:19:29 +0000918 uLong adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000919 Byte *buf;
920 int len;
Tim Peters977e5402001-10-17 03:57:20 +0000921
Gregory P. Smith27275032008-03-20 06:20:09 +0000922 if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000923 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000924 adler32val = adler32(adler32val, buf, len);
Gregory P. Smith27275032008-03-20 06:20:09 +0000925 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +0000926}
Tim Peters977e5402001-10-17 03:57:20 +0000927
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000928PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000929"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
930"\n"
931"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000932"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +0000933
934static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000935PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000936{
Christian Heimes1dc54002008-03-24 02:19:29 +0000937 uLong crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000938 Byte *buf;
939 int len;
Gregory P. Smith27275032008-03-20 06:20:09 +0000940 if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000941 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000942 crc32val = crc32(crc32val, buf, len);
Gregory P. Smith27275032008-03-20 06:20:09 +0000943 return PyLong_FromUnsignedLong(crc32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +0000944}
Tim Peters977e5402001-10-17 03:57:20 +0000945
Guido van Rossumfb221561997-04-29 15:38:09 +0000946
947static PyMethodDef zlib_methods[] =
948{
Tim Peters977e5402001-10-17 03:57:20 +0000949 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000950 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000951 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000952 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000953 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000954 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000955 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
956 crc32__doc__},
957 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000958 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000959 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000960 decompressobj__doc__},
961 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000962};
963
Tim Peters0c322792002-07-17 16:49:03 +0000964static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000965 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000966 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000967 sizeof(compobject),
968 0,
969 (destructor)Comp_dealloc, /*tp_dealloc*/
970 0, /*tp_print*/
971 (getattrfunc)Comp_getattr, /*tp_getattr*/
972 0, /*tp_setattr*/
973 0, /*tp_compare*/
974 0, /*tp_repr*/
975 0, /*tp_as_number*/
976 0, /*tp_as_sequence*/
977 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000978};
979
Tim Peters0c322792002-07-17 16:49:03 +0000980static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000981 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000982 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000983 sizeof(compobject),
984 0,
985 (destructor)Decomp_dealloc, /*tp_dealloc*/
986 0, /*tp_print*/
987 (getattrfunc)Decomp_getattr, /*tp_getattr*/
988 0, /*tp_setattr*/
989 0, /*tp_compare*/
990 0, /*tp_repr*/
991 0, /*tp_as_number*/
992 0, /*tp_as_sequence*/
993 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000994};
995
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000996PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +0000997"The functions in this module allow compression and decompression using the\n"
998"zlib library, which is based on GNU zip.\n"
999"\n"
1000"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
1001"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001002"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001003"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001004"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001005"decompressobj([wbits]) -- Return a decompressor object.\n"
1006"\n"
1007"'wbits' is window buffer size.\n"
1008"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001009"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001010
Mark Hammond62b1ab12002-07-23 06:31:15 +00001011PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001012PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001013{
Fred Drake4baedc12002-04-01 14:53:37 +00001014 PyObject *m, *ver;
Christian Heimes90aa7642007-12-19 02:45:37 +00001015 Py_TYPE(&Comptype) = &PyType_Type;
1016 Py_TYPE(&Decomptype) = &PyType_Type;
Jeremy Hylton9714f992001-10-16 21:19:45 +00001017 m = Py_InitModule4("zlib", zlib_methods,
1018 zlib_module_documentation,
1019 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001020 if (m == NULL)
1021 return;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001022
Fred Drake4baedc12002-04-01 14:53:37 +00001023 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1024 if (ZlibError != NULL) {
1025 Py_INCREF(ZlibError);
1026 PyModule_AddObject(m, "error", ZlibError);
1027 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001028 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1029 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1030 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1031 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1032 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1033 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1034 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1035 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1036 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001037
Jeremy Hylton9714f992001-10-16 21:19:45 +00001038 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1039 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1040 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1041 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001042
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001043 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001044 if (ver != NULL)
1045 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001046
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001047 PyModule_AddStringConstant(m, "__version__", "1.0");
1048
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001049#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +00001050 zlib_lock = PyThread_allocate_lock();
Sjoerd Mullender556a9382002-03-11 09:20:47 +00001051#endif /* WITH_THREAD */
Guido van Rossumfb221561997-04-29 15:38:09 +00001052}