blob: 78bd130f200e54b1420d842cf3005af707a7f0c8 [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{
49 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{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000384 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000385 Py_XDECREF(self->unused_data);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000386 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000387}
388
Guido van Rossum3c540301997-06-03 22:21:03 +0000389static char comp_compress__doc__[] =
390"compress(data) -- Return a string containing a compressed version of the data.\n\n"
391"After calling this function, some of the input data may still\n"
392"be stored in internal buffers for later processing.\n"
393"Call the flush() method to clear these buffers."
394;
395
396
Guido van Rossumfb221561997-04-29 15:38:09 +0000397static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000398PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000399{
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 *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000455PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000456{
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000457 int length, err, inplen;
Guido van Rossumfb221561997-04-29 15:38:09 +0000458 PyObject *RetVal;
459 Byte *input;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000460 unsigned long start_total_out;
461
Guido van Rossum43713e52000-02-29 13:59:29 +0000462 if (!PyArg_ParseTuple(args, "s#:decompress", &input, &inplen))
Guido van Rossumfb221561997-04-29 15:38:09 +0000463 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000464 start_total_out = self->zst.total_out;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000465 RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000466 self->zst.avail_in = inplen;
467 self->zst.next_in = input;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000468 self->zst.avail_out = length = DEFAULTALLOC;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000469 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000470 err = Z_OK;
Jeremy Hyltona74ef661997-08-13 21:39:18 +0000471
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000472 while (self->zst.avail_in != 0 && err == Z_OK)
473 {
474 err = inflate(&(self->zst), Z_NO_FLUSH);
475 if (err == Z_OK && self->zst.avail_out <= 0)
476 {
477 if (_PyString_Resize(&RetVal, length << 1) == -1)
478 {
479 PyErr_SetString(PyExc_MemoryError,
480 "Can't allocate memory to compress data");
481 return NULL;
482 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000483 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000484 self->zst.avail_out = length;
485 length = length << 1;
486 }
487 }
488
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000489 if (err != Z_OK && err != Z_STREAM_END)
490 {
491 if (self->zst.msg == Z_NULL)
492 PyErr_Format(ZlibError, "Error %i while decompressing",
493 err);
494 else
495 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
496 err, self->zst.msg);
497 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000498 return NULL;
499 }
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000500
501 if (err == Z_STREAM_END)
502 {
503 /* The end of the compressed data has been reached, so set
504 the unused_data attribute to a string containing the
505 remainder of the data in the string. */
506 int pos = self->zst.next_in - input; /* Position in the string */
507 Py_XDECREF(self->unused_data); /* Free the original, empty string */
508
Guido van Rossumaee9bb21999-04-12 14:35:48 +0000509 self->unused_data = PyString_FromStringAndSize((char *)input+pos,
510 inplen-pos);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000511 if (self->unused_data == NULL) return NULL;
512 }
513
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000514 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000515 return RetVal;
516}
517
Guido van Rossum3c540301997-06-03 22:21:03 +0000518static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000519"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
520"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
521"default value used when mode is not specified is Z_FINISH.\n"
522"If mode == Z_FINISH, the compressor object can no longer be used after\n"
523"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000524;
525
Guido van Rossumfb221561997-04-29 15:38:09 +0000526static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000527PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000528{
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000529 int length=DEFAULTALLOC, err = Z_OK;
Guido van Rossumfb221561997-04-29 15:38:09 +0000530 PyObject *RetVal;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000531 int flushmode = Z_FINISH;
532 unsigned long start_total_out;
533
Guido van Rossum43713e52000-02-29 13:59:29 +0000534 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000535 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000536
537 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
538 doing any work at all; just return an empty string. */
539 if (flushmode == Z_NO_FLUSH)
540 {
541 return PyString_FromStringAndSize(NULL, 0);
542 }
543
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000544 self->zst.avail_in = 0;
545 self->zst.next_in = Z_NULL;
546 if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
547 PyErr_SetString(PyExc_MemoryError,
548 "Can't allocate memory to compress data");
549 return NULL;
550 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000551 start_total_out = self->zst.total_out;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000552 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000553 self->zst.avail_out = length;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000554
555 /* When flushing the zstream, there's no input data.
556 If zst.avail_out == 0, that means that more output space is
557 needed to complete the flush operation. */
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000558 while (1) {
559 err = deflate(&(self->zst), flushmode);
560
561 /* If the output is Z_OK, and there's still room in the output
562 buffer, then the flush is complete. */
563 if ( (err == Z_OK) && self->zst.avail_out > 0) break;
564
565 /* A nonzero return indicates some sort of error (but see
566 the comment for the error handler below) */
567 if ( err != Z_OK ) break;
568
569 /* There's no space left for output, so increase the buffer and loop
570 again */
571 if (_PyString_Resize(&RetVal, length << 1) == -1) {
572 PyErr_SetString(PyExc_MemoryError,
573 "Can't allocate memory to compress data");
574 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000575 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000576 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
577 self->zst.avail_out = length;
578 length = length << 1;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000579 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000580
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000581 /* Raise an exception indicating an error. The condition for
582 detecting a error is kind of complicated; Z_OK indicates no
583 error, but if the flushmode is Z_FINISH, then Z_STREAM_END is
584 also not an error. */
585 if (err!=Z_OK && !(flushmode == Z_FINISH && err == Z_STREAM_END) )
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000586 {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000587 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000588 PyErr_Format(ZlibError, "Error %i while flushing",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000589 err);
590 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000591 PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000592 err, self->zst.msg);
593 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000594 return NULL;
Jeremy Hylton6892aa31999-01-06 22:56:24 +0000595 }
Andrew M. Kuchling173156f1999-03-22 19:25:30 +0000596
597 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to
598 free various data structures */
599
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000600 if (flushmode == Z_FINISH) {
601 err=deflateEnd(&(self->zst));
602 if (err!=Z_OK) {
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000603 if (self->zst.msg == Z_NULL)
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000604 PyErr_Format(ZlibError, "Error %i from deflateEnd()",
605 err);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000606 else
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000607 PyErr_Format(ZlibError,
608 "Error %i from deflateEnd(): %.200s",
609 err, self->zst.msg);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000610 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000611 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000612 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000613 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000614 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Guido van Rossumfb221561997-04-29 15:38:09 +0000615 return RetVal;
616}
617
Guido van Rossum3c540301997-06-03 22:21:03 +0000618static char decomp_flush__doc__[] =
619"flush() -- Return a string containing any remaining decompressed data. "
620"The decompressor object can no longer be used after this call."
621;
622
Guido van Rossumfb221561997-04-29 15:38:09 +0000623static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000624PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000625{
626 int length=0, err;
Guido van Rossumfb221561997-04-29 15:38:09 +0000627 PyObject *RetVal;
628
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000629 if (!PyArg_ParseTuple(args, ""))
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000630 return NULL;
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000631 if (!(RetVal = PyString_FromStringAndSize(NULL, DEFAULTALLOC)))
632 {
633 PyErr_SetString(PyExc_MemoryError,
634 "Can't allocate memory to decompress data");
635 return NULL;
636 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000637 self->zst.avail_in=0;
Guido van Rossumed2554a1997-08-18 15:31:24 +0000638 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000639 length = self->zst.avail_out = DEFAULTALLOC;
640
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000641 /* I suspect that Z_BUF_ERROR is the only error code we need to check for
642 in the following loop, but will leave the Z_OK in for now to avoid
643 destabilizing this function. --amk */
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000644 err = Z_OK;
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000645 while ( err == Z_OK )
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000646 {
647 err = inflate(&(self->zst), Z_FINISH);
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000648 if ( ( err == Z_OK || err == Z_BUF_ERROR ) && self->zst.avail_out == 0)
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000649 {
650 if (_PyString_Resize(&RetVal, length << 1) == -1)
651 {
652 PyErr_SetString(PyExc_MemoryError,
653 "Can't allocate memory to decompress data");
654 return NULL;
655 }
Guido van Rossumed2554a1997-08-18 15:31:24 +0000656 self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000657 self->zst.avail_out = length;
658 length = length << 1;
Guido van Rossumb729a1d1999-04-07 20:23:17 +0000659 err = Z_OK;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000660 }
661 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000662 if (err!=Z_STREAM_END)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000663 {
664 if (self->zst.msg == Z_NULL)
665 PyErr_Format(ZlibError, "Error %i while decompressing",
666 err);
667 else
668 PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
669 err, self->zst.msg);
670 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000671 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000672 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000673 err=inflateEnd(&(self->zst));
674 if (err!=Z_OK)
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000675 {
676 if (self->zst.msg == Z_NULL)
677 PyErr_Format(ZlibError,
678 "Error %i while flushing decompression object",
679 err);
680 else
681 PyErr_Format(ZlibError,
682 "Error %i while flushing decompression object: %.200s",
683 err, self->zst.msg);
684 Py_DECREF(RetVal);
Guido van Rossumfb221561997-04-29 15:38:09 +0000685 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000686 }
Jeremy Hylton644c17d1997-08-14 21:06:42 +0000687 _PyString_Resize(&RetVal,
688 (char *)self->zst.next_out - PyString_AsString(RetVal));
Guido van Rossumfb221561997-04-29 15:38:09 +0000689 return RetVal;
690}
691
692static PyMethodDef comp_methods[] =
693{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000694 {"compress", (binaryfunc)PyZlib_objcompress,
695 METH_VARARGS, comp_compress__doc__},
696 {"flush", (binaryfunc)PyZlib_flush,
697 METH_VARARGS, comp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000698 {NULL, NULL}
699};
700
701static PyMethodDef Decomp_methods[] =
702{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000703 {"decompress", (binaryfunc)PyZlib_objdecompress,
704 METH_VARARGS, decomp_decompress__doc__},
705 {"flush", (binaryfunc)PyZlib_unflush,
706 METH_VARARGS, decomp_flush__doc__},
Guido van Rossumfb221561997-04-29 15:38:09 +0000707 {NULL, NULL}
708};
709
710static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000711Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000712{
713 return Py_FindMethod(comp_methods, (PyObject *)self, name);
714}
715
716static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000717Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000718{
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000719 if (strcmp(name, "unused_data") == 0)
720 {
721 Py_INCREF(self->unused_data);
722 return self->unused_data;
723 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000724 return Py_FindMethod(Decomp_methods, (PyObject *)self, name);
725}
726
Guido van Rossum3c540301997-06-03 22:21:03 +0000727static char adler32__doc__[] =
728"adler32(string) -- Compute an Adler-32 checksum of string, using "
729"a default starting value, and returning an integer value.\n"
730"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
731"the starting value provided, and returning an integer value\n"
732;
733
Guido van Rossumfb221561997-04-29 15:38:09 +0000734static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000735PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000736{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000737 uLong adler32val=adler32(0L, Z_NULL, 0);
738 Byte *buf;
739 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000740
Guido van Rossum43713e52000-02-29 13:59:29 +0000741 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000742 {
743 return NULL;
744 }
745 adler32val = adler32(adler32val, buf, len);
746 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000747}
748
Guido van Rossum3c540301997-06-03 22:21:03 +0000749static char crc32__doc__[] =
750"crc32(string) -- Compute a CRC-32 checksum of string, using "
751"a default starting value, and returning an integer value.\n"
752"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
753"the starting value provided, and returning an integer value.\n"
754;
Guido van Rossumfb221561997-04-29 15:38:09 +0000755
756static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000757PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000758{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000759 uLong crc32val=crc32(0L, Z_NULL, 0);
760 Byte *buf;
761 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000762 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000763 {
764 return NULL;
765 }
766 crc32val = crc32(crc32val, buf, len);
767 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000768}
769
770
771static PyMethodDef zlib_methods[] =
772{
Andrew M. Kuchling14f51582000-08-03 02:04:05 +0000773 {"adler32", (PyCFunction)PyZlib_adler32,
774 METH_VARARGS, adler32__doc__},
775 {"compress", (PyCFunction)PyZlib_compress,
776 METH_VARARGS, compress__doc__},
777 {"compressobj", (PyCFunction)PyZlib_compressobj,
778 METH_VARARGS, compressobj__doc__},
779 {"crc32", (PyCFunction)PyZlib_crc32,
780 METH_VARARGS, crc32__doc__},
781 {"decompress", (PyCFunction)PyZlib_decompress,
782 METH_VARARGS, decompress__doc__},
783 {"decompressobj", (PyCFunction)PyZlib_decompressobj,
784 METH_VARARGS, decompressobj__doc__},
785 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000786};
787
788statichere PyTypeObject Comptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000789 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000790 0,
791 "Compress",
792 sizeof(compobject),
793 0,
794 (destructor)Comp_dealloc, /*tp_dealloc*/
795 0, /*tp_print*/
796 (getattrfunc)Comp_getattr, /*tp_getattr*/
797 0, /*tp_setattr*/
798 0, /*tp_compare*/
799 0, /*tp_repr*/
800 0, /*tp_as_number*/
801 0, /*tp_as_sequence*/
802 0, /*tp_as_mapping*/
803};
804
805statichere PyTypeObject Decomptype = {
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000806 PyObject_HEAD_INIT(0)
Guido van Rossumfb221561997-04-29 15:38:09 +0000807 0,
808 "Decompress",
809 sizeof(compobject),
810 0,
811 (destructor)Decomp_dealloc, /*tp_dealloc*/
812 0, /*tp_print*/
813 (getattrfunc)Decomp_getattr, /*tp_getattr*/
814 0, /*tp_setattr*/
815 0, /*tp_compare*/
816 0, /*tp_repr*/
817 0, /*tp_as_number*/
818 0, /*tp_as_sequence*/
819 0, /*tp_as_mapping*/
820};
821
822/* The following insint() routine was blatantly ripped off from
823 socketmodule.c */
824
825/* Convenience routine to export an integer value.
826 For simplicity, errors (which are unlikely anyway) are ignored. */
827static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000828insint(PyObject *d, char *name, int value)
Guido van Rossumfb221561997-04-29 15:38:09 +0000829{
830 PyObject *v = PyInt_FromLong((long) value);
831 if (v == NULL) {
832 /* Don't bother reporting this error */
833 PyErr_Clear();
834 }
835 else {
836 PyDict_SetItemString(d, name, v);
837 Py_DECREF(v);
838 }
839}
840
Guido van Rossum3c540301997-06-03 22:21:03 +0000841static char zlib_module_documentation[]=
842"The functions in this module allow compression and decompression "
843"using the zlib library, which is based on GNU zip. \n\n"
844"adler32(string) -- Compute an Adler-32 checksum.\n"
845"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
846"compress(string) -- Compress a string.\n"
847"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
848"compressobj([level]) -- Return a compressor object.\n"
849"crc32(string) -- Compute a CRC-32 checksum.\n"
850"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000851"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000852"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
853"Compressor objects support compress() and flush() methods; decompressor \n"
854"objects support decompress() and flush()."
855;
856
Guido van Rossum3886bb61998-12-04 18:50:17 +0000857DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000858PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000859{
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000860 PyObject *m, *d, *ver;
Guido van Rossum9ec0f8b1997-12-18 05:21:29 +0000861 Comptype.ob_type = &PyType_Type;
862 Decomptype.ob_type = &PyType_Type;
Guido van Rossum3c540301997-06-03 22:21:03 +0000863 m = Py_InitModule4("zlib", zlib_methods,
864 zlib_module_documentation,
865 (PyObject*)NULL,PYTHON_API_VERSION);
Guido van Rossumfb221561997-04-29 15:38:09 +0000866 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000867 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
Fred Drake8972dfd1999-12-22 16:13:54 +0000868 if (ZlibError != NULL)
869 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000870
Guido van Rossumfb221561997-04-29 15:38:09 +0000871 insint(d, "MAX_WBITS", MAX_WBITS);
872 insint(d, "DEFLATED", DEFLATED);
873 insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000874 insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
875 insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
876 insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
877 insint(d, "Z_FILTERED", Z_FILTERED);
878 insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
879 insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000880
881 insint(d, "Z_FINISH", Z_FINISH);
882 insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
883 insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
884 insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
885
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000886 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake8972dfd1999-12-22 16:13:54 +0000887 if (ver != NULL) {
888 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
889 Py_DECREF(ver);
890 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000891}