blob: 5569de6282c56aceb2290da3297c4e55f335315c [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
Guido van Rossum821a5e41998-05-08 14:56:29 +00002/* See http://www.cdrom.com/pub/infozip/zlib/ */
3/* See http://www.winimage.com/zLibDll for Windows */
Guido van Rossumfb221561997-04-29 15:38:09 +00004
Guido van Rossum97b54571997-06-03 22:21:47 +00005#include "Python.h"
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +00006#ifdef MS_WIN32
7#define ZLIB_DLL
8#endif
Guido van Rossum97b54571997-06-03 22:21:47 +00009#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +000010
11/* The following parameters are copied from zutil.h, version 0.95 */
12#define DEFLATED 8
13#if MAX_MEM_LEVEL >= 8
14# define DEF_MEM_LEVEL 8
15#else
16# define DEF_MEM_LEVEL MAX_MEM_LEVEL
17#endif
18#define DEF_WBITS MAX_WBITS
19
20/* The output buffer will be increased in chunks of ADDCHUNK bytes. */
Jeremy Hylton41b9f001997-08-13 23:19:55 +000021#define DEFAULTALLOC 16*1024
Guido van Rossumfb221561997-04-29 15:38:09 +000022#define PyInit_zlib initzlib
23
24staticforward PyTypeObject Comptype;
25staticforward PyTypeObject Decomptype;
26
27static PyObject *ZlibError;
28
29typedef struct
30{
31 PyObject_HEAD
32 z_stream zst;
33} compobject;
34
Guido van Rossum3c540301997-06-03 22:21:03 +000035static char compressobj__doc__[] =
36"compressobj() -- Return a compressor object.\n"
37"compressobj(level) -- Return a compressor object, using the given compression level.\n"
38;
39
40static char decompressobj__doc__[] =
41"decompressobj() -- Return a decompressor object.\n"
42"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
43;
44
Guido van Rossumfb221561997-04-29 15:38:09 +000045static compobject *
46newcompobject(type)
47 PyTypeObject *type;
48{
49 compobject *self;
50 self = PyObject_NEW(compobject, type);
51 if (self == NULL)
52 return NULL;
53 return self;
54}
55
Guido van Rossum3c540301997-06-03 22:21:03 +000056static char compress__doc__[] =
57"compress(string) -- Compress string using the default compression level, "
58"returning a string containing compressed data.\n"
59"compress(string, level) -- Compress string, using the chosen compression "
60"level (from 1 to 9). Return a string containing the compressed data.\n"
61;
62
Guido van Rossumfb221561997-04-29 15:38:09 +000063static PyObject *
64PyZlib_compress(self, args)
65 PyObject *self;
66 PyObject *args;
67{
68 PyObject *ReturnVal;
69 Byte *input, *output;
70 int length, level=Z_DEFAULT_COMPRESSION, err;
71 z_stream zst;
72
73 if (!PyArg_ParseTuple(args, "s#|i", &input, &length, &level))
74 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000075 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000076 output=(Byte*)malloc(zst.avail_out);
77 if (output==NULL)
78 {
79 PyErr_SetString(PyExc_MemoryError,
80 "Can't allocate memory to compress data");
81 return NULL;
82 }
Guido van Rossum97b54571997-06-03 22:21:47 +000083 zst.zalloc=(alloc_func)NULL;
84 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000085 zst.next_out=(Byte *)output;
86 zst.next_in =(Byte *)input;
87 zst.avail_in=length;
88 err=deflateInit(&zst, level);
89 switch(err)
90 {
91 case(Z_OK):
92 break;
93 case(Z_MEM_ERROR):
94 PyErr_SetString(PyExc_MemoryError,
95 "Out of memory while compressing data");
96 free(output);
97 return NULL;
98 break;
99 case(Z_STREAM_ERROR):
100 PyErr_SetString(ZlibError,
101 "Bad compression level");
102 free(output);
103 return NULL;
104 break;
105 default:
106 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000107 if (zst.msg == Z_NULL)
108 PyErr_Format(ZlibError, "Error %i while compressing data",
109 err);
110 else
111 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
112 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000113 deflateEnd(&zst);
114 free(output);
115 return NULL;
116 }
117 break;
118 }
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;
Guido van Rossumfb221561997-04-29 15:38:09 +0000178
179 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);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000230 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000231 return NULL;
232 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000233 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000234 zst.avail_out=r_strlen;
235 r_strlen = r_strlen << 1;
236 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000237 default:
238 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000239 if (zst.msg == Z_NULL)
240 PyErr_Format(ZlibError, "Error %i while decompressing data",
241 err);
242 else
243 PyErr_Format(ZlibError,
244 "Error %i while decompressing data: %.200s",
245 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000246 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000247 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000248 return NULL;
249 }
250 }
251 } while(err!=Z_STREAM_END);
252
253 err=inflateEnd(&zst);
254 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000255 {
256 if (zst.msg == Z_NULL)
257 PyErr_Format(ZlibError,
258 "Error %i while finishing data decompression",
259 err);
260 else
261 PyErr_Format(ZlibError,
262 "Error %i while finishing data decompression: %.200s",
263 err, zst.msg);
264 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000265 return NULL;
266 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000267 _PyString_Resize(&result_str, zst.total_out);
268 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000269}
270
271static PyObject *
272PyZlib_compressobj(selfptr, args)
273 PyObject *selfptr;
274 PyObject *args;
275{
276 compobject *self;
277 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
278 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000279
280 if (!PyArg_ParseTuple(args, "|iiiii", &level, &method, &wbits,
281 &memLevel, &strategy))
282 return NULL;
283
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000284 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000285 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000286 self->zst.zalloc = (alloc_func)NULL;
287 self->zst.zfree = (free_func)Z_NULL;
288 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000289 switch(err)
290 {
291 case (Z_OK):
292 return (PyObject*)self;
293 break;
294 case (Z_MEM_ERROR):
295 PyErr_SetString(PyExc_MemoryError,
296 "Can't allocate memory for compression object");
297 return NULL;
298 break;
299 case(Z_STREAM_ERROR):
300 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;
303 break;
304 default:
305 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000306 if (self->zst.msg == Z_NULL)
307 PyErr_Format(ZlibError,
308 "Error %i while creating compression object",
309 err);
310 else
311 PyErr_Format(ZlibError,
312 "Error %i while creating compression object: %.200s",
313 err, self->zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000314 return NULL;
315 break;
316 }
317 }
318}
319
320static PyObject *
321PyZlib_decompressobj(selfptr, args)
322 PyObject *selfptr;
323 PyObject *args;
324{
325 int wbits=DEF_WBITS, err;
326 compobject *self;
327 if (!PyArg_ParseTuple(args, "|i", &wbits))
328 {
329 return NULL;
330 }
331 self=newcompobject(&Decomptype);
332 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000333 self->zst.zalloc=(alloc_func)NULL;
334 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000335 err=inflateInit2(&self->zst, wbits);
336 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000337 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000338 case (Z_OK):
339 return (PyObject*)self;
340 break;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000341 case(Z_STREAM_ERROR):
342 PyErr_SetString(PyExc_ValueError,
343 "Invalid initialization option");
344 return NULL;
345 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000346 case (Z_MEM_ERROR):
347 PyErr_SetString(PyExc_MemoryError,
348 "Can't allocate memory for decompression object");
349 return NULL;
350 break;
351 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000352 {
353 if (self->zst.msg == Z_NULL)
354 PyErr_Format(ZlibError,
355 "Error %i while creating decompression object",
356 err);
357 else
358 PyErr_Format(ZlibError,
359 "Error %i while creating decompression object: %.200s",
360 err, self->zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000361 return NULL;
362 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000363 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000364 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000365}
366
367static void
368Comp_dealloc(self)
369 compobject *self;
370{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000371 deflateEnd(&self->zst);
372 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");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000421 Py_DECREF(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000422 return NULL;
423 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000424 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000425 self->zst.avail_out = length;
426 length = length << 1;
427 }
428 }
429 if (err != Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000430 {
431 if (self->zst.msg == Z_NULL)
432 PyErr_Format(ZlibError, "Error %i while compressing",
433 err);
434 else
435 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
436 err, self->zst.msg);
437 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000438 return NULL;
439 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000440 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000441 return RetVal;
442}
443
Guido van Rossum3c540301997-06-03 22:21:03 +0000444static char decomp_decompress__doc__[] =
445"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
446"After calling this function, some of the input data may still\n"
447"be stored in internal buffers for later processing.\n"
448"Call the flush() method to clear these buffers."
449;
450
Guido van Rossumfb221561997-04-29 15:38:09 +0000451static PyObject *
452PyZlib_objdecompress(self, args)
453 compobject *self;
454 PyObject *args;
455{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000456 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000457 PyObject *RetVal;
458 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000459 unsigned long start_total_out;
460
Guido van Rossumfb221561997-04-29 15:38:09 +0000461 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
462 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000463 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000464 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000465 self->zst.avail_in = inplen;
466 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000467 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000468 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000469 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000470
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000471 while (self->zst.avail_in != 0 && err == Z_OK)
472 {
473 err = inflate(&(self->zst), Z_NO_FLUSH);
474 if (err == Z_OK && self->zst.avail_out <= 0)
475 {
476 if (_PyString_Resize(&RetVal, length << 1) == -1)
477 {
478 PyErr_SetString(PyExc_MemoryError,
479 "Can't allocate memory to compress data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000480 Py_DECREF(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000481 return NULL;
482 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000483 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000484 self->zst.avail_out = length;
485 length = length << 1;
486 }
487 }
488
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000489 if (err != Z_OK && err != Z_STREAM_END)
490 {
491 if (self->zst.msg == Z_NULL)
492 PyErr_Format(ZlibError, "Error %i while decompressing",
493 err);
494 else
495 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
496 err, self->zst.msg);
497 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000498 return NULL;
499 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000500 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000501 return RetVal;
502}
503
Guido van Rossum3c540301997-06-03 22:21:03 +0000504static char comp_flush__doc__[] =
505"flush() -- Return a string containing any remaining compressed data. "
506"The compressor object can no longer be used after this call."
507;
508
Guido van Rossumfb221561997-04-29 15:38:09 +0000509static PyObject *
510PyZlib_flush(self, args)
511 compobject *self;
512 PyObject *args;
513{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000514 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000515 PyObject *RetVal;
516
517 if (!PyArg_NoArgs(args))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000518 return NULL;
519 self->zst.avail_in = 0;
520 self->zst.next_in = Z_NULL;
521 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
522 PyErr_SetString(PyExc_MemoryError,
523 "Can't allocate memory to compress data");
524 return NULL;
525 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000526 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000527 self->zst.avail_out = length;
528 while (err == Z_OK)
529 {
530 err = deflate(&(self->zst), Z_FINISH);
531 if (self->zst.avail_out <= 0) {
532 if (_PyString_Resize(&RetVal, length << 1) == -1) {
533 PyErr_SetString(PyExc_MemoryError,
534 "Can't allocate memory to compress data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000535 Py_DECREF(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000536 return NULL;
537 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000538 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000539 self->zst.avail_out = length;
540 length = length << 1;
541 }
542 }
543 if (err!=Z_STREAM_END) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000544 if (self->zst.msg == Z_NULL)
545 PyErr_Format(ZlibError, "Error %i while compressing",
546 err);
547 else
548 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
549 err, self->zst.msg);
550 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000551 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000552 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000553 err=deflateEnd(&(self->zst));
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000554 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000555 if (self->zst.msg == Z_NULL)
556 PyErr_Format(ZlibError, "Error %i while flushing compression object",
557 err);
558 else
559 PyErr_Format(ZlibError,
560 "Error %i while flushing compression object: %.200s",
561 err, self->zst.msg);
562 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000563 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000564 }
565 _PyString_Resize(&RetVal,
566 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000567 return RetVal;
568}
569
Guido van Rossum3c540301997-06-03 22:21:03 +0000570static char decomp_flush__doc__[] =
571"flush() -- Return a string containing any remaining decompressed data. "
572"The decompressor object can no longer be used after this call."
573;
574
Guido van Rossumfb221561997-04-29 15:38:09 +0000575static PyObject *
576PyZlib_unflush(self, args)
577 compobject *self;
578 PyObject *args;
579{
580 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000581 PyObject *RetVal;
582
583 if (!PyArg_NoArgs(args))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000584 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000585 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
586 {
587 PyErr_SetString(PyExc_MemoryError,
588 "Can't allocate memory to decompress data");
589 return NULL;
590 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000591 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000592 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000593 length = self->zst.avail_out = DEFAULTALLOC;
594
595 err = Z_OK;
596 while (err == Z_OK)
597 {
598 err = inflate(&(self->zst), Z_FINISH);
599 if (err == Z_OK && self->zst.avail_out == 0)
600 {
601 if (_PyString_Resize(&RetVal, length << 1) == -1)
602 {
603 PyErr_SetString(PyExc_MemoryError,
604 "Can't allocate memory to decompress data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000605 Py_DECREF(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000606 return NULL;
607 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000608 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000609 self->zst.avail_out = length;
610 length = length << 1;
611 }
612 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000613 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000614 {
615 if (self->zst.msg == Z_NULL)
616 PyErr_Format(ZlibError, "Error %i while decompressing",
617 err);
618 else
619 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
620 err, self->zst.msg);
621 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000622 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000623 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000624 err=inflateEnd(&(self->zst));
625 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000626 {
627 if (self->zst.msg == Z_NULL)
628 PyErr_Format(ZlibError,
629 "Error %i while flushing decompression object",
630 err);
631 else
632 PyErr_Format(ZlibError,
633 "Error %i while flushing decompression object: %.200s",
634 err, self->zst.msg);
635 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000636 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000637 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000638 _PyString_Resize(&RetVal,
639 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000640 return RetVal;
641}
642
643static PyMethodDef comp_methods[] =
644{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000645 {"compress", (binaryfunc)PyZlib_objcompress, 1, comp_compress__doc__},
646 {"flush", (binaryfunc)PyZlib_flush, 0, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000647 {NULL, NULL}
648};
649
650static PyMethodDef Decomp_methods[] =
651{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000652 {"decompress", (binaryfunc)PyZlib_objdecompress, 1, decomp_decompress__doc__},
653 {"flush", (binaryfunc)PyZlib_unflush, 0, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000654 {NULL, NULL}
655};
656
657static PyObject *
658Comp_getattr(self, name)
659 compobject *self;
660 char *name;
661{
662 return Py_FindMethod(comp_methods, (PyObject *)self, name);
663}
664
665static PyObject *
666Decomp_getattr(self, name)
667 compobject *self;
668 char *name;
669{
670 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
671}
672
Guido van Rossum3c540301997-06-03 22:21:03 +0000673static char adler32__doc__[] =
674"adler32(string) -- Compute an Adler-32 checksum of string, using "
675"a default starting value, and returning an integer value.\n"
676"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
677"the starting value provided, and returning an integer value\n"
678;
679
Guido van Rossumfb221561997-04-29 15:38:09 +0000680static PyObject *
681PyZlib_adler32(self, args)
682 PyObject *self, *args;
683{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000684 uLong adler32val=adler32(0L, Z_NULL, 0);
685 Byte *buf;
686 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000687
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000688 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &adler32val))
689 {
690 return NULL;
691 }
692 adler32val = adler32(adler32val, buf, len);
693 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000694}
695
Guido van Rossum3c540301997-06-03 22:21:03 +0000696static char crc32__doc__[] =
697"crc32(string) -- Compute a CRC-32 checksum of string, using "
698"a default starting value, and returning an integer value.\n"
699"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
700"the starting value provided, and returning an integer value.\n"
701;
Guido van Rossumfb221561997-04-29 15:38:09 +0000702
703static PyObject *
704PyZlib_crc32(self, args)
705 PyObject *self, *args;
706{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000707 uLong crc32val=crc32(0L, Z_NULL, 0);
708 Byte *buf;
709 int len;
710 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &crc32val))
711 {
712 return NULL;
713 }
714 crc32val = crc32(crc32val, buf, len);
715 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000716}
717
718
719static PyMethodDef zlib_methods[] =
720{
Guido van Rossum3c540301997-06-03 22:21:03 +0000721 {"adler32", (PyCFunction)PyZlib_adler32, 1, adler32__doc__},
722 {"compress", (PyCFunction)PyZlib_compress, 1, compress__doc__},
723 {"compressobj", (PyCFunction)PyZlib_compressobj, 1, compressobj__doc__},
724 {"crc32", (PyCFunction)PyZlib_crc32, 1, crc32__doc__},
725 {"decompress", (PyCFunction)PyZlib_decompress, 1, decompress__doc__},
726 {"decompressobj", (PyCFunction)PyZlib_decompressobj, 1, decompressobj__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000727 {NULL, NULL}
728};
729
730statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000731 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000732 0,
733 "Compress",
734 sizeof(compobject),
735 0,
736 (destructor)Comp_dealloc, /*tp_dealloc*/
737 0, /*tp_print*/
738 (getattrfunc)Comp_getattr, /*tp_getattr*/
739 0, /*tp_setattr*/
740 0, /*tp_compare*/
741 0, /*tp_repr*/
742 0, /*tp_as_number*/
743 0, /*tp_as_sequence*/
744 0, /*tp_as_mapping*/
745};
746
747statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000748 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000749 0,
750 "Decompress",
751 sizeof(compobject),
752 0,
753 (destructor)Decomp_dealloc, /*tp_dealloc*/
754 0, /*tp_print*/
755 (getattrfunc)Decomp_getattr, /*tp_getattr*/
756 0, /*tp_setattr*/
757 0, /*tp_compare*/
758 0, /*tp_repr*/
759 0, /*tp_as_number*/
760 0, /*tp_as_sequence*/
761 0, /*tp_as_mapping*/
762};
763
764/* The following insint() routine was blatantly ripped off from
765 socketmodule.c */
766
767/* Convenience routine to export an integer value.
768 For simplicity, errors (which are unlikely anyway) are ignored. */
769static void
770insint(d, name, value)
771 PyObject *d;
772 char *name;
773 int value;
774{
775 PyObject *v = PyInt_FromLong((long) value);
776 if (v == NULL) {
777 /* Don't bother reporting this error */
778 PyErr_Clear();
779 }
780 else {
781 PyDict_SetItemString(d, name, v);
782 Py_DECREF(v);
783 }
784}
785
Guido van Rossum3c540301997-06-03 22:21:03 +0000786static char zlib_module_documentation[]=
787"The functions in this module allow compression and decompression "
788"using the zlib library, which is based on GNU zip. \n\n"
789"adler32(string) -- Compute an Adler-32 checksum.\n"
790"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
791"compress(string) -- Compress a string.\n"
792"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
793"compressobj([level]) -- Return a compressor object.\n"
794"crc32(string) -- Compute a CRC-32 checksum.\n"
795"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000796"decompress(string,[wbites],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000797"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
798"Compressor objects support compress() and flush() methods; decompressor \n"
799"objects support decompress() and flush()."
800;
801
Guido van Rossumfb221561997-04-29 15:38:09 +0000802void
803PyInit_zlib()
804{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000805 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000806 Comptype.ob_type = &PyType_Type;
807 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000808 m = Py_InitModule4("zlib", zlib_methods,
809 zlib_module_documentation,
810 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000811 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000812 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Guido van Rossumfb221561997-04-29 15:38:09 +0000813 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000814
Guido van Rossumfb221561997-04-29 15:38:09 +0000815 insint(d, "MAX_WBITS", MAX_WBITS);
816 insint(d, "DEFLATED", DEFLATED);
817 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000818 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
819 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
820 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
821 insint(d, "Z_FILTERED", Z_FILTERED);
822 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
823 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
824 ver = PyString_FromString(ZLIB_VERSION);
825 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
Guido van Rossumfb221561997-04-29 15:38:09 +0000826}