blob: f664e98caa053e7404b9409801c3579912e0bc17 [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. Kuchlingb95227d1999-03-25 21:21:08 +000033 PyObject *unused_data;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000034 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000035} compobject;
36
Guido van Rossum3c540301997-06-03 22:21:03 +000037static char compressobj__doc__[] =
38"compressobj() -- Return a compressor object.\n"
39"compressobj(level) -- Return a compressor object, using the given compression level.\n"
40;
41
42static char decompressobj__doc__[] =
43"decompressobj() -- Return a decompressor object.\n"
44"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
45;
46
Guido van Rossumfb221561997-04-29 15:38:09 +000047static compobject *
48newcompobject(type)
49 PyTypeObject *type;
50{
51 compobject *self;
52 self = PyObject_NEW(compobject, type);
53 if (self == NULL)
54 return NULL;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000055 self->is_initialised = 0;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000056 self->unused_data = PyString_FromString("");
Guido van Rossumfb221561997-04-29 15:38:09 +000057 return self;
58}
59
Guido van Rossum3c540301997-06-03 22:21:03 +000060static char compress__doc__[] =
61"compress(string) -- Compress string using the default compression level, "
62"returning a string containing compressed data.\n"
63"compress(string, level) -- Compress string, using the chosen compression "
64"level (from 1 to 9). Return a string containing the compressed data.\n"
65;
66
Guido van Rossumfb221561997-04-29 15:38:09 +000067static PyObject *
68PyZlib_compress(self, args)
69 PyObject *self;
70 PyObject *args;
71{
72 PyObject *ReturnVal;
73 Byte *input, *output;
74 int length, level=Z_DEFAULT_COMPRESSION, err;
75 z_stream zst;
76
77 if (!PyArg_ParseTuple(args, "s#|i", &input, &length, &level))
78 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000079 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000080 output=(Byte*)malloc(zst.avail_out);
81 if (output==NULL)
82 {
83 PyErr_SetString(PyExc_MemoryError,
84 "Can't allocate memory to compress data");
85 return NULL;
86 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +000087
Jeremy Hylton5bc4abe1998-12-21 17:15:00 +000088 zst.zalloc=(alloc_func)NULL;
Guido van Rossum97b54571997-06-03 22:21:47 +000089 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000090 zst.next_out=(Byte *)output;
91 zst.next_in =(Byte *)input;
92 zst.avail_in=length;
93 err=deflateInit(&zst, level);
94 switch(err)
95 {
96 case(Z_OK):
97 break;
98 case(Z_MEM_ERROR):
99 PyErr_SetString(PyExc_MemoryError,
100 "Out of memory while compressing data");
101 free(output);
102 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000103 case(Z_STREAM_ERROR):
104 PyErr_SetString(ZlibError,
105 "Bad compression level");
106 free(output);
107 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000108 default:
109 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000110 if (zst.msg == Z_NULL)
111 PyErr_Format(ZlibError, "Error %i while compressing data",
112 err);
113 else
114 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
115 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000116 deflateEnd(&zst);
117 free(output);
118 return NULL;
119 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000120 }
121
122 err=deflate(&zst, Z_FINISH);
123 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000124 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000125 case(Z_STREAM_END):
126 break;
127 /* Are there other errors to be trapped here? */
128 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000129 {
130 if (zst.msg == Z_NULL)
131 PyErr_Format(ZlibError, "Error %i while compressing data",
132 err);
133 else
134 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
135 err, zst.msg);
136 deflateEnd(&zst);
137 free(output);
138 return NULL;
139 }
140 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000141 err=deflateEnd(&zst);
142 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000143 {
144 if (zst.msg == Z_NULL)
145 PyErr_Format(ZlibError, "Error %i while finishing compression",
146 err);
147 else
148 PyErr_Format(ZlibError,
149 "Error %i while finishing compression: %.200s",
150 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000151 free(output);
152 return NULL;
153 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000154 ReturnVal=PyString_FromStringAndSize((char *)output, zst.total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000155 free(output);
156 return ReturnVal;
157}
158
Guido van Rossum3c540301997-06-03 22:21:03 +0000159static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000160"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
161"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
162"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 +0000163;
164
Guido van Rossumfb221561997-04-29 15:38:09 +0000165static PyObject *
166PyZlib_decompress(self, args)
167 PyObject *self;
168 PyObject *args;
169{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000170 PyObject *result_str;
171 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000172 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000173 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000174 z_stream zst;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000175 if (!PyArg_ParseTuple(args, "s#|ii", &input, &length, &wsize, &r_strlen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000176 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000177
178 if (r_strlen <= 0)
179 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000180
Guido van Rossumfb221561997-04-29 15:38:09 +0000181 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000182 zst.avail_out=r_strlen;
183 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
184 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000185 PyErr_SetString(PyExc_MemoryError,
186 "Can't allocate memory to decompress data");
187 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000188 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000189 zst.zalloc=(alloc_func)NULL;
190 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000191 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000192 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000193 err=inflateInit2(&zst, wsize);
Guido van Rossumfb221561997-04-29 15:38:09 +0000194 switch(err)
195 {
196 case(Z_OK):
197 break;
198 case(Z_MEM_ERROR):
199 PyErr_SetString(PyExc_MemoryError,
200 "Out of memory while decompressing data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000201 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000202 return NULL;
203 default:
204 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000205 if (zst.msg == Z_NULL)
206 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
207 err);
208 else
209 PyErr_Format(ZlibError,
210 "Error %i while preparing to decompress data: %.200s",
211 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000212 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000213 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000214 return NULL;
215 }
216 }
217 do
218 {
219 err=inflate(&zst, Z_FINISH);
220 switch(err)
221 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000222 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000223 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000224 case(Z_BUF_ERROR):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000225 case(Z_OK):
226 /* need more memory */
227 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000228 {
229 PyErr_SetString(PyExc_MemoryError,
230 "Out of memory while decompressing data");
231 inflateEnd(&zst);
232 return NULL;
233 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000234 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000235 zst.avail_out=r_strlen;
236 r_strlen = r_strlen << 1;
237 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000238 default:
239 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000240 if (zst.msg == Z_NULL)
241 PyErr_Format(ZlibError, "Error %i while decompressing data",
242 err);
243 else
244 PyErr_Format(ZlibError,
245 "Error %i while decompressing data: %.200s",
246 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000247 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000248 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000249 return NULL;
250 }
251 }
252 } while(err!=Z_STREAM_END);
253
254 err=inflateEnd(&zst);
255 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000256 {
257 if (zst.msg == Z_NULL)
258 PyErr_Format(ZlibError,
259 "Error %i while finishing data decompression",
260 err);
261 else
262 PyErr_Format(ZlibError,
263 "Error %i while finishing data decompression: %.200s",
264 err, zst.msg);
265 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000266 return NULL;
267 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000268 _PyString_Resize(&result_str, zst.total_out);
269 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000270}
271
272static PyObject *
273PyZlib_compressobj(selfptr, args)
274 PyObject *selfptr;
275 PyObject *args;
276{
277 compobject *self;
278 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
279 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000280
281 if (!PyArg_ParseTuple(args, "|iiiii", &level, &method, &wbits,
282 &memLevel, &strategy))
283 return NULL;
284
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000285 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000286 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000287 self->zst.zalloc = (alloc_func)NULL;
288 self->zst.zfree = (free_func)Z_NULL;
289 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000290 switch(err)
291 {
292 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000293 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000294 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000295 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000296 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000297 PyErr_SetString(PyExc_MemoryError,
298 "Can't allocate memory for compression object");
299 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000300 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000301 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000302 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000303 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000304 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000305 default:
306 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000307 if (self->zst.msg == Z_NULL)
308 PyErr_Format(ZlibError,
309 "Error %i while creating compression object",
310 err);
311 else
312 PyErr_Format(ZlibError,
313 "Error %i while creating compression object: %.200s",
314 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000315 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000316 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000317 }
318 }
319}
320
321static PyObject *
322PyZlib_decompressobj(selfptr, args)
323 PyObject *selfptr;
324 PyObject *args;
325{
326 int wbits=DEF_WBITS, err;
327 compobject *self;
328 if (!PyArg_ParseTuple(args, "|i", &wbits))
329 {
330 return NULL;
331 }
332 self=newcompobject(&Decomptype);
333 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000334 self->zst.zalloc=(alloc_func)NULL;
335 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000336 err=inflateInit2(&self->zst, wbits);
337 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000338 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000339 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000340 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000341 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000342 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000343 Py_DECREF(self);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000344 PyErr_SetString(PyExc_ValueError,
345 "Invalid initialization option");
346 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000347 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000348 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000349 PyErr_SetString(PyExc_MemoryError,
350 "Can't allocate memory for decompression object");
351 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000352 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000353 {
354 if (self->zst.msg == Z_NULL)
355 PyErr_Format(ZlibError,
356 "Error %i while creating decompression object",
357 err);
358 else
359 PyErr_Format(ZlibError,
360 "Error %i while creating decompression object: %.200s",
361 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000362 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000363 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000364 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000365 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000366}
367
368static void
369Comp_dealloc(self)
370 compobject *self;
371{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000372 if (self->is_initialised)
373 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000374 Py_XDECREF(self->unused_data);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000375 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000376}
377
378static void
379Decomp_dealloc(self)
380 compobject *self;
381{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000382 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000383 Py_XDECREF(self->unused_data);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000384 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000385}
386
Guido van Rossum3c540301997-06-03 22:21:03 +0000387static char comp_compress__doc__[] =
388"compress(data) -- Return a string containing a compressed version of the data.\n\n"
389"After calling this function, some of the input data may still\n"
390"be stored in internal buffers for later processing.\n"
391"Call the flush() method to clear these buffers."
392;
393
394
Guido van Rossumfb221561997-04-29 15:38:09 +0000395static PyObject *
396PyZlib_objcompress(self, args)
397 compobject *self;
398 PyObject *args;
399{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000400 int err = Z_OK, inplen;
401 int length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000402 PyObject *RetVal;
403 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000404 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000405
406 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000407 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000408 self->zst.avail_in = inplen;
409 self->zst.next_in = input;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000410 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
411 PyErr_SetString(PyExc_MemoryError,
412 "Can't allocate memory to compress data");
413 return NULL;
414 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000415 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000416 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000417 self->zst.avail_out = length;
418 while (self->zst.avail_in != 0 && err == Z_OK)
419 {
420 err = deflate(&(self->zst), Z_NO_FLUSH);
421 if (self->zst.avail_out <= 0) {
422 if (_PyString_Resize(&RetVal, length << 1) == -1) {
423 PyErr_SetString(PyExc_MemoryError,
424 "Can't allocate memory to compress data");
425 return NULL;
426 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000427 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000428 self->zst.avail_out = length;
429 length = length << 1;
430 }
431 }
432 if (err != Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000433 {
434 if (self->zst.msg == Z_NULL)
435 PyErr_Format(ZlibError, "Error %i while compressing",
436 err);
437 else
438 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
439 err, self->zst.msg);
440 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000441 return NULL;
442 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000443 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000444 return RetVal;
445}
446
Guido van Rossum3c540301997-06-03 22:21:03 +0000447static char decomp_decompress__doc__[] =
448"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
449"After calling this function, some of the input data may still\n"
450"be stored in internal buffers for later processing.\n"
451"Call the flush() method to clear these buffers."
452;
453
Guido van Rossumfb221561997-04-29 15:38:09 +0000454static PyObject *
455PyZlib_objdecompress(self, args)
456 compobject *self;
457 PyObject *args;
458{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000459 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000460 PyObject *RetVal;
461 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000462 unsigned long start_total_out;
463
Guido van Rossumfb221561997-04-29 15:38:09 +0000464 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
465 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000466 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000467 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000468 self->zst.avail_in = inplen;
469 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000470 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000471 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000472 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000473
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000474 while (self->zst.avail_in != 0 && err == Z_OK)
475 {
476 err = inflate(&(self->zst), Z_NO_FLUSH);
477 if (err == Z_OK && self->zst.avail_out <= 0)
478 {
479 if (_PyString_Resize(&RetVal, length << 1) == -1)
480 {
481 PyErr_SetString(PyExc_MemoryError,
482 "Can't allocate memory to compress data");
483 return NULL;
484 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000485 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000486 self->zst.avail_out = length;
487 length = length << 1;
488 }
489 }
490
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000491 if (err != Z_OK && err != Z_STREAM_END)
492 {
493 if (self->zst.msg == Z_NULL)
494 PyErr_Format(ZlibError, "Error %i while decompressing",
495 err);
496 else
497 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
498 err, self->zst.msg);
499 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000500 return NULL;
501 }
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000502
503 if (err == Z_STREAM_END)
504 {
505 /* The end of the compressed data has been reached, so set
506 the unused_data attribute to a string containing the
507 remainder of the data in the string. */
508 int pos = self->zst.next_in - input; /* Position in the string */
509 Py_XDECREF(self->unused_data); /* Free the original, empty string */
510
511 self->unused_data = PyString_FromStringAndSize(input+pos, inplen-pos);
512 if (self->unused_data == NULL) return NULL;
513 }
514
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000515 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000516 return RetVal;
517}
518
Guido van Rossum3c540301997-06-03 22:21:03 +0000519static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000520"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
521"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
522"default value used when mode is not specified is Z_FINISH.\n"
523"If mode == Z_FINISH, the compressor object can no longer be used after\n"
524"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000525;
526
Guido van Rossumfb221561997-04-29 15:38:09 +0000527static PyObject *
528PyZlib_flush(self, args)
529 compobject *self;
530 PyObject *args;
531{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000532 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000533 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000534 int flushmode = Z_FINISH;
535 unsigned long start_total_out;
536
537 if (!PyArg_ParseTuple(args, "|i", &flushmode))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000538 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000539
540 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
541 doing any work at all; just return an empty string. */
542 if (flushmode == Z_NO_FLUSH)
543 {
544 return PyString_FromStringAndSize(NULL, 0);
545 }
546
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000547 self->zst.avail_in = 0;
548 self->zst.next_in = Z_NULL;
549 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
550 PyErr_SetString(PyExc_MemoryError,
551 "Can't allocate memory to compress data");
552 return NULL;
553 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000554 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000555 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000556 self->zst.avail_out = length;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000557
558 /* When flushing the zstream, there's no input data.
559 If zst.avail_out == 0, that means that more output space is
560 needed to complete the flush operation. */
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000561 while (1) {
562 err = deflate(&(self->zst), flushmode);
563
564 /* If the output is Z_OK, and there's still room in the output
565 buffer, then the flush is complete. */
566 if ( (err == Z_OK) && self->zst.avail_out > 0) break;
567
568 /* A nonzero return indicates some sort of error (but see
569 the comment for the error handler below) */
570 if ( err != Z_OK ) break;
571
572 /* There's no space left for output, so increase the buffer and loop
573 again */
574 if (_PyString_Resize(&RetVal, length << 1) == -1) {
575 PyErr_SetString(PyExc_MemoryError,
576 "Can't allocate memory to compress data");
577 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000578 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000579 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
580 self->zst.avail_out = length;
581 length = length << 1;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000582 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000583
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000584 /* Raise an exception indicating an error. The condition for
585 detecting a error is kind of complicated; Z_OK indicates no
586 error, but if the flushmode is Z_FINISH, then Z_STREAM_END is
587 also not an error. */
588 if (err!=Z_OK && !(flushmode == Z_FINISH && err == Z_STREAM_END) )
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000589 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000590 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000591 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000592 err);
593 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000594 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000595 err, self->zst.msg);
596 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000597 return NULL;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000598 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000599
600 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to
601 free various data structures */
602
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000603 if (flushmode == Z_FINISH) {
604 err=deflateEnd(&(self->zst));
605 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000606 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000607 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
608 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000609 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000610 PyErr_Format(ZlibError,
611 "Error %i from deflateEnd(): %.200s",
612 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000613 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000614 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000615 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000616 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000617 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000618 return RetVal;
619}
620
Guido van Rossum3c540301997-06-03 22:21:03 +0000621static char decomp_flush__doc__[] =
622"flush() -- Return a string containing any remaining decompressed data. "
623"The decompressor object can no longer be used after this call."
624;
625
Guido van Rossumfb221561997-04-29 15:38:09 +0000626static PyObject *
627PyZlib_unflush(self, args)
628 compobject *self;
629 PyObject *args;
630{
631 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000632 PyObject *RetVal;
633
634 if (!PyArg_NoArgs(args))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000635 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000636 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
637 {
638 PyErr_SetString(PyExc_MemoryError,
639 "Can't allocate memory to decompress data");
640 return NULL;
641 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000642 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000643 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000644 length = self->zst.avail_out = DEFAULTALLOC;
645
646 err = Z_OK;
647 while (err == Z_OK)
648 {
649 err = inflate(&(self->zst), Z_FINISH);
650 if (err == Z_OK && self->zst.avail_out == 0)
651 {
652 if (_PyString_Resize(&RetVal, length << 1) == -1)
653 {
654 PyErr_SetString(PyExc_MemoryError,
655 "Can't allocate memory to decompress data");
656 return NULL;
657 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000658 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000659 self->zst.avail_out = length;
660 length = length << 1;
661 }
662 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000663 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000664 {
665 if (self->zst.msg == Z_NULL)
666 PyErr_Format(ZlibError, "Error %i while decompressing",
667 err);
668 else
669 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
670 err, self->zst.msg);
671 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000672 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000673 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000674 err=inflateEnd(&(self->zst));
675 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000676 {
677 if (self->zst.msg == Z_NULL)
678 PyErr_Format(ZlibError,
679 "Error %i while flushing decompression object",
680 err);
681 else
682 PyErr_Format(ZlibError,
683 "Error %i while flushing decompression object: %.200s",
684 err, self->zst.msg);
685 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000686 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000687 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000688 _PyString_Resize(&RetVal,
689 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000690 return RetVal;
691}
692
693static PyMethodDef comp_methods[] =
694{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000695 {"compress", (binaryfunc)PyZlib_objcompress, 1, comp_compress__doc__},
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000696 {"flush", (binaryfunc)PyZlib_flush, 1, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000697 {NULL, NULL}
698};
699
700static PyMethodDef Decomp_methods[] =
701{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000702 {"decompress", (binaryfunc)PyZlib_objdecompress, 1, decomp_decompress__doc__},
703 {"flush", (binaryfunc)PyZlib_unflush, 0, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000704 {NULL, NULL}
705};
706
707static PyObject *
708Comp_getattr(self, name)
709 compobject *self;
710 char *name;
711{
712 return Py_FindMethod(comp_methods, (PyObject *)self, name);
713}
714
715static PyObject *
716Decomp_getattr(self, name)
717 compobject *self;
718 char *name;
719{
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000720 if (strcmp(name, "unused_data") == 0)
721 {
722 Py_INCREF(self->unused_data);
723 return self->unused_data;
724 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000725 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
726}
727
Guido van Rossum3c540301997-06-03 22:21:03 +0000728static char adler32__doc__[] =
729"adler32(string) -- Compute an Adler-32 checksum of string, using "
730"a default starting value, and returning an integer value.\n"
731"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
732"the starting value provided, and returning an integer value\n"
733;
734
Guido van Rossumfb221561997-04-29 15:38:09 +0000735static PyObject *
736PyZlib_adler32(self, args)
737 PyObject *self, *args;
738{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000739 uLong adler32val=adler32(0L, Z_NULL, 0);
740 Byte *buf;
741 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000742
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000743 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &adler32val))
744 {
745 return NULL;
746 }
747 adler32val = adler32(adler32val, buf, len);
748 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000749}
750
Guido van Rossum3c540301997-06-03 22:21:03 +0000751static char crc32__doc__[] =
752"crc32(string) -- Compute a CRC-32 checksum of string, using "
753"a default starting value, and returning an integer value.\n"
754"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
755"the starting value provided, and returning an integer value.\n"
756;
Guido van Rossumfb221561997-04-29 15:38:09 +0000757
758static PyObject *
759PyZlib_crc32(self, args)
760 PyObject *self, *args;
761{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000762 uLong crc32val=crc32(0L, Z_NULL, 0);
763 Byte *buf;
764 int len;
765 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &crc32val))
766 {
767 return NULL;
768 }
769 crc32val = crc32(crc32val, buf, len);
770 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000771}
772
773
774static PyMethodDef zlib_methods[] =
775{
Guido van Rossum3c540301997-06-03 22:21:03 +0000776 {"adler32", (PyCFunction)PyZlib_adler32, 1, adler32__doc__},
777 {"compress", (PyCFunction)PyZlib_compress, 1, compress__doc__},
778 {"compressobj", (PyCFunction)PyZlib_compressobj, 1, compressobj__doc__},
779 {"crc32", (PyCFunction)PyZlib_crc32, 1, crc32__doc__},
780 {"decompress", (PyCFunction)PyZlib_decompress, 1, decompress__doc__},
781 {"decompressobj", (PyCFunction)PyZlib_decompressobj, 1, decompressobj__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000782 {NULL, NULL}
783};
784
785statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000786 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000787 0,
788 "Compress",
789 sizeof(compobject),
790 0,
791 (destructor)Comp_dealloc, /*tp_dealloc*/
792 0, /*tp_print*/
793 (getattrfunc)Comp_getattr, /*tp_getattr*/
794 0, /*tp_setattr*/
795 0, /*tp_compare*/
796 0, /*tp_repr*/
797 0, /*tp_as_number*/
798 0, /*tp_as_sequence*/
799 0, /*tp_as_mapping*/
800};
801
802statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000803 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000804 0,
805 "Decompress",
806 sizeof(compobject),
807 0,
808 (destructor)Decomp_dealloc, /*tp_dealloc*/
809 0, /*tp_print*/
810 (getattrfunc)Decomp_getattr, /*tp_getattr*/
811 0, /*tp_setattr*/
812 0, /*tp_compare*/
813 0, /*tp_repr*/
814 0, /*tp_as_number*/
815 0, /*tp_as_sequence*/
816 0, /*tp_as_mapping*/
817};
818
819/* The following insint() routine was blatantly ripped off from
820 socketmodule.c */
821
822/* Convenience routine to export an integer value.
823 For simplicity, errors (which are unlikely anyway) are ignored. */
824static void
825insint(d, name, value)
826 PyObject *d;
827 char *name;
828 int value;
829{
830 PyObject *v = PyInt_FromLong((long) value);
831 if (v == NULL) {
832 /* Don't bother reporting this error */
833 PyErr_Clear();
834 }
835 else {
836 PyDict_SetItemString(d, name, v);
837 Py_DECREF(v);
838 }
839}
840
Guido van Rossum3c540301997-06-03 22:21:03 +0000841static char zlib_module_documentation[]=
842"The functions in this module allow compression and decompression "
843"using the zlib library, which is based on GNU zip. \n\n"
844"adler32(string) -- Compute an Adler-32 checksum.\n"
845"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
846"compress(string) -- Compress a string.\n"
847"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
848"compressobj([level]) -- Return a compressor object.\n"
849"crc32(string) -- Compute a CRC-32 checksum.\n"
850"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000851"decompress(string,[wbites],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000852"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
853"Compressor objects support compress() and flush() methods; decompressor \n"
854"objects support decompress() and flush()."
855;
856
Guido van Rossum3886bb61998-12-04 18:50:17 +0000857DL_EXPORT(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000858PyInit_zlib()
859{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000860 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000861 Comptype.ob_type = &PyType_Type;
862 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000863 m = Py_InitModule4("zlib", zlib_methods,
864 zlib_module_documentation,
865 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000866 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000867 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Guido van Rossumfb221561997-04-29 15:38:09 +0000868 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000869
Guido van Rossumfb221561997-04-29 15:38:09 +0000870 insint(d, "MAX_WBITS", MAX_WBITS);
871 insint(d, "DEFLATED", DEFLATED);
872 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000873 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
874 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
875 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
876 insint(d, "Z_FILTERED", Z_FILTERED);
877 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
878 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000879
880 insint(d, "Z_FINISH", Z_FINISH);
881 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
882 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
883 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
884
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000885 ver = PyString_FromString(ZLIB_VERSION);
886 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
Barry Warsaw30aa1e71999-01-28 19:40:05 +0000887 Py_DECREF(ver);
Guido van Rossumfb221561997-04-29 15:38:09 +0000888}