blob: 6dd8c29447ce0aa42e28cb1dc195ceb791ede216 [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
18 What we _do_ have to worry about is releasing the global lock _in
19 general_ in the zlibmodule functions, because of all the calls to
20 Python functions, which assume that the global lock is held. So
21 only two types of calls are wrapped in Py_BEGIN/END_ALLOW_THREADS:
22 those that grab the zlib lock, and those that involve other
23 time-consuming functions where we need to worry about holding up
24 other Python threads.
25
26 We don't need to worry about the string inputs being modified out
27 from underneath us, because string objects are immutable. However,
28 we do need to make sure we take on ownership, so that the strings
29 are not deleted out from under us during a thread swap.
30
31 N.B.
32
33 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions
34 that modify the components of preexisting de/compress objects, it
35 could prove to be a performance gain on multiprocessor machines if
36 there was an de/compress object-specific lock. However, for the
37 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL
38 de/compress objects.
39
40 */
41
42static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */
43
44#define ENTER_ZLIB \
45 { Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(zlib_lock, 1); \
46 Py_END_ALLOW_THREADS
47
48#define LEAVE_ZLIB \
49 PyThread_release_lock(zlib_lock); }
50
51#else
52
53#define ENTER_ZLIB
54#define LEAVE_ZLIB
55
56#endif
57
Guido van Rossumfb221561997-04-29 15:38:09 +000058/* The following parameters are copied from zutil.h, version 0.95 */
59#define DEFLATED 8
60#if MAX_MEM_LEVEL >= 8
61# define DEF_MEM_LEVEL 8
62#else
63# define DEF_MEM_LEVEL MAX_MEM_LEVEL
64#endif
65#define DEF_WBITS MAX_WBITS
66
Guido van Rossumb729a1d1999-04-07 20:23:17 +000067/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
68#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000069#define PyInit_zlib initzlib
70
71staticforward PyTypeObject Comptype;
72staticforward PyTypeObject Decomptype;
73
74static PyObject *ZlibError;
75
76typedef struct
77{
Jeremy Hylton9714f992001-10-16 21:19:45 +000078 PyObject_HEAD
79 z_stream zst;
80 PyObject *unused_data;
81 PyObject *unconsumed_tail;
82 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000083} compobject;
84
Guido van Rossum3c540301997-06-03 22:21:03 +000085static char compressobj__doc__[] =
86"compressobj() -- Return a compressor object.\n"
87"compressobj(level) -- Return a compressor object, using the given compression level.\n"
88;
89
90static char decompressobj__doc__[] =
91"decompressobj() -- Return a decompressor object.\n"
92"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
93;
94
Guido van Rossumfb221561997-04-29 15:38:09 +000095static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000096newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +000097{
Jeremy Hylton9714f992001-10-16 21:19:45 +000098 compobject *self;
99 self = PyObject_New(compobject, type);
100 if (self == NULL)
101 return NULL;
102 self->is_initialised = 0;
103 self->unused_data = PyString_FromString("");
104 if (self->unused_data == NULL) {
105 Py_DECREF(self);
106 return NULL;
107 }
108 self->unconsumed_tail = PyString_FromString("");
109 if (self->unconsumed_tail == NULL) {
110 Py_DECREF(self);
111 return NULL;
112 }
113 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000114}
115
Guido van Rossum3c540301997-06-03 22:21:03 +0000116static char compress__doc__[] =
117"compress(string) -- Compress string using the default compression level, "
118"returning a string containing compressed data.\n"
119"compress(string, level) -- Compress string, using the chosen compression "
120"level (from 1 to 9). Return a string containing the compressed data.\n"
121;
122
Guido van Rossumfb221561997-04-29 15:38:09 +0000123static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000124PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000125{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000126 PyObject *ReturnVal = NULL;
127 Byte *input, *output;
128 int length, level=Z_DEFAULT_COMPRESSION, err;
129 z_stream zst;
130 int return_error;
131 PyObject * inputString;
Guido van Rossumfb221561997-04-29 15:38:09 +0000132
Jeremy Hylton9714f992001-10-16 21:19:45 +0000133 /* require Python string object, optional 'level' arg */
134 if (!PyArg_ParseTuple(args, "S|i:compress", &inputString, &level))
135 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000136
Jeremy Hylton9714f992001-10-16 21:19:45 +0000137 /* now get a pointer to the internal string */
138 if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
139 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000140
Jeremy Hylton9714f992001-10-16 21:19:45 +0000141 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000142
Jeremy Hylton9714f992001-10-16 21:19:45 +0000143 output=(Byte*)malloc(zst.avail_out);
144 if (output==NULL)
Guido van Rossumfb221561997-04-29 15:38:09 +0000145 {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000146 PyErr_SetString(PyExc_MemoryError,
147 "Can't allocate memory to compress data");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000148 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000149 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000150
Jeremy Hylton9714f992001-10-16 21:19:45 +0000151 /* Past the point of no return. From here on out, we need to make sure
152 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000153
Jeremy Hylton9714f992001-10-16 21:19:45 +0000154 Py_INCREF(inputString); /* increment so that we hold ref */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000155
Jeremy Hylton9714f992001-10-16 21:19:45 +0000156 zst.zalloc=(alloc_func)NULL;
157 zst.zfree=(free_func)Z_NULL;
158 zst.next_out=(Byte *)output;
159 zst.next_in =(Byte *)input;
160 zst.avail_in=length;
161 err=deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000162
Jeremy Hylton9714f992001-10-16 21:19:45 +0000163 return_error = 0;
164 switch(err)
Guido van Rossumfb221561997-04-29 15:38:09 +0000165 {
166 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000167 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000168 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000169 PyErr_SetString(PyExc_MemoryError,
170 "Out of memory while compressing data");
171 return_error = 1;
172 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000173 case(Z_STREAM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000174 PyErr_SetString(ZlibError,
175 "Bad compression level");
176 return_error = 1;
177 break;
178 default: {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000179 if (zst.msg == Z_NULL)
180 PyErr_Format(ZlibError, "Error %i while compressing data",
181 err);
182 else
183 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
184 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000185 deflateEnd(&zst);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000186 return_error = 1;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000187 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000188 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000189
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000190 if (!return_error) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000191 Py_BEGIN_ALLOW_THREADS;
192 err=deflate(&zst, Z_FINISH);
193 Py_END_ALLOW_THREADS;
194
195 switch(err)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000196 {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000197 case(Z_STREAM_END):
198 break;
199 /* Are there other errors to be trapped here? */
200 default: {
201 if (zst.msg == Z_NULL)
202 PyErr_Format(ZlibError, "Error %i while compressing data",
203 err);
204 else
205 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
206 err, zst.msg);
207
208 deflateEnd(&zst);
209
210 return_error = 1;
211 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000212 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000213
214 if (!return_error) {
215 err=deflateEnd(&zst);
216 if (err == Z_OK)
217 ReturnVal = PyString_FromStringAndSize((char *)output,
218 zst.total_out);
219 else {
220 if (zst.msg == Z_NULL)
221 PyErr_Format(ZlibError,
222 "Error %i while finishing compression",
223 err);
224 else
225 PyErr_Format(ZlibError,
226 "Error %i while finishing compression: %.200s",
227 err, zst.msg);
228 }
229 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000230 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000231
Jeremy Hylton9714f992001-10-16 21:19:45 +0000232 free(output);
233 Py_DECREF(inputString);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000234
Jeremy Hylton9714f992001-10-16 21:19:45 +0000235 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000236}
237
Guido van Rossum3c540301997-06-03 22:21:03 +0000238static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000239"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
240"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
241"decompress(string, wbits, bufsize) -- Decompress the data in string with a window buffer size of wbits and an initial output buffer size of bufsize.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000242;
243
Guido van Rossumfb221561997-04-29 15:38:09 +0000244static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000245PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000246{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000247 PyObject *result_str;
248 Byte *input;
249 int length, err;
250 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
251 z_stream zst;
252 int return_error;
253 PyObject * inputString;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000254
Jeremy Hylton9714f992001-10-16 21:19:45 +0000255 if (!PyArg_ParseTuple(args, "S|ii:decompress",
256 &inputString, &wsize, &r_strlen))
257 return NULL;
258 if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
259 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000260
Jeremy Hylton9714f992001-10-16 21:19:45 +0000261 if (r_strlen <= 0)
262 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000263
Jeremy Hylton9714f992001-10-16 21:19:45 +0000264 zst.avail_in = length;
265 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000266
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000267 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000268 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000269
Jeremy Hylton9714f992001-10-16 21:19:45 +0000270 /* Past the point of no return. From here on out, we need to make sure
271 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000272
Jeremy Hylton9714f992001-10-16 21:19:45 +0000273 Py_INCREF(inputString); /* increment so that we hold ref */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000274
Jeremy Hylton9714f992001-10-16 21:19:45 +0000275 zst.zalloc = (alloc_func)NULL;
276 zst.zfree = (free_func)Z_NULL;
277 zst.next_out = (Byte *)PyString_AsString(result_str);
278 zst.next_in = (Byte *)input;
279 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000280
Jeremy Hylton9714f992001-10-16 21:19:45 +0000281 return_error = 0;
282 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000283 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000284 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000285 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000286 PyErr_SetString(PyExc_MemoryError,
287 "Out of memory while decompressing data");
288 return_error = 1;
289 default: {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000290 if (zst.msg == Z_NULL)
291 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
292 err);
293 else
294 PyErr_Format(ZlibError,
295 "Error %i while preparing to decompress data: %.200s",
296 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000297 inflateEnd(&zst);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000298
299 return_error = 1;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000300 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000301 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000302
Jeremy Hylton9714f992001-10-16 21:19:45 +0000303 do {
304 if (return_error)
305 break;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000306
Jeremy Hylton9714f992001-10-16 21:19:45 +0000307 Py_BEGIN_ALLOW_THREADS
308 err=inflate(&zst, Z_FINISH);
309 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000310
Jeremy Hylton9714f992001-10-16 21:19:45 +0000311 switch(err) {
312 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000313 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000314 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000315 /*
316 * If there is at least 1 byte of room according to zst.avail_out
317 * and we get this error, assume that it means zlib cannot
318 * process the inflate call() due to an error in the data.
319 */
320 if (zst.avail_out > 0)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000321 {
322 PyErr_Format(ZlibError, "Error %i while decompressing data",
323 err);
324 inflateEnd(&zst);
325 return_error = 1;
326 break;
327 }
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000328 /* fall through */
329 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000330 /* need more memory */
Jeremy Hylton9714f992001-10-16 21:19:45 +0000331 if (_PyString_Resize(&result_str, r_strlen << 1) == -1) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000332 inflateEnd(&zst);
333 result_str = NULL;
334 return_error = 1;
335 }
336 zst.next_out = (unsigned char *)PyString_AsString(result_str) \
337 + r_strlen;
338 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000339 r_strlen = r_strlen << 1;
340 break;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000341 default: {
342 if (zst.msg == Z_NULL)
343 PyErr_Format(ZlibError, "Error %i while decompressing data",
344 err);
345 else
346 PyErr_Format(ZlibError,
347 "Error %i while decompressing data: %.200s",
348 err, zst.msg);
349 inflateEnd(&zst);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000350 return_error = 1;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000351 }
352 }
353 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000354
Jeremy Hylton9714f992001-10-16 21:19:45 +0000355 if (!return_error) {
356 err = inflateEnd(&zst);
357 if (err != Z_OK) {
358 if (zst.msg == Z_NULL)
359 PyErr_Format(ZlibError,
360 "Error %i while finishing data decompression",
361 err);
362 else
363 PyErr_Format(ZlibError,
364 "Error %i while finishing data decompression: %.200s",
365 err, zst.msg);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000366
Jeremy Hylton9714f992001-10-16 21:19:45 +0000367 return_error = 1;
368 return NULL;
369 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000370 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000371
Jeremy Hylton9714f992001-10-16 21:19:45 +0000372 if (!return_error)
373 _PyString_Resize(&result_str, zst.total_out);
374 else
375 Py_XDECREF(result_str); /* sets result_str == NULL, if not already */
376 Py_DECREF(inputString);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000377
Jeremy Hylton9714f992001-10-16 21:19:45 +0000378 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000379}
380
381static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000382PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000383{
384 compobject *self;
385 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
386 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000387
Guido van Rossum43713e52000-02-29 13:59:29 +0000388 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000389 &memLevel, &strategy))
390 return NULL;
391
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000392 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000393 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000394 self->zst.zalloc = (alloc_func)NULL;
395 self->zst.zfree = (free_func)Z_NULL;
396 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000397 switch(err)
398 {
399 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000400 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000401 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000402 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000403 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000404 PyErr_SetString(PyExc_MemoryError,
405 "Can't allocate memory for compression object");
406 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000407 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000408 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000409 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000410 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000411 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000412 default:
413 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000414 if (self->zst.msg == Z_NULL)
415 PyErr_Format(ZlibError,
416 "Error %i while creating compression object",
417 err);
418 else
419 PyErr_Format(ZlibError,
420 "Error %i while creating compression object: %.200s",
421 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000422 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000423 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000424 }
425 }
426}
427
428static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000429PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000430{
431 int wbits=DEF_WBITS, err;
432 compobject *self;
Guido van Rossum43713e52000-02-29 13:59:29 +0000433 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
Guido van Rossumfb221561997-04-29 15:38:09 +0000434 {
435 return NULL;
436 }
437 self=newcompobject(&Decomptype);
438 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000439 self->zst.zalloc=(alloc_func)NULL;
440 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000441 err=inflateInit2(&self->zst, wbits);
442 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000443 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000444 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000445 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000446 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000447 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000448 Py_DECREF(self);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000449 PyErr_SetString(PyExc_ValueError,
450 "Invalid initialization option");
451 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000452 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000453 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000454 PyErr_SetString(PyExc_MemoryError,
455 "Can't allocate memory for decompression object");
456 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000457 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000458 {
459 if (self->zst.msg == Z_NULL)
460 PyErr_Format(ZlibError,
461 "Error %i while creating decompression object",
462 err);
463 else
464 PyErr_Format(ZlibError,
465 "Error %i while creating decompression object: %.200s",
466 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000467 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000468 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000469 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000470 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000471}
472
473static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000474Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000475{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000476 ENTER_ZLIB
477
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000478 if (self->is_initialised)
479 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000480 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000481 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000482 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000483
484 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000485}
486
487static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000488Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000489{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000490 ENTER_ZLIB
491
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000492 if (self->is_initialised)
493 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000494 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000495 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000496 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000497
498 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000499}
500
Guido van Rossum3c540301997-06-03 22:21:03 +0000501static char comp_compress__doc__[] =
502"compress(data) -- Return a string containing a compressed version of the data.\n\n"
503"After calling this function, some of the input data may still\n"
504"be stored in internal buffers for later processing.\n"
505"Call the flush() method to clear these buffers."
506;
507
508
Guido van Rossumfb221561997-04-29 15:38:09 +0000509static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000510PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000511{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000512 int err, inplen, length = DEFAULTALLOC;
513 PyObject *RetVal;
514 Byte *input;
515 unsigned long start_total_out;
516 int return_error;
517 PyObject * inputString;
Guido van Rossumfb221561997-04-29 15:38:09 +0000518
Jeremy Hylton9714f992001-10-16 21:19:45 +0000519 if (!PyArg_ParseTuple(args, "S:compress", &inputString))
520 return NULL;
521 if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
522 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000523
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000524 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000525 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000526
527 ENTER_ZLIB
528
529 Py_INCREF(inputString);
530
531 start_total_out = self->zst.total_out;
532 self->zst.avail_in = inplen;
533 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000534 self->zst.avail_out = length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000535 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
536
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000537 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000538 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000539 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000540
Jeremy Hylton9714f992001-10-16 21:19:45 +0000541 return_error = 0;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000542
Jeremy Hylton9714f992001-10-16 21:19:45 +0000543 /* while Z_OK and the output buffer is full, there might be more output,
544 so extend the output buffer and try again */
545 while (err == Z_OK && self->zst.avail_out == 0) {
546 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000547 return_error = 1;
548 break;
549 }
550 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) \
551 + length;
552 self->zst.avail_out = length;
553 length = length << 1;
554
555 Py_BEGIN_ALLOW_THREADS
556 err = deflate(&(self->zst), Z_NO_FLUSH);
557 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000558 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000559 /* We will only get Z_BUF_ERROR if the output buffer was full but
560 there wasn't more output when we tried again, so it is not an error
561 condition.
562 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000563
Jeremy Hylton9714f992001-10-16 21:19:45 +0000564 if (!return_error) {
565 if (err != Z_OK && err != Z_BUF_ERROR) {
566 if (self->zst.msg == Z_NULL)
567 PyErr_Format(ZlibError, "Error %i while compressing",
568 err);
569 else
570 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
571 err, self->zst.msg);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000572
Jeremy Hylton9714f992001-10-16 21:19:45 +0000573 return_error = 1;
574 Py_DECREF(RetVal);
575 }
576 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000577
Jeremy Hylton9714f992001-10-16 21:19:45 +0000578 if (return_error)
579 RetVal = NULL; /* should have been handled by DECREF */
580 else
581 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000582
Jeremy Hylton9714f992001-10-16 21:19:45 +0000583 Py_DECREF(inputString);
584
585 LEAVE_ZLIB
586
587 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000588}
589
Guido van Rossum3c540301997-06-03 22:21:03 +0000590static char decomp_decompress__doc__[] =
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000591"decompress(data, max_length) -- Return a string containing\n"
592"the decompressed version of the data.\n\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000593"After calling this function, some of the input data may still\n"
594"be stored in internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000595"Call the flush() method to clear these buffers.\n"
596"If the max_length parameter is specified then the return value will be\n"
597"no longer than max_length. Unconsumed input data will be stored in\n"
598"the unconsumed_tail attribute."
Guido van Rossum3c540301997-06-03 22:21:03 +0000599;
600
Guido van Rossumfb221561997-04-29 15:38:09 +0000601static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000602PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000603{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000604 int err, inplen, old_length, length = DEFAULTALLOC;
605 int max_length = 0;
606 PyObject *RetVal;
607 Byte *input;
608 unsigned long start_total_out;
609 int return_error;
610 PyObject * inputString;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000611
Jeremy Hylton9714f992001-10-16 21:19:45 +0000612 if (!PyArg_ParseTuple(args, "S|i:decompress", &inputString, &max_length))
613 return NULL;
614 if (max_length < 0) {
615 PyErr_SetString(PyExc_ValueError,
616 "max_length must be greater than zero");
617 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000618 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000619
620 if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
621 return NULL;
622
623 /* limit amount of data allocated to max_length */
624 if (max_length && length > max_length)
625 length = max_length;
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000626 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000627 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000628
629 ENTER_ZLIB
630 return_error = 0;
631
632 Py_INCREF(inputString);
633
634 start_total_out = self->zst.total_out;
635 self->zst.avail_in = inplen;
636 self->zst.next_in = input;
637 self->zst.avail_out = length;
638 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000639
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000640 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000641 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000642 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000643
Jeremy Hylton9714f992001-10-16 21:19:45 +0000644 /* While Z_OK and the output buffer is full, there might be more output.
645 So extend the output buffer and try again.
646 */
647 while (err == Z_OK && self->zst.avail_out == 0) {
648 /* If max_length set, don't continue decompressing if we've already
649 reached the limit.
650 */
651 if (max_length && length >= max_length)
652 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000653
Jeremy Hylton9714f992001-10-16 21:19:45 +0000654 /* otherwise, ... */
655 old_length = length;
656 length = length << 1;
657 if (max_length && length > max_length)
658 length = max_length;
659
660 if (_PyString_Resize(&RetVal, length) == -1) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000661 return_error = 1;
662 break;
663 }
664 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) \
665 + old_length;
666 self->zst.avail_out = length - old_length;
667
668 Py_BEGIN_ALLOW_THREADS
669 err = inflate(&(self->zst), Z_SYNC_FLUSH);
670 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000671 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000672
673 /* Not all of the compressed data could be accomodated in the output buffer
674 of specified size. Return the unconsumed tail in an attribute.*/
675 if(max_length) {
676 Py_DECREF(self->unconsumed_tail);
677 self->unconsumed_tail = PyString_FromStringAndSize(self->zst.next_in,
678 self->zst.avail_in);
679 if(!self->unconsumed_tail)
680 return_error = 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000681 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000682
Jeremy Hylton9714f992001-10-16 21:19:45 +0000683 /* The end of the compressed data has been reached, so set the
684 unused_data attribute to a string containing the remainder of the
685 data in the string. Note that this is also a logical place to call
686 inflateEnd, but the old behaviour of only calling it on flush() is
687 preserved.
688 */
689 if (!return_error) {
690 if (err == Z_STREAM_END) {
691 Py_XDECREF(self->unused_data); /* Free original empty string */
692 self->unused_data = PyString_FromStringAndSize(
693 (char *)self->zst.next_in, self->zst.avail_in);
694 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000695 Py_DECREF(RetVal);
696 return_error = 1;
697 }
698 /* We will only get Z_BUF_ERROR if the output buffer was full
699 but there wasn't more output when we tried again, so it is
700 not an error condition.
701 */
702 } else if (err != Z_OK && err != Z_BUF_ERROR) {
703 if (self->zst.msg == Z_NULL)
704 PyErr_Format(ZlibError, "Error %i while decompressing",
705 err);
706 else
707 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
708 err, self->zst.msg);
709 Py_DECREF(RetVal);
710 return_error = 1;
711 }
712 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000713
Jeremy Hylton9714f992001-10-16 21:19:45 +0000714 if (!return_error) {
715 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
716 }
717 else
718 RetVal = NULL; /* should be handled by DECREF */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000719
Jeremy Hylton9714f992001-10-16 21:19:45 +0000720 Py_DECREF(inputString);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000721
Jeremy Hylton9714f992001-10-16 21:19:45 +0000722 LEAVE_ZLIB
723
724 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000725}
726
Guido van Rossum3c540301997-06-03 22:21:03 +0000727static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000728"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
729"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
730"default value used when mode is not specified is Z_FINISH.\n"
731"If mode == Z_FINISH, the compressor object can no longer be used after\n"
732"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000733;
734
Guido van Rossumfb221561997-04-29 15:38:09 +0000735static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000736PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000737{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000738 int err, length = DEFAULTALLOC;
739 PyObject *RetVal;
740 int flushmode = Z_FINISH;
741 unsigned long start_total_out;
742 int return_error;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000743
Jeremy Hylton9714f992001-10-16 21:19:45 +0000744 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
745 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000746
Jeremy Hylton9714f992001-10-16 21:19:45 +0000747 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
748 doing any work at all; just return an empty string. */
749 if (flushmode == Z_NO_FLUSH) {
750 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000751 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000752
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000753 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000754 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000755
756 ENTER_ZLIB
757
758 start_total_out = self->zst.total_out;
759 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000760 self->zst.avail_out = length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000761 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000762
763 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000764 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000765 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000766
Jeremy Hylton9714f992001-10-16 21:19:45 +0000767 return_error = 0;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000768
Jeremy Hylton9714f992001-10-16 21:19:45 +0000769 /* while Z_OK and the output buffer is full, there might be more output,
770 so extend the output buffer and try again */
771 while (err == Z_OK && self->zst.avail_out == 0) {
772 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000773 return_error = 1;
774 break;
775 }
776 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) \
777 + length;
778 self->zst.avail_out = length;
779 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000780
Jeremy Hylton9714f992001-10-16 21:19:45 +0000781 Py_BEGIN_ALLOW_THREADS
782 err = deflate(&(self->zst), flushmode);
783 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000784 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000785
Jeremy Hylton9714f992001-10-16 21:19:45 +0000786 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
787 various data structures. Note we should only get Z_STREAM_END when
788 flushmode is Z_FINISH, but checking both for safety*/
789 if (!return_error) {
790 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
791 err = deflateEnd(&(self->zst));
792 if (err != Z_OK) {
793 if (self->zst.msg == Z_NULL)
794 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
795 err);
796 else
797 PyErr_Format(ZlibError,
798 "Error %i from deflateEnd(): %.200s",
799 err, self->zst.msg);
800
801 Py_DECREF(RetVal);
802 return_error = 1;
803 } else
804 self->is_initialised = 0;
805
806 /* We will only get Z_BUF_ERROR if the output buffer was full
807 but there wasn't more output when we tried again, so it is
808 not an error condition.
809 */
810 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
811 if (self->zst.msg == Z_NULL)
812 PyErr_Format(ZlibError, "Error %i while flushing",
813 err);
814 else
815 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
816 err, self->zst.msg);
817 Py_DECREF(RetVal);
818 return_error = 1;
819 }
820 }
821
822 if (!return_error)
823 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
824 else
825 RetVal = NULL; /* should have been handled by DECREF */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000826
Jeremy Hylton9714f992001-10-16 21:19:45 +0000827 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000828
Jeremy Hylton9714f992001-10-16 21:19:45 +0000829 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000830}
831
Guido van Rossum3c540301997-06-03 22:21:03 +0000832static char decomp_flush__doc__[] =
833"flush() -- Return a string containing any remaining decompressed data. "
834"The decompressor object can no longer be used after this call."
835;
836
Guido van Rossumfb221561997-04-29 15:38:09 +0000837static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000838PyZlib_unflush(compobject *self, PyObject *args)
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000839/*decompressor flush is a no-op because all pending data would have been
840 flushed by the decompress method. However, this routine previously called
841 inflateEnd, causing any further decompress or flush calls to raise
842 exceptions. This behaviour has been preserved.*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000843{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000844 int err;
845 PyObject * retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000846
Jeremy Hylton9714f992001-10-16 21:19:45 +0000847 if (!PyArg_ParseTuple(args, ""))
848 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000849
Jeremy Hylton9714f992001-10-16 21:19:45 +0000850 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000851
Jeremy Hylton9714f992001-10-16 21:19:45 +0000852 err = inflateEnd(&(self->zst));
853 if (err != Z_OK) {
854 if (self->zst.msg == Z_NULL)
855 PyErr_Format(ZlibError, "Error %i from inflateEnd()",
856 err);
857 else
858 PyErr_Format(ZlibError, "Error %i from inflateEnd(): %.200s",
859 err, self->zst.msg);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000860
Jeremy Hylton9714f992001-10-16 21:19:45 +0000861 retval = NULL;
862 } else {
863 self->is_initialised = 0;
864 retval = PyString_FromStringAndSize(NULL, 0);
865 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000866
Jeremy Hylton9714f992001-10-16 21:19:45 +0000867 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000868
Jeremy Hylton9714f992001-10-16 21:19:45 +0000869 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000870}
871
872static PyMethodDef comp_methods[] =
873{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000874 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
875 comp_compress__doc__},
876 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
877 comp_flush__doc__},
878 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000879};
880
881static PyMethodDef Decomp_methods[] =
882{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000883 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
884 decomp_decompress__doc__},
885 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
886 decomp_flush__doc__},
887 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000888};
889
890static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000891Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000892{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000893 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
894 internal data. */
895
896 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000897}
898
899static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000900Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000901{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000902 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000903
Jeremy Hylton9714f992001-10-16 21:19:45 +0000904 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000905
Jeremy Hylton9714f992001-10-16 21:19:45 +0000906 if (strcmp(name, "unused_data") == 0) {
907 Py_INCREF(self->unused_data);
908 retval = self->unused_data;
909 } else if (strcmp(name, "unconsumed_tail") == 0) {
910 Py_INCREF(self->unconsumed_tail);
911 retval = self->unconsumed_tail;
912 } else
913 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000914
Jeremy Hylton9714f992001-10-16 21:19:45 +0000915 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000916
Jeremy Hylton9714f992001-10-16 21:19:45 +0000917 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000918}
919
Guido van Rossum3c540301997-06-03 22:21:03 +0000920static char adler32__doc__[] =
921"adler32(string) -- Compute an Adler-32 checksum of string, using "
922"a default starting value, and returning an integer value.\n"
923"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
924"the starting value provided, and returning an integer value\n"
925;
926
Guido van Rossumfb221561997-04-29 15:38:09 +0000927static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000928PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000929{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000930 uLong adler32val = adler32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000931 Byte *buf;
932 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000933
Guido van Rossum43713e52000-02-29 13:59:29 +0000934 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000935 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000936 adler32val = adler32(adler32val, buf, len);
937 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000938}
939
Guido van Rossum3c540301997-06-03 22:21:03 +0000940static char crc32__doc__[] =
941"crc32(string) -- Compute a CRC-32 checksum of string, using "
942"a default starting value, and returning an integer value.\n"
943"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
944"the starting value provided, and returning an integer value.\n"
945;
Guido van Rossumfb221561997-04-29 15:38:09 +0000946
947static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000948PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000949{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000950 uLong crc32val = crc32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000951 Byte *buf;
952 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000953 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000954 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000955 crc32val = crc32(crc32val, buf, len);
956 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000957}
958
959
960static PyMethodDef zlib_methods[] =
961{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000962 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
963 adler32__doc__},
964 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
965 compress__doc__},
966 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
967 compressobj__doc__},
968 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
969 crc32__doc__},
970 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
971 decompress__doc__},
972 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
973 decompressobj__doc__},
974 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000975};
976
977statichere PyTypeObject Comptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000978 PyObject_HEAD_INIT(0)
979 0,
980 "Compress",
981 sizeof(compobject),
982 0,
983 (destructor)Comp_dealloc, /*tp_dealloc*/
984 0, /*tp_print*/
985 (getattrfunc)Comp_getattr, /*tp_getattr*/
986 0, /*tp_setattr*/
987 0, /*tp_compare*/
988 0, /*tp_repr*/
989 0, /*tp_as_number*/
990 0, /*tp_as_sequence*/
991 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000992};
993
994statichere PyTypeObject Decomptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000995 PyObject_HEAD_INIT(0)
996 0,
997 "Decompress",
998 sizeof(compobject),
999 0,
1000 (destructor)Decomp_dealloc, /*tp_dealloc*/
1001 0, /*tp_print*/
1002 (getattrfunc)Decomp_getattr, /*tp_getattr*/
1003 0, /*tp_setattr*/
1004 0, /*tp_compare*/
1005 0, /*tp_repr*/
1006 0, /*tp_as_number*/
1007 0, /*tp_as_sequence*/
1008 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001009};
1010
1011/* The following insint() routine was blatantly ripped off from
1012 socketmodule.c */
1013
1014/* Convenience routine to export an integer value.
1015 For simplicity, errors (which are unlikely anyway) are ignored. */
1016static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001017insint(PyObject *d, char *name, int value)
Guido van Rossumfb221561997-04-29 15:38:09 +00001018{
1019 PyObject *v = PyInt_FromLong((long) value);
1020 if (v == NULL) {
1021 /* Don't bother reporting this error */
1022 PyErr_Clear();
1023 }
1024 else {
1025 PyDict_SetItemString(d, name, v);
1026 Py_DECREF(v);
1027 }
1028}
1029
Guido van Rossum3c540301997-06-03 22:21:03 +00001030static char zlib_module_documentation[]=
1031"The functions in this module allow compression and decompression "
1032"using the zlib library, which is based on GNU zip. \n\n"
1033"adler32(string) -- Compute an Adler-32 checksum.\n"
1034"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
1035"compress(string) -- Compress a string.\n"
1036"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
1037"compressobj([level]) -- Return a compressor object.\n"
1038"crc32(string) -- Compute a CRC-32 checksum.\n"
1039"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001040"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001041"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
1042"Compressor objects support compress() and flush() methods; decompressor \n"
1043"objects support decompress() and flush()."
1044;
1045
Guido van Rossum3886bb61998-12-04 18:50:17 +00001046DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001047PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001048{
Jeremy Hylton9714f992001-10-16 21:19:45 +00001049 PyObject *m, *d, *ver;
1050 Comptype.ob_type = &PyType_Type;
1051 Decomptype.ob_type = &PyType_Type;
1052 m = Py_InitModule4("zlib", zlib_methods,
1053 zlib_module_documentation,
1054 (PyObject*)NULL,PYTHON_API_VERSION);
1055 d = PyModule_GetDict(m);
1056 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1057 if (ZlibError != NULL)
1058 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001059
Jeremy Hylton9714f992001-10-16 21:19:45 +00001060 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1061 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1062 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1063 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1064 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1065 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1066 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1067 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1068 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
1069
1070 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1071 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1072 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1073 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
1074
1075 ver = PyString_FromString(ZLIB_VERSION);
1076 if (ver != NULL) {
1077 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
1078 Py_DECREF(ver);
1079 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001080
1081#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +00001082 zlib_lock = PyThread_allocate_lock();
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001083#endif // WITH_THREAD
Guido van Rossumfb221561997-04-29 15:38:09 +00001084}