blob: 486c0edcd12a3cbd66cb4cc5987b9c50efa91e0f [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;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000033 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000034} compobject;
35
Guido van Rossum3c540301997-06-03 22:21:03 +000036static char compressobj__doc__[] =
37"compressobj() -- Return a compressor object.\n"
38"compressobj(level) -- Return a compressor object, using the given compression level.\n"
39;
40
41static char decompressobj__doc__[] =
42"decompressobj() -- Return a decompressor object.\n"
43"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
44;
45
Guido van Rossumfb221561997-04-29 15:38:09 +000046static compobject *
47newcompobject(type)
48 PyTypeObject *type;
49{
50 compobject *self;
51 self = PyObject_NEW(compobject, type);
52 if (self == NULL)
53 return NULL;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000054 self->is_initialised = 0;
Guido van Rossumfb221561997-04-29 15:38:09 +000055 return self;
56}
57
Guido van Rossum3c540301997-06-03 22:21:03 +000058static char compress__doc__[] =
59"compress(string) -- Compress string using the default compression level, "
60"returning a string containing compressed data.\n"
61"compress(string, level) -- Compress string, using the chosen compression "
62"level (from 1 to 9). Return a string containing the compressed data.\n"
63;
64
Guido van Rossumfb221561997-04-29 15:38:09 +000065static PyObject *
66PyZlib_compress(self, args)
67 PyObject *self;
68 PyObject *args;
69{
70 PyObject *ReturnVal;
71 Byte *input, *output;
72 int length, level=Z_DEFAULT_COMPRESSION, err;
73 z_stream zst;
74
75 if (!PyArg_ParseTuple(args, "s#|i", &input, &length, &level))
76 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000077 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000078 output=(Byte*)malloc(zst.avail_out);
79 if (output==NULL)
80 {
81 PyErr_SetString(PyExc_MemoryError,
82 "Can't allocate memory to compress data");
83 return NULL;
84 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +000085
Jeremy Hylton5bc4abe1998-12-21 17:15:00 +000086 zst.zalloc=(alloc_func)NULL;
Guido van Rossum97b54571997-06-03 22:21:47 +000087 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000088 zst.next_out=(Byte *)output;
89 zst.next_in =(Byte *)input;
90 zst.avail_in=length;
91 err=deflateInit(&zst, level);
92 switch(err)
93 {
94 case(Z_OK):
95 break;
96 case(Z_MEM_ERROR):
97 PyErr_SetString(PyExc_MemoryError,
98 "Out of memory while compressing data");
99 free(output);
100 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000101 case(Z_STREAM_ERROR):
102 PyErr_SetString(ZlibError,
103 "Bad compression level");
104 free(output);
105 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000106 default:
107 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000108 if (zst.msg == Z_NULL)
109 PyErr_Format(ZlibError, "Error %i while compressing data",
110 err);
111 else
112 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
113 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000114 deflateEnd(&zst);
115 free(output);
116 return NULL;
117 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000118 }
119
120 err=deflate(&zst, Z_FINISH);
121 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000122 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000123 case(Z_STREAM_END):
124 break;
125 /* Are there other errors to be trapped here? */
126 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000127 {
128 if (zst.msg == Z_NULL)
129 PyErr_Format(ZlibError, "Error %i while compressing data",
130 err);
131 else
132 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
133 err, zst.msg);
134 deflateEnd(&zst);
135 free(output);
136 return NULL;
137 }
138 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000139 err=deflateEnd(&zst);
140 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000141 {
142 if (zst.msg == Z_NULL)
143 PyErr_Format(ZlibError, "Error %i while finishing compression",
144 err);
145 else
146 PyErr_Format(ZlibError,
147 "Error %i while finishing compression: %.200s",
148 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000149 free(output);
150 return NULL;
151 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000152 ReturnVal=PyString_FromStringAndSize((char *)output, zst.total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000153 free(output);
154 return ReturnVal;
155}
156
Guido van Rossum3c540301997-06-03 22:21:03 +0000157static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000158"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
159"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
160"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 +0000161;
162
Guido van Rossumfb221561997-04-29 15:38:09 +0000163static PyObject *
164PyZlib_decompress(self, args)
165 PyObject *self;
166 PyObject *args;
167{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000168 PyObject *result_str;
169 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000170 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000171 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000172 z_stream zst;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000173 if (!PyArg_ParseTuple(args, "s#|ii", &input, &length, &wsize, &r_strlen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000174 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000175
176 if (r_strlen <= 0)
177 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000178
Guido van Rossumfb221561997-04-29 15:38:09 +0000179 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000180 zst.avail_out=r_strlen;
181 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
182 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000183 PyErr_SetString(PyExc_MemoryError,
184 "Can't allocate memory to decompress data");
185 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000186 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000187 zst.zalloc=(alloc_func)NULL;
188 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000189 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000190 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000191 err=inflateInit2(&zst, wsize);
Guido van Rossumfb221561997-04-29 15:38:09 +0000192 switch(err)
193 {
194 case(Z_OK):
195 break;
196 case(Z_MEM_ERROR):
197 PyErr_SetString(PyExc_MemoryError,
198 "Out of memory while decompressing data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000199 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000200 return NULL;
201 default:
202 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000203 if (zst.msg == Z_NULL)
204 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
205 err);
206 else
207 PyErr_Format(ZlibError,
208 "Error %i while preparing to decompress data: %.200s",
209 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000210 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000211 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000212 return NULL;
213 }
214 }
215 do
216 {
217 err=inflate(&zst, Z_FINISH);
218 switch(err)
219 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000220 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000221 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000222 case(Z_BUF_ERROR):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000223 case(Z_OK):
224 /* need more memory */
225 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000226 {
227 PyErr_SetString(PyExc_MemoryError,
228 "Out of memory while decompressing data");
229 inflateEnd(&zst);
230 return NULL;
231 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000232 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000233 zst.avail_out=r_strlen;
234 r_strlen = r_strlen << 1;
235 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000236 default:
237 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000238 if (zst.msg == Z_NULL)
239 PyErr_Format(ZlibError, "Error %i while decompressing data",
240 err);
241 else
242 PyErr_Format(ZlibError,
243 "Error %i while decompressing data: %.200s",
244 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000245 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000246 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000247 return NULL;
248 }
249 }
250 } while(err!=Z_STREAM_END);
251
252 err=inflateEnd(&zst);
253 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000254 {
255 if (zst.msg == Z_NULL)
256 PyErr_Format(ZlibError,
257 "Error %i while finishing data decompression",
258 err);
259 else
260 PyErr_Format(ZlibError,
261 "Error %i while finishing data decompression: %.200s",
262 err, zst.msg);
263 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000264 return NULL;
265 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000266 _PyString_Resize(&result_str, zst.total_out);
267 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000268}
269
270static PyObject *
271PyZlib_compressobj(selfptr, args)
272 PyObject *selfptr;
273 PyObject *args;
274{
275 compobject *self;
276 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
277 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000278
279 if (!PyArg_ParseTuple(args, "|iiiii", &level, &method, &wbits,
280 &memLevel, &strategy))
281 return NULL;
282
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000283 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000284 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000285 self->zst.zalloc = (alloc_func)NULL;
286 self->zst.zfree = (free_func)Z_NULL;
287 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000288 switch(err)
289 {
290 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000291 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000292 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000293 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000294 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000295 PyErr_SetString(PyExc_MemoryError,
296 "Can't allocate memory for compression object");
297 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000298 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000299 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000300 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000301 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000302 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000303 default:
304 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000305 if (self->zst.msg == Z_NULL)
306 PyErr_Format(ZlibError,
307 "Error %i while creating compression object",
308 err);
309 else
310 PyErr_Format(ZlibError,
311 "Error %i while creating compression object: %.200s",
312 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000313 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000314 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000315 }
316 }
317}
318
319static PyObject *
320PyZlib_decompressobj(selfptr, args)
321 PyObject *selfptr;
322 PyObject *args;
323{
324 int wbits=DEF_WBITS, err;
325 compobject *self;
326 if (!PyArg_ParseTuple(args, "|i", &wbits))
327 {
328 return NULL;
329 }
330 self=newcompobject(&Decomptype);
331 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000332 self->zst.zalloc=(alloc_func)NULL;
333 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000334 err=inflateInit2(&self->zst, wbits);
335 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000336 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000337 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000338 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000339 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000340 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000341 Py_DECREF(self);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000342 PyErr_SetString(PyExc_ValueError,
343 "Invalid initialization option");
344 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000345 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000346 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000347 PyErr_SetString(PyExc_MemoryError,
348 "Can't allocate memory for decompression object");
349 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000350 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000351 {
352 if (self->zst.msg == Z_NULL)
353 PyErr_Format(ZlibError,
354 "Error %i while creating decompression object",
355 err);
356 else
357 PyErr_Format(ZlibError,
358 "Error %i while creating decompression object: %.200s",
359 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000360 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000361 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000362 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000363 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000364}
365
366static void
367Comp_dealloc(self)
368 compobject *self;
369{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000370 if (self->is_initialised)
371 deflateEnd(&self->zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000372 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000373}
374
375static void
376Decomp_dealloc(self)
377 compobject *self;
378{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000379 inflateEnd(&self->zst);
380 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000381}
382
Guido van Rossum3c540301997-06-03 22:21:03 +0000383static char comp_compress__doc__[] =
384"compress(data) -- Return a string containing a compressed version of the data.\n\n"
385"After calling this function, some of the input data may still\n"
386"be stored in internal buffers for later processing.\n"
387"Call the flush() method to clear these buffers."
388;
389
390
Guido van Rossumfb221561997-04-29 15:38:09 +0000391static PyObject *
392PyZlib_objcompress(self, args)
393 compobject *self;
394 PyObject *args;
395{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000396 int err = Z_OK, inplen;
397 int length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000398 PyObject *RetVal;
399 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000400 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000401
402 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000403 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000404 self->zst.avail_in = inplen;
405 self->zst.next_in = input;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000406 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
407 PyErr_SetString(PyExc_MemoryError,
408 "Can't allocate memory to compress data");
409 return NULL;
410 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000411 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000412 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000413 self->zst.avail_out = length;
414 while (self->zst.avail_in != 0 && err == Z_OK)
415 {
416 err = deflate(&(self->zst), Z_NO_FLUSH);
417 if (self->zst.avail_out <= 0) {
418 if (_PyString_Resize(&RetVal, length << 1) == -1) {
419 PyErr_SetString(PyExc_MemoryError,
420 "Can't allocate memory to compress data");
421 return NULL;
422 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000423 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000424 self->zst.avail_out = length;
425 length = length << 1;
426 }
427 }
428 if (err != Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000429 {
430 if (self->zst.msg == Z_NULL)
431 PyErr_Format(ZlibError, "Error %i while compressing",
432 err);
433 else
434 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
435 err, self->zst.msg);
436 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000437 return NULL;
438 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000439 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000440 return RetVal;
441}
442
Guido van Rossum3c540301997-06-03 22:21:03 +0000443static char decomp_decompress__doc__[] =
444"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
445"After calling this function, some of the input data may still\n"
446"be stored in internal buffers for later processing.\n"
447"Call the flush() method to clear these buffers."
448;
449
Guido van Rossumfb221561997-04-29 15:38:09 +0000450static PyObject *
451PyZlib_objdecompress(self, args)
452 compobject *self;
453 PyObject *args;
454{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000455 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000456 PyObject *RetVal;
457 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000458 unsigned long start_total_out;
459
Guido van Rossumfb221561997-04-29 15:38:09 +0000460 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
461 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000462 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000463 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000464 self->zst.avail_in = inplen;
465 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000466 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000467 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000468 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000469
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000470 while (self->zst.avail_in != 0 && err == Z_OK)
471 {
472 err = inflate(&(self->zst), Z_NO_FLUSH);
473 if (err == Z_OK && self->zst.avail_out <= 0)
474 {
475 if (_PyString_Resize(&RetVal, length << 1) == -1)
476 {
477 PyErr_SetString(PyExc_MemoryError,
478 "Can't allocate memory to compress data");
479 return NULL;
480 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000481 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000482 self->zst.avail_out = length;
483 length = length << 1;
484 }
485 }
486
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000487 if (err != Z_OK && err != Z_STREAM_END)
488 {
489 if (self->zst.msg == Z_NULL)
490 PyErr_Format(ZlibError, "Error %i while decompressing",
491 err);
492 else
493 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
494 err, self->zst.msg);
495 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000496 return NULL;
497 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000498 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000499 return RetVal;
500}
501
Guido van Rossum3c540301997-06-03 22:21:03 +0000502static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000503"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
504"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
505"default value used when mode is not specified is Z_FINISH.\n"
506"If mode == Z_FINISH, the compressor object can no longer be used after\n"
507"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000508;
509
Guido van Rossumfb221561997-04-29 15:38:09 +0000510static PyObject *
511PyZlib_flush(self, args)
512 compobject *self;
513 PyObject *args;
514{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000515 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000516 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000517 int flushmode = Z_FINISH;
518 unsigned long start_total_out;
519
520 if (!PyArg_ParseTuple(args, "|i", &flushmode))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000521 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000522
523 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
524 doing any work at all; just return an empty string. */
525 if (flushmode == Z_NO_FLUSH)
526 {
527 return PyString_FromStringAndSize(NULL, 0);
528 }
529
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000530 self->zst.avail_in = 0;
531 self->zst.next_in = Z_NULL;
532 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
533 PyErr_SetString(PyExc_MemoryError,
534 "Can't allocate memory to compress data");
535 return NULL;
536 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000537 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000538 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000539 self->zst.avail_out = length;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000540
541 /* When flushing the zstream, there's no input data.
542 If zst.avail_out == 0, that means that more output space is
543 needed to complete the flush operation. */
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000544 while (1) {
545 err = deflate(&(self->zst), flushmode);
546
547 /* If the output is Z_OK, and there's still room in the output
548 buffer, then the flush is complete. */
549 if ( (err == Z_OK) && self->zst.avail_out > 0) break;
550
551 /* A nonzero return indicates some sort of error (but see
552 the comment for the error handler below) */
553 if ( err != Z_OK ) break;
554
555 /* There's no space left for output, so increase the buffer and loop
556 again */
557 if (_PyString_Resize(&RetVal, length << 1) == -1) {
558 PyErr_SetString(PyExc_MemoryError,
559 "Can't allocate memory to compress data");
560 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000561 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000562 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
563 self->zst.avail_out = length;
564 length = length << 1;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000565 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000566
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000567 /* Raise an exception indicating an error. The condition for
568 detecting a error is kind of complicated; Z_OK indicates no
569 error, but if the flushmode is Z_FINISH, then Z_STREAM_END is
570 also not an error. */
571 if (err!=Z_OK && !(flushmode == Z_FINISH && err == Z_STREAM_END) )
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000572 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000573 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000574 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000575 err);
576 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000577 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000578 err, self->zst.msg);
579 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000580 return NULL;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000581 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000582
583 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to
584 free various data structures */
585
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000586 if (flushmode == Z_FINISH) {
587 err=deflateEnd(&(self->zst));
588 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000589 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000590 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
591 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000592 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000593 PyErr_Format(ZlibError,
594 "Error %i from deflateEnd(): %.200s",
595 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000596 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000597 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000598 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000599 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000600 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000601 return RetVal;
602}
603
Guido van Rossum3c540301997-06-03 22:21:03 +0000604static char decomp_flush__doc__[] =
605"flush() -- Return a string containing any remaining decompressed data. "
606"The decompressor object can no longer be used after this call."
607;
608
Guido van Rossumfb221561997-04-29 15:38:09 +0000609static PyObject *
610PyZlib_unflush(self, args)
611 compobject *self;
612 PyObject *args;
613{
614 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000615 PyObject *RetVal;
616
617 if (!PyArg_NoArgs(args))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000618 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000619 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
620 {
621 PyErr_SetString(PyExc_MemoryError,
622 "Can't allocate memory to decompress data");
623 return NULL;
624 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000625 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000626 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000627 length = self->zst.avail_out = DEFAULTALLOC;
628
629 err = Z_OK;
630 while (err == Z_OK)
631 {
632 err = inflate(&(self->zst), Z_FINISH);
633 if (err == Z_OK && self->zst.avail_out == 0)
634 {
635 if (_PyString_Resize(&RetVal, length << 1) == -1)
636 {
637 PyErr_SetString(PyExc_MemoryError,
638 "Can't allocate memory to decompress data");
639 return NULL;
640 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000641 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000642 self->zst.avail_out = length;
643 length = length << 1;
644 }
645 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000646 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000647 {
648 if (self->zst.msg == Z_NULL)
649 PyErr_Format(ZlibError, "Error %i while decompressing",
650 err);
651 else
652 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
653 err, self->zst.msg);
654 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000655 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000656 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000657 err=inflateEnd(&(self->zst));
658 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000659 {
660 if (self->zst.msg == Z_NULL)
661 PyErr_Format(ZlibError,
662 "Error %i while flushing decompression object",
663 err);
664 else
665 PyErr_Format(ZlibError,
666 "Error %i while flushing decompression object: %.200s",
667 err, self->zst.msg);
668 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000669 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000670 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000671 _PyString_Resize(&RetVal,
672 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000673 return RetVal;
674}
675
676static PyMethodDef comp_methods[] =
677{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000678 {"compress", (binaryfunc)PyZlib_objcompress, 1, comp_compress__doc__},
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000679 {"flush", (binaryfunc)PyZlib_flush, 1, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000680 {NULL, NULL}
681};
682
683static PyMethodDef Decomp_methods[] =
684{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000685 {"decompress", (binaryfunc)PyZlib_objdecompress, 1, decomp_decompress__doc__},
686 {"flush", (binaryfunc)PyZlib_unflush, 0, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000687 {NULL, NULL}
688};
689
690static PyObject *
691Comp_getattr(self, name)
692 compobject *self;
693 char *name;
694{
695 return Py_FindMethod(comp_methods, (PyObject *)self, name);
696}
697
698static PyObject *
699Decomp_getattr(self, name)
700 compobject *self;
701 char *name;
702{
703 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
704}
705
Guido van Rossum3c540301997-06-03 22:21:03 +0000706static char adler32__doc__[] =
707"adler32(string) -- Compute an Adler-32 checksum of string, using "
708"a default starting value, and returning an integer value.\n"
709"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
710"the starting value provided, and returning an integer value\n"
711;
712
Guido van Rossumfb221561997-04-29 15:38:09 +0000713static PyObject *
714PyZlib_adler32(self, args)
715 PyObject *self, *args;
716{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000717 uLong adler32val=adler32(0L, Z_NULL, 0);
718 Byte *buf;
719 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000720
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000721 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &adler32val))
722 {
723 return NULL;
724 }
725 adler32val = adler32(adler32val, buf, len);
726 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000727}
728
Guido van Rossum3c540301997-06-03 22:21:03 +0000729static char crc32__doc__[] =
730"crc32(string) -- Compute a CRC-32 checksum of string, using "
731"a default starting value, and returning an integer value.\n"
732"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
733"the starting value provided, and returning an integer value.\n"
734;
Guido van Rossumfb221561997-04-29 15:38:09 +0000735
736static PyObject *
737PyZlib_crc32(self, args)
738 PyObject *self, *args;
739{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000740 uLong crc32val=crc32(0L, Z_NULL, 0);
741 Byte *buf;
742 int len;
743 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &crc32val))
744 {
745 return NULL;
746 }
747 crc32val = crc32(crc32val, buf, len);
748 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000749}
750
751
752static PyMethodDef zlib_methods[] =
753{
Guido van Rossum3c540301997-06-03 22:21:03 +0000754 {"adler32", (PyCFunction)PyZlib_adler32, 1, adler32__doc__},
755 {"compress", (PyCFunction)PyZlib_compress, 1, compress__doc__},
756 {"compressobj", (PyCFunction)PyZlib_compressobj, 1, compressobj__doc__},
757 {"crc32", (PyCFunction)PyZlib_crc32, 1, crc32__doc__},
758 {"decompress", (PyCFunction)PyZlib_decompress, 1, decompress__doc__},
759 {"decompressobj", (PyCFunction)PyZlib_decompressobj, 1, decompressobj__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000760 {NULL, NULL}
761};
762
763statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000764 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000765 0,
766 "Compress",
767 sizeof(compobject),
768 0,
769 (destructor)Comp_dealloc, /*tp_dealloc*/
770 0, /*tp_print*/
771 (getattrfunc)Comp_getattr, /*tp_getattr*/
772 0, /*tp_setattr*/
773 0, /*tp_compare*/
774 0, /*tp_repr*/
775 0, /*tp_as_number*/
776 0, /*tp_as_sequence*/
777 0, /*tp_as_mapping*/
778};
779
780statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000781 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000782 0,
783 "Decompress",
784 sizeof(compobject),
785 0,
786 (destructor)Decomp_dealloc, /*tp_dealloc*/
787 0, /*tp_print*/
788 (getattrfunc)Decomp_getattr, /*tp_getattr*/
789 0, /*tp_setattr*/
790 0, /*tp_compare*/
791 0, /*tp_repr*/
792 0, /*tp_as_number*/
793 0, /*tp_as_sequence*/
794 0, /*tp_as_mapping*/
795};
796
797/* The following insint() routine was blatantly ripped off from
798 socketmodule.c */
799
800/* Convenience routine to export an integer value.
801 For simplicity, errors (which are unlikely anyway) are ignored. */
802static void
803insint(d, name, value)
804 PyObject *d;
805 char *name;
806 int value;
807{
808 PyObject *v = PyInt_FromLong((long) value);
809 if (v == NULL) {
810 /* Don't bother reporting this error */
811 PyErr_Clear();
812 }
813 else {
814 PyDict_SetItemString(d, name, v);
815 Py_DECREF(v);
816 }
817}
818
Guido van Rossum3c540301997-06-03 22:21:03 +0000819static char zlib_module_documentation[]=
820"The functions in this module allow compression and decompression "
821"using the zlib library, which is based on GNU zip. \n\n"
822"adler32(string) -- Compute an Adler-32 checksum.\n"
823"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
824"compress(string) -- Compress a string.\n"
825"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
826"compressobj([level]) -- Return a compressor object.\n"
827"crc32(string) -- Compute a CRC-32 checksum.\n"
828"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000829"decompress(string,[wbites],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000830"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
831"Compressor objects support compress() and flush() methods; decompressor \n"
832"objects support decompress() and flush()."
833;
834
Guido van Rossum3886bb61998-12-04 18:50:17 +0000835DL_EXPORT(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000836PyInit_zlib()
837{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000838 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000839 Comptype.ob_type = &PyType_Type;
840 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000841 m = Py_InitModule4("zlib", zlib_methods,
842 zlib_module_documentation,
843 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000844 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000845 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Guido van Rossumfb221561997-04-29 15:38:09 +0000846 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000847
Guido van Rossumfb221561997-04-29 15:38:09 +0000848 insint(d, "MAX_WBITS", MAX_WBITS);
849 insint(d, "DEFLATED", DEFLATED);
850 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000851 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
852 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
853 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
854 insint(d, "Z_FILTERED", Z_FILTERED);
855 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
856 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000857
858 insint(d, "Z_FINISH", Z_FINISH);
859 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
860 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
861 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
862
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000863 ver = PyString_FromString(ZLIB_VERSION);
864 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
Barry Warsaw30aa1e71999-01-28 19:40:05 +0000865 Py_DECREF(ver);
Guido van Rossumfb221561997-04-29 15:38:09 +0000866}