blob: 1d038c71af728d7072e3938bac5af14b8b4a3170 [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
Mark Hammondae8c2682001-01-31 10:28:03 +00002/* See http://www.info-zip.org/pub/infozip/zlib/ */
3
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{
78 PyObject_HEAD
79 z_stream zst;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000080 PyObject *unused_data;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000081 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000082} compobject;
83
Guido van Rossum3c540301997-06-03 22:21:03 +000084static char compressobj__doc__[] =
85"compressobj() -- Return a compressor object.\n"
86"compressobj(level) -- Return a compressor object, using the given compression level.\n"
87;
88
89static char decompressobj__doc__[] =
90"decompressobj() -- Return a decompressor object.\n"
91"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
92;
93
Guido van Rossumfb221561997-04-29 15:38:09 +000094static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000095newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +000096{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +000097 compobject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000098 self = PyObject_New(compobject, type);
Guido van Rossumfb221561997-04-29 15:38:09 +000099 if (self == NULL)
100 return NULL;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000101 self->is_initialised = 0;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000102 self->unused_data = PyString_FromString("");
Guido van Rossumfb221561997-04-29 15:38:09 +0000103 return self;
104}
105
Guido van Rossum3c540301997-06-03 22:21:03 +0000106static char compress__doc__[] =
107"compress(string) -- Compress string using the default compression level, "
108"returning a string containing compressed data.\n"
109"compress(string, level) -- Compress string, using the chosen compression "
110"level (from 1 to 9). Return a string containing the compressed data.\n"
111;
112
Guido van Rossumfb221561997-04-29 15:38:09 +0000113static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000114PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000115{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000116 PyObject *ReturnVal = NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000117 Byte *input, *output;
118 int length, level=Z_DEFAULT_COMPRESSION, err;
119 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000120 int return_error;
121 PyObject * inputString;
Guido van Rossumfb221561997-04-29 15:38:09 +0000122
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000123 /* require Python string object, optional 'level' arg */
124 if (!PyArg_ParseTuple(args, "S|i:compress", &inputString, &level))
Guido van Rossumfb221561997-04-29 15:38:09 +0000125 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000126
127 /* now get a pointer to the internal string */
Martin v. Löwiscaef93d2001-09-08 16:23:34 +0000128 if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000129 return NULL;
130
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000131 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000132
Guido van Rossumfb221561997-04-29 15:38:09 +0000133 output=(Byte*)malloc(zst.avail_out);
134 if (output==NULL)
135 {
136 PyErr_SetString(PyExc_MemoryError,
137 "Can't allocate memory to compress data");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000138 free(output);
139
Guido van Rossumfb221561997-04-29 15:38:09 +0000140 return NULL;
141 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000142
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000143 /* Past the point of no return. From here on out, we need to make sure
144 we clean up mallocs & INCREFs. */
145
146 Py_INCREF(inputString); /* increment so that we hold ref */
147
Jeremy Hylton5bc4abe1998-12-21 17:15:00 +0000148 zst.zalloc=(alloc_func)NULL;
Guido van Rossum97b54571997-06-03 22:21:47 +0000149 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000150 zst.next_out=(Byte *)output;
151 zst.next_in =(Byte *)input;
152 zst.avail_in=length;
153 err=deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000154
155 return_error = 0;
Guido van Rossumfb221561997-04-29 15:38:09 +0000156 switch(err)
157 {
158 case(Z_OK):
159 break;
160 case(Z_MEM_ERROR):
161 PyErr_SetString(PyExc_MemoryError,
162 "Out of memory while compressing data");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000163 return_error = 1;
164 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000165 case(Z_STREAM_ERROR):
166 PyErr_SetString(ZlibError,
167 "Bad compression level");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000168 return_error = 1;
169 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000170 default:
171 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000172 if (zst.msg == Z_NULL)
173 PyErr_Format(ZlibError, "Error %i while compressing data",
174 err);
175 else
176 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
177 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000178 deflateEnd(&zst);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000179 return_error = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000180 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000181 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000182
183 if (!return_error) {
184 Py_BEGIN_ALLOW_THREADS
185 err=deflate(&zst, Z_FINISH);
186 Py_END_ALLOW_THREADS
187
188 switch(err)
189 {
190 case(Z_STREAM_END):
191 break;
192 /* Are there other errors to be trapped here? */
193 default:
194 {
195 if (zst.msg == Z_NULL)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000196 PyErr_Format(ZlibError, "Error %i while compressing data",
197 err);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000198 else
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000199 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
200 err, zst.msg);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000201
202 deflateEnd(&zst);
203
204 return_error = 1;
205 }
206 }
207
208 if (!return_error) {
209 err=deflateEnd(&zst);
210 if (err == Z_OK)
211 ReturnVal = PyString_FromStringAndSize((char *)output, zst.total_out);
212 else {
213 {
214 if (zst.msg == Z_NULL)
215 PyErr_Format(ZlibError, "Error %i while finishing compression",
216 err);
217 else
218 PyErr_Format(ZlibError,
219 "Error %i while finishing compression: %.200s",
220 err, zst.msg);
221 }
222 }
223
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000224 }
225 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000226
Guido van Rossumfb221561997-04-29 15:38:09 +0000227 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000228 Py_DECREF(inputString);
229
Guido van Rossumfb221561997-04-29 15:38:09 +0000230 return ReturnVal;
231}
232
Guido van Rossum3c540301997-06-03 22:21:03 +0000233static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000234"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
235"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
236"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 +0000237;
238
Guido van Rossumfb221561997-04-29 15:38:09 +0000239static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000240PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000241{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000242 PyObject *result_str;
243 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000244 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000245 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000246 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000247 int return_error;
248 PyObject * inputString;
249
250 if (!PyArg_ParseTuple(args, "S|ii:decompress", &inputString, &wsize, &r_strlen))
251 return NULL;
Martin v. Löwiscaef93d2001-09-08 16:23:34 +0000252 if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000253 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000254
255 if (r_strlen <= 0)
256 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000257
Guido van Rossumfb221561997-04-29 15:38:09 +0000258 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000259 zst.avail_out=r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000260
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000261 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
262 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000263 PyErr_SetString(PyExc_MemoryError,
264 "Can't allocate memory to decompress data");
265 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000266 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000267
268 /* Past the point of no return. From here on out, we need to make sure
269 we clean up mallocs & INCREFs. */
270
271 Py_INCREF(inputString); /* increment so that we hold ref */
272
Guido van Rossum97b54571997-06-03 22:21:47 +0000273 zst.zalloc=(alloc_func)NULL;
274 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000275 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000276 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000277 err=inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000278
279 return_error = 0;
Guido van Rossumfb221561997-04-29 15:38:09 +0000280 switch(err)
281 {
282 case(Z_OK):
283 break;
284 case(Z_MEM_ERROR):
285 PyErr_SetString(PyExc_MemoryError,
286 "Out of memory while decompressing data");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000287 return_error = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000288 default:
289 {
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;
Guido van Rossumfb221561997-04-29 15:38:09 +0000300 }
301 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000302
Guido van Rossumfb221561997-04-29 15:38:09 +0000303 do
304 {
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000305 if (return_error)
306 break;
307
308 Py_BEGIN_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000309 err=inflate(&zst, Z_FINISH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000310 Py_END_ALLOW_THREADS
311
Guido van Rossumfb221561997-04-29 15:38:09 +0000312 switch(err)
313 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000314 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000315 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000316 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000317 /*
318 * If there is at least 1 byte of room according to zst.avail_out
319 * and we get this error, assume that it means zlib cannot
320 * process the inflate call() due to an error in the data.
321 */
322 if (zst.avail_out > 0)
323 {
324 PyErr_Format(ZlibError, "Error %i while decompressing data",
325 err);
326 inflateEnd(&zst);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000327 return_error = 1;
328 break;
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000329 }
330 /* fall through */
331 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000332 /* need more memory */
333 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000334 {
335 PyErr_SetString(PyExc_MemoryError,
336 "Out of memory while decompressing data");
337 inflateEnd(&zst);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000338 result_str = NULL;
339 return_error = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000340 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000341 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000342 zst.avail_out=r_strlen;
343 r_strlen = r_strlen << 1;
344 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000345 default:
346 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000347 if (zst.msg == Z_NULL)
348 PyErr_Format(ZlibError, "Error %i while decompressing data",
349 err);
350 else
351 PyErr_Format(ZlibError,
352 "Error %i while decompressing data: %.200s",
353 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000354 inflateEnd(&zst);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000355 return_error = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000356 }
357 }
358 } while(err!=Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000359
360 if (!return_error) {
361 err=inflateEnd(&zst);
362 if (err!=Z_OK)
363 {
364 if (zst.msg == Z_NULL)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000365 PyErr_Format(ZlibError,
366 "Error %i while finishing data decompression",
367 err);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000368 else
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000369 PyErr_Format(ZlibError,
370 "Error %i while finishing data decompression: %.200s",
371 err, zst.msg);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000372
373 return_error = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000374 return NULL;
375 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000376 }
377
378 if (!return_error)
379 _PyString_Resize(&result_str, zst.total_out);
380 else {
381 Py_XDECREF(result_str); /* sets result_str == NULL, if not already */
382 }
383 Py_DECREF(inputString);
384
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000385 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000386}
387
388static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000389PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000390{
391 compobject *self;
392 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
393 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000394
Guido van Rossum43713e52000-02-29 13:59:29 +0000395 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000396 &memLevel, &strategy))
397 return NULL;
398
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000399 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000400 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000401 self->zst.zalloc = (alloc_func)NULL;
402 self->zst.zfree = (free_func)Z_NULL;
403 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000404 switch(err)
405 {
406 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000407 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000408 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000409 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000410 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000411 PyErr_SetString(PyExc_MemoryError,
412 "Can't allocate memory for compression object");
413 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000414 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000415 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000416 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000417 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000418 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000419 default:
420 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000421 if (self->zst.msg == Z_NULL)
422 PyErr_Format(ZlibError,
423 "Error %i while creating compression object",
424 err);
425 else
426 PyErr_Format(ZlibError,
427 "Error %i while creating compression object: %.200s",
428 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000429 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000430 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000431 }
432 }
433}
434
435static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000436PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000437{
438 int wbits=DEF_WBITS, err;
439 compobject *self;
Guido van Rossum43713e52000-02-29 13:59:29 +0000440 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
Guido van Rossumfb221561997-04-29 15:38:09 +0000441 {
442 return NULL;
443 }
444 self=newcompobject(&Decomptype);
445 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000446 self->zst.zalloc=(alloc_func)NULL;
447 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000448 err=inflateInit2(&self->zst, wbits);
449 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000450 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000451 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000452 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000453 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000454 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000455 Py_DECREF(self);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000456 PyErr_SetString(PyExc_ValueError,
457 "Invalid initialization option");
458 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000459 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000460 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000461 PyErr_SetString(PyExc_MemoryError,
462 "Can't allocate memory for decompression object");
463 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000464 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000465 {
466 if (self->zst.msg == Z_NULL)
467 PyErr_Format(ZlibError,
468 "Error %i while creating decompression object",
469 err);
470 else
471 PyErr_Format(ZlibError,
472 "Error %i while creating decompression object: %.200s",
473 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000474 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000475 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000476 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000477 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000478}
479
480static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000481Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000482{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000483 ENTER_ZLIB
484
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000485 if (self->is_initialised)
486 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000487 Py_XDECREF(self->unused_data);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000488 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000489
490 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000491}
492
493static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000494Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000495{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000496 ENTER_ZLIB
497
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000498 if (self->is_initialised)
499 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000500 Py_XDECREF(self->unused_data);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000501 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000502
503 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000504}
505
Guido van Rossum3c540301997-06-03 22:21:03 +0000506static char comp_compress__doc__[] =
507"compress(data) -- Return a string containing a compressed version of the data.\n\n"
508"After calling this function, some of the input data may still\n"
509"be stored in internal buffers for later processing.\n"
510"Call the flush() method to clear these buffers."
511;
512
513
Guido van Rossumfb221561997-04-29 15:38:09 +0000514static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000515PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000516{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000517 int err, inplen, length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000518 PyObject *RetVal;
519 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000520 unsigned long start_total_out;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000521 int return_error;
522 PyObject * inputString;
Guido van Rossumfb221561997-04-29 15:38:09 +0000523
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000524 if (!PyArg_ParseTuple(args, "S:compress", &inputString))
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000525 return NULL;
Martin v. Löwiscaef93d2001-09-08 16:23:34 +0000526 if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000527 return NULL;
528
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000529 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
530 PyErr_SetString(PyExc_MemoryError,
531 "Can't allocate memory to compress data");
532 return NULL;
533 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000534
535 ENTER_ZLIB
536
537 Py_INCREF(inputString);
538
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000539 start_total_out = self->zst.total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000540 self->zst.avail_in = inplen;
541 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000542 self->zst.avail_out = length;
543 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000544
545 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000546 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000547 Py_END_ALLOW_THREADS
548
549 return_error = 0;
550
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000551 /* while Z_OK and the output buffer is full, there might be more output,
552 so extend the output buffer and try again */
553 while (err == Z_OK && self->zst.avail_out == 0) {
554 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000555 PyErr_SetString(PyExc_MemoryError,
556 "Can't allocate memory to compress data");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000557 return_error = 1;
558 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000559 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000560 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
561 self->zst.avail_out = length;
562 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000563
564 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000565 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000566 Py_END_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000567 }
568 /* We will only get Z_BUF_ERROR if the output buffer was full but there
569 wasn't more output when we tried again, so it is not an error condition */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000570
571 if (!return_error) {
572 if (err != Z_OK && err != Z_BUF_ERROR) {
573 if (self->zst.msg == Z_NULL)
574 PyErr_Format(ZlibError, "Error %i while compressing",
575 err);
576 else
577 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
578 err, self->zst.msg);
579
580 return_error = 1;
581 Py_DECREF(RetVal);
582 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000583 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000584
585 if (return_error)
586 RetVal = NULL; /* should have been handled by DECREF */
587 else
588 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
589
590 Py_DECREF(inputString);
591
592 LEAVE_ZLIB
593
Guido van Rossumfb221561997-04-29 15:38:09 +0000594 return RetVal;
595}
596
Guido van Rossum3c540301997-06-03 22:21:03 +0000597static char decomp_decompress__doc__[] =
598"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
599"After calling this function, some of the input data may still\n"
600"be stored in internal buffers for later processing.\n"
601"Call the flush() method to clear these buffers."
602;
603
Guido van Rossumfb221561997-04-29 15:38:09 +0000604static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000605PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000606{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000607 int err, inplen, length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000608 PyObject *RetVal;
609 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000610 unsigned long start_total_out;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000611 int return_error;
612 PyObject * inputString;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000613
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000614 if (!PyArg_ParseTuple(args, "S:decompress", &inputString))
Guido van Rossumfb221561997-04-29 15:38:09 +0000615 return NULL;
Martin v. Löwiscaef93d2001-09-08 16:23:34 +0000616 if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000617 return NULL;
618
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000619 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
620 PyErr_SetString(PyExc_MemoryError,
621 "Can't allocate memory to compress data");
622 return NULL;
623 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000624
625 ENTER_ZLIB
626 return_error = 0;
627
628 Py_INCREF(inputString);
629
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000630 start_total_out = self->zst.total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000631 self->zst.avail_in = inplen;
632 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000633 self->zst.avail_out = length;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000634 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000635
636 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000637 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000638 Py_END_ALLOW_THREADS
639
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000640 /* while Z_OK and the output buffer is full, there might be more output,
641 so extend the output buffer and try again */
642 while (err == Z_OK && self->zst.avail_out == 0) {
643 if (_PyString_Resize(&RetVal, length << 1) == -1) {
644 PyErr_SetString(PyExc_MemoryError,
645 "Can't allocate memory to compress data");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000646 return_error = 1;
647 break;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000648 }
649 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
650 self->zst.avail_out = length;
651 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000652 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000653 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000654 Py_END_ALLOW_THREADS
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000655 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000656
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000657 /* The end of the compressed data has been reached, so set the unused_data
658 attribute to a string containing the remainder of the data in the string.
659 Note that this is also a logical place to call inflateEnd, but the old
660 behaviour of only calling it on flush() is preserved.*/
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000661 if (!return_error) {
662 if (err == Z_STREAM_END) {
663 Py_XDECREF(self->unused_data); /* Free the original, empty string */
664 self->unused_data = PyString_FromStringAndSize((char *)self->zst.next_in,
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000665 self->zst.avail_in);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000666 if (self->unused_data == NULL) {
667 PyErr_SetString(PyExc_MemoryError,
668 "Can't allocate memory to unused_data");
669 Py_DECREF(RetVal);
670 return_error = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000671 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000672 /* We will only get Z_BUF_ERROR if the output buffer was full but there
673 wasn't more output when we tried again, so it is not an error
674 condition */
675 } else if (err != Z_OK && err != Z_BUF_ERROR) {
676 if (self->zst.msg == Z_NULL)
677 PyErr_Format(ZlibError, "Error %i while decompressing",
678 err);
679 else
680 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
681 err, self->zst.msg);
682 Py_DECREF(RetVal);
683 return_error = 1;
684 }
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000685 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000686
687 if (!return_error) {
688 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
689 }
690 else
691 RetVal = NULL; /* should be handled by DECREF */
692
693 Py_DECREF(inputString);
694
695 LEAVE_ZLIB
696
Guido van Rossumfb221561997-04-29 15:38:09 +0000697 return RetVal;
698}
699
Guido van Rossum3c540301997-06-03 22:21:03 +0000700static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000701"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
702"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
703"default value used when mode is not specified is Z_FINISH.\n"
704"If mode == Z_FINISH, the compressor object can no longer be used after\n"
705"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000706;
707
Guido van Rossumfb221561997-04-29 15:38:09 +0000708static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000709PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000710{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000711 int err, length=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000712 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000713 int flushmode = Z_FINISH;
714 unsigned long start_total_out;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000715 int return_error;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000716
Guido van Rossum43713e52000-02-29 13:59:29 +0000717 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000718 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000719
720 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
721 doing any work at all; just return an empty string. */
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000722 if (flushmode == Z_NO_FLUSH) {
723 return PyString_FromStringAndSize(NULL, 0);
724 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000725
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000726 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000727 PyErr_SetString(PyExc_MemoryError,
728 "Can't allocate memory to compress data");
729 return NULL;
730 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000731
732 ENTER_ZLIB
733
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000734 start_total_out = self->zst.total_out;
735 self->zst.avail_in = 0;
736 self->zst.avail_out = length;
737 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000738
739 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000740 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000741 Py_END_ALLOW_THREADS
742
743 return_error = 0;
744
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000745 /* while Z_OK and the output buffer is full, there might be more output,
746 so extend the output buffer and try again */
747 while (err == Z_OK && self->zst.avail_out == 0) {
748 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000749 PyErr_SetString(PyExc_MemoryError,
750 "Can't allocate memory to compress data");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000751 return_error = 1;
752 break;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000753 }
754 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
755 self->zst.avail_out = length;
756 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000757
758 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000759 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000760 Py_END_ALLOW_THREADS
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000761 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000762
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000763 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
764 various data structures. Note we should only get Z_STREAM_END when
765 flushmode is Z_FINISH, but checking both for safety*/
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000766 if (!return_error) {
767 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
768 err=deflateEnd(&(self->zst));
769 if (err!=Z_OK) {
770 if (self->zst.msg == Z_NULL)
771 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
772 err);
773 else
774 PyErr_Format(ZlibError,"Error %i from deflateEnd(): %.200s",
775 err, self->zst.msg);
776
777 Py_DECREF(RetVal);
778 return_error = 1;
779 }
780 else
781 self->is_initialised = 0;
782
783 /* We will only get Z_BUF_ERROR if the output buffer was full but there
784 wasn't more output when we tried again, so it is not an error
785 condition */
786 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000787 if (self->zst.msg == Z_NULL)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000788 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000789 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000790 else
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000791 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000792 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000793 Py_DECREF(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000794 return_error = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000795 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000796 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000797
798 if (!return_error)
799 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
800 else
801 RetVal = NULL; /* should have been handled by DECREF */
802
803 LEAVE_ZLIB
804
Guido van Rossumfb221561997-04-29 15:38:09 +0000805 return RetVal;
806}
807
Guido van Rossum3c540301997-06-03 22:21:03 +0000808static char decomp_flush__doc__[] =
809"flush() -- Return a string containing any remaining decompressed data. "
810"The decompressor object can no longer be used after this call."
811;
812
Guido van Rossumfb221561997-04-29 15:38:09 +0000813static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000814PyZlib_unflush(compobject *self, PyObject *args)
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000815/*decompressor flush is a no-op because all pending data would have been
816 flushed by the decompress method. However, this routine previously called
817 inflateEnd, causing any further decompress or flush calls to raise
818 exceptions. This behaviour has been preserved.*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000819{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000820 int err;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000821 PyObject * retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000822
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000823 if (!PyArg_ParseTuple(args, ""))
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000824 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000825
826 ENTER_ZLIB
827
Guido van Rossumfb221561997-04-29 15:38:09 +0000828 err=inflateEnd(&(self->zst));
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000829 if (err!=Z_OK) {
830 if (self->zst.msg == Z_NULL)
831 PyErr_Format(ZlibError, "Error %i from inflateEnd()",
832 err);
833 else
834 PyErr_Format(ZlibError, "Error %i from inflateEnd(): %.200s",
835 err, self->zst.msg);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000836
837 retval = NULL;
838
839 } else {
840 self->is_initialised = 0;
841 retval = PyString_FromStringAndSize(NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000842 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000843
844 LEAVE_ZLIB
845
846 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000847}
848
849static PyMethodDef comp_methods[] =
850{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000851 {"compress", (binaryfunc)PyZlib_objcompress,
852 METH_VARARGS, comp_compress__doc__},
853 {"flush", (binaryfunc)PyZlib_flush,
854 METH_VARARGS, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000855 {NULL, NULL}
856};
857
858static PyMethodDef Decomp_methods[] =
859{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000860 {"decompress", (binaryfunc)PyZlib_objdecompress,
861 METH_VARARGS, decomp_decompress__doc__},
862 {"flush", (binaryfunc)PyZlib_unflush,
863 METH_VARARGS, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000864 {NULL, NULL}
865};
866
867static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000868Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000869{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000870 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
871 internal data. */
872
873 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000874}
875
876static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000877Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000878{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000879 PyObject * retval;
880
881 ENTER_ZLIB
882
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000883 if (strcmp(name, "unused_data") == 0)
884 {
885 Py_INCREF(self->unused_data);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000886 retval = self->unused_data;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000887 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000888 else
889 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
890
891 LEAVE_ZLIB
892
893 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000894}
895
Guido van Rossum3c540301997-06-03 22:21:03 +0000896static char adler32__doc__[] =
897"adler32(string) -- Compute an Adler-32 checksum of string, using "
898"a default starting value, and returning an integer value.\n"
899"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
900"the starting value provided, and returning an integer value\n"
901;
902
Guido van Rossumfb221561997-04-29 15:38:09 +0000903static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000904PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000905{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000906 uLong adler32val=adler32(0L, Z_NULL, 0);
907 Byte *buf;
908 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000909
Guido van Rossum43713e52000-02-29 13:59:29 +0000910 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000911 {
912 return NULL;
913 }
914 adler32val = adler32(adler32val, buf, len);
915 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000916}
917
Guido van Rossum3c540301997-06-03 22:21:03 +0000918static char crc32__doc__[] =
919"crc32(string) -- Compute a CRC-32 checksum of string, using "
920"a default starting value, and returning an integer value.\n"
921"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
922"the starting value provided, and returning an integer value.\n"
923;
Guido van Rossumfb221561997-04-29 15:38:09 +0000924
925static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000926PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000927{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000928 uLong crc32val=crc32(0L, Z_NULL, 0);
929 Byte *buf;
930 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000931 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000932 {
933 return NULL;
934 }
935 crc32val = crc32(crc32val, buf, len);
936 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000937}
938
939
940static PyMethodDef zlib_methods[] =
941{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000942 {"adler32", (PyCFunction)PyZlib_adler32,
943 METH_VARARGS, adler32__doc__},
944 {"compress", (PyCFunction)PyZlib_compress,
945 METH_VARARGS, compress__doc__},
946 {"compressobj", (PyCFunction)PyZlib_compressobj,
947 METH_VARARGS, compressobj__doc__},
948 {"crc32", (PyCFunction)PyZlib_crc32,
949 METH_VARARGS, crc32__doc__},
950 {"decompress", (PyCFunction)PyZlib_decompress,
951 METH_VARARGS, decompress__doc__},
952 {"decompressobj", (PyCFunction)PyZlib_decompressobj,
953 METH_VARARGS, decompressobj__doc__},
954 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000955};
956
957statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000958 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000959 0,
960 "Compress",
961 sizeof(compobject),
962 0,
963 (destructor)Comp_dealloc, /*tp_dealloc*/
964 0, /*tp_print*/
965 (getattrfunc)Comp_getattr, /*tp_getattr*/
966 0, /*tp_setattr*/
967 0, /*tp_compare*/
968 0, /*tp_repr*/
969 0, /*tp_as_number*/
970 0, /*tp_as_sequence*/
971 0, /*tp_as_mapping*/
972};
973
974statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000975 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000976 0,
977 "Decompress",
978 sizeof(compobject),
979 0,
980 (destructor)Decomp_dealloc, /*tp_dealloc*/
981 0, /*tp_print*/
982 (getattrfunc)Decomp_getattr, /*tp_getattr*/
983 0, /*tp_setattr*/
984 0, /*tp_compare*/
985 0, /*tp_repr*/
986 0, /*tp_as_number*/
987 0, /*tp_as_sequence*/
988 0, /*tp_as_mapping*/
989};
990
991/* The following insint() routine was blatantly ripped off from
992 socketmodule.c */
993
994/* Convenience routine to export an integer value.
995 For simplicity, errors (which are unlikely anyway) are ignored. */
996static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000997insint(PyObject *d, char *name, int value)
Guido van Rossumfb221561997-04-29 15:38:09 +0000998{
999 PyObject *v = PyInt_FromLong((long) value);
1000 if (v == NULL) {
1001 /* Don't bother reporting this error */
1002 PyErr_Clear();
1003 }
1004 else {
1005 PyDict_SetItemString(d, name, v);
1006 Py_DECREF(v);
1007 }
1008}
1009
Guido van Rossum3c540301997-06-03 22:21:03 +00001010static char zlib_module_documentation[]=
1011"The functions in this module allow compression and decompression "
1012"using the zlib library, which is based on GNU zip. \n\n"
1013"adler32(string) -- Compute an Adler-32 checksum.\n"
1014"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
1015"compress(string) -- Compress a string.\n"
1016"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
1017"compressobj([level]) -- Return a compressor object.\n"
1018"crc32(string) -- Compute a CRC-32 checksum.\n"
1019"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001020"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001021"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
1022"Compressor objects support compress() and flush() methods; decompressor \n"
1023"objects support decompress() and flush()."
1024;
1025
Guido van Rossum3886bb61998-12-04 18:50:17 +00001026DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001027PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001028{
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001029 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +00001030 Comptype.ob_type = &PyType_Type;
1031 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +00001032 m = Py_InitModule4("zlib", zlib_methods,
1033 zlib_module_documentation,
1034 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +00001035 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +00001036 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Fred Drake8972dfd1999-12-22 16:13:54 +00001037 if (ZlibError != NULL)
1038 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001039
Guido van Rossumfb221561997-04-29 15:38:09 +00001040 insint(d, "MAX_WBITS", MAX_WBITS);
1041 insint(d, "DEFLATED", DEFLATED);
1042 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001043 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
1044 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1045 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1046 insint(d, "Z_FILTERED", Z_FILTERED);
1047 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1048 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +00001049
1050 insint(d, "Z_FINISH", Z_FINISH);
1051 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
1052 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1053 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
1054
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001055 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake8972dfd1999-12-22 16:13:54 +00001056 if (ver != NULL) {
1057 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
1058 Py_DECREF(ver);
1059 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001060
1061#ifdef WITH_THREAD
1062 zlib_lock = PyThread_allocate_lock();
1063#endif // WITH_THREAD
Guido van Rossumfb221561997-04-29 15:38:09 +00001064}