blob: 93bb99ffc014bd9a8fe69001102d564c375dbff3 [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
2
Guido van Rossum97b54571997-06-03 22:21:47 +00003#include "Python.h"
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +00004#ifdef MS_WIN32
5#define ZLIB_DLL
6#endif
Guido van Rossum97b54571997-06-03 22:21:47 +00007#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +00008
9/* The following parameters are copied from zutil.h, version 0.95 */
10#define DEFLATED 8
11#if MAX_MEM_LEVEL >= 8
12# define DEF_MEM_LEVEL 8
13#else
14# define DEF_MEM_LEVEL MAX_MEM_LEVEL
15#endif
16#define DEF_WBITS MAX_WBITS
17
18/* The output buffer will be increased in chunks of ADDCHUNK bytes. */
Jeremy Hylton41b9f001997-08-13 23:19:55 +000019#define DEFAULTALLOC 16*1024
Guido van Rossumfb221561997-04-29 15:38:09 +000020#define PyInit_zlib initzlib
21
22staticforward PyTypeObject Comptype;
23staticforward PyTypeObject Decomptype;
24
25static PyObject *ZlibError;
26
27typedef struct
28{
29 PyObject_HEAD
30 z_stream zst;
31} compobject;
32
Guido van Rossum3c540301997-06-03 22:21:03 +000033static char compressobj__doc__[] =
34"compressobj() -- Return a compressor object.\n"
35"compressobj(level) -- Return a compressor object, using the given compression level.\n"
36;
37
38static char decompressobj__doc__[] =
39"decompressobj() -- Return a decompressor object.\n"
40"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
41;
42
Guido van Rossumfb221561997-04-29 15:38:09 +000043static compobject *
44newcompobject(type)
45 PyTypeObject *type;
46{
47 compobject *self;
48 self = PyObject_NEW(compobject, type);
49 if (self == NULL)
50 return NULL;
51 return self;
52}
53
Guido van Rossum3c540301997-06-03 22:21:03 +000054static char compress__doc__[] =
55"compress(string) -- Compress string using the default compression level, "
56"returning a string containing compressed data.\n"
57"compress(string, level) -- Compress string, using the chosen compression "
58"level (from 1 to 9). Return a string containing the compressed data.\n"
59;
60
Guido van Rossumfb221561997-04-29 15:38:09 +000061static PyObject *
62PyZlib_compress(self, args)
63 PyObject *self;
64 PyObject *args;
65{
66 PyObject *ReturnVal;
67 Byte *input, *output;
68 int length, level=Z_DEFAULT_COMPRESSION, err;
69 z_stream zst;
70
71 if (!PyArg_ParseTuple(args, "s#|i", &input, &length, &level))
72 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000073 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000074 output=(Byte*)malloc(zst.avail_out);
75 if (output==NULL)
76 {
77 PyErr_SetString(PyExc_MemoryError,
78 "Can't allocate memory to compress data");
79 return NULL;
80 }
Guido van Rossum97b54571997-06-03 22:21:47 +000081 zst.zalloc=(alloc_func)NULL;
82 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000083 zst.next_out=(Byte *)output;
84 zst.next_in =(Byte *)input;
85 zst.avail_in=length;
86 err=deflateInit(&zst, level);
87 switch(err)
88 {
89 case(Z_OK):
90 break;
91 case(Z_MEM_ERROR):
92 PyErr_SetString(PyExc_MemoryError,
93 "Out of memory while compressing data");
94 free(output);
95 return NULL;
96 break;
97 case(Z_STREAM_ERROR):
98 PyErr_SetString(ZlibError,
99 "Bad compression level");
100 free(output);
101 return NULL;
102 break;
103 default:
104 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000105 if (zst.msg == Z_NULL)
106 PyErr_Format(ZlibError, "Error %i while compressing data",
107 err);
108 else
109 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
110 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000111 deflateEnd(&zst);
112 free(output);
113 return NULL;
114 }
115 break;
116 }
117
118 err=deflate(&zst, Z_FINISH);
119 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000120 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000121 case(Z_STREAM_END):
122 break;
123 /* Are there other errors to be trapped here? */
124 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000125 {
126 if (zst.msg == Z_NULL)
127 PyErr_Format(ZlibError, "Error %i while compressing data",
128 err);
129 else
130 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
131 err, zst.msg);
132 deflateEnd(&zst);
133 free(output);
134 return NULL;
135 }
136 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000137 err=deflateEnd(&zst);
138 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000139 {
140 if (zst.msg == Z_NULL)
141 PyErr_Format(ZlibError, "Error %i while finishing compression",
142 err);
143 else
144 PyErr_Format(ZlibError,
145 "Error %i while finishing compression: %.200s",
146 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000147 free(output);
148 return NULL;
149 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000150 ReturnVal=PyString_FromStringAndSize((char *)output, zst.total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000151 free(output);
152 return ReturnVal;
153}
154
Guido van Rossum3c540301997-06-03 22:21:03 +0000155static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000156"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
157"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
158"decompress(string, wbits, bufsize) -- Decompress the data in string with a window buffer size of wbits and an initial output buffer size of bufsize.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000159;
160
Guido van Rossumfb221561997-04-29 15:38:09 +0000161static PyObject *
162PyZlib_decompress(self, args)
163 PyObject *self;
164 PyObject *args;
165{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000166 PyObject *result_str;
167 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000168 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000169 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000170 z_stream zst;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000171 if (!PyArg_ParseTuple(args, "s#|ii", &input, &length, &wsize, &r_strlen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000172 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000173
174 if (r_strlen <= 0)
175 r_strlen = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000176
177 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000178 zst.avail_out=r_strlen;
179 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
180 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000181 PyErr_SetString(PyExc_MemoryError,
182 "Can't allocate memory to decompress data");
183 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000184 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000185 zst.zalloc=(alloc_func)NULL;
186 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000187 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000188 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000189 err=inflateInit2(&zst, wsize);
Guido van Rossumfb221561997-04-29 15:38:09 +0000190 switch(err)
191 {
192 case(Z_OK):
193 break;
194 case(Z_MEM_ERROR):
195 PyErr_SetString(PyExc_MemoryError,
196 "Out of memory while decompressing data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000197 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000198 return NULL;
199 default:
200 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000201 if (zst.msg == Z_NULL)
202 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
203 err);
204 else
205 PyErr_Format(ZlibError,
206 "Error %i while preparing to decompress data: %.200s",
207 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000208 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000209 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000210 return NULL;
211 }
212 }
213 do
214 {
215 err=inflate(&zst, Z_FINISH);
216 switch(err)
217 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000218 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000219 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000220 case(Z_BUF_ERROR):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000221 case(Z_OK):
222 /* need more memory */
223 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000224 {
225 PyErr_SetString(PyExc_MemoryError,
226 "Out of memory while decompressing data");
227 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000228 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000229 return NULL;
230 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000231 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000232 zst.avail_out=r_strlen;
233 r_strlen = r_strlen << 1;
234 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000235 default:
236 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000237 if (zst.msg == Z_NULL)
238 PyErr_Format(ZlibError, "Error %i while decompressing data",
239 err);
240 else
241 PyErr_Format(ZlibError,
242 "Error %i while decompressing data: %.200s",
243 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000244 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000245 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000246 return NULL;
247 }
248 }
249 } while(err!=Z_STREAM_END);
250
251 err=inflateEnd(&zst);
252 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000253 {
254 if (zst.msg == Z_NULL)
255 PyErr_Format(ZlibError,
256 "Error %i while finishing data decompression",
257 err);
258 else
259 PyErr_Format(ZlibError,
260 "Error %i while finishing data decompression: %.200s",
261 err, zst.msg);
262 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000263 return NULL;
264 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000265 _PyString_Resize(&result_str, zst.total_out);
266 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000267}
268
269static PyObject *
270PyZlib_compressobj(selfptr, args)
271 PyObject *selfptr;
272 PyObject *args;
273{
274 compobject *self;
275 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
276 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000277
278 if (!PyArg_ParseTuple(args, "|iiiii", &level, &method, &wbits,
279 &memLevel, &strategy))
280 return NULL;
281
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000282 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000283 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000284 self->zst.zalloc = (alloc_func)NULL;
285 self->zst.zfree = (free_func)Z_NULL;
286 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000287 switch(err)
288 {
289 case (Z_OK):
290 return (PyObject*)self;
291 break;
292 case (Z_MEM_ERROR):
293 PyErr_SetString(PyExc_MemoryError,
294 "Can't allocate memory for compression object");
295 return NULL;
296 break;
297 case(Z_STREAM_ERROR):
298 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000299 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000300 return NULL;
301 break;
302 default:
303 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000304 if (self->zst.msg == Z_NULL)
305 PyErr_Format(ZlibError,
306 "Error %i while creating compression object",
307 err);
308 else
309 PyErr_Format(ZlibError,
310 "Error %i while creating compression object: %.200s",
311 err, self->zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000312 return NULL;
313 break;
314 }
315 }
316}
317
318static PyObject *
319PyZlib_decompressobj(selfptr, args)
320 PyObject *selfptr;
321 PyObject *args;
322{
323 int wbits=DEF_WBITS, err;
324 compobject *self;
325 if (!PyArg_ParseTuple(args, "|i", &wbits))
326 {
327 return NULL;
328 }
329 self=newcompobject(&Decomptype);
330 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000331 self->zst.zalloc=(alloc_func)NULL;
332 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000333 err=inflateInit2(&self->zst, wbits);
334 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000335 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000336 case (Z_OK):
337 return (PyObject*)self;
338 break;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000339 case(Z_STREAM_ERROR):
340 PyErr_SetString(PyExc_ValueError,
341 "Invalid initialization option");
342 return NULL;
343 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000344 case (Z_MEM_ERROR):
345 PyErr_SetString(PyExc_MemoryError,
346 "Can't allocate memory for decompression object");
347 return NULL;
348 break;
349 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000350 {
351 if (self->zst.msg == Z_NULL)
352 PyErr_Format(ZlibError,
353 "Error %i while creating decompression object",
354 err);
355 else
356 PyErr_Format(ZlibError,
357 "Error %i while creating decompression object: %.200s",
358 err, self->zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000359 return NULL;
360 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000361 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000362 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000363}
364
365static void
366Comp_dealloc(self)
367 compobject *self;
368{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000369 deflateEnd(&self->zst);
370 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000371}
372
373static void
374Decomp_dealloc(self)
375 compobject *self;
376{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000377 inflateEnd(&self->zst);
378 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000379}
380
Guido van Rossum3c540301997-06-03 22:21:03 +0000381static char comp_compress__doc__[] =
382"compress(data) -- Return a string containing a compressed version of the data.\n\n"
383"After calling this function, some of the input data may still\n"
384"be stored in internal buffers for later processing.\n"
385"Call the flush() method to clear these buffers."
386;
387
388
Guido van Rossumfb221561997-04-29 15:38:09 +0000389static PyObject *
390PyZlib_objcompress(self, args)
391 compobject *self;
392 PyObject *args;
393{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000394 int err = Z_OK, inplen;
395 int length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000396 PyObject *RetVal;
397 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000398 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000399
400 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000401 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000402 self->zst.avail_in = inplen;
403 self->zst.next_in = input;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000404 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
405 PyErr_SetString(PyExc_MemoryError,
406 "Can't allocate memory to compress data");
407 return NULL;
408 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000409 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000410 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000411 self->zst.avail_out = length;
412 while (self->zst.avail_in != 0 && err == Z_OK)
413 {
414 err = deflate(&(self->zst), Z_NO_FLUSH);
415 if (self->zst.avail_out <= 0) {
416 if (_PyString_Resize(&RetVal, length << 1) == -1) {
417 PyErr_SetString(PyExc_MemoryError,
418 "Can't allocate memory to compress data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000419 Py_DECREF(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000420 return NULL;
421 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000422 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000423 self->zst.avail_out = length;
424 length = length << 1;
425 }
426 }
427 if (err != Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000428 {
429 if (self->zst.msg == Z_NULL)
430 PyErr_Format(ZlibError, "Error %i while compressing",
431 err);
432 else
433 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
434 err, self->zst.msg);
435 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000436 return NULL;
437 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000438 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000439 return RetVal;
440}
441
Guido van Rossum3c540301997-06-03 22:21:03 +0000442static char decomp_decompress__doc__[] =
443"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
444"After calling this function, some of the input data may still\n"
445"be stored in internal buffers for later processing.\n"
446"Call the flush() method to clear these buffers."
447;
448
Guido van Rossumfb221561997-04-29 15:38:09 +0000449static PyObject *
450PyZlib_objdecompress(self, args)
451 compobject *self;
452 PyObject *args;
453{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000454 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000455 PyObject *RetVal;
456 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000457 unsigned long start_total_out;
458
Guido van Rossumfb221561997-04-29 15:38:09 +0000459 if (!PyArg_ParseTuple(args, "s#", &input, &inplen))
460 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000461 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000462 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000463 self->zst.avail_in = inplen;
464 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000465 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000466 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000467 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000468
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000469 while (self->zst.avail_in != 0 && err == Z_OK)
470 {
471 err = inflate(&(self->zst), Z_NO_FLUSH);
472 if (err == Z_OK && self->zst.avail_out <= 0)
473 {
474 if (_PyString_Resize(&RetVal, length << 1) == -1)
475 {
476 PyErr_SetString(PyExc_MemoryError,
477 "Can't allocate memory to compress data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000478 Py_DECREF(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000479 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__[] =
503"flush() -- Return a string containing any remaining compressed data. "
504"The compressor object can no longer be used after this call."
505;
506
Guido van Rossumfb221561997-04-29 15:38:09 +0000507static PyObject *
508PyZlib_flush(self, args)
509 compobject *self;
510 PyObject *args;
511{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000512 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000513 PyObject *RetVal;
514
515 if (!PyArg_NoArgs(args))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000516 return NULL;
517 self->zst.avail_in = 0;
518 self->zst.next_in = Z_NULL;
519 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
520 PyErr_SetString(PyExc_MemoryError,
521 "Can't allocate memory to compress data");
522 return NULL;
523 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000524 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000525 self->zst.avail_out = length;
526 while (err == Z_OK)
527 {
528 err = deflate(&(self->zst), Z_FINISH);
529 if (self->zst.avail_out <= 0) {
530 if (_PyString_Resize(&RetVal, length << 1) == -1) {
531 PyErr_SetString(PyExc_MemoryError,
532 "Can't allocate memory to compress data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000533 Py_DECREF(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000534 return NULL;
535 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000536 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000537 self->zst.avail_out = length;
538 length = length << 1;
539 }
540 }
541 if (err!=Z_STREAM_END) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000542 if (self->zst.msg == Z_NULL)
543 PyErr_Format(ZlibError, "Error %i while compressing",
544 err);
545 else
546 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
547 err, self->zst.msg);
548 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000549 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000550 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000551 err=deflateEnd(&(self->zst));
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000552 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000553 if (self->zst.msg == Z_NULL)
554 PyErr_Format(ZlibError, "Error %i while flushing compression object",
555 err);
556 else
557 PyErr_Format(ZlibError,
558 "Error %i while flushing compression object: %.200s",
559 err, self->zst.msg);
560 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000561 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000562 }
563 _PyString_Resize(&RetVal,
564 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000565 return RetVal;
566}
567
Guido van Rossum3c540301997-06-03 22:21:03 +0000568static char decomp_flush__doc__[] =
569"flush() -- Return a string containing any remaining decompressed data. "
570"The decompressor object can no longer be used after this call."
571;
572
Guido van Rossumfb221561997-04-29 15:38:09 +0000573static PyObject *
574PyZlib_unflush(self, args)
575 compobject *self;
576 PyObject *args;
577{
578 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000579 PyObject *RetVal;
580
581 if (!PyArg_NoArgs(args))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000582 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000583 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
584 {
585 PyErr_SetString(PyExc_MemoryError,
586 "Can't allocate memory to decompress data");
587 return NULL;
588 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000589 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000590 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000591 length = self->zst.avail_out = DEFAULTALLOC;
592
593 err = Z_OK;
594 while (err == Z_OK)
595 {
596 err = inflate(&(self->zst), Z_FINISH);
597 if (err == Z_OK && self->zst.avail_out == 0)
598 {
599 if (_PyString_Resize(&RetVal, length << 1) == -1)
600 {
601 PyErr_SetString(PyExc_MemoryError,
602 "Can't allocate memory to decompress data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000603 Py_DECREF(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000604 return NULL;
605 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000606 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000607 self->zst.avail_out = length;
608 length = length << 1;
609 }
610 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000611 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000612 {
613 if (self->zst.msg == Z_NULL)
614 PyErr_Format(ZlibError, "Error %i while decompressing",
615 err);
616 else
617 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
618 err, self->zst.msg);
619 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000620 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000621 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000622 err=inflateEnd(&(self->zst));
623 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000624 {
625 if (self->zst.msg == Z_NULL)
626 PyErr_Format(ZlibError,
627 "Error %i while flushing decompression object",
628 err);
629 else
630 PyErr_Format(ZlibError,
631 "Error %i while flushing decompression object: %.200s",
632 err, self->zst.msg);
633 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000634 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000635 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000636 _PyString_Resize(&RetVal,
637 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000638 return RetVal;
639}
640
641static PyMethodDef comp_methods[] =
642{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000643 {"compress", (binaryfunc)PyZlib_objcompress, 1, comp_compress__doc__},
644 {"flush", (binaryfunc)PyZlib_flush, 0, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000645 {NULL, NULL}
646};
647
648static PyMethodDef Decomp_methods[] =
649{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000650 {"decompress", (binaryfunc)PyZlib_objdecompress, 1, decomp_decompress__doc__},
651 {"flush", (binaryfunc)PyZlib_unflush, 0, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000652 {NULL, NULL}
653};
654
655static PyObject *
656Comp_getattr(self, name)
657 compobject *self;
658 char *name;
659{
660 return Py_FindMethod(comp_methods, (PyObject *)self, name);
661}
662
663static PyObject *
664Decomp_getattr(self, name)
665 compobject *self;
666 char *name;
667{
668 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
669}
670
Guido van Rossum3c540301997-06-03 22:21:03 +0000671static char adler32__doc__[] =
672"adler32(string) -- Compute an Adler-32 checksum of string, using "
673"a default starting value, and returning an integer value.\n"
674"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
675"the starting value provided, and returning an integer value\n"
676;
677
Guido van Rossumfb221561997-04-29 15:38:09 +0000678static PyObject *
679PyZlib_adler32(self, args)
680 PyObject *self, *args;
681{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000682 uLong adler32val=adler32(0L, Z_NULL, 0);
683 Byte *buf;
684 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000685
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000686 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &adler32val))
687 {
688 return NULL;
689 }
690 adler32val = adler32(adler32val, buf, len);
691 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000692}
693
Guido van Rossum3c540301997-06-03 22:21:03 +0000694static char crc32__doc__[] =
695"crc32(string) -- Compute a CRC-32 checksum of string, using "
696"a default starting value, and returning an integer value.\n"
697"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
698"the starting value provided, and returning an integer value.\n"
699;
Guido van Rossumfb221561997-04-29 15:38:09 +0000700
701static PyObject *
702PyZlib_crc32(self, args)
703 PyObject *self, *args;
704{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000705 uLong crc32val=crc32(0L, Z_NULL, 0);
706 Byte *buf;
707 int len;
708 if (!PyArg_ParseTuple(args, "s#|l", &buf, &len, &crc32val))
709 {
710 return NULL;
711 }
712 crc32val = crc32(crc32val, buf, len);
713 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000714}
715
716
717static PyMethodDef zlib_methods[] =
718{
Guido van Rossum3c540301997-06-03 22:21:03 +0000719 {"adler32", (PyCFunction)PyZlib_adler32, 1, adler32__doc__},
720 {"compress", (PyCFunction)PyZlib_compress, 1, compress__doc__},
721 {"compressobj", (PyCFunction)PyZlib_compressobj, 1, compressobj__doc__},
722 {"crc32", (PyCFunction)PyZlib_crc32, 1, crc32__doc__},
723 {"decompress", (PyCFunction)PyZlib_decompress, 1, decompress__doc__},
724 {"decompressobj", (PyCFunction)PyZlib_decompressobj, 1, decompressobj__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000725 {NULL, NULL}
726};
727
728statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000729 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000730 0,
731 "Compress",
732 sizeof(compobject),
733 0,
734 (destructor)Comp_dealloc, /*tp_dealloc*/
735 0, /*tp_print*/
736 (getattrfunc)Comp_getattr, /*tp_getattr*/
737 0, /*tp_setattr*/
738 0, /*tp_compare*/
739 0, /*tp_repr*/
740 0, /*tp_as_number*/
741 0, /*tp_as_sequence*/
742 0, /*tp_as_mapping*/
743};
744
745statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000746 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000747 0,
748 "Decompress",
749 sizeof(compobject),
750 0,
751 (destructor)Decomp_dealloc, /*tp_dealloc*/
752 0, /*tp_print*/
753 (getattrfunc)Decomp_getattr, /*tp_getattr*/
754 0, /*tp_setattr*/
755 0, /*tp_compare*/
756 0, /*tp_repr*/
757 0, /*tp_as_number*/
758 0, /*tp_as_sequence*/
759 0, /*tp_as_mapping*/
760};
761
762/* The following insint() routine was blatantly ripped off from
763 socketmodule.c */
764
765/* Convenience routine to export an integer value.
766 For simplicity, errors (which are unlikely anyway) are ignored. */
767static void
768insint(d, name, value)
769 PyObject *d;
770 char *name;
771 int value;
772{
773 PyObject *v = PyInt_FromLong((long) value);
774 if (v == NULL) {
775 /* Don't bother reporting this error */
776 PyErr_Clear();
777 }
778 else {
779 PyDict_SetItemString(d, name, v);
780 Py_DECREF(v);
781 }
782}
783
Guido van Rossum3c540301997-06-03 22:21:03 +0000784static char zlib_module_documentation[]=
785"The functions in this module allow compression and decompression "
786"using the zlib library, which is based on GNU zip. \n\n"
787"adler32(string) -- Compute an Adler-32 checksum.\n"
788"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
789"compress(string) -- Compress a string.\n"
790"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
791"compressobj([level]) -- Return a compressor object.\n"
792"crc32(string) -- Compute a CRC-32 checksum.\n"
793"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000794"decompress(string,[wbites],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000795"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
796"Compressor objects support compress() and flush() methods; decompressor \n"
797"objects support decompress() and flush()."
798;
799
Guido van Rossumfb221561997-04-29 15:38:09 +0000800void
801PyInit_zlib()
802{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000803 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000804 Comptype.ob_type = &PyType_Type;
805 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000806 m = Py_InitModule4("zlib", zlib_methods,
807 zlib_module_documentation,
808 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000809 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000810 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Guido van Rossumfb221561997-04-29 15:38:09 +0000811 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000812
Guido van Rossumfb221561997-04-29 15:38:09 +0000813 insint(d, "MAX_WBITS", MAX_WBITS);
814 insint(d, "DEFLATED", DEFLATED);
815 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000816 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
817 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
818 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
819 insint(d, "Z_FILTERED", Z_FILTERED);
820 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
821 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
822 ver = PyString_FromString(ZLIB_VERSION);
823 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
Guido van Rossumfb221561997-04-29 15:38:09 +0000824}