blob: b42309212f1010afa8bd197546ae6bd79ecc1d9c [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
Martin v. Löwis1dbce442001-10-09 10:54:31 +00002/* See http://www.gzip.org/zlib/ */
Mark Hammondae8c2682001-01-31 10:28:03 +00003
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
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000010#ifdef WITH_THREAD
11#include "pythread.h"
12
13/* #defs ripped off from _tkinter.c, even though the situation here is much
14 simpler, because we don't have to worry about waiting for Tcl
15 events! And, since zlib itself is threadsafe, we don't need to worry
16 about re-entering zlib functions.
17
18 What we _do_ have to worry about is releasing the global lock _in
19 general_ in the zlibmodule functions, because of all the calls to
20 Python functions, which assume that the global lock is held. So
21 only two types of calls are wrapped in Py_BEGIN/END_ALLOW_THREADS:
22 those that grab the zlib lock, and those that involve other
23 time-consuming functions where we need to worry about holding up
24 other Python threads.
25
26 We don't need to worry about the string inputs being modified out
27 from underneath us, because string objects are immutable. However,
28 we do need to make sure we take on ownership, so that the strings
29 are not deleted out from under us during a thread swap.
30
31 N.B.
32
33 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions
34 that modify the components of preexisting de/compress objects, it
35 could prove to be a performance gain on multiprocessor machines if
36 there was an de/compress object-specific lock. However, for the
37 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL
38 de/compress objects.
39
40 */
41
42static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */
43
44#define ENTER_ZLIB \
45 { Py_BEGIN_ALLOW_THREADS PyThread_acquire_lock(zlib_lock, 1); \
46 Py_END_ALLOW_THREADS
47
48#define LEAVE_ZLIB \
49 PyThread_release_lock(zlib_lock); }
50
51#else
52
53#define ENTER_ZLIB
54#define LEAVE_ZLIB
55
56#endif
57
Guido van Rossumfb221561997-04-29 15:38:09 +000058/* The following parameters are copied from zutil.h, version 0.95 */
59#define DEFLATED 8
60#if MAX_MEM_LEVEL >= 8
61# define DEF_MEM_LEVEL 8
62#else
63# define DEF_MEM_LEVEL MAX_MEM_LEVEL
64#endif
65#define DEF_WBITS MAX_WBITS
66
Guido van Rossumb729a1d1999-04-07 20:23:17 +000067/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
68#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000069#define PyInit_zlib initzlib
70
71staticforward PyTypeObject Comptype;
72staticforward PyTypeObject Decomptype;
73
74static PyObject *ZlibError;
75
76typedef struct
77{
Jeremy Hylton9714f992001-10-16 21:19:45 +000078 PyObject_HEAD
79 z_stream zst;
80 PyObject *unused_data;
81 PyObject *unconsumed_tail;
82 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000083} compobject;
84
Jeremy Hylton0965e082001-10-16 21:56:09 +000085static void
86zlib_error(z_stream zst, int err, char *msg)
87{
88 if (zst.msg == Z_NULL)
89 PyErr_Format(ZlibError, "Error %d %s", err, msg);
90 else
91 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
92}
93
Guido van Rossum3c540301997-06-03 22:21:03 +000094static char compressobj__doc__[] =
95"compressobj() -- Return a compressor object.\n"
96"compressobj(level) -- Return a compressor object, using the given compression level.\n"
97;
98
99static char decompressobj__doc__[] =
100"decompressobj() -- Return a decompressor object.\n"
101"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
102;
103
Guido van Rossumfb221561997-04-29 15:38:09 +0000104static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000105newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +0000106{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000107 compobject *self;
108 self = PyObject_New(compobject, type);
109 if (self == NULL)
110 return NULL;
111 self->is_initialised = 0;
112 self->unused_data = PyString_FromString("");
113 if (self->unused_data == NULL) {
114 Py_DECREF(self);
115 return NULL;
116 }
117 self->unconsumed_tail = PyString_FromString("");
118 if (self->unconsumed_tail == NULL) {
119 Py_DECREF(self);
120 return NULL;
121 }
122 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000123}
124
Guido van Rossum3c540301997-06-03 22:21:03 +0000125static char compress__doc__[] =
126"compress(string) -- Compress string using the default compression level, "
127"returning a string containing compressed data.\n"
128"compress(string, level) -- Compress string, using the chosen compression "
129"level (from 1 to 9). Return a string containing the compressed data.\n"
130;
131
Guido van Rossumfb221561997-04-29 15:38:09 +0000132static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000133PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000134{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000135 PyObject *ReturnVal = NULL;
136 Byte *input, *output;
137 int length, level=Z_DEFAULT_COMPRESSION, err;
138 z_stream zst;
Guido van Rossumfb221561997-04-29 15:38:09 +0000139
Jeremy Hylton9714f992001-10-16 21:19:45 +0000140 /* require Python string object, optional 'level' arg */
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000141 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000142 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000143
Jeremy Hylton9714f992001-10-16 21:19:45 +0000144 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000145
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000146 output = (Byte*)malloc(zst.avail_out);
147 if (output == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000148 PyErr_SetString(PyExc_MemoryError,
149 "Can't allocate memory to compress data");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000150 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000151 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000152
Jeremy Hylton9714f992001-10-16 21:19:45 +0000153 /* Past the point of no return. From here on out, we need to make sure
154 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000155
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000156 zst.zalloc = (alloc_func)NULL;
157 zst.zfree = (free_func)Z_NULL;
158 zst.next_out = (Byte *)output;
159 zst.next_in = (Byte *)input;
160 zst.avail_in = length;
161 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000162
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000163 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000164 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000165 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000166 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000167 PyErr_SetString(PyExc_MemoryError,
168 "Out of memory while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000169 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000170 case(Z_STREAM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000171 PyErr_SetString(ZlibError,
172 "Bad compression level");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000173 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000174 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000175 deflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000176 zlib_error(zst, err, "while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000177 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000178 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000179
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000180 Py_BEGIN_ALLOW_THREADS;
181 err = deflate(&zst, Z_FINISH);
182 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000183
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000184 if (err != Z_STREAM_END) {
185 zlib_error(zst, err, "while compressing data");
186 deflateEnd(&zst);
187 goto error;
188 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000189
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000190 err=deflateEnd(&zst);
191 if (err == Z_OK)
192 ReturnVal = PyString_FromStringAndSize((char *)output,
193 zst.total_out);
194 else
195 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000196
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000197 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000198 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000199
Jeremy Hylton9714f992001-10-16 21:19:45 +0000200 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000201}
202
Guido van Rossum3c540301997-06-03 22:21:03 +0000203static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000204"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
205"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
206"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 +0000207;
208
Guido van Rossumfb221561997-04-29 15:38:09 +0000209static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000210PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000211{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000212 PyObject *result_str;
213 Byte *input;
214 int length, err;
215 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
216 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000217
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000218 if (!PyArg_ParseTuple(args, "s#|ii:decompress",
219 &input, &length, &wsize, &r_strlen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000220 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000221
Jeremy Hylton9714f992001-10-16 21:19:45 +0000222 if (r_strlen <= 0)
223 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000224
Jeremy Hylton9714f992001-10-16 21:19:45 +0000225 zst.avail_in = length;
226 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000227
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000228 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000229 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000230
Jeremy Hylton9714f992001-10-16 21:19:45 +0000231 zst.zalloc = (alloc_func)NULL;
232 zst.zfree = (free_func)Z_NULL;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000233 zst.next_out = (Byte *)PyString_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000234 zst.next_in = (Byte *)input;
235 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000236
Jeremy Hylton9714f992001-10-16 21:19:45 +0000237 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000238 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000239 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000240 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000241 PyErr_SetString(PyExc_MemoryError,
242 "Out of memory while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000243 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000244 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000245 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000246 zlib_error(zst, err, "while preparing to decompress data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000247 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000248 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000249
Jeremy Hylton9714f992001-10-16 21:19:45 +0000250 do {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000251 Py_BEGIN_ALLOW_THREADS
252 err=inflate(&zst, Z_FINISH);
253 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000254
Jeremy Hylton9714f992001-10-16 21:19:45 +0000255 switch(err) {
256 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000257 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000258 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000259 /*
260 * If there is at least 1 byte of room according to zst.avail_out
261 * and we get this error, assume that it means zlib cannot
262 * process the inflate call() due to an error in the data.
263 */
Jeremy Hylton0965e082001-10-16 21:56:09 +0000264 if (zst.avail_out > 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000265 PyErr_Format(ZlibError, "Error %i while decompressing data",
266 err);
267 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000268 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000269 }
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000270 /* fall through */
271 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000272 /* need more memory */
Jeremy Hylton9714f992001-10-16 21:19:45 +0000273 if (_PyString_Resize(&result_str, r_strlen << 1) == -1) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000274 inflateEnd(&zst);
275 result_str = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000276 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000277 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000278 zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000279 + r_strlen;
280 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000281 r_strlen = r_strlen << 1;
282 break;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000283 default:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000284 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000285 zlib_error(zst, err, "while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000286 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000287 }
288 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000289
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000290 err = inflateEnd(&zst);
291 if (err != Z_OK) {
292 zlib_error(zst, err, "while finishing data decompression");
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000293 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000294 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000295
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000296 _PyString_Resize(&result_str, zst.total_out);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000297 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000298
299 error:
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000300 Py_XDECREF(result_str);
301 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000302}
303
304static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000305PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000306{
Jeremy Hylton499000002001-10-16 21:59:35 +0000307 compobject *self;
308 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
309 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000310
Jeremy Hylton499000002001-10-16 21:59:35 +0000311 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
312 &memLevel, &strategy))
313 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000314
Jeremy Hylton499000002001-10-16 21:59:35 +0000315 self = newcompobject(&Comptype);
316 if (self==NULL)
317 return(NULL);
318 self->zst.zalloc = (alloc_func)NULL;
319 self->zst.zfree = (free_func)Z_NULL;
320 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
321 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000322 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000323 self->is_initialised = 1;
324 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000325 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000326 Py_DECREF(self);
327 PyErr_SetString(PyExc_MemoryError,
328 "Can't allocate memory for compression object");
329 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000330 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000331 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000332 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000333 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000334 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000335 zlib_error(self->zst, err, "while creating compression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000336 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000337 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000338 }
339}
340
341static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000342PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000343{
Jeremy Hylton499000002001-10-16 21:59:35 +0000344 int wbits=DEF_WBITS, err;
345 compobject *self;
346 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
347 return NULL;
348
349 self = newcompobject(&Decomptype);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000350 if (self == NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000351 return(NULL);
352 self->zst.zalloc = (alloc_func)NULL;
353 self->zst.zfree = (free_func)Z_NULL;
354 err = inflateInit2(&self->zst, wbits);
355 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000356 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000357 self->is_initialised = 1;
358 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000359 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000360 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000361 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000362 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000363 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000364 Py_DECREF(self);
365 PyErr_SetString(PyExc_MemoryError,
366 "Can't allocate memory for decompression object");
367 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000368 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000369 zlib_error(self->zst, err, "while creating decompression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000370 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000371 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000372 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000373}
374
375static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000376Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000377{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000378 ENTER_ZLIB
379
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000380 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000381 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000382 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000383 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000384 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000385
386 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000387}
388
389static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000390Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000391{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000392 ENTER_ZLIB
393
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000394 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000395 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000396 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000397 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000398 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000399
400 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000401}
402
Guido van Rossum3c540301997-06-03 22:21:03 +0000403static char comp_compress__doc__[] =
404"compress(data) -- Return a string containing a compressed version of the data.\n\n"
405"After calling this function, some of the input data may still\n"
406"be stored in internal buffers for later processing.\n"
407"Call the flush() method to clear these buffers."
408;
409
410
Guido van Rossumfb221561997-04-29 15:38:09 +0000411static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000412PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000413{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000414 int err, inplen, length = DEFAULTALLOC;
415 PyObject *RetVal;
416 Byte *input;
417 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000418
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000419 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000420 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000421
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000422 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000423 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000424
425 ENTER_ZLIB
426
Jeremy Hylton9714f992001-10-16 21:19:45 +0000427 start_total_out = self->zst.total_out;
428 self->zst.avail_in = inplen;
429 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000430 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000431 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000432
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000433 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000434 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000435 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000436
Jeremy Hylton9714f992001-10-16 21:19:45 +0000437 /* while Z_OK and the output buffer is full, there might be more output,
438 so extend the output buffer and try again */
439 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000440 if (_PyString_Resize(&RetVal, length << 1) == -1) {
441 RetVal = NULL;
442 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000443 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000444 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000445 + length;
446 self->zst.avail_out = length;
447 length = length << 1;
448
449 Py_BEGIN_ALLOW_THREADS
450 err = deflate(&(self->zst), Z_NO_FLUSH);
451 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000452 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000453 /* We will only get Z_BUF_ERROR if the output buffer was full but
454 there wasn't more output when we tried again, so it is not an error
455 condition.
456 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000457
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000458 if (err != Z_OK && err != Z_BUF_ERROR) {
459 zlib_error(self->zst, err, "while compressing");
460 Py_DECREF(RetVal);
461 RetVal = NULL;
462 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000463 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000464 if (_PyString_Resize(&RetVal,
465 self->zst.total_out - start_total_out) < 0)
466 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000467
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000468 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000469 LEAVE_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000470 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000471}
472
Guido van Rossum3c540301997-06-03 22:21:03 +0000473static char decomp_decompress__doc__[] =
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000474"decompress(data, max_length) -- Return a string containing\n"
475"the decompressed version of the data.\n\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000476"After calling this function, some of the input data may still\n"
477"be stored in internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000478"Call the flush() method to clear these buffers.\n"
479"If the max_length parameter is specified then the return value will be\n"
480"no longer than max_length. Unconsumed input data will be stored in\n"
481"the unconsumed_tail attribute."
Guido van Rossum3c540301997-06-03 22:21:03 +0000482;
483
Guido van Rossumfb221561997-04-29 15:38:09 +0000484static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000485PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000486{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000487 int err, inplen, old_length, length = DEFAULTALLOC;
488 int max_length = 0;
489 PyObject *RetVal;
490 Byte *input;
491 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000492
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000493 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
494 &inplen, &max_length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000495 return NULL;
496 if (max_length < 0) {
497 PyErr_SetString(PyExc_ValueError,
498 "max_length must be greater than zero");
499 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000500 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000501
Jeremy Hylton9714f992001-10-16 21:19:45 +0000502 /* limit amount of data allocated to max_length */
503 if (max_length && length > max_length)
504 length = max_length;
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000505 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000506 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000507
508 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000509
Jeremy Hylton9714f992001-10-16 21:19:45 +0000510 start_total_out = self->zst.total_out;
511 self->zst.avail_in = inplen;
512 self->zst.next_in = input;
513 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000514 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000515
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000516 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000517 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000518 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000519
Jeremy Hylton9714f992001-10-16 21:19:45 +0000520 /* While Z_OK and the output buffer is full, there might be more output.
521 So extend the output buffer and try again.
522 */
523 while (err == Z_OK && self->zst.avail_out == 0) {
524 /* If max_length set, don't continue decompressing if we've already
525 reached the limit.
526 */
527 if (max_length && length >= max_length)
528 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000529
Jeremy Hylton9714f992001-10-16 21:19:45 +0000530 /* otherwise, ... */
531 old_length = length;
532 length = length << 1;
533 if (max_length && length > max_length)
534 length = max_length;
535
536 if (_PyString_Resize(&RetVal, length) == -1) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000537 RetVal = NULL;
538 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000539 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000540 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000541 + old_length;
542 self->zst.avail_out = length - old_length;
543
544 Py_BEGIN_ALLOW_THREADS
545 err = inflate(&(self->zst), Z_SYNC_FLUSH);
546 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000547 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000548
549 /* Not all of the compressed data could be accomodated in the output buffer
550 of specified size. Return the unconsumed tail in an attribute.*/
551 if(max_length) {
552 Py_DECREF(self->unconsumed_tail);
553 self->unconsumed_tail = PyString_FromStringAndSize(self->zst.next_in,
554 self->zst.avail_in);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000555 if(!self->unconsumed_tail) {
556 Py_DECREF(RetVal);
557 RetVal = NULL;
558 goto error;
559 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000560 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000561
Jeremy Hylton9714f992001-10-16 21:19:45 +0000562 /* The end of the compressed data has been reached, so set the
563 unused_data attribute to a string containing the remainder of the
564 data in the string. Note that this is also a logical place to call
565 inflateEnd, but the old behaviour of only calling it on flush() is
566 preserved.
567 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000568 if (err == Z_STREAM_END) {
569 Py_XDECREF(self->unused_data); /* Free original empty string */
570 self->unused_data = PyString_FromStringAndSize(
571 (char *)self->zst.next_in, self->zst.avail_in);
572 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000573 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000574 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000575 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000576 /* We will only get Z_BUF_ERROR if the output buffer was full
577 but there wasn't more output when we tried again, so it is
578 not an error condition.
579 */
580 } else if (err != Z_OK && err != Z_BUF_ERROR) {
581 zlib_error(self->zst, err, "while decompressing");
582 Py_DECREF(RetVal);
583 RetVal = NULL;
584 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000585 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000586
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000587 if (_PyString_Resize(&RetVal, self->zst.total_out - start_total_out) < 0)
588 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000589
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000590 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000591 LEAVE_ZLIB
592
593 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000594}
595
Guido van Rossum3c540301997-06-03 22:21:03 +0000596static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000597"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
598"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
599"default value used when mode is not specified is Z_FINISH.\n"
600"If mode == Z_FINISH, the compressor object can no longer be used after\n"
601"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000602;
603
Guido van Rossumfb221561997-04-29 15:38:09 +0000604static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000605PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000606{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000607 int err, length = DEFAULTALLOC;
608 PyObject *RetVal;
609 int flushmode = Z_FINISH;
610 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000611
Jeremy Hylton9714f992001-10-16 21:19:45 +0000612 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
613 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000614
Jeremy Hylton9714f992001-10-16 21:19:45 +0000615 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
616 doing any work at all; just return an empty string. */
617 if (flushmode == Z_NO_FLUSH) {
618 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000619 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000620
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000621 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000622 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000623
624 ENTER_ZLIB
625
626 start_total_out = self->zst.total_out;
627 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000628 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000629 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000630
631 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000632 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000633 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000634
Jeremy Hylton9714f992001-10-16 21:19:45 +0000635 /* while Z_OK and the output buffer is full, there might be more output,
636 so extend the output buffer and try again */
637 while (err == Z_OK && self->zst.avail_out == 0) {
638 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000639 RetVal = NULL;
640 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000641 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000642 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000643 + length;
644 self->zst.avail_out = length;
645 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000646
Jeremy Hylton9714f992001-10-16 21:19:45 +0000647 Py_BEGIN_ALLOW_THREADS
648 err = deflate(&(self->zst), flushmode);
649 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000650 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000651
Jeremy Hylton9714f992001-10-16 21:19:45 +0000652 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
653 various data structures. Note we should only get Z_STREAM_END when
654 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000655 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
656 err = deflateEnd(&(self->zst));
657 if (err != Z_OK) {
658 zlib_error(self->zst, err, "from deflateEnd()");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000659 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000660 RetVal = NULL;
661 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000662 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000663 else
664 self->is_initialised = 0;
665
666 /* We will only get Z_BUF_ERROR if the output buffer was full
667 but there wasn't more output when we tried again, so it is
668 not an error condition.
669 */
670 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
671 zlib_error(self->zst, err, "while flushing");
672 Py_DECREF(RetVal);
673 RetVal = NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000674 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000675
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000676 if (_PyString_Resize(&RetVal, self->zst.total_out - start_total_out) < 0)
677 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000678
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000679 error:
680 LEAVE_ZLIB;
681
682 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000683}
684
Guido van Rossum3c540301997-06-03 22:21:03 +0000685static char decomp_flush__doc__[] =
686"flush() -- Return a string containing any remaining decompressed data. "
687"The decompressor object can no longer be used after this call."
688;
689
Guido van Rossumfb221561997-04-29 15:38:09 +0000690static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000691PyZlib_unflush(compobject *self, PyObject *args)
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000692/*decompressor flush is a no-op because all pending data would have been
693 flushed by the decompress method. However, this routine previously called
694 inflateEnd, causing any further decompress or flush calls to raise
695 exceptions. This behaviour has been preserved.*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000696{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000697 int err;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000698 PyObject * retval = NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000699
Jeremy Hylton9714f992001-10-16 21:19:45 +0000700 if (!PyArg_ParseTuple(args, ""))
701 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000702
Jeremy Hylton9714f992001-10-16 21:19:45 +0000703 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000704
Jeremy Hylton9714f992001-10-16 21:19:45 +0000705 err = inflateEnd(&(self->zst));
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000706 if (err != Z_OK)
Jeremy Hylton0965e082001-10-16 21:56:09 +0000707 zlib_error(self->zst, err, "from inflateEnd()");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000708 else {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000709 self->is_initialised = 0;
710 retval = PyString_FromStringAndSize(NULL, 0);
711 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000712
Jeremy Hylton9714f992001-10-16 21:19:45 +0000713 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000714
Jeremy Hylton9714f992001-10-16 21:19:45 +0000715 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000716}
717
718static PyMethodDef comp_methods[] =
719{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000720 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
721 comp_compress__doc__},
722 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
723 comp_flush__doc__},
724 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000725};
726
727static PyMethodDef Decomp_methods[] =
728{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000729 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
730 decomp_decompress__doc__},
731 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
732 decomp_flush__doc__},
733 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000734};
735
736static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000737Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000738{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000739 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
740 internal data. */
741
742 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000743}
744
745static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000746Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000747{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000748 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000749
Jeremy Hylton9714f992001-10-16 21:19:45 +0000750 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000751
Jeremy Hylton9714f992001-10-16 21:19:45 +0000752 if (strcmp(name, "unused_data") == 0) {
753 Py_INCREF(self->unused_data);
754 retval = self->unused_data;
755 } else if (strcmp(name, "unconsumed_tail") == 0) {
756 Py_INCREF(self->unconsumed_tail);
757 retval = self->unconsumed_tail;
758 } else
759 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000760
Jeremy Hylton9714f992001-10-16 21:19:45 +0000761 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000762
Jeremy Hylton9714f992001-10-16 21:19:45 +0000763 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000764}
765
Guido van Rossum3c540301997-06-03 22:21:03 +0000766static char adler32__doc__[] =
767"adler32(string) -- Compute an Adler-32 checksum of string, using "
768"a default starting value, and returning an integer value.\n"
769"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
770"the starting value provided, and returning an integer value\n"
771;
772
Guido van Rossumfb221561997-04-29 15:38:09 +0000773static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000774PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000775{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000776 uLong adler32val = adler32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000777 Byte *buf;
778 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000779
Guido van Rossum43713e52000-02-29 13:59:29 +0000780 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000781 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000782 adler32val = adler32(adler32val, buf, len);
783 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000784}
785
Guido van Rossum3c540301997-06-03 22:21:03 +0000786static char crc32__doc__[] =
787"crc32(string) -- Compute a CRC-32 checksum of string, using "
788"a default starting value, and returning an integer value.\n"
789"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
790"the starting value provided, and returning an integer value.\n"
791;
Guido van Rossumfb221561997-04-29 15:38:09 +0000792
793static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000794PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000795{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000796 uLong crc32val = crc32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000797 Byte *buf;
798 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000799 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000800 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000801 crc32val = crc32(crc32val, buf, len);
802 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000803}
804
805
806static PyMethodDef zlib_methods[] =
807{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000808 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
809 adler32__doc__},
810 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
811 compress__doc__},
812 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
813 compressobj__doc__},
814 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
815 crc32__doc__},
816 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
817 decompress__doc__},
818 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
819 decompressobj__doc__},
820 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000821};
822
823statichere PyTypeObject Comptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000824 PyObject_HEAD_INIT(0)
825 0,
826 "Compress",
827 sizeof(compobject),
828 0,
829 (destructor)Comp_dealloc, /*tp_dealloc*/
830 0, /*tp_print*/
831 (getattrfunc)Comp_getattr, /*tp_getattr*/
832 0, /*tp_setattr*/
833 0, /*tp_compare*/
834 0, /*tp_repr*/
835 0, /*tp_as_number*/
836 0, /*tp_as_sequence*/
837 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000838};
839
840statichere PyTypeObject Decomptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000841 PyObject_HEAD_INIT(0)
842 0,
843 "Decompress",
844 sizeof(compobject),
845 0,
846 (destructor)Decomp_dealloc, /*tp_dealloc*/
847 0, /*tp_print*/
848 (getattrfunc)Decomp_getattr, /*tp_getattr*/
849 0, /*tp_setattr*/
850 0, /*tp_compare*/
851 0, /*tp_repr*/
852 0, /*tp_as_number*/
853 0, /*tp_as_sequence*/
854 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000855};
856
857/* The following insint() routine was blatantly ripped off from
858 socketmodule.c */
859
860/* Convenience routine to export an integer value.
861 For simplicity, errors (which are unlikely anyway) are ignored. */
862static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000863insint(PyObject *d, char *name, int value)
Guido van Rossumfb221561997-04-29 15:38:09 +0000864{
865 PyObject *v = PyInt_FromLong((long) value);
866 if (v == NULL) {
867 /* Don't bother reporting this error */
868 PyErr_Clear();
869 }
870 else {
871 PyDict_SetItemString(d, name, v);
872 Py_DECREF(v);
873 }
874}
875
Guido van Rossum3c540301997-06-03 22:21:03 +0000876static char zlib_module_documentation[]=
877"The functions in this module allow compression and decompression "
878"using the zlib library, which is based on GNU zip. \n\n"
879"adler32(string) -- Compute an Adler-32 checksum.\n"
880"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
881"compress(string) -- Compress a string.\n"
882"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
883"compressobj([level]) -- Return a compressor object.\n"
884"crc32(string) -- Compute a CRC-32 checksum.\n"
885"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000886"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000887"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
888"Compressor objects support compress() and flush() methods; decompressor \n"
889"objects support decompress() and flush()."
890;
891
Guido van Rossum3886bb61998-12-04 18:50:17 +0000892DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000893PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000894{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000895 PyObject *m, *d, *ver;
896 Comptype.ob_type = &PyType_Type;
897 Decomptype.ob_type = &PyType_Type;
898 m = Py_InitModule4("zlib", zlib_methods,
899 zlib_module_documentation,
900 (PyObject*)NULL,PYTHON_API_VERSION);
901 d = PyModule_GetDict(m);
902 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
903 if (ZlibError != NULL)
904 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000905
Jeremy Hylton9714f992001-10-16 21:19:45 +0000906 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
907 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
908 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
909 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
910 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
911 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
912 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
913 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
914 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
915
916 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
917 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
918 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
919 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
920
921 ver = PyString_FromString(ZLIB_VERSION);
922 if (ver != NULL) {
923 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
924 Py_DECREF(ver);
925 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000926
927#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +0000928 zlib_lock = PyThread_allocate_lock();
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000929#endif // WITH_THREAD
Guido van Rossumfb221561997-04-29 15:38:09 +0000930}