blob: 81a9cd449775ea8e735e4cd17408c796ca56e37a [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. */
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000544 while (err == Z_OK) {
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000545 err = deflate(&(self->zst), Z_FINISH);
546 if (self->zst.avail_out <= 0) {
547 if (_PyString_Resize(&RetVal, length << 1) == -1) {
548 PyErr_SetString(PyExc_MemoryError,
549 "Can't allocate memory to compress data");
550 return NULL;
551 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000552 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000553 self->zst.avail_out = length;
554 length = length << 1;
555 }
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000556 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000557
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000558 if (err != Z_STREAM_END)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000559 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000560 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000561 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000562 err);
563 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000564 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000565 err, self->zst.msg);
566 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000567 return NULL;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000568 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000569 if (flushmode == Z_FINISH) {
570 err=deflateEnd(&(self->zst));
571 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000572 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000573 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
574 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000575 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000576 PyErr_Format(ZlibError,
577 "Error %i from deflateEnd(): %.200s",
578 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000579 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000580 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000581 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000582 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000583 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000584 return RetVal;
585}
586
Guido van Rossum3c540301997-06-03 22:21:03 +0000587static char decomp_flush__doc__[] =
588"flush() -- Return a string containing any remaining decompressed data. "
589"The decompressor object can no longer be used after this call."
590;
591
Guido van Rossumfb221561997-04-29 15:38:09 +0000592static PyObject *
593PyZlib_unflush(self, args)
594 compobject *self;
595 PyObject *args;
596{
597 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000598 PyObject *RetVal;
599
600 if (!PyArg_NoArgs(args))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000601 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000602 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
603 {
604 PyErr_SetString(PyExc_MemoryError,
605 "Can't allocate memory to decompress data");
606 return NULL;
607 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000608 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000609 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000610 length = self->zst.avail_out = DEFAULTALLOC;
611
612 err = Z_OK;
613 while (err == Z_OK)
614 {
615 err = inflate(&(self->zst), Z_FINISH);
616 if (err == Z_OK && self->zst.avail_out == 0)
617 {
618 if (_PyString_Resize(&RetVal, length << 1) == -1)
619 {
620 PyErr_SetString(PyExc_MemoryError,
621 "Can't allocate memory to decompress data");
622 return NULL;
623 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000624 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000625 self->zst.avail_out = length;
626 length = length << 1;
627 }
628 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000629 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000630 {
631 if (self->zst.msg == Z_NULL)
632 PyErr_Format(ZlibError, "Error %i while decompressing",
633 err);
634 else
635 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
636 err, self->zst.msg);
637 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000638 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000639 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000640 err=inflateEnd(&(self->zst));
641 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000642 {
643 if (self->zst.msg == Z_NULL)
644 PyErr_Format(ZlibError,
645 "Error %i while flushing decompression object",
646 err);
647 else
648 PyErr_Format(ZlibError,
649 "Error %i while flushing decompression object: %.200s",
650 err, self->zst.msg);
651 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000652 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000653 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000654 _PyString_Resize(&RetVal,
655 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000656 return RetVal;
657}
658
659static PyMethodDef comp_methods[] =
660{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000661 {"compress", (binaryfunc)PyZlib_objcompress, 1, comp_compress__doc__},
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000662 {"flush", (binaryfunc)PyZlib_flush, 1, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000663 {NULL, NULL}
664};
665
666static PyMethodDef Decomp_methods[] =
667{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000668 {"decompress", (binaryfunc)PyZlib_objdecompress, 1, decomp_decompress__doc__},
669 {"flush", (binaryfunc)PyZlib_unflush, 0, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000670 {NULL, NULL}
671};
672
673static PyObject *
674Comp_getattr(self, name)
675 compobject *self;
676 char *name;
677{
678 return Py_FindMethod(comp_methods, (PyObject *)self, name);
679}
680
681static PyObject *
682Decomp_getattr(self, name)
683 compobject *self;
684 char *name;
685{
686 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
687}
688
Guido van Rossum3c540301997-06-03 22:21:03 +0000689static char adler32__doc__[] =
690"adler32(string) -- Compute an Adler-32 checksum of string, using "
691"a default starting value, and returning an integer value.\n"
692"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
693"the starting value provided, and returning an integer value\n"
694;
695
Guido van Rossumfb221561997-04-29 15:38:09 +0000696static PyObject *
697PyZlib_adler32(self, args)
698 PyObject *self, *args;
699{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000700 uLong adler32val=adler32(0L, Z_NULL, 0);
701 Byte *buf;
702 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000703
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000704 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &adler32val))
705 {
706 return NULL;
707 }
708 adler32val = adler32(adler32val, buf, len);
709 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000710}
711
Guido van Rossum3c540301997-06-03 22:21:03 +0000712static char crc32__doc__[] =
713"crc32(string) -- Compute a CRC-32 checksum of string, using "
714"a default starting value, and returning an integer value.\n"
715"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
716"the starting value provided, and returning an integer value.\n"
717;
Guido van Rossumfb221561997-04-29 15:38:09 +0000718
719static PyObject *
720PyZlib_crc32(self, args)
721 PyObject *self, *args;
722{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000723 uLong crc32val=crc32(0L, Z_NULL, 0);
724 Byte *buf;
725 int len;
726 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &crc32val))
727 {
728 return NULL;
729 }
730 crc32val = crc32(crc32val, buf, len);
731 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000732}
733
734
735static PyMethodDef zlib_methods[] =
736{
Guido van Rossum3c540301997-06-03 22:21:03 +0000737 {"adler32", (PyCFunction)PyZlib_adler32, 1, adler32__doc__},
738 {"compress", (PyCFunction)PyZlib_compress, 1, compress__doc__},
739 {"compressobj", (PyCFunction)PyZlib_compressobj, 1, compressobj__doc__},
740 {"crc32", (PyCFunction)PyZlib_crc32, 1, crc32__doc__},
741 {"decompress", (PyCFunction)PyZlib_decompress, 1, decompress__doc__},
742 {"decompressobj", (PyCFunction)PyZlib_decompressobj, 1, decompressobj__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000743 {NULL, NULL}
744};
745
746statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000747 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000748 0,
749 "Compress",
750 sizeof(compobject),
751 0,
752 (destructor)Comp_dealloc, /*tp_dealloc*/
753 0, /*tp_print*/
754 (getattrfunc)Comp_getattr, /*tp_getattr*/
755 0, /*tp_setattr*/
756 0, /*tp_compare*/
757 0, /*tp_repr*/
758 0, /*tp_as_number*/
759 0, /*tp_as_sequence*/
760 0, /*tp_as_mapping*/
761};
762
763statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000764 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000765 0,
766 "Decompress",
767 sizeof(compobject),
768 0,
769 (destructor)Decomp_dealloc, /*tp_dealloc*/
770 0, /*tp_print*/
771 (getattrfunc)Decomp_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
780/* The following insint() routine was blatantly ripped off from
781 socketmodule.c */
782
783/* Convenience routine to export an integer value.
784 For simplicity, errors (which are unlikely anyway) are ignored. */
785static void
786insint(d, name, value)
787 PyObject *d;
788 char *name;
789 int value;
790{
791 PyObject *v = PyInt_FromLong((long) value);
792 if (v == NULL) {
793 /* Don't bother reporting this error */
794 PyErr_Clear();
795 }
796 else {
797 PyDict_SetItemString(d, name, v);
798 Py_DECREF(v);
799 }
800}
801
Guido van Rossum3c540301997-06-03 22:21:03 +0000802static char zlib_module_documentation[]=
803"The functions in this module allow compression and decompression "
804"using the zlib library, which is based on GNU zip. \n\n"
805"adler32(string) -- Compute an Adler-32 checksum.\n"
806"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
807"compress(string) -- Compress a string.\n"
808"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
809"compressobj([level]) -- Return a compressor object.\n"
810"crc32(string) -- Compute a CRC-32 checksum.\n"
811"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000812"decompress(string,[wbites],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000813"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
814"Compressor objects support compress() and flush() methods; decompressor \n"
815"objects support decompress() and flush()."
816;
817
Guido van Rossum3886bb61998-12-04 18:50:17 +0000818DL_EXPORT(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000819PyInit_zlib()
820{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000821 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000822 Comptype.ob_type = &PyType_Type;
823 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000824 m = Py_InitModule4("zlib", zlib_methods,
825 zlib_module_documentation,
826 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000827 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000828 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Guido van Rossumfb221561997-04-29 15:38:09 +0000829 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000830
Guido van Rossumfb221561997-04-29 15:38:09 +0000831 insint(d, "MAX_WBITS", MAX_WBITS);
832 insint(d, "DEFLATED", DEFLATED);
833 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000834 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
835 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
836 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
837 insint(d, "Z_FILTERED", Z_FILTERED);
838 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
839 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000840
841 insint(d, "Z_FINISH", Z_FINISH);
842 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
843 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
844 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
845
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000846 ver = PyString_FromString(ZLIB_VERSION);
847 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
Barry Warsaw30aa1e71999-01-28 19:40:05 +0000848 Py_DECREF(ver);
Guido van Rossumfb221561997-04-29 15:38:09 +0000849}