blob: aaecc112264c916190ac2f740149ffa30a6d695f [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
Guido van Rossumb729a1d1999-04-07 20:23:17 +000020/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
21#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000022#define PyInit_zlib initzlib
23
24staticforward PyTypeObject Comptype;
25staticforward PyTypeObject Decomptype;
26
27static PyObject *ZlibError;
28
29typedef struct
30{
31 PyObject_HEAD
32 z_stream zst;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000033 PyObject *unused_data;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000034 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000035} compobject;
36
Guido van Rossum3c540301997-06-03 22:21:03 +000037static char compressobj__doc__[] =
38"compressobj() -- Return a compressor object.\n"
39"compressobj(level) -- Return a compressor object, using the given compression level.\n"
40;
41
42static char decompressobj__doc__[] =
43"decompressobj() -- Return a decompressor object.\n"
44"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
45;
46
Guido van Rossumfb221561997-04-29 15:38:09 +000047static compobject *
48newcompobject(type)
49 PyTypeObject *type;
50{
51 compobject *self;
52 self = PyObject_NEW(compobject, type);
53 if (self == NULL)
54 return NULL;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000055 self->is_initialised = 0;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000056 self->unused_data = PyString_FromString("");
Guido van Rossumfb221561997-04-29 15:38:09 +000057 return self;
58}
59
Guido van Rossum3c540301997-06-03 22:21:03 +000060static char compress__doc__[] =
61"compress(string) -- Compress string using the default compression level, "
62"returning a string containing compressed data.\n"
63"compress(string, level) -- Compress string, using the chosen compression "
64"level (from 1 to 9). Return a string containing the compressed data.\n"
65;
66
Guido van Rossumfb221561997-04-29 15:38:09 +000067static PyObject *
68PyZlib_compress(self, args)
69 PyObject *self;
70 PyObject *args;
71{
72 PyObject *ReturnVal;
73 Byte *input, *output;
74 int length, level=Z_DEFAULT_COMPRESSION, err;
75 z_stream zst;
76
Guido van Rossum43713e52000-02-29 13:59:29 +000077 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Guido van Rossumfb221561997-04-29 15:38:09 +000078 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000079 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000080 output=(Byte*)malloc(zst.avail_out);
81 if (output==NULL)
82 {
83 PyErr_SetString(PyExc_MemoryError,
84 "Can't allocate memory to compress data");
85 return NULL;
86 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +000087
Jeremy Hylton5bc4abe1998-12-21 17:15:00 +000088 zst.zalloc=(alloc_func)NULL;
Guido van Rossum97b54571997-06-03 22:21:47 +000089 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000090 zst.next_out=(Byte *)output;
91 zst.next_in =(Byte *)input;
92 zst.avail_in=length;
93 err=deflateInit(&zst, level);
94 switch(err)
95 {
96 case(Z_OK):
97 break;
98 case(Z_MEM_ERROR):
99 PyErr_SetString(PyExc_MemoryError,
100 "Out of memory while compressing data");
101 free(output);
102 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000103 case(Z_STREAM_ERROR):
104 PyErr_SetString(ZlibError,
105 "Bad compression level");
106 free(output);
107 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000108 default:
109 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000110 if (zst.msg == Z_NULL)
111 PyErr_Format(ZlibError, "Error %i while compressing data",
112 err);
113 else
114 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
115 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000116 deflateEnd(&zst);
117 free(output);
118 return NULL;
119 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000120 }
121
122 err=deflate(&zst, Z_FINISH);
123 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000124 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000125 case(Z_STREAM_END):
126 break;
127 /* Are there other errors to be trapped here? */
128 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000129 {
130 if (zst.msg == Z_NULL)
131 PyErr_Format(ZlibError, "Error %i while compressing data",
132 err);
133 else
134 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
135 err, zst.msg);
136 deflateEnd(&zst);
137 free(output);
138 return NULL;
139 }
140 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000141 err=deflateEnd(&zst);
142 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000143 {
144 if (zst.msg == Z_NULL)
145 PyErr_Format(ZlibError, "Error %i while finishing compression",
146 err);
147 else
148 PyErr_Format(ZlibError,
149 "Error %i while finishing compression: %.200s",
150 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000151 free(output);
152 return NULL;
153 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000154 ReturnVal=PyString_FromStringAndSize((char *)output, zst.total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000155 free(output);
156 return ReturnVal;
157}
158
Guido van Rossum3c540301997-06-03 22:21:03 +0000159static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000160"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
161"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
162"decompress(string, wbits, bufsize) -- Decompress the data in string with a window buffer size of wbits and an initial output buffer size of bufsize.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000163;
164
Guido van Rossumfb221561997-04-29 15:38:09 +0000165static PyObject *
166PyZlib_decompress(self, args)
167 PyObject *self;
168 PyObject *args;
169{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000170 PyObject *result_str;
171 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000172 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000173 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000174 z_stream zst;
Guido van Rossum43713e52000-02-29 13:59:29 +0000175 if (!PyArg_ParseTuple(args, "s#|ii:decompress", &input, &length, &wsize, &r_strlen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000176 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000177
178 if (r_strlen <= 0)
179 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000180
Guido van Rossumfb221561997-04-29 15:38:09 +0000181 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000182 zst.avail_out=r_strlen;
183 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
184 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000185 PyErr_SetString(PyExc_MemoryError,
186 "Can't allocate memory to decompress data");
187 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000188 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000189 zst.zalloc=(alloc_func)NULL;
190 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000191 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000192 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000193 err=inflateInit2(&zst, wsize);
Guido van Rossumfb221561997-04-29 15:38:09 +0000194 switch(err)
195 {
196 case(Z_OK):
197 break;
198 case(Z_MEM_ERROR):
199 PyErr_SetString(PyExc_MemoryError,
200 "Out of memory while decompressing data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000201 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000202 return NULL;
203 default:
204 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000205 if (zst.msg == Z_NULL)
206 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
207 err);
208 else
209 PyErr_Format(ZlibError,
210 "Error %i while preparing to decompress data: %.200s",
211 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000212 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000213 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000214 return NULL;
215 }
216 }
217 do
218 {
219 err=inflate(&zst, Z_FINISH);
220 switch(err)
221 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000222 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000223 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000224 case(Z_BUF_ERROR):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000225 case(Z_OK):
226 /* need more memory */
227 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000228 {
229 PyErr_SetString(PyExc_MemoryError,
230 "Out of memory while decompressing data");
231 inflateEnd(&zst);
232 return NULL;
233 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000234 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000235 zst.avail_out=r_strlen;
236 r_strlen = r_strlen << 1;
237 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000238 default:
239 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000240 if (zst.msg == Z_NULL)
241 PyErr_Format(ZlibError, "Error %i while decompressing data",
242 err);
243 else
244 PyErr_Format(ZlibError,
245 "Error %i while decompressing data: %.200s",
246 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000247 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000248 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000249 return NULL;
250 }
251 }
252 } while(err!=Z_STREAM_END);
253
254 err=inflateEnd(&zst);
255 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000256 {
257 if (zst.msg == Z_NULL)
258 PyErr_Format(ZlibError,
259 "Error %i while finishing data decompression",
260 err);
261 else
262 PyErr_Format(ZlibError,
263 "Error %i while finishing data decompression: %.200s",
264 err, zst.msg);
265 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000266 return NULL;
267 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000268 _PyString_Resize(&result_str, zst.total_out);
269 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000270}
271
272static PyObject *
273PyZlib_compressobj(selfptr, args)
274 PyObject *selfptr;
275 PyObject *args;
276{
277 compobject *self;
278 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
279 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000280
Guido van Rossum43713e52000-02-29 13:59:29 +0000281 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000282 &memLevel, &strategy))
283 return NULL;
284
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000285 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000286 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000287 self->zst.zalloc = (alloc_func)NULL;
288 self->zst.zfree = (free_func)Z_NULL;
289 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000290 switch(err)
291 {
292 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000293 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000294 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000295 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000296 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000297 PyErr_SetString(PyExc_MemoryError,
298 "Can't allocate memory for compression object");
299 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000300 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000301 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000302 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000303 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000304 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000305 default:
306 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000307 if (self->zst.msg == Z_NULL)
308 PyErr_Format(ZlibError,
309 "Error %i while creating compression object",
310 err);
311 else
312 PyErr_Format(ZlibError,
313 "Error %i while creating compression object: %.200s",
314 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000315 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000316 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000317 }
318 }
319}
320
321static PyObject *
322PyZlib_decompressobj(selfptr, args)
323 PyObject *selfptr;
324 PyObject *args;
325{
326 int wbits=DEF_WBITS, err;
327 compobject *self;
Guido van Rossum43713e52000-02-29 13:59:29 +0000328 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
Guido van Rossumfb221561997-04-29 15:38:09 +0000329 {
330 return NULL;
331 }
332 self=newcompobject(&Decomptype);
333 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000334 self->zst.zalloc=(alloc_func)NULL;
335 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000336 err=inflateInit2(&self->zst, wbits);
337 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000338 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000339 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000340 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000341 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000342 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000343 Py_DECREF(self);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000344 PyErr_SetString(PyExc_ValueError,
345 "Invalid initialization option");
346 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000347 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000348 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000349 PyErr_SetString(PyExc_MemoryError,
350 "Can't allocate memory for decompression object");
351 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000352 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000353 {
354 if (self->zst.msg == Z_NULL)
355 PyErr_Format(ZlibError,
356 "Error %i while creating decompression object",
357 err);
358 else
359 PyErr_Format(ZlibError,
360 "Error %i while creating decompression object: %.200s",
361 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000362 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000363 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000364 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000365 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000366}
367
368static void
369Comp_dealloc(self)
370 compobject *self;
371{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000372 if (self->is_initialised)
373 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000374 Py_XDECREF(self->unused_data);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000375 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000376}
377
378static void
379Decomp_dealloc(self)
380 compobject *self;
381{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000382 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000383 Py_XDECREF(self->unused_data);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000384 PyMem_DEL(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000385}
386
Guido van Rossum3c540301997-06-03 22:21:03 +0000387static char comp_compress__doc__[] =
388"compress(data) -- Return a string containing a compressed version of the data.\n\n"
389"After calling this function, some of the input data may still\n"
390"be stored in internal buffers for later processing.\n"
391"Call the flush() method to clear these buffers."
392;
393
394
Guido van Rossumfb221561997-04-29 15:38:09 +0000395static PyObject *
396PyZlib_objcompress(self, args)
397 compobject *self;
398 PyObject *args;
399{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000400 int err = Z_OK, inplen;
401 int length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000402 PyObject *RetVal;
403 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000404 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000405
Guido van Rossum43713e52000-02-29 13:59:29 +0000406 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000407 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000408 self->zst.avail_in = inplen;
409 self->zst.next_in = input;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000410 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
411 PyErr_SetString(PyExc_MemoryError,
412 "Can't allocate memory to compress data");
413 return NULL;
414 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000415 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000416 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000417 self->zst.avail_out = length;
418 while (self->zst.avail_in != 0 && err == Z_OK)
419 {
420 err = deflate(&(self->zst), Z_NO_FLUSH);
421 if (self->zst.avail_out <= 0) {
422 if (_PyString_Resize(&RetVal, length << 1) == -1) {
423 PyErr_SetString(PyExc_MemoryError,
424 "Can't allocate memory to compress data");
425 return NULL;
426 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000427 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000428 self->zst.avail_out = length;
429 length = length << 1;
430 }
431 }
432 if (err != Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000433 {
434 if (self->zst.msg == Z_NULL)
435 PyErr_Format(ZlibError, "Error %i while compressing",
436 err);
437 else
438 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
439 err, self->zst.msg);
440 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000441 return NULL;
442 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000443 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000444 return RetVal;
445}
446
Guido van Rossum3c540301997-06-03 22:21:03 +0000447static char decomp_decompress__doc__[] =
448"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
449"After calling this function, some of the input data may still\n"
450"be stored in internal buffers for later processing.\n"
451"Call the flush() method to clear these buffers."
452;
453
Guido van Rossumfb221561997-04-29 15:38:09 +0000454static PyObject *
455PyZlib_objdecompress(self, args)
456 compobject *self;
457 PyObject *args;
458{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000459 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000460 PyObject *RetVal;
461 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000462 unsigned long start_total_out;
463
Guido van Rossum43713e52000-02-29 13:59:29 +0000464 if (!PyArg_ParseTuple(args, "s#:decompress", &input, &inplen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000465 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000466 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000467 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000468 self->zst.avail_in = inplen;
469 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000470 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000471 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000472 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000473
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000474 while (self->zst.avail_in != 0 && err == Z_OK)
475 {
476 err = inflate(&(self->zst), Z_NO_FLUSH);
477 if (err == Z_OK && self->zst.avail_out <= 0)
478 {
479 if (_PyString_Resize(&RetVal, length << 1) == -1)
480 {
481 PyErr_SetString(PyExc_MemoryError,
482 "Can't allocate memory to compress data");
483 return NULL;
484 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000485 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000486 self->zst.avail_out = length;
487 length = length << 1;
488 }
489 }
490
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000491 if (err != Z_OK && err != Z_STREAM_END)
492 {
493 if (self->zst.msg == Z_NULL)
494 PyErr_Format(ZlibError, "Error %i while decompressing",
495 err);
496 else
497 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
498 err, self->zst.msg);
499 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000500 return NULL;
501 }
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000502
503 if (err == Z_STREAM_END)
504 {
505 /* The end of the compressed data has been reached, so set
506 the unused_data attribute to a string containing the
507 remainder of the data in the string. */
508 int pos = self->zst.next_in - input; /* Position in the string */
509 Py_XDECREF(self->unused_data); /* Free the original, empty string */
510
Guido van Rossumaee9bb21999-04-12 14:35:48 +0000511 self->unused_data = PyString_FromStringAndSize((char *)input+pos,
512 inplen-pos);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000513 if (self->unused_data == NULL) return NULL;
514 }
515
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000516 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000517 return RetVal;
518}
519
Guido van Rossum3c540301997-06-03 22:21:03 +0000520static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000521"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
522"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
523"default value used when mode is not specified is Z_FINISH.\n"
524"If mode == Z_FINISH, the compressor object can no longer be used after\n"
525"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000526;
527
Guido van Rossumfb221561997-04-29 15:38:09 +0000528static PyObject *
529PyZlib_flush(self, args)
530 compobject *self;
531 PyObject *args;
532{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000533 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000534 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000535 int flushmode = Z_FINISH;
536 unsigned long start_total_out;
537
Guido van Rossum43713e52000-02-29 13:59:29 +0000538 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000539 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000540
541 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
542 doing any work at all; just return an empty string. */
543 if (flushmode == Z_NO_FLUSH)
544 {
545 return PyString_FromStringAndSize(NULL, 0);
546 }
547
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000548 self->zst.avail_in = 0;
549 self->zst.next_in = Z_NULL;
550 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
551 PyErr_SetString(PyExc_MemoryError,
552 "Can't allocate memory to compress data");
553 return NULL;
554 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000555 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000556 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000557 self->zst.avail_out = length;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000558
559 /* When flushing the zstream, there's no input data.
560 If zst.avail_out == 0, that means that more output space is
561 needed to complete the flush operation. */
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000562 while (1) {
563 err = deflate(&(self->zst), flushmode);
564
565 /* If the output is Z_OK, and there's still room in the output
566 buffer, then the flush is complete. */
567 if ( (err == Z_OK) && self->zst.avail_out > 0) break;
568
569 /* A nonzero return indicates some sort of error (but see
570 the comment for the error handler below) */
571 if ( err != Z_OK ) break;
572
573 /* There's no space left for output, so increase the buffer and loop
574 again */
575 if (_PyString_Resize(&RetVal, length << 1) == -1) {
576 PyErr_SetString(PyExc_MemoryError,
577 "Can't allocate memory to compress data");
578 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000579 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000580 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
581 self->zst.avail_out = length;
582 length = length << 1;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000583 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000584
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000585 /* Raise an exception indicating an error. The condition for
586 detecting a error is kind of complicated; Z_OK indicates no
587 error, but if the flushmode is Z_FINISH, then Z_STREAM_END is
588 also not an error. */
589 if (err!=Z_OK && !(flushmode == Z_FINISH && err == Z_STREAM_END) )
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000590 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000591 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000592 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000593 err);
594 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000595 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000596 err, self->zst.msg);
597 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000598 return NULL;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000599 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000600
601 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to
602 free various data structures */
603
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000604 if (flushmode == Z_FINISH) {
605 err=deflateEnd(&(self->zst));
606 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000607 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000608 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
609 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000610 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000611 PyErr_Format(ZlibError,
612 "Error %i from deflateEnd(): %.200s",
613 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000614 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000615 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000616 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000617 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000618 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000619 return RetVal;
620}
621
Guido van Rossum3c540301997-06-03 22:21:03 +0000622static char decomp_flush__doc__[] =
623"flush() -- Return a string containing any remaining decompressed data. "
624"The decompressor object can no longer be used after this call."
625;
626
Guido van Rossumfb221561997-04-29 15:38:09 +0000627static PyObject *
628PyZlib_unflush(self, args)
629 compobject *self;
630 PyObject *args;
631{
632 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000633 PyObject *RetVal;
634
635 if (!PyArg_NoArgs(args))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000636 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000637 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
638 {
639 PyErr_SetString(PyExc_MemoryError,
640 "Can't allocate memory to decompress data");
641 return NULL;
642 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000643 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000644 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000645 length = self->zst.avail_out = DEFAULTALLOC;
646
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000647 /* I suspect that Z_BUF_ERROR is the only error code we need to check for
648 in the following loop, but will leave the Z_OK in for now to avoid
649 destabilizing this function. --amk */
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000650 err = Z_OK;
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000651 while ( err == Z_OK )
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000652 {
653 err = inflate(&(self->zst), Z_FINISH);
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000654 if ( ( err == Z_OK || err == Z_BUF_ERROR ) && self->zst.avail_out == 0)
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000655 {
656 if (_PyString_Resize(&RetVal, length << 1) == -1)
657 {
658 PyErr_SetString(PyExc_MemoryError,
659 "Can't allocate memory to decompress data");
660 return NULL;
661 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000662 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000663 self->zst.avail_out = length;
664 length = length << 1;
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000665 err = Z_OK;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000666 }
667 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000668 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000669 {
670 if (self->zst.msg == Z_NULL)
671 PyErr_Format(ZlibError, "Error %i while decompressing",
672 err);
673 else
674 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
675 err, self->zst.msg);
676 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000677 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000678 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000679 err=inflateEnd(&(self->zst));
680 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000681 {
682 if (self->zst.msg == Z_NULL)
683 PyErr_Format(ZlibError,
684 "Error %i while flushing decompression object",
685 err);
686 else
687 PyErr_Format(ZlibError,
688 "Error %i while flushing decompression object: %.200s",
689 err, self->zst.msg);
690 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000691 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000692 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000693 _PyString_Resize(&RetVal,
694 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000695 return RetVal;
696}
697
698static PyMethodDef comp_methods[] =
699{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000700 {"compress", (binaryfunc)PyZlib_objcompress, 1, comp_compress__doc__},
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000701 {"flush", (binaryfunc)PyZlib_flush, 1, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000702 {NULL, NULL}
703};
704
705static PyMethodDef Decomp_methods[] =
706{
Guido van Rossumc1f08821997-08-28 21:21:22 +0000707 {"decompress", (binaryfunc)PyZlib_objdecompress, 1, decomp_decompress__doc__},
708 {"flush", (binaryfunc)PyZlib_unflush, 0, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000709 {NULL, NULL}
710};
711
712static PyObject *
713Comp_getattr(self, name)
714 compobject *self;
715 char *name;
716{
717 return Py_FindMethod(comp_methods, (PyObject *)self, name);
718}
719
720static PyObject *
721Decomp_getattr(self, name)
722 compobject *self;
723 char *name;
724{
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000725 if (strcmp(name, "unused_data") == 0)
726 {
727 Py_INCREF(self->unused_data);
728 return self->unused_data;
729 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000730 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
731}
732
Guido van Rossum3c540301997-06-03 22:21:03 +0000733static char adler32__doc__[] =
734"adler32(string) -- Compute an Adler-32 checksum of string, using "
735"a default starting value, and returning an integer value.\n"
736"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
737"the starting value provided, and returning an integer value\n"
738;
739
Guido van Rossumfb221561997-04-29 15:38:09 +0000740static PyObject *
741PyZlib_adler32(self, args)
742 PyObject *self, *args;
743{
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 *
764PyZlib_crc32(self, args)
765 PyObject *self, *args;
766{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000767 uLong crc32val=crc32(0L, Z_NULL, 0);
768 Byte *buf;
769 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000770 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000771 {
772 return NULL;
773 }
774 crc32val = crc32(crc32val, buf, len);
775 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000776}
777
778
779static PyMethodDef zlib_methods[] =
780{
Guido van Rossum3c540301997-06-03 22:21:03 +0000781 {"adler32", (PyCFunction)PyZlib_adler32, 1, adler32__doc__},
782 {"compress", (PyCFunction)PyZlib_compress, 1, compress__doc__},
783 {"compressobj", (PyCFunction)PyZlib_compressobj, 1, compressobj__doc__},
784 {"crc32", (PyCFunction)PyZlib_crc32, 1, crc32__doc__},
785 {"decompress", (PyCFunction)PyZlib_decompress, 1, decompress__doc__},
786 {"decompressobj", (PyCFunction)PyZlib_decompressobj, 1, decompressobj__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000787 {NULL, NULL}
788};
789
790statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000791 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000792 0,
793 "Compress",
794 sizeof(compobject),
795 0,
796 (destructor)Comp_dealloc, /*tp_dealloc*/
797 0, /*tp_print*/
798 (getattrfunc)Comp_getattr, /*tp_getattr*/
799 0, /*tp_setattr*/
800 0, /*tp_compare*/
801 0, /*tp_repr*/
802 0, /*tp_as_number*/
803 0, /*tp_as_sequence*/
804 0, /*tp_as_mapping*/
805};
806
807statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000808 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000809 0,
810 "Decompress",
811 sizeof(compobject),
812 0,
813 (destructor)Decomp_dealloc, /*tp_dealloc*/
814 0, /*tp_print*/
815 (getattrfunc)Decomp_getattr, /*tp_getattr*/
816 0, /*tp_setattr*/
817 0, /*tp_compare*/
818 0, /*tp_repr*/
819 0, /*tp_as_number*/
820 0, /*tp_as_sequence*/
821 0, /*tp_as_mapping*/
822};
823
824/* The following insint() routine was blatantly ripped off from
825 socketmodule.c */
826
827/* Convenience routine to export an integer value.
828 For simplicity, errors (which are unlikely anyway) are ignored. */
829static void
830insint(d, name, value)
831 PyObject *d;
832 char *name;
833 int value;
834{
835 PyObject *v = PyInt_FromLong((long) value);
836 if (v == NULL) {
837 /* Don't bother reporting this error */
838 PyErr_Clear();
839 }
840 else {
841 PyDict_SetItemString(d, name, v);
842 Py_DECREF(v);
843 }
844}
845
Guido van Rossum3c540301997-06-03 22:21:03 +0000846static char zlib_module_documentation[]=
847"The functions in this module allow compression and decompression "
848"using the zlib library, which is based on GNU zip. \n\n"
849"adler32(string) -- Compute an Adler-32 checksum.\n"
850"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
851"compress(string) -- Compress a string.\n"
852"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
853"compressobj([level]) -- Return a compressor object.\n"
854"crc32(string) -- Compute a CRC-32 checksum.\n"
855"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000856"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000857"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
858"Compressor objects support compress() and flush() methods; decompressor \n"
859"objects support decompress() and flush()."
860;
861
Guido van Rossum3886bb61998-12-04 18:50:17 +0000862DL_EXPORT(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000863PyInit_zlib()
864{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000865 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000866 Comptype.ob_type = &PyType_Type;
867 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000868 m = Py_InitModule4("zlib", zlib_methods,
869 zlib_module_documentation,
870 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000871 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000872 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Fred Drake8972dfd1999-12-22 16:13:54 +0000873 if (ZlibError != NULL)
874 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000875
Guido van Rossumfb221561997-04-29 15:38:09 +0000876 insint(d, "MAX_WBITS", MAX_WBITS);
877 insint(d, "DEFLATED", DEFLATED);
878 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000879 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
880 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
881 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
882 insint(d, "Z_FILTERED", Z_FILTERED);
883 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
884 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000885
886 insint(d, "Z_FINISH", Z_FINISH);
887 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
888 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
889 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
890
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000891 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake8972dfd1999-12-22 16:13:54 +0000892 if (ver != NULL) {
893 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
894 Py_DECREF(ver);
895 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000896}