blob: 5afa70920a96ef69f0cbba5f1805a67f75c99d02 [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
Guido van Rossum821a5e41998-05-08 14:56:29 +00002/* See http://www.cdrom.com/pub/infozip/zlib/ */
3/* See http://www.winimage.com/zLibDll for Windows */
Guido van Rossumfb221561997-04-29 15:38:09 +00004
Guido van Rossum97b54571997-06-03 22:21:47 +00005#include "Python.h"
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +00006#ifdef MS_WIN32
7#define ZLIB_DLL
8#endif
Guido van Rossum97b54571997-06-03 22:21:47 +00009#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +000010
11/* The following parameters are copied from zutil.h, version 0.95 */
12#define DEFLATED 8
13#if MAX_MEM_LEVEL >= 8
14# define DEF_MEM_LEVEL 8
15#else
16# define DEF_MEM_LEVEL MAX_MEM_LEVEL
17#endif
18#define DEF_WBITS MAX_WBITS
19
20/* The output buffer will be increased in chunks of ADDCHUNK bytes. */
Jeremy Hylton41b9f001997-08-13 23:19:55 +000021#define DEFAULTALLOC 16*1024
Guido van Rossumfb221561997-04-29 15:38:09 +000022#define PyInit_zlib initzlib
23
24staticforward PyTypeObject Comptype;
25staticforward PyTypeObject Decomptype;
26
27static PyObject *ZlibError;
28
29typedef struct
30{
31 PyObject_HEAD
32 z_stream zst;
33} compobject;
34
Guido van Rossum3c540301997-06-03 22:21:03 +000035static char compressobj__doc__[] =
36"compressobj() -- Return a compressor object.\n"
37"compressobj(level) -- Return a compressor object, using the given compression level.\n"
38;
39
40static char decompressobj__doc__[] =
41"decompressobj() -- Return a decompressor object.\n"
42"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
43;
44
Guido van Rossumfb221561997-04-29 15:38:09 +000045static compobject *
46newcompobject(type)
47 PyTypeObject *type;
48{
49 compobject *self;
50 self = PyObject_NEW(compobject, type);
51 if (self == NULL)
52 return NULL;
53 return self;
54}
55
Guido van Rossum3c540301997-06-03 22:21:03 +000056static char compress__doc__[] =
57"compress(string) -- Compress string using the default compression level, "
58"returning a string containing compressed data.\n"
59"compress(string, level) -- Compress string, using the chosen compression "
60"level (from 1 to 9). Return a string containing the compressed data.\n"
61;
62
Guido van Rossumfb221561997-04-29 15:38:09 +000063static PyObject *
64PyZlib_compress(self, args)
65 PyObject *self;
66 PyObject *args;
67{
68 PyObject *ReturnVal;
69 Byte *input, *output;
70 int length, level=Z_DEFAULT_COMPRESSION, err;
71 z_stream zst;
72
73 if (!PyArg_ParseTuple(args, "s#|i", &input, &length, &level))
74 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000075 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000076 output=(Byte*)malloc(zst.avail_out);
77 if (output==NULL)
78 {
79 PyErr_SetString(PyExc_MemoryError,
80 "Can't allocate memory to compress data");
81 return NULL;
82 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +000083
Jeremy Hylton5bc4abe1998-12-21 17:15:00 +000084 zst.zalloc=(alloc_func)NULL;
Guido van Rossum97b54571997-06-03 22:21:47 +000085 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000086 zst.next_out=(Byte *)output;
87 zst.next_in =(Byte *)input;
88 zst.avail_in=length;
89 err=deflateInit(&zst, level);
90 switch(err)
91 {
92 case(Z_OK):
93 break;
94 case(Z_MEM_ERROR):
95 PyErr_SetString(PyExc_MemoryError,
96 "Out of memory while compressing data");
97 free(output);
98 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000099 case(Z_STREAM_ERROR):
100 PyErr_SetString(ZlibError,
101 "Bad compression level");
102 free(output);
103 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000104 default:
105 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000106 if (zst.msg == Z_NULL)
107 PyErr_Format(ZlibError, "Error %i while compressing data",
108 err);
109 else
110 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
111 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000112 deflateEnd(&zst);
113 free(output);
114 return NULL;
115 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000116 }
117
118 err=deflate(&zst, Z_FINISH);
119 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000120 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000121 case(Z_STREAM_END):
122 break;
123 /* Are there other errors to be trapped here? */
124 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000125 {
126 if (zst.msg == Z_NULL)
127 PyErr_Format(ZlibError, "Error %i while compressing data",
128 err);
129 else
130 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
131 err, zst.msg);
132 deflateEnd(&zst);
133 free(output);
134 return NULL;
135 }
136 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000137 err=deflateEnd(&zst);
138 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000139 {
140 if (zst.msg == Z_NULL)
141 PyErr_Format(ZlibError, "Error %i while finishing compression",
142 err);
143 else
144 PyErr_Format(ZlibError,
145 "Error %i while finishing compression: %.200s",
146 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000147 free(output);
148 return NULL;
149 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000150 ReturnVal=PyString_FromStringAndSize((char *)output, zst.total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000151 free(output);
152 return ReturnVal;
153}
154
Guido van Rossum3c540301997-06-03 22:21:03 +0000155static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000156"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
157"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
158"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 +0000159;
160
Guido van Rossumfb221561997-04-29 15:38:09 +0000161static PyObject *
162PyZlib_decompress(self, args)
163 PyObject *self;
164 PyObject *args;
165{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000166 PyObject *result_str;
167 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000168 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000169 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000170 z_stream zst;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000171 if (!PyArg_ParseTuple(args, "s#|ii", &input, &length, &wsize, &r_strlen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000172 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000173
174 if (r_strlen <= 0)
175 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000176
Guido van Rossumfb221561997-04-29 15:38:09 +0000177 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000178 zst.avail_out=r_strlen;
179 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
180 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000181 PyErr_SetString(PyExc_MemoryError,
182 "Can't allocate memory to decompress data");
183 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000184 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000185 zst.zalloc=(alloc_func)NULL;
186 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000187 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000188 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000189 err=inflateInit2(&zst, wsize);
Guido van Rossumfb221561997-04-29 15:38:09 +0000190 switch(err)
191 {
192 case(Z_OK):
193 break;
194 case(Z_MEM_ERROR):
195 PyErr_SetString(PyExc_MemoryError,
196 "Out of memory while decompressing data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000197 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000198 return NULL;
199 default:
200 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000201 if (zst.msg == Z_NULL)
202 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
203 err);
204 else
205 PyErr_Format(ZlibError,
206 "Error %i while preparing to decompress data: %.200s",
207 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000208 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000209 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000210 return NULL;
211 }
212 }
213 do
214 {
215 err=inflate(&zst, Z_FINISH);
216 switch(err)
217 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000218 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000219 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000220 case(Z_BUF_ERROR):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000221 case(Z_OK):
222 /* need more memory */
223 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000224 {
225 PyErr_SetString(PyExc_MemoryError,
226 "Out of memory while decompressing data");
227 inflateEnd(&zst);
228 return NULL;
229 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000230 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000231 zst.avail_out=r_strlen;
232 r_strlen = r_strlen << 1;
233 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000234 default:
235 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000236 if (zst.msg == Z_NULL)
237 PyErr_Format(ZlibError, "Error %i while decompressing data",
238 err);
239 else
240 PyErr_Format(ZlibError,
241 "Error %i while decompressing data: %.200s",
242 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000243 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000244 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000245 return NULL;
246 }
247 }
248 } while(err!=Z_STREAM_END);
249
250 err=inflateEnd(&zst);
251 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000252 {
253 if (zst.msg == Z_NULL)
254 PyErr_Format(ZlibError,
255 "Error %i while finishing data decompression",
256 err);
257 else
258 PyErr_Format(ZlibError,
259 "Error %i while finishing data decompression: %.200s",
260 err, zst.msg);
261 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000262 return NULL;
263 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000264 _PyString_Resize(&result_str, zst.total_out);
265 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000266}
267
268static PyObject *
269PyZlib_compressobj(selfptr, args)
270 PyObject *selfptr;
271 PyObject *args;
272{
273 compobject *self;
274 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
275 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000276
277 if (!PyArg_ParseTuple(args, "|iiiii", &level, &method, &wbits,
278 &memLevel, &strategy))
279 return NULL;
280
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000281 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000282 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000283 self->zst.zalloc = (alloc_func)NULL;
284 self->zst.zfree = (free_func)Z_NULL;
285 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000286 switch(err)
287 {
288 case (Z_OK):
289 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000290 case (Z_MEM_ERROR):
291 PyErr_SetString(PyExc_MemoryError,
292 "Can't allocate memory for compression object");
293 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000294 case(Z_STREAM_ERROR):
295 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000296 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000297 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000298 default:
299 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000300 if (self->zst.msg == Z_NULL)
301 PyErr_Format(ZlibError,
302 "Error %i while creating compression object",
303 err);
304 else
305 PyErr_Format(ZlibError,
306 "Error %i while creating compression object: %.200s",
307 err, self->zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000308 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000309 }
310 }
311}
312
313static PyObject *
314PyZlib_decompressobj(selfptr, args)
315 PyObject *selfptr;
316 PyObject *args;
317{
318 int wbits=DEF_WBITS, err;
319 compobject *self;
320 if (!PyArg_ParseTuple(args, "|i", &wbits))
321 {
322 return NULL;
323 }
324 self=newcompobject(&Decomptype);
325 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000326 self->zst.zalloc=(alloc_func)NULL;
327 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000328 err=inflateInit2(&self->zst, wbits);
329 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000330 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000331 case (Z_OK):
332 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000333 case(Z_STREAM_ERROR):
334 PyErr_SetString(PyExc_ValueError,
335 "Invalid initialization option");
336 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000337 case (Z_MEM_ERROR):
338 PyErr_SetString(PyExc_MemoryError,
339 "Can't allocate memory for decompression object");
340 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000341 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000342 {
343 if (self->zst.msg == Z_NULL)
344 PyErr_Format(ZlibError,
345 "Error %i while creating decompression object",
346 err);
347 else
348 PyErr_Format(ZlibError,
349 "Error %i while creating decompression object: %.200s",
350 err, self->zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000351 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000352 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000353 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000354}
355
356static void
357Comp_dealloc(self)
358 compobject *self;
359{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000360 deflateEnd(&self->zst);
361 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000362}
363
364static void
365Decomp_dealloc(self)
366 compobject *self;
367{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000368 inflateEnd(&self->zst);
369 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000370}
371
Guido van Rossum3c540301997-06-03 22:21:03 +0000372static char comp_compress__doc__[] =
373"compress(data) -- Return a string containing a compressed version of the data.\n\n"
374"After calling this function, some of the input data may still\n"
375"be stored in internal buffers for later processing.\n"
376"Call the flush() method to clear these buffers."
377;
378
379
Guido van Rossumfb221561997-04-29 15:38:09 +0000380static PyObject *
381PyZlib_objcompress(self, args)
382 compobject *self;
383 PyObject *args;
384{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000385 int err = Z_OK, inplen;
386 int length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000387 PyObject *RetVal;
388 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000389 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000390
391 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000392 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000393 self->zst.avail_in = inplen;
394 self->zst.next_in = input;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000395 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
396 PyErr_SetString(PyExc_MemoryError,
397 "Can't allocate memory to compress data");
398 return NULL;
399 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000400 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000401 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000402 self->zst.avail_out = length;
403 while (self->zst.avail_in != 0 && err == Z_OK)
404 {
405 err = deflate(&(self->zst), Z_NO_FLUSH);
406 if (self->zst.avail_out <= 0) {
407 if (_PyString_Resize(&RetVal, length << 1) == -1) {
408 PyErr_SetString(PyExc_MemoryError,
409 "Can't allocate memory to compress data");
410 return NULL;
411 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000412 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000413 self->zst.avail_out = length;
414 length = length << 1;
415 }
416 }
417 if (err != Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000418 {
419 if (self->zst.msg == Z_NULL)
420 PyErr_Format(ZlibError, "Error %i while compressing",
421 err);
422 else
423 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
424 err, self->zst.msg);
425 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000426 return NULL;
427 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000428 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000429 return RetVal;
430}
431
Guido van Rossum3c540301997-06-03 22:21:03 +0000432static char decomp_decompress__doc__[] =
433"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
434"After calling this function, some of the input data may still\n"
435"be stored in internal buffers for later processing.\n"
436"Call the flush() method to clear these buffers."
437;
438
Guido van Rossumfb221561997-04-29 15:38:09 +0000439static PyObject *
440PyZlib_objdecompress(self, args)
441 compobject *self;
442 PyObject *args;
443{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000444 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000445 PyObject *RetVal;
446 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000447 unsigned long start_total_out;
448
Guido van Rossumfb221561997-04-29 15:38:09 +0000449 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
450 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000451 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000452 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000453 self->zst.avail_in = inplen;
454 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000455 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000456 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000457 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000458
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000459 while (self->zst.avail_in != 0 && err == Z_OK)
460 {
461 err = inflate(&(self->zst), Z_NO_FLUSH);
462 if (err == Z_OK && self->zst.avail_out <= 0)
463 {
464 if (_PyString_Resize(&RetVal, length << 1) == -1)
465 {
466 PyErr_SetString(PyExc_MemoryError,
467 "Can't allocate memory to compress data");
468 return NULL;
469 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000470 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000471 self->zst.avail_out = length;
472 length = length << 1;
473 }
474 }
475
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000476 if (err != Z_OK && err != Z_STREAM_END)
477 {
478 if (self->zst.msg == Z_NULL)
479 PyErr_Format(ZlibError, "Error %i while decompressing",
480 err);
481 else
482 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
483 err, self->zst.msg);
484 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000485 return NULL;
486 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000487 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000488 return RetVal;
489}
490
Guido van Rossum3c540301997-06-03 22:21:03 +0000491static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000492"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
493"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
494"default value used when mode is not specified is Z_FINISH.\n"
495"If mode == Z_FINISH, the compressor object can no longer be used after\n"
496"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000497;
498
Guido van Rossumfb221561997-04-29 15:38:09 +0000499static PyObject *
500PyZlib_flush(self, args)
501 compobject *self;
502 PyObject *args;
503{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000504 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000505 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000506 int flushmode = Z_FINISH;
507 unsigned long start_total_out;
508
509 if (!PyArg_ParseTuple(args, "|i", &flushmode))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000510 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000511
512 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
513 doing any work at all; just return an empty string. */
514 if (flushmode == Z_NO_FLUSH)
515 {
516 return PyString_FromStringAndSize(NULL, 0);
517 }
518
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000519 self->zst.avail_in = 0;
520 self->zst.next_in = Z_NULL;
521 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
522 PyErr_SetString(PyExc_MemoryError,
523 "Can't allocate memory to compress data");
524 return NULL;
525 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000526 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000527 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000528 self->zst.avail_out = length;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000529
530 /* When flushing the zstream, there's no input data.
531 If zst.avail_out == 0, that means that more output space is
532 needed to complete the flush operation. */
533 do {
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000534 err = deflate(&(self->zst), Z_FINISH);
535 if (self->zst.avail_out <= 0) {
536 if (_PyString_Resize(&RetVal, length << 1) == -1) {
537 PyErr_SetString(PyExc_MemoryError,
538 "Can't allocate memory to compress data");
539 return NULL;
540 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000541 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000542 self->zst.avail_out = length;
543 length = length << 1;
544 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000545 } while (self->zst.avail_out == 0);
546
547 if (err!=Z_OK && err != Z_STREAM_END)
548 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000549 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000550 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000551 err);
552 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000553 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000554 err, self->zst.msg);
555 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000556 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000557 }
558 if (flushmode == Z_FINISH) {
559 err=deflateEnd(&(self->zst));
560 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000561 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000562 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
563 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000564 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000565 PyErr_Format(ZlibError,
566 "Error %i from deflateEnd(): %.200s",
567 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000568 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000569 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000570 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000571 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000572 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000573 return RetVal;
574}
575
Guido van Rossum3c540301997-06-03 22:21:03 +0000576static char decomp_flush__doc__[] =
577"flush() -- Return a string containing any remaining decompressed data. "
578"The decompressor object can no longer be used after this call."
579;
580
Guido van Rossumfb221561997-04-29 15:38:09 +0000581static PyObject *
582PyZlib_unflush(self, args)
583 compobject *self;
584 PyObject *args;
585{
586 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000587 PyObject *RetVal;
588
589 if (!PyArg_NoArgs(args))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000590 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000591 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
592 {
593 PyErr_SetString(PyExc_MemoryError,
594 "Can't allocate memory to decompress data");
595 return NULL;
596 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000597 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000598 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000599 length = self->zst.avail_out = DEFAULTALLOC;
600
601 err = Z_OK;
602 while (err == Z_OK)
603 {
604 err = inflate(&(self->zst), Z_FINISH);
605 if (err == Z_OK && self->zst.avail_out == 0)
606 {
607 if (_PyString_Resize(&RetVal, length << 1) == -1)
608 {
609 PyErr_SetString(PyExc_MemoryError,
610 "Can't allocate memory to decompress data");
611 return NULL;
612 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000613 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000614 self->zst.avail_out = length;
615 length = length << 1;
616 }
617 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000618 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000619 {
620 if (self->zst.msg == Z_NULL)
621 PyErr_Format(ZlibError, "Error %i while decompressing",
622 err);
623 else
624 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
625 err, self->zst.msg);
626 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000627 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000628 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000629 err=inflateEnd(&(self->zst));
630 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000631 {
632 if (self->zst.msg == Z_NULL)
633 PyErr_Format(ZlibError,
634 "Error %i while flushing decompression object",
635 err);
636 else
637 PyErr_Format(ZlibError,
638 "Error %i while flushing decompression object: %.200s",
639 err, self->zst.msg);
640 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000641 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000642 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000643 _PyString_Resize(&RetVal,
644 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000645 return RetVal;
646}
647
648static PyMethodDef comp_methods[] =
649{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000650 {"compress", (binaryfunc)PyZlib_objcompress, 1, comp_compress__doc__},
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000651 {"flush", (binaryfunc)PyZlib_flush, 1, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000652 {NULL, NULL}
653};
654
655static PyMethodDef Decomp_methods[] =
656{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000657 {"decompress", (binaryfunc)PyZlib_objdecompress, 1, decomp_decompress__doc__},
658 {"flush", (binaryfunc)PyZlib_unflush, 0, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000659 {NULL, NULL}
660};
661
662static PyObject *
663Comp_getattr(self, name)
664 compobject *self;
665 char *name;
666{
667 return Py_FindMethod(comp_methods, (PyObject *)self, name);
668}
669
670static PyObject *
671Decomp_getattr(self, name)
672 compobject *self;
673 char *name;
674{
675 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
676}
677
Guido van Rossum3c540301997-06-03 22:21:03 +0000678static char adler32__doc__[] =
679"adler32(string) -- Compute an Adler-32 checksum of string, using "
680"a default starting value, and returning an integer value.\n"
681"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
682"the starting value provided, and returning an integer value\n"
683;
684
Guido van Rossumfb221561997-04-29 15:38:09 +0000685static PyObject *
686PyZlib_adler32(self, args)
687 PyObject *self, *args;
688{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000689 uLong adler32val=adler32(0L, Z_NULL, 0);
690 Byte *buf;
691 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000692
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000693 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &adler32val))
694 {
695 return NULL;
696 }
697 adler32val = adler32(adler32val, buf, len);
698 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000699}
700
Guido van Rossum3c540301997-06-03 22:21:03 +0000701static char crc32__doc__[] =
702"crc32(string) -- Compute a CRC-32 checksum of string, using "
703"a default starting value, and returning an integer value.\n"
704"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
705"the starting value provided, and returning an integer value.\n"
706;
Guido van Rossumfb221561997-04-29 15:38:09 +0000707
708static PyObject *
709PyZlib_crc32(self, args)
710 PyObject *self, *args;
711{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000712 uLong crc32val=crc32(0L, Z_NULL, 0);
713 Byte *buf;
714 int len;
715 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &crc32val))
716 {
717 return NULL;
718 }
719 crc32val = crc32(crc32val, buf, len);
720 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000721}
722
723
724static PyMethodDef zlib_methods[] =
725{
Guido van Rossum3c540301997-06-03 22:21:03 +0000726 {"adler32", (PyCFunction)PyZlib_adler32, 1, adler32__doc__},
727 {"compress", (PyCFunction)PyZlib_compress, 1, compress__doc__},
728 {"compressobj", (PyCFunction)PyZlib_compressobj, 1, compressobj__doc__},
729 {"crc32", (PyCFunction)PyZlib_crc32, 1, crc32__doc__},
730 {"decompress", (PyCFunction)PyZlib_decompress, 1, decompress__doc__},
731 {"decompressobj", (PyCFunction)PyZlib_decompressobj, 1, decompressobj__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000732 {NULL, NULL}
733};
734
735statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000736 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000737 0,
738 "Compress",
739 sizeof(compobject),
740 0,
741 (destructor)Comp_dealloc, /*tp_dealloc*/
742 0, /*tp_print*/
743 (getattrfunc)Comp_getattr, /*tp_getattr*/
744 0, /*tp_setattr*/
745 0, /*tp_compare*/
746 0, /*tp_repr*/
747 0, /*tp_as_number*/
748 0, /*tp_as_sequence*/
749 0, /*tp_as_mapping*/
750};
751
752statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000753 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000754 0,
755 "Decompress",
756 sizeof(compobject),
757 0,
758 (destructor)Decomp_dealloc, /*tp_dealloc*/
759 0, /*tp_print*/
760 (getattrfunc)Decomp_getattr, /*tp_getattr*/
761 0, /*tp_setattr*/
762 0, /*tp_compare*/
763 0, /*tp_repr*/
764 0, /*tp_as_number*/
765 0, /*tp_as_sequence*/
766 0, /*tp_as_mapping*/
767};
768
769/* The following insint() routine was blatantly ripped off from
770 socketmodule.c */
771
772/* Convenience routine to export an integer value.
773 For simplicity, errors (which are unlikely anyway) are ignored. */
774static void
775insint(d, name, value)
776 PyObject *d;
777 char *name;
778 int value;
779{
780 PyObject *v = PyInt_FromLong((long) value);
781 if (v == NULL) {
782 /* Don't bother reporting this error */
783 PyErr_Clear();
784 }
785 else {
786 PyDict_SetItemString(d, name, v);
787 Py_DECREF(v);
788 }
789}
790
Guido van Rossum3c540301997-06-03 22:21:03 +0000791static char zlib_module_documentation[]=
792"The functions in this module allow compression and decompression "
793"using the zlib library, which is based on GNU zip. \n\n"
794"adler32(string) -- Compute an Adler-32 checksum.\n"
795"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
796"compress(string) -- Compress a string.\n"
797"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
798"compressobj([level]) -- Return a compressor object.\n"
799"crc32(string) -- Compute a CRC-32 checksum.\n"
800"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000801"decompress(string,[wbites],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000802"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
803"Compressor objects support compress() and flush() methods; decompressor \n"
804"objects support decompress() and flush()."
805;
806
Guido van Rossum3886bb61998-12-04 18:50:17 +0000807DL_EXPORT(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000808PyInit_zlib()
809{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000810 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000811 Comptype.ob_type = &PyType_Type;
812 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000813 m = Py_InitModule4("zlib", zlib_methods,
814 zlib_module_documentation,
815 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000816 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000817 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Guido van Rossumfb221561997-04-29 15:38:09 +0000818 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000819
Guido van Rossumfb221561997-04-29 15:38:09 +0000820 insint(d, "MAX_WBITS", MAX_WBITS);
821 insint(d, "DEFLATED", DEFLATED);
822 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000823 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
824 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
825 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
826 insint(d, "Z_FILTERED", Z_FILTERED);
827 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
828 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000829
830 insint(d, "Z_FINISH", Z_FINISH);
831 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
832 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
833 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
834
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000835 ver = PyString_FromString(ZLIB_VERSION);
836 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
Guido van Rossumfb221561997-04-29 15:38:09 +0000837}