blob: ed00b5c18b1c7a69670ddb06d7dffb5ddeaa13f4 [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
Mark Hammondae8c2682001-01-31 10:28:03 +00002/* See http://www.info-zip.org/pub/infozip/zlib/ */
3
4/* *** Notes for Windows Users ***
5 * Download the source distribution as referenced above.
6 * Unpack the distribution such that a "..\..\zlib-1.1.3" directory is created
7 relative to the "pcbuild" directory.
8 * Build this "zlib" project. Via from MSVC magic, the correct zlib makefile will
9 be run, and "..\..\zlib-1.1.3\zlib.lib" will be built before zlib.pyd.
10 *** End of notes for Windows users ***
11*/
12
Guido van Rossumfb221561997-04-29 15:38:09 +000013
Guido van Rossum97b54571997-06-03 22:21:47 +000014#include "Python.h"
15#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +000016
17/* The following parameters are copied from zutil.h, version 0.95 */
18#define DEFLATED 8
19#if MAX_MEM_LEVEL >= 8
20# define DEF_MEM_LEVEL 8
21#else
22# define DEF_MEM_LEVEL MAX_MEM_LEVEL
23#endif
24#define DEF_WBITS MAX_WBITS
25
Guido van Rossumb729a1d1999-04-07 20:23:17 +000026/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
27#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000028#define PyInit_zlib initzlib
29
30staticforward PyTypeObject Comptype;
31staticforward PyTypeObject Decomptype;
32
33static PyObject *ZlibError;
34
35typedef struct
36{
37 PyObject_HEAD
38 z_stream zst;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000039 PyObject *unused_data;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000040 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000041} compobject;
42
Guido van Rossum3c540301997-06-03 22:21:03 +000043static char compressobj__doc__[] =
44"compressobj() -- Return a compressor object.\n"
45"compressobj(level) -- Return a compressor object, using the given compression level.\n"
46;
47
48static char decompressobj__doc__[] =
49"decompressobj() -- Return a decompressor object.\n"
50"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
51;
52
Guido van Rossumfb221561997-04-29 15:38:09 +000053static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000054newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +000055{
56 compobject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000057 self = PyObject_New(compobject, type);
Guido van Rossumfb221561997-04-29 15:38:09 +000058 if (self == NULL)
59 return NULL;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000060 self->is_initialised = 0;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000061 self->unused_data = PyString_FromString("");
Guido van Rossumfb221561997-04-29 15:38:09 +000062 return self;
63}
64
Guido van Rossum3c540301997-06-03 22:21:03 +000065static char compress__doc__[] =
66"compress(string) -- Compress string using the default compression level, "
67"returning a string containing compressed data.\n"
68"compress(string, level) -- Compress string, using the chosen compression "
69"level (from 1 to 9). Return a string containing the compressed data.\n"
70;
71
Guido van Rossumfb221561997-04-29 15:38:09 +000072static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000073PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +000074{
75 PyObject *ReturnVal;
76 Byte *input, *output;
77 int length, level=Z_DEFAULT_COMPRESSION, err;
78 z_stream zst;
79
Guido van Rossum43713e52000-02-29 13:59:29 +000080 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Guido van Rossumfb221561997-04-29 15:38:09 +000081 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000082 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000083 output=(Byte*)malloc(zst.avail_out);
84 if (output==NULL)
85 {
86 PyErr_SetString(PyExc_MemoryError,
87 "Can't allocate memory to compress data");
88 return NULL;
89 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +000090
Jeremy Hylton5bc4abe1998-12-21 17:15:00 +000091 zst.zalloc=(alloc_func)NULL;
Guido van Rossum97b54571997-06-03 22:21:47 +000092 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000093 zst.next_out=(Byte *)output;
94 zst.next_in =(Byte *)input;
95 zst.avail_in=length;
96 err=deflateInit(&zst, level);
97 switch(err)
98 {
99 case(Z_OK):
100 break;
101 case(Z_MEM_ERROR):
102 PyErr_SetString(PyExc_MemoryError,
103 "Out of memory while compressing data");
104 free(output);
105 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000106 case(Z_STREAM_ERROR):
107 PyErr_SetString(ZlibError,
108 "Bad compression level");
109 free(output);
110 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000111 default:
112 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000113 if (zst.msg == Z_NULL)
114 PyErr_Format(ZlibError, "Error %i while compressing data",
115 err);
116 else
117 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
118 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000119 deflateEnd(&zst);
120 free(output);
121 return NULL;
122 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000123 }
124
125 err=deflate(&zst, Z_FINISH);
126 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000127 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000128 case(Z_STREAM_END):
129 break;
130 /* Are there other errors to be trapped here? */
131 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000132 {
133 if (zst.msg == Z_NULL)
134 PyErr_Format(ZlibError, "Error %i while compressing data",
135 err);
136 else
137 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
138 err, zst.msg);
139 deflateEnd(&zst);
140 free(output);
141 return NULL;
142 }
143 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000144 err=deflateEnd(&zst);
145 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000146 {
147 if (zst.msg == Z_NULL)
148 PyErr_Format(ZlibError, "Error %i while finishing compression",
149 err);
150 else
151 PyErr_Format(ZlibError,
152 "Error %i while finishing compression: %.200s",
153 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000154 free(output);
155 return NULL;
156 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000157 ReturnVal=PyString_FromStringAndSize((char *)output, zst.total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000158 free(output);
159 return ReturnVal;
160}
161
Guido van Rossum3c540301997-06-03 22:21:03 +0000162static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000163"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
164"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
165"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 +0000166;
167
Guido van Rossumfb221561997-04-29 15:38:09 +0000168static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000169PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000170{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000171 PyObject *result_str;
172 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000173 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000174 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000175 z_stream zst;
Guido van Rossum43713e52000-02-29 13:59:29 +0000176 if (!PyArg_ParseTuple(args, "s#|ii:decompress", &input, &length, &wsize, &r_strlen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000177 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000178
179 if (r_strlen <= 0)
180 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000181
Guido van Rossumfb221561997-04-29 15:38:09 +0000182 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000183 zst.avail_out=r_strlen;
184 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
185 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000186 PyErr_SetString(PyExc_MemoryError,
187 "Can't allocate memory to decompress data");
188 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000189 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000190 zst.zalloc=(alloc_func)NULL;
191 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000192 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000193 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000194 err=inflateInit2(&zst, wsize);
Guido van Rossumfb221561997-04-29 15:38:09 +0000195 switch(err)
196 {
197 case(Z_OK):
198 break;
199 case(Z_MEM_ERROR):
200 PyErr_SetString(PyExc_MemoryError,
201 "Out of memory while decompressing data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000202 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000203 return NULL;
204 default:
205 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000206 if (zst.msg == Z_NULL)
207 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
208 err);
209 else
210 PyErr_Format(ZlibError,
211 "Error %i while preparing to decompress data: %.200s",
212 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000213 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000214 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000215 return NULL;
216 }
217 }
218 do
219 {
220 err=inflate(&zst, Z_FINISH);
221 switch(err)
222 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000223 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000224 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000225 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000226 /*
227 * If there is at least 1 byte of room according to zst.avail_out
228 * and we get this error, assume that it means zlib cannot
229 * process the inflate call() due to an error in the data.
230 */
231 if (zst.avail_out > 0)
232 {
233 PyErr_Format(ZlibError, "Error %i while decompressing data",
234 err);
235 inflateEnd(&zst);
236 Py_DECREF(result_str);
237 return NULL;
238 }
239 /* fall through */
240 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000241 /* need more memory */
242 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000243 {
244 PyErr_SetString(PyExc_MemoryError,
245 "Out of memory while decompressing data");
246 inflateEnd(&zst);
247 return NULL;
248 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000249 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000250 zst.avail_out=r_strlen;
251 r_strlen = r_strlen << 1;
252 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000253 default:
254 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000255 if (zst.msg == Z_NULL)
256 PyErr_Format(ZlibError, "Error %i while decompressing data",
257 err);
258 else
259 PyErr_Format(ZlibError,
260 "Error %i while decompressing data: %.200s",
261 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000262 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000263 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000264 return NULL;
265 }
266 }
267 } while(err!=Z_STREAM_END);
268
269 err=inflateEnd(&zst);
270 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000271 {
272 if (zst.msg == Z_NULL)
273 PyErr_Format(ZlibError,
274 "Error %i while finishing data decompression",
275 err);
276 else
277 PyErr_Format(ZlibError,
278 "Error %i while finishing data decompression: %.200s",
279 err, zst.msg);
280 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000281 return NULL;
282 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000283 _PyString_Resize(&result_str, zst.total_out);
284 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000285}
286
287static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000288PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000289{
290 compobject *self;
291 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
292 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000293
Guido van Rossum43713e52000-02-29 13:59:29 +0000294 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000295 &memLevel, &strategy))
296 return NULL;
297
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000298 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000299 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000300 self->zst.zalloc = (alloc_func)NULL;
301 self->zst.zfree = (free_func)Z_NULL;
302 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000303 switch(err)
304 {
305 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000306 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000307 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000308 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000309 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000310 PyErr_SetString(PyExc_MemoryError,
311 "Can't allocate memory for compression object");
312 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000313 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000314 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000315 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000316 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000317 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000318 default:
319 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000320 if (self->zst.msg == Z_NULL)
321 PyErr_Format(ZlibError,
322 "Error %i while creating compression object",
323 err);
324 else
325 PyErr_Format(ZlibError,
326 "Error %i while creating compression object: %.200s",
327 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000328 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000329 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000330 }
331 }
332}
333
334static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000335PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000336{
337 int wbits=DEF_WBITS, err;
338 compobject *self;
Guido van Rossum43713e52000-02-29 13:59:29 +0000339 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
Guido van Rossumfb221561997-04-29 15:38:09 +0000340 {
341 return NULL;
342 }
343 self=newcompobject(&Decomptype);
344 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000345 self->zst.zalloc=(alloc_func)NULL;
346 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000347 err=inflateInit2(&self->zst, wbits);
348 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000349 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000350 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000351 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000352 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000353 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000354 Py_DECREF(self);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000355 PyErr_SetString(PyExc_ValueError,
356 "Invalid initialization option");
357 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000358 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000359 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000360 PyErr_SetString(PyExc_MemoryError,
361 "Can't allocate memory for decompression object");
362 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000363 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000364 {
365 if (self->zst.msg == Z_NULL)
366 PyErr_Format(ZlibError,
367 "Error %i while creating decompression object",
368 err);
369 else
370 PyErr_Format(ZlibError,
371 "Error %i while creating decompression object: %.200s",
372 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000373 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000374 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000375 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000376 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000377}
378
379static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000380Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000381{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000382 if (self->is_initialised)
383 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000384 Py_XDECREF(self->unused_data);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000385 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000386}
387
388static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000389Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000390{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000391 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000392 Py_XDECREF(self->unused_data);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000393 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000394}
395
Guido van Rossum3c540301997-06-03 22:21:03 +0000396static char comp_compress__doc__[] =
397"compress(data) -- Return a string containing a compressed version of the data.\n\n"
398"After calling this function, some of the input data may still\n"
399"be stored in internal buffers for later processing.\n"
400"Call the flush() method to clear these buffers."
401;
402
403
Guido van Rossumfb221561997-04-29 15:38:09 +0000404static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000405PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000406{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000407 int err = Z_OK, inplen;
408 int length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000409 PyObject *RetVal;
410 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000411 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000412
Guido van Rossum43713e52000-02-29 13:59:29 +0000413 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000414 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000415 self->zst.avail_in = inplen;
416 self->zst.next_in = input;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000417 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
418 PyErr_SetString(PyExc_MemoryError,
419 "Can't allocate memory to compress data");
420 return NULL;
421 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000422 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000423 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000424 self->zst.avail_out = length;
425 while (self->zst.avail_in != 0 && err == Z_OK)
426 {
427 err = deflate(&(self->zst), Z_NO_FLUSH);
428 if (self->zst.avail_out <= 0) {
429 if (_PyString_Resize(&RetVal, length << 1) == -1) {
430 PyErr_SetString(PyExc_MemoryError,
431 "Can't allocate memory to compress data");
432 return NULL;
433 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000434 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000435 self->zst.avail_out = length;
436 length = length << 1;
437 }
438 }
439 if (err != Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000440 {
441 if (self->zst.msg == Z_NULL)
442 PyErr_Format(ZlibError, "Error %i while compressing",
443 err);
444 else
445 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
446 err, self->zst.msg);
447 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000448 return NULL;
449 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000450 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000451 return RetVal;
452}
453
Guido van Rossum3c540301997-06-03 22:21:03 +0000454static char decomp_decompress__doc__[] =
455"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
456"After calling this function, some of the input data may still\n"
457"be stored in internal buffers for later processing.\n"
458"Call the flush() method to clear these buffers."
459;
460
Guido van Rossumfb221561997-04-29 15:38:09 +0000461static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000462PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000463{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000464 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000465 PyObject *RetVal;
466 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000467 unsigned long start_total_out;
468
Guido van Rossum43713e52000-02-29 13:59:29 +0000469 if (!PyArg_ParseTuple(args, "s#:decompress", &input, &inplen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000470 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000471 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000472 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000473 self->zst.avail_in = inplen;
474 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000475 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000476 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000477 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000478
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000479 while (self->zst.avail_in != 0 && err == Z_OK)
480 {
481 err = inflate(&(self->zst), Z_NO_FLUSH);
482 if (err == Z_OK && self->zst.avail_out <= 0)
483 {
484 if (_PyString_Resize(&RetVal, length << 1) == -1)
485 {
486 PyErr_SetString(PyExc_MemoryError,
487 "Can't allocate memory to compress data");
488 return NULL;
489 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000490 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000491 self->zst.avail_out = length;
492 length = length << 1;
493 }
494 }
495
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000496 if (err != Z_OK && err != Z_STREAM_END)
497 {
498 if (self->zst.msg == Z_NULL)
499 PyErr_Format(ZlibError, "Error %i while decompressing",
500 err);
501 else
502 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
503 err, self->zst.msg);
504 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000505 return NULL;
506 }
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000507
508 if (err == Z_STREAM_END)
509 {
510 /* The end of the compressed data has been reached, so set
511 the unused_data attribute to a string containing the
512 remainder of the data in the string. */
513 int pos = self->zst.next_in - input; /* Position in the string */
514 Py_XDECREF(self->unused_data); /* Free the original, empty string */
515
Guido van Rossumaee9bb21999-04-12 14:35:48 +0000516 self->unused_data = PyString_FromStringAndSize((char *)input+pos,
517 inplen-pos);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000518 if (self->unused_data == NULL) return NULL;
519 }
520
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000521 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000522 return RetVal;
523}
524
Guido van Rossum3c540301997-06-03 22:21:03 +0000525static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000526"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
527"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
528"default value used when mode is not specified is Z_FINISH.\n"
529"If mode == Z_FINISH, the compressor object can no longer be used after\n"
530"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000531;
532
Guido van Rossumfb221561997-04-29 15:38:09 +0000533static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000534PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000535{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000536 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000537 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000538 int flushmode = Z_FINISH;
539 unsigned long start_total_out;
540
Guido van Rossum43713e52000-02-29 13:59:29 +0000541 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000542 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000543
544 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
545 doing any work at all; just return an empty string. */
546 if (flushmode == Z_NO_FLUSH)
547 {
548 return PyString_FromStringAndSize(NULL, 0);
549 }
550
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000551 self->zst.avail_in = 0;
552 self->zst.next_in = Z_NULL;
553 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
554 PyErr_SetString(PyExc_MemoryError,
555 "Can't allocate memory to compress data");
556 return NULL;
557 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000558 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000559 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000560 self->zst.avail_out = length;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000561
562 /* When flushing the zstream, there's no input data.
563 If zst.avail_out == 0, that means that more output space is
564 needed to complete the flush operation. */
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000565 while (1) {
566 err = deflate(&(self->zst), flushmode);
567
568 /* If the output is Z_OK, and there's still room in the output
569 buffer, then the flush is complete. */
570 if ( (err == Z_OK) && self->zst.avail_out > 0) break;
571
572 /* A nonzero return indicates some sort of error (but see
573 the comment for the error handler below) */
574 if ( err != Z_OK ) break;
575
576 /* There's no space left for output, so increase the buffer and loop
577 again */
578 if (_PyString_Resize(&RetVal, length << 1) == -1) {
579 PyErr_SetString(PyExc_MemoryError,
580 "Can't allocate memory to compress data");
581 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000582 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000583 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
584 self->zst.avail_out = length;
585 length = length << 1;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000586 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000587
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000588 /* Raise an exception indicating an error. The condition for
589 detecting a error is kind of complicated; Z_OK indicates no
590 error, but if the flushmode is Z_FINISH, then Z_STREAM_END is
591 also not an error. */
592 if (err!=Z_OK && !(flushmode == Z_FINISH && err == Z_STREAM_END) )
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000593 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000594 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000595 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000596 err);
597 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000598 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000599 err, self->zst.msg);
600 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000601 return NULL;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000602 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000603
604 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to
605 free various data structures */
606
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000607 if (flushmode == Z_FINISH) {
608 err=deflateEnd(&(self->zst));
609 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000610 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000611 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
612 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000613 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000614 PyErr_Format(ZlibError,
615 "Error %i from deflateEnd(): %.200s",
616 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000617 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000618 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000619 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000620 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000621 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000622 return RetVal;
623}
624
Guido van Rossum3c540301997-06-03 22:21:03 +0000625static char decomp_flush__doc__[] =
626"flush() -- Return a string containing any remaining decompressed data. "
627"The decompressor object can no longer be used after this call."
628;
629
Guido van Rossumfb221561997-04-29 15:38:09 +0000630static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000631PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000632{
633 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000634 PyObject *RetVal;
635
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000636 if (!PyArg_ParseTuple(args, ""))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000637 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000638 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
639 {
640 PyErr_SetString(PyExc_MemoryError,
641 "Can't allocate memory to decompress data");
642 return NULL;
643 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000644 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000645 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000646 length = self->zst.avail_out = DEFAULTALLOC;
647
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000648 /* I suspect that Z_BUF_ERROR is the only error code we need to check for
649 in the following loop, but will leave the Z_OK in for now to avoid
650 destabilizing this function. --amk */
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000651 err = Z_OK;
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000652 while ( err == Z_OK )
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000653 {
654 err = inflate(&(self->zst), Z_FINISH);
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000655 if ( ( err == Z_OK || err == Z_BUF_ERROR ) && self->zst.avail_out == 0)
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000656 {
657 if (_PyString_Resize(&RetVal, length << 1) == -1)
658 {
659 PyErr_SetString(PyExc_MemoryError,
660 "Can't allocate memory to decompress data");
661 return NULL;
662 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000663 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000664 self->zst.avail_out = length;
665 length = length << 1;
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000666 err = Z_OK;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000667 }
668 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000669 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000670 {
671 if (self->zst.msg == Z_NULL)
672 PyErr_Format(ZlibError, "Error %i while decompressing",
673 err);
674 else
675 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
676 err, self->zst.msg);
677 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000678 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000679 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000680 err=inflateEnd(&(self->zst));
681 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000682 {
683 if (self->zst.msg == Z_NULL)
684 PyErr_Format(ZlibError,
685 "Error %i while flushing decompression object",
686 err);
687 else
688 PyErr_Format(ZlibError,
689 "Error %i while flushing decompression object: %.200s",
690 err, self->zst.msg);
691 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000692 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000693 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000694 _PyString_Resize(&RetVal,
695 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000696 return RetVal;
697}
698
699static PyMethodDef comp_methods[] =
700{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000701 {"compress", (binaryfunc)PyZlib_objcompress,
702 METH_VARARGS, comp_compress__doc__},
703 {"flush", (binaryfunc)PyZlib_flush,
704 METH_VARARGS, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000705 {NULL, NULL}
706};
707
708static PyMethodDef Decomp_methods[] =
709{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000710 {"decompress", (binaryfunc)PyZlib_objdecompress,
711 METH_VARARGS, decomp_decompress__doc__},
712 {"flush", (binaryfunc)PyZlib_unflush,
713 METH_VARARGS, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000714 {NULL, NULL}
715};
716
717static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000718Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000719{
720 return Py_FindMethod(comp_methods, (PyObject *)self, name);
721}
722
723static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000724Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000725{
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000726 if (strcmp(name, "unused_data") == 0)
727 {
728 Py_INCREF(self->unused_data);
729 return self->unused_data;
730 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000731 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
732}
733
Guido van Rossum3c540301997-06-03 22:21:03 +0000734static char adler32__doc__[] =
735"adler32(string) -- Compute an Adler-32 checksum of string, using "
736"a default starting value, and returning an integer value.\n"
737"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
738"the starting value provided, and returning an integer value\n"
739;
740
Guido van Rossumfb221561997-04-29 15:38:09 +0000741static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000742PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000743{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000744 uLong adler32val=adler32(0L, Z_NULL, 0);
745 Byte *buf;
746 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000747
Guido van Rossum43713e52000-02-29 13:59:29 +0000748 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000749 {
750 return NULL;
751 }
752 adler32val = adler32(adler32val, buf, len);
753 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000754}
755
Guido van Rossum3c540301997-06-03 22:21:03 +0000756static char crc32__doc__[] =
757"crc32(string) -- Compute a CRC-32 checksum of string, using "
758"a default starting value, and returning an integer value.\n"
759"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
760"the starting value provided, and returning an integer value.\n"
761;
Guido van Rossumfb221561997-04-29 15:38:09 +0000762
763static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000764PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000765{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000766 uLong crc32val=crc32(0L, Z_NULL, 0);
767 Byte *buf;
768 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000769 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000770 {
771 return NULL;
772 }
773 crc32val = crc32(crc32val, buf, len);
774 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000775}
776
777
778static PyMethodDef zlib_methods[] =
779{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000780 {"adler32", (PyCFunction)PyZlib_adler32,
781 METH_VARARGS, adler32__doc__},
782 {"compress", (PyCFunction)PyZlib_compress,
783 METH_VARARGS, compress__doc__},
784 {"compressobj", (PyCFunction)PyZlib_compressobj,
785 METH_VARARGS, compressobj__doc__},
786 {"crc32", (PyCFunction)PyZlib_crc32,
787 METH_VARARGS, crc32__doc__},
788 {"decompress", (PyCFunction)PyZlib_decompress,
789 METH_VARARGS, decompress__doc__},
790 {"decompressobj", (PyCFunction)PyZlib_decompressobj,
791 METH_VARARGS, decompressobj__doc__},
792 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000793};
794
795statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000796 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000797 0,
798 "Compress",
799 sizeof(compobject),
800 0,
801 (destructor)Comp_dealloc, /*tp_dealloc*/
802 0, /*tp_print*/
803 (getattrfunc)Comp_getattr, /*tp_getattr*/
804 0, /*tp_setattr*/
805 0, /*tp_compare*/
806 0, /*tp_repr*/
807 0, /*tp_as_number*/
808 0, /*tp_as_sequence*/
809 0, /*tp_as_mapping*/
810};
811
812statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000813 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000814 0,
815 "Decompress",
816 sizeof(compobject),
817 0,
818 (destructor)Decomp_dealloc, /*tp_dealloc*/
819 0, /*tp_print*/
820 (getattrfunc)Decomp_getattr, /*tp_getattr*/
821 0, /*tp_setattr*/
822 0, /*tp_compare*/
823 0, /*tp_repr*/
824 0, /*tp_as_number*/
825 0, /*tp_as_sequence*/
826 0, /*tp_as_mapping*/
827};
828
829/* The following insint() routine was blatantly ripped off from
830 socketmodule.c */
831
832/* Convenience routine to export an integer value.
833 For simplicity, errors (which are unlikely anyway) are ignored. */
834static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000835insint(PyObject *d, char *name, int value)
Guido van Rossumfb221561997-04-29 15:38:09 +0000836{
837 PyObject *v = PyInt_FromLong((long) value);
838 if (v == NULL) {
839 /* Don't bother reporting this error */
840 PyErr_Clear();
841 }
842 else {
843 PyDict_SetItemString(d, name, v);
844 Py_DECREF(v);
845 }
846}
847
Guido van Rossum3c540301997-06-03 22:21:03 +0000848static char zlib_module_documentation[]=
849"The functions in this module allow compression and decompression "
850"using the zlib library, which is based on GNU zip. \n\n"
851"adler32(string) -- Compute an Adler-32 checksum.\n"
852"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
853"compress(string) -- Compress a string.\n"
854"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
855"compressobj([level]) -- Return a compressor object.\n"
856"crc32(string) -- Compute a CRC-32 checksum.\n"
857"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000858"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000859"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
860"Compressor objects support compress() and flush() methods; decompressor \n"
861"objects support decompress() and flush()."
862;
863
Guido van Rossum3886bb61998-12-04 18:50:17 +0000864DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000865PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000866{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000867 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000868 Comptype.ob_type = &PyType_Type;
869 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000870 m = Py_InitModule4("zlib", zlib_methods,
871 zlib_module_documentation,
872 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000873 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000874 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Fred Drake8972dfd1999-12-22 16:13:54 +0000875 if (ZlibError != NULL)
876 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000877
Guido van Rossumfb221561997-04-29 15:38:09 +0000878 insint(d, "MAX_WBITS", MAX_WBITS);
879 insint(d, "DEFLATED", DEFLATED);
880 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000881 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
882 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
883 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
884 insint(d, "Z_FILTERED", Z_FILTERED);
885 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
886 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000887
888 insint(d, "Z_FINISH", Z_FINISH);
889 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
890 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
891 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
892
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000893 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake8972dfd1999-12-22 16:13:54 +0000894 if (ver != NULL) {
895 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
896 Py_DECREF(ver);
897 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000898}