blob: fbb8ecea37344d207eee6e9ae6925b3b8a74c715 [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
Tim Petersee826f82001-01-31 19:39:44 +00004/* Windows users: read Python's PCbuild\readme.txt */
Mark Hammondae8c2682001-01-31 10:28:03 +00005
Guido van Rossumfb221561997-04-29 15:38:09 +00006
Guido van Rossum97b54571997-06-03 22:21:47 +00007#include "Python.h"
8#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +00009
10/* The following parameters are copied from zutil.h, version 0.95 */
11#define DEFLATED 8
12#if MAX_MEM_LEVEL >= 8
13# define DEF_MEM_LEVEL 8
14#else
15# define DEF_MEM_LEVEL MAX_MEM_LEVEL
16#endif
17#define DEF_WBITS MAX_WBITS
18
Guido van Rossumb729a1d1999-04-07 20:23:17 +000019/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
20#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000021#define PyInit_zlib initzlib
22
23staticforward PyTypeObject Comptype;
24staticforward PyTypeObject Decomptype;
25
26static PyObject *ZlibError;
27
28typedef struct
29{
30 PyObject_HEAD
31 z_stream zst;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000032 PyObject *unused_data;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000033 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000034} compobject;
35
Guido van Rossum3c540301997-06-03 22:21:03 +000036static char compressobj__doc__[] =
37"compressobj() -- Return a compressor object.\n"
38"compressobj(level) -- Return a compressor object, using the given compression level.\n"
39;
40
41static char decompressobj__doc__[] =
42"decompressobj() -- Return a decompressor object.\n"
43"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
44;
45
Guido van Rossumfb221561997-04-29 15:38:09 +000046static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000047newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +000048{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +000049 compobject *self;
Guido van Rossumb18618d2000-05-03 23:44:39 +000050 self = PyObject_New(compobject, type);
Guido van Rossumfb221561997-04-29 15:38:09 +000051 if (self == NULL)
52 return NULL;
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +000053 self->is_initialised = 0;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +000054 self->unused_data = PyString_FromString("");
Guido van Rossumfb221561997-04-29 15:38:09 +000055 return self;
56}
57
Guido van Rossum3c540301997-06-03 22:21:03 +000058static char compress__doc__[] =
59"compress(string) -- Compress string using the default compression level, "
60"returning a string containing compressed data.\n"
61"compress(string, level) -- Compress string, using the chosen compression "
62"level (from 1 to 9). Return a string containing the compressed data.\n"
63;
64
Guido van Rossumfb221561997-04-29 15:38:09 +000065static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000066PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +000067{
68 PyObject *ReturnVal;
69 Byte *input, *output;
70 int length, level=Z_DEFAULT_COMPRESSION, err;
71 z_stream zst;
72
Guido van Rossum43713e52000-02-29 13:59:29 +000073 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Guido van Rossumfb221561997-04-29 15:38:09 +000074 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +000075 zst.avail_out = length + length/1000 + 12 + 1;
Guido van Rossumfb221561997-04-29 15:38:09 +000076 output=(Byte*)malloc(zst.avail_out);
77 if (output==NULL)
78 {
79 PyErr_SetString(PyExc_MemoryError,
80 "Can't allocate memory to compress data");
81 return NULL;
82 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +000083
Jeremy Hylton5bc4abe1998-12-21 17:15:00 +000084 zst.zalloc=(alloc_func)NULL;
Guido van Rossum97b54571997-06-03 22:21:47 +000085 zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000086 zst.next_out=(Byte *)output;
87 zst.next_in =(Byte *)input;
88 zst.avail_in=length;
89 err=deflateInit(&zst, level);
90 switch(err)
91 {
92 case(Z_OK):
93 break;
94 case(Z_MEM_ERROR):
95 PyErr_SetString(PyExc_MemoryError,
96 "Out of memory while compressing data");
97 free(output);
98 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +000099 case(Z_STREAM_ERROR):
100 PyErr_SetString(ZlibError,
101 "Bad compression level");
102 free(output);
103 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000104 default:
105 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000106 if (zst.msg == Z_NULL)
107 PyErr_Format(ZlibError, "Error %i while compressing data",
108 err);
109 else
110 PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
111 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000112 deflateEnd(&zst);
113 free(output);
114 return NULL;
115 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000116 }
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 *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000162PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000163{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000164 PyObject *result_str;
165 Byte *input;
Guido van Rossumfb221561997-04-29 15:38:09 +0000166 int length, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000167 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000168 z_stream zst;
Guido van Rossum43713e52000-02-29 13:59:29 +0000169 if (!PyArg_ParseTuple(args, "s#|ii:decompress", &input, &length, &wsize, &r_strlen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000170 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000171
172 if (r_strlen <= 0)
173 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000174
Guido van Rossumfb221561997-04-29 15:38:09 +0000175 zst.avail_in=length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000176 zst.avail_out=r_strlen;
177 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
178 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000179 PyErr_SetString(PyExc_MemoryError,
180 "Can't allocate memory to decompress data");
181 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000182 }
Guido van Rossum97b54571997-06-03 22:21:47 +0000183 zst.zalloc=(alloc_func)NULL;
184 zst.zfree=(free_func)Z_NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000185 zst.next_out=(Byte *)PyString_AsString(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000186 zst.next_in =(Byte *)input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000187 err=inflateInit2(&zst, wsize);
Guido van Rossumfb221561997-04-29 15:38:09 +0000188 switch(err)
189 {
190 case(Z_OK):
191 break;
192 case(Z_MEM_ERROR):
193 PyErr_SetString(PyExc_MemoryError,
194 "Out of memory while decompressing data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000195 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000196 return NULL;
197 default:
198 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000199 if (zst.msg == Z_NULL)
200 PyErr_Format(ZlibError, "Error %i preparing to decompress data",
201 err);
202 else
203 PyErr_Format(ZlibError,
204 "Error %i while preparing to decompress data: %.200s",
205 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000206 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000207 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000208 return NULL;
209 }
210 }
211 do
212 {
213 err=inflate(&zst, Z_FINISH);
214 switch(err)
215 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000216 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000217 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000218 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000219 /*
220 * If there is at least 1 byte of room according to zst.avail_out
221 * and we get this error, assume that it means zlib cannot
222 * process the inflate call() due to an error in the data.
223 */
224 if (zst.avail_out > 0)
225 {
226 PyErr_Format(ZlibError, "Error %i while decompressing data",
227 err);
228 inflateEnd(&zst);
229 Py_DECREF(result_str);
230 return NULL;
231 }
232 /* fall through */
233 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000234 /* need more memory */
235 if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
Guido van Rossumfb221561997-04-29 15:38:09 +0000236 {
237 PyErr_SetString(PyExc_MemoryError,
238 "Out of memory while decompressing data");
239 inflateEnd(&zst);
240 return NULL;
241 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000242 zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000243 zst.avail_out=r_strlen;
244 r_strlen = r_strlen << 1;
245 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000246 default:
247 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000248 if (zst.msg == Z_NULL)
249 PyErr_Format(ZlibError, "Error %i while decompressing data",
250 err);
251 else
252 PyErr_Format(ZlibError,
253 "Error %i while decompressing data: %.200s",
254 err, zst.msg);
Guido van Rossumfb221561997-04-29 15:38:09 +0000255 inflateEnd(&zst);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000256 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000257 return NULL;
258 }
259 }
260 } while(err!=Z_STREAM_END);
261
262 err=inflateEnd(&zst);
263 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000264 {
265 if (zst.msg == Z_NULL)
266 PyErr_Format(ZlibError,
267 "Error %i while finishing data decompression",
268 err);
269 else
270 PyErr_Format(ZlibError,
271 "Error %i while finishing data decompression: %.200s",
272 err, zst.msg);
273 Py_DECREF(result_str);
Guido van Rossumfb221561997-04-29 15:38:09 +0000274 return NULL;
275 }
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000276 _PyString_Resize(&result_str, zst.total_out);
277 return result_str;
Guido van Rossumfb221561997-04-29 15:38:09 +0000278}
279
280static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000281PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000282{
283 compobject *self;
284 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
285 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000286
Guido van Rossum43713e52000-02-29 13:59:29 +0000287 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000288 &memLevel, &strategy))
289 return NULL;
290
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000291 self = newcompobject(&Comptype);
Guido van Rossumfb221561997-04-29 15:38:09 +0000292 if (self==NULL) return(NULL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000293 self->zst.zalloc = (alloc_func)NULL;
294 self->zst.zfree = (free_func)Z_NULL;
295 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
Guido van Rossumfb221561997-04-29 15:38:09 +0000296 switch(err)
297 {
298 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000299 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000300 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000301 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000302 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000303 PyErr_SetString(PyExc_MemoryError,
304 "Can't allocate memory for compression object");
305 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000306 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000307 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000308 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000309 "Invalid initialization option");
Guido van Rossumfb221561997-04-29 15:38:09 +0000310 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000311 default:
312 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000313 if (self->zst.msg == Z_NULL)
314 PyErr_Format(ZlibError,
315 "Error %i while creating compression object",
316 err);
317 else
318 PyErr_Format(ZlibError,
319 "Error %i while creating compression object: %.200s",
320 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000321 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000322 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000323 }
324 }
325}
326
327static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000328PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000329{
330 int wbits=DEF_WBITS, err;
331 compobject *self;
Guido van Rossum43713e52000-02-29 13:59:29 +0000332 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
Guido van Rossumfb221561997-04-29 15:38:09 +0000333 {
334 return NULL;
335 }
336 self=newcompobject(&Decomptype);
337 if (self==NULL) return(NULL);
Guido van Rossum97b54571997-06-03 22:21:47 +0000338 self->zst.zalloc=(alloc_func)NULL;
339 self->zst.zfree=(free_func)Z_NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000340 err=inflateInit2(&self->zst, wbits);
341 switch(err)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000342 {
Guido van Rossumfb221561997-04-29 15:38:09 +0000343 case (Z_OK):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000344 self->is_initialised = 1;
Guido van Rossumfb221561997-04-29 15:38:09 +0000345 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000346 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000347 Py_DECREF(self);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000348 PyErr_SetString(PyExc_ValueError,
349 "Invalid initialization option");
350 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000351 case (Z_MEM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000352 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000353 PyErr_SetString(PyExc_MemoryError,
354 "Can't allocate memory for decompression object");
355 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000356 default:
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000357 {
358 if (self->zst.msg == Z_NULL)
359 PyErr_Format(ZlibError,
360 "Error %i while creating decompression object",
361 err);
362 else
363 PyErr_Format(ZlibError,
364 "Error %i while creating decompression object: %.200s",
365 err, self->zst.msg);
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000366 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000367 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000368 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000369 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000370}
371
372static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000373Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000374{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000375 if (self->is_initialised)
376 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000377 Py_XDECREF(self->unused_data);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000378 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000379}
380
381static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000382Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000383{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000384 if (self->is_initialised)
385 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000386 Py_XDECREF(self->unused_data);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000387 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000388}
389
Guido van Rossum3c540301997-06-03 22:21:03 +0000390static char comp_compress__doc__[] =
391"compress(data) -- Return a string containing a compressed version of the data.\n\n"
392"After calling this function, some of the input data may still\n"
393"be stored in internal buffers for later processing.\n"
394"Call the flush() method to clear these buffers."
395;
396
397
Guido van Rossumfb221561997-04-29 15:38:09 +0000398static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000399PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000400{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000401 int err, inplen, 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))
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000407 return NULL;
408 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
409 PyErr_SetString(PyExc_MemoryError,
410 "Can't allocate memory to compress data");
411 return NULL;
412 }
413 start_total_out = self->zst.total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000414 self->zst.avail_in = inplen;
415 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000416 self->zst.avail_out = length;
417 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
418 err = deflate(&(self->zst), Z_NO_FLUSH);
419 /* while Z_OK and the output buffer is full, there might be more output,
420 so extend the output buffer and try again */
421 while (err == Z_OK && self->zst.avail_out == 0) {
422 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000423 PyErr_SetString(PyExc_MemoryError,
424 "Can't allocate memory to compress data");
425 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000426 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000427 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
428 self->zst.avail_out = length;
429 length = length << 1;
430 err = deflate(&(self->zst), Z_NO_FLUSH);
431 }
432 /* We will only get Z_BUF_ERROR if the output buffer was full but there
433 wasn't more output when we tried again, so it is not an error condition */
434 if (err != Z_OK && err != Z_BUF_ERROR) {
435 if (self->zst.msg == Z_NULL)
436 PyErr_Format(ZlibError, "Error %i while compressing",
437 err);
438 else
439 PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
440 err, self->zst.msg);
441 Py_DECREF(RetVal);
442 return NULL;
443 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000444 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000445 return RetVal;
446}
447
Guido van Rossum3c540301997-06-03 22:21:03 +0000448static char decomp_decompress__doc__[] =
449"decompress(data) -- Return a string containing the decompressed version of the data.\n\n"
450"After calling this function, some of the input data may still\n"
451"be stored in internal buffers for later processing.\n"
452"Call the flush() method to clear these buffers."
453;
454
Guido van Rossumfb221561997-04-29 15:38:09 +0000455static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000456PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000457{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000458 int err, inplen, length = DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000459 PyObject *RetVal;
460 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000461 unsigned long start_total_out;
462
Guido van Rossum43713e52000-02-29 13:59:29 +0000463 if (!PyArg_ParseTuple(args, "s#:decompress", &input, &inplen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000464 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000465 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
466 PyErr_SetString(PyExc_MemoryError,
467 "Can't allocate memory to compress data");
468 return NULL;
469 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000470 start_total_out = self->zst.total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000471 self->zst.avail_in = inplen;
472 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000473 self->zst.avail_out = length;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000474 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000475 err = inflate(&(self->zst), Z_SYNC_FLUSH);
476 /* while Z_OK and the output buffer is full, there might be more output,
477 so extend the output buffer and try again */
478 while (err == Z_OK && self->zst.avail_out == 0) {
479 if (_PyString_Resize(&RetVal, length << 1) == -1) {
480 PyErr_SetString(PyExc_MemoryError,
481 "Can't allocate memory to compress data");
482 return NULL;
483 }
484 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
485 self->zst.avail_out = length;
486 length = length << 1;
487 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000488 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000489 /* The end of the compressed data has been reached, so set the unused_data
490 attribute to a string containing the remainder of the data in the string.
491 Note that this is also a logical place to call inflateEnd, but the old
492 behaviour of only calling it on flush() is preserved.*/
493 if (err == Z_STREAM_END) {
494 Py_XDECREF(self->unused_data); /* Free the original, empty string */
Andrew M. Kuchlinga1a690f2001-02-22 15:52:55 +0000495 self->unused_data = PyString_FromStringAndSize((char *)self->zst.next_in,
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000496 self->zst.avail_in);
497 if (self->unused_data == NULL) {
498 PyErr_SetString(PyExc_MemoryError,
499 "Can't allocate memory to unused_data");
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000500 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000501 return NULL;
502 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000503 /* We will only get Z_BUF_ERROR if the output buffer was full but there
504 wasn't more output when we tried again, so it is not an error condition */
505 } else if (err != Z_OK && err != Z_BUF_ERROR) {
506 if (self->zst.msg == Z_NULL)
507 PyErr_Format(ZlibError, "Error %i while decompressing",
508 err);
509 else
510 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
511 err, self->zst.msg);
512 Py_DECREF(RetVal);
513 return NULL;
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000514 }
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000515 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000516 return RetVal;
517}
518
Guido van Rossum3c540301997-06-03 22:21:03 +0000519static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000520"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
521"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
522"default value used when mode is not specified is Z_FINISH.\n"
523"If mode == Z_FINISH, the compressor object can no longer be used after\n"
524"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000525;
526
Guido van Rossumfb221561997-04-29 15:38:09 +0000527static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000528PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000529{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000530 int err, length=DEFAULTALLOC;
Guido van Rossumfb221561997-04-29 15:38:09 +0000531 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000532 int flushmode = Z_FINISH;
533 unsigned long start_total_out;
534
Guido van Rossum43713e52000-02-29 13:59:29 +0000535 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000536 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000537
538 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
539 doing any work at all; just return an empty string. */
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000540 if (flushmode == Z_NO_FLUSH) {
541 return PyString_FromStringAndSize(NULL, 0);
542 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000543
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000544 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000545 PyErr_SetString(PyExc_MemoryError,
546 "Can't allocate memory to compress data");
547 return NULL;
548 }
549 start_total_out = self->zst.total_out;
550 self->zst.avail_in = 0;
551 self->zst.avail_out = length;
552 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
553 err = deflate(&(self->zst), flushmode);
554 /* while Z_OK and the output buffer is full, there might be more output,
555 so extend the output buffer and try again */
556 while (err == Z_OK && self->zst.avail_out == 0) {
557 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000558 PyErr_SetString(PyExc_MemoryError,
559 "Can't allocate memory to compress data");
560 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000561 }
562 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
563 self->zst.avail_out = length;
564 length = length << 1;
565 err = deflate(&(self->zst), flushmode);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000566 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000567 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
568 various data structures. Note we should only get Z_STREAM_END when
569 flushmode is Z_FINISH, but checking both for safety*/
570 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000571 err=deflateEnd(&(self->zst));
572 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000573 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000574 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
575 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000576 else
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000577 PyErr_Format(ZlibError,"Error %i from deflateEnd(): %.200s",
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000578 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000579 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000580 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000581 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000582 self->is_initialised = 0;
583 /* We will only get Z_BUF_ERROR if the output buffer was full but there
584 wasn't more output when we tried again, so it is not an error condition */
585 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
586 if (self->zst.msg == Z_NULL)
587 PyErr_Format(ZlibError, "Error %i while flushing",
588 err);
589 else
590 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
591 err, self->zst.msg);
592 Py_DECREF(RetVal);
593 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000594 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000595 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000596 return RetVal;
597}
598
Guido van Rossum3c540301997-06-03 22:21:03 +0000599static char decomp_flush__doc__[] =
600"flush() -- Return a string containing any remaining decompressed data. "
601"The decompressor object can no longer be used after this call."
602;
603
Guido van Rossumfb221561997-04-29 15:38:09 +0000604static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000605PyZlib_unflush(compobject *self, PyObject *args)
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000606/*decompressor flush is a no-op because all pending data would have been
607 flushed by the decompress method. However, this routine previously called
608 inflateEnd, causing any further decompress or flush calls to raise
609 exceptions. This behaviour has been preserved.*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000610{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000611 int err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000612
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000613 if (!PyArg_ParseTuple(args, ""))
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000614 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000615 err=inflateEnd(&(self->zst));
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000616 if (err!=Z_OK) {
617 if (self->zst.msg == Z_NULL)
618 PyErr_Format(ZlibError, "Error %i from inflateEnd()",
619 err);
620 else
621 PyErr_Format(ZlibError, "Error %i from inflateEnd(): %.200s",
622 err, self->zst.msg);
623 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000624 }
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000625 self->is_initialised = 0;
626 return PyString_FromStringAndSize(NULL, 0);
Guido van Rossumfb221561997-04-29 15:38:09 +0000627}
628
629static PyMethodDef comp_methods[] =
630{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000631 {"compress", (binaryfunc)PyZlib_objcompress,
632 METH_VARARGS, comp_compress__doc__},
633 {"flush", (binaryfunc)PyZlib_flush,
634 METH_VARARGS, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000635 {NULL, NULL}
636};
637
638static PyMethodDef Decomp_methods[] =
639{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000640 {"decompress", (binaryfunc)PyZlib_objdecompress,
641 METH_VARARGS, decomp_decompress__doc__},
642 {"flush", (binaryfunc)PyZlib_unflush,
643 METH_VARARGS, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000644 {NULL, NULL}
645};
646
647static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000648Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000649{
650 return Py_FindMethod(comp_methods, (PyObject *)self, name);
651}
652
653static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000654Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000655{
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000656 if (strcmp(name, "unused_data") == 0)
657 {
658 Py_INCREF(self->unused_data);
659 return self->unused_data;
660 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000661 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
662}
663
Guido van Rossum3c540301997-06-03 22:21:03 +0000664static char adler32__doc__[] =
665"adler32(string) -- Compute an Adler-32 checksum of string, using "
666"a default starting value, and returning an integer value.\n"
667"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
668"the starting value provided, and returning an integer value\n"
669;
670
Guido van Rossumfb221561997-04-29 15:38:09 +0000671static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000672PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000673{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000674 uLong adler32val=adler32(0L, Z_NULL, 0);
675 Byte *buf;
676 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000677
Guido van Rossum43713e52000-02-29 13:59:29 +0000678 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000679 {
680 return NULL;
681 }
682 adler32val = adler32(adler32val, buf, len);
683 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000684}
685
Guido van Rossum3c540301997-06-03 22:21:03 +0000686static char crc32__doc__[] =
687"crc32(string) -- Compute a CRC-32 checksum of string, using "
688"a default starting value, and returning an integer value.\n"
689"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
690"the starting value provided, and returning an integer value.\n"
691;
Guido van Rossumfb221561997-04-29 15:38:09 +0000692
693static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000694PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000695{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000696 uLong crc32val=crc32(0L, Z_NULL, 0);
697 Byte *buf;
698 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000699 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000700 {
701 return NULL;
702 }
703 crc32val = crc32(crc32val, buf, len);
704 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000705}
706
707
708static PyMethodDef zlib_methods[] =
709{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000710 {"adler32", (PyCFunction)PyZlib_adler32,
711 METH_VARARGS, adler32__doc__},
712 {"compress", (PyCFunction)PyZlib_compress,
713 METH_VARARGS, compress__doc__},
714 {"compressobj", (PyCFunction)PyZlib_compressobj,
715 METH_VARARGS, compressobj__doc__},
716 {"crc32", (PyCFunction)PyZlib_crc32,
717 METH_VARARGS, crc32__doc__},
718 {"decompress", (PyCFunction)PyZlib_decompress,
719 METH_VARARGS, decompress__doc__},
720 {"decompressobj", (PyCFunction)PyZlib_decompressobj,
721 METH_VARARGS, decompressobj__doc__},
722 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000723};
724
725statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000726 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000727 0,
728 "Compress",
729 sizeof(compobject),
730 0,
731 (destructor)Comp_dealloc, /*tp_dealloc*/
732 0, /*tp_print*/
733 (getattrfunc)Comp_getattr, /*tp_getattr*/
734 0, /*tp_setattr*/
735 0, /*tp_compare*/
736 0, /*tp_repr*/
737 0, /*tp_as_number*/
738 0, /*tp_as_sequence*/
739 0, /*tp_as_mapping*/
740};
741
742statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000743 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000744 0,
745 "Decompress",
746 sizeof(compobject),
747 0,
748 (destructor)Decomp_dealloc, /*tp_dealloc*/
749 0, /*tp_print*/
750 (getattrfunc)Decomp_getattr, /*tp_getattr*/
751 0, /*tp_setattr*/
752 0, /*tp_compare*/
753 0, /*tp_repr*/
754 0, /*tp_as_number*/
755 0, /*tp_as_sequence*/
756 0, /*tp_as_mapping*/
757};
758
759/* The following insint() routine was blatantly ripped off from
760 socketmodule.c */
761
762/* Convenience routine to export an integer value.
763 For simplicity, errors (which are unlikely anyway) are ignored. */
764static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000765insint(PyObject *d, char *name, int value)
Guido van Rossumfb221561997-04-29 15:38:09 +0000766{
767 PyObject *v = PyInt_FromLong((long) value);
768 if (v == NULL) {
769 /* Don't bother reporting this error */
770 PyErr_Clear();
771 }
772 else {
773 PyDict_SetItemString(d, name, v);
774 Py_DECREF(v);
775 }
776}
777
Guido van Rossum3c540301997-06-03 22:21:03 +0000778static char zlib_module_documentation[]=
779"The functions in this module allow compression and decompression "
780"using the zlib library, which is based on GNU zip. \n\n"
781"adler32(string) -- Compute an Adler-32 checksum.\n"
782"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
783"compress(string) -- Compress a string.\n"
784"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
785"compressobj([level]) -- Return a compressor object.\n"
786"crc32(string) -- Compute a CRC-32 checksum.\n"
787"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000788"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000789"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
790"Compressor objects support compress() and flush() methods; decompressor \n"
791"objects support decompress() and flush()."
792;
793
Guido van Rossum3886bb61998-12-04 18:50:17 +0000794DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000795PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000796{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000797 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000798 Comptype.ob_type = &PyType_Type;
799 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000800 m = Py_InitModule4("zlib", zlib_methods,
801 zlib_module_documentation,
802 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000803 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000804 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Fred Drake8972dfd1999-12-22 16:13:54 +0000805 if (ZlibError != NULL)
806 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000807
Guido van Rossumfb221561997-04-29 15:38:09 +0000808 insint(d, "MAX_WBITS", MAX_WBITS);
809 insint(d, "DEFLATED", DEFLATED);
810 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000811 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
812 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
813 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
814 insint(d, "Z_FILTERED", Z_FILTERED);
815 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
816 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000817
818 insint(d, "Z_FINISH", Z_FINISH);
819 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
820 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
821 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
822
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000823 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake8972dfd1999-12-22 16:13:54 +0000824 if (ver != NULL) {
825 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
826 Py_DECREF(ver);
827 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000828}