blob: feb52ea93814b8ae0de59e8c7ad68b0b5bcbde18 [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
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000018 N.B.
19
20 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions
21 that modify the components of preexisting de/compress objects, it
22 could prove to be a performance gain on multiprocessor machines if
23 there was an de/compress object-specific lock. However, for the
24 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL
25 de/compress objects.
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000026 */
27
28static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */
29
30#define ENTER_ZLIB \
Tim Peters6605c642001-10-17 03:43:54 +000031 Py_BEGIN_ALLOW_THREADS \
32 PyThread_acquire_lock(zlib_lock, 1); \
33 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000034
35#define LEAVE_ZLIB \
Tim Peters6605c642001-10-17 03:43:54 +000036 PyThread_release_lock(zlib_lock);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000037
38#else
39
40#define ENTER_ZLIB
41#define LEAVE_ZLIB
42
43#endif
44
Guido van Rossumfb221561997-04-29 15:38:09 +000045/* The following parameters are copied from zutil.h, version 0.95 */
46#define DEFLATED 8
47#if MAX_MEM_LEVEL >= 8
48# define DEF_MEM_LEVEL 8
49#else
50# define DEF_MEM_LEVEL MAX_MEM_LEVEL
51#endif
52#define DEF_WBITS MAX_WBITS
53
Guido van Rossumb729a1d1999-04-07 20:23:17 +000054/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
55#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000056#define PyInit_zlib initzlib
57
58staticforward PyTypeObject Comptype;
59staticforward PyTypeObject Decomptype;
60
61static PyObject *ZlibError;
62
Tim Peters977e5402001-10-17 03:57:20 +000063typedef struct
Guido van Rossumfb221561997-04-29 15:38:09 +000064{
Jeremy Hylton9714f992001-10-16 21:19:45 +000065 PyObject_HEAD
66 z_stream zst;
67 PyObject *unused_data;
68 PyObject *unconsumed_tail;
69 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000070} compobject;
71
Jeremy Hylton0965e082001-10-16 21:56:09 +000072static void
73zlib_error(z_stream zst, int err, char *msg)
74{
75 if (zst.msg == Z_NULL)
76 PyErr_Format(ZlibError, "Error %d %s", err, msg);
77 else
78 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
79}
80
Tim Peters977e5402001-10-17 03:57:20 +000081static char compressobj__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +000082"compressobj([level]) -- Return a compressor object.\n"
83"\n"
84"Optional arg level is the compression level, in 1-9.";
Guido van Rossum3c540301997-06-03 22:21:03 +000085
Tim Peters977e5402001-10-17 03:57:20 +000086static char decompressobj__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +000087"decompressobj([wbits]) -- Return a decompressor object.\n"
88"\n"
89"Optional arg wbits is the window buffer size.";
Guido van Rossum3c540301997-06-03 22:21:03 +000090
Guido van Rossumfb221561997-04-29 15:38:09 +000091static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000092newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +000093{
Tim Peters977e5402001-10-17 03:57:20 +000094 compobject *self;
Jeremy Hylton9714f992001-10-16 21:19:45 +000095 self = PyObject_New(compobject, type);
96 if (self == NULL)
97 return NULL;
98 self->is_initialised = 0;
99 self->unused_data = PyString_FromString("");
100 if (self->unused_data == NULL) {
101 Py_DECREF(self);
102 return NULL;
103 }
104 self->unconsumed_tail = PyString_FromString("");
105 if (self->unconsumed_tail == NULL) {
106 Py_DECREF(self);
107 return NULL;
108 }
109 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000110}
111
Tim Peters977e5402001-10-17 03:57:20 +0000112static char compress__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +0000113"compress(string[, level]) -- Returned compressed string.\n"
114"\n"
115"Optional arg level is the compression level, in 1-9.";
Guido van Rossum3c540301997-06-03 22:21:03 +0000116
Guido van Rossumfb221561997-04-29 15:38:09 +0000117static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000118PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000119{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000120 PyObject *ReturnVal = NULL;
121 Byte *input, *output;
122 int length, level=Z_DEFAULT_COMPRESSION, err;
123 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000124
Jeremy Hylton9714f992001-10-16 21:19:45 +0000125 /* require Python string object, optional 'level' arg */
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000126 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000127 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000128
Jeremy Hylton9714f992001-10-16 21:19:45 +0000129 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000130
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000131 output = (Byte*)malloc(zst.avail_out);
132 if (output == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000133 PyErr_SetString(PyExc_MemoryError,
134 "Can't allocate memory to compress data");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000135 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000136 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000137
Jeremy Hylton9714f992001-10-16 21:19:45 +0000138 /* Past the point of no return. From here on out, we need to make sure
139 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000140
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000141 zst.zalloc = (alloc_func)NULL;
142 zst.zfree = (free_func)Z_NULL;
143 zst.next_out = (Byte *)output;
144 zst.next_in = (Byte *)input;
145 zst.avail_in = length;
146 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000147
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000148 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000149 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000150 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000151 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000152 PyErr_SetString(PyExc_MemoryError,
153 "Out of memory while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000154 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000155 case(Z_STREAM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000156 PyErr_SetString(ZlibError,
157 "Bad compression level");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000158 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000159 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000160 deflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000161 zlib_error(zst, err, "while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000162 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000163 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000164
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000165 Py_BEGIN_ALLOW_THREADS;
166 err = deflate(&zst, Z_FINISH);
167 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000168
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000169 if (err != Z_STREAM_END) {
170 zlib_error(zst, err, "while compressing data");
171 deflateEnd(&zst);
172 goto error;
173 }
Tim Peters977e5402001-10-17 03:57:20 +0000174
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000175 err=deflateEnd(&zst);
176 if (err == Z_OK)
Tim Peters977e5402001-10-17 03:57:20 +0000177 ReturnVal = PyString_FromStringAndSize((char *)output,
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000178 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000179 else
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000180 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000181
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000182 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000183 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000184
Jeremy Hylton9714f992001-10-16 21:19:45 +0000185 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000186}
187
Tim Peters977e5402001-10-17 03:57:20 +0000188static char decompress__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +0000189"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
190"\n"
191"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
192"the initial output buffer size.";
Guido van Rossum3c540301997-06-03 22:21:03 +0000193
Guido van Rossumfb221561997-04-29 15:38:09 +0000194static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000195PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000196{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000197 PyObject *result_str;
198 Byte *input;
199 int length, err;
200 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
201 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000202
Tim Peters977e5402001-10-17 03:57:20 +0000203 if (!PyArg_ParseTuple(args, "s#|ii:decompress",
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000204 &input, &length, &wsize, &r_strlen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000205 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000206
Jeremy Hylton9714f992001-10-16 21:19:45 +0000207 if (r_strlen <= 0)
208 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000209
Jeremy Hylton9714f992001-10-16 21:19:45 +0000210 zst.avail_in = length;
211 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000212
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000213 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000214 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000215
Jeremy Hylton9714f992001-10-16 21:19:45 +0000216 zst.zalloc = (alloc_func)NULL;
217 zst.zfree = (free_func)Z_NULL;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000218 zst.next_out = (Byte *)PyString_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000219 zst.next_in = (Byte *)input;
220 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000221
Jeremy Hylton9714f992001-10-16 21:19:45 +0000222 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000223 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000224 break;
Tim Peters977e5402001-10-17 03:57:20 +0000225 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000226 PyErr_SetString(PyExc_MemoryError,
227 "Out of memory while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000228 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000229 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000230 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000231 zlib_error(zst, err, "while preparing to decompress data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000232 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000233 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000234
Jeremy Hylton9714f992001-10-16 21:19:45 +0000235 do {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000236 Py_BEGIN_ALLOW_THREADS
237 err=inflate(&zst, Z_FINISH);
238 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000239
Jeremy Hylton9714f992001-10-16 21:19:45 +0000240 switch(err) {
241 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000242 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000243 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000244 /*
245 * If there is at least 1 byte of room according to zst.avail_out
246 * and we get this error, assume that it means zlib cannot
247 * process the inflate call() due to an error in the data.
248 */
Jeremy Hylton0965e082001-10-16 21:56:09 +0000249 if (zst.avail_out > 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000250 PyErr_Format(ZlibError, "Error %i while decompressing data",
251 err);
252 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000253 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000254 }
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000255 /* fall through */
256 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000257 /* need more memory */
Jeremy Hylton9714f992001-10-16 21:19:45 +0000258 if (_PyString_Resize(&result_str, r_strlen << 1) == -1) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000259 inflateEnd(&zst);
260 result_str = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000261 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000262 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000263 zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000264 + r_strlen;
265 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000266 r_strlen = r_strlen << 1;
267 break;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000268 default:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000269 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000270 zlib_error(zst, err, "while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000271 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000272 }
273 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000274
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000275 err = inflateEnd(&zst);
276 if (err != Z_OK) {
277 zlib_error(zst, err, "while finishing data decompression");
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000278 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000279 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000280
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000281 _PyString_Resize(&result_str, zst.total_out);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000282 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000283
284 error:
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000285 Py_XDECREF(result_str);
286 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000287}
288
289static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000290PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000291{
Jeremy Hylton499000002001-10-16 21:59:35 +0000292 compobject *self;
293 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
294 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000295
Jeremy Hylton499000002001-10-16 21:59:35 +0000296 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
297 &memLevel, &strategy))
298 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000299
Jeremy Hylton499000002001-10-16 21:59:35 +0000300 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000301 if (self==NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000302 return(NULL);
303 self->zst.zalloc = (alloc_func)NULL;
304 self->zst.zfree = (free_func)Z_NULL;
305 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
306 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000307 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000308 self->is_initialised = 1;
309 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000310 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000311 Py_DECREF(self);
312 PyErr_SetString(PyExc_MemoryError,
313 "Can't allocate memory for compression object");
314 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000315 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000316 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000317 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000318 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000319 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000320 zlib_error(self->zst, err, "while creating compression object");
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
326static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000327PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000328{
Jeremy Hylton499000002001-10-16 21:59:35 +0000329 int wbits=DEF_WBITS, err;
330 compobject *self;
331 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
332 return NULL;
333
334 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000335 if (self == NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000336 return(NULL);
337 self->zst.zalloc = (alloc_func)NULL;
338 self->zst.zfree = (free_func)Z_NULL;
339 err = inflateInit2(&self->zst, wbits);
340 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000341 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000342 self->is_initialised = 1;
343 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000344 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000345 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000346 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000347 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000348 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000349 Py_DECREF(self);
350 PyErr_SetString(PyExc_MemoryError,
351 "Can't allocate memory for decompression object");
352 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000353 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000354 zlib_error(self->zst, err, "while creating decompression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000355 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000356 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000357 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000358}
359
360static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000361Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000362{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000363 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000364 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000365 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000366 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000367 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000368}
369
370static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000371Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000372{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000373 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000374 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000375 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000376 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000377 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000378}
379
Guido van Rossum3c540301997-06-03 22:21:03 +0000380static char comp_compress__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +0000381"compress(data) -- Return a string containing data compressed.\n"
382"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000383"After calling this function, some of the input data may still\n"
384"be stored in internal buffers for later processing.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000385"Call the flush() method to clear these buffers.";
Guido van Rossum3c540301997-06-03 22:21:03 +0000386
387
Guido van Rossumfb221561997-04-29 15:38:09 +0000388static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000389PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000390{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000391 int err, inplen, length = DEFAULTALLOC;
392 PyObject *RetVal;
393 Byte *input;
394 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000395
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000396 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000397 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000398
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000399 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000400 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000401
402 ENTER_ZLIB
403
Jeremy Hylton9714f992001-10-16 21:19:45 +0000404 start_total_out = self->zst.total_out;
405 self->zst.avail_in = inplen;
406 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000407 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000408 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000409
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000410 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000411 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000412 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000413
Jeremy Hylton9714f992001-10-16 21:19:45 +0000414 /* while Z_OK and the output buffer is full, there might be more output,
415 so extend the output buffer and try again */
416 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000417 if (_PyString_Resize(&RetVal, length << 1) == -1) {
418 RetVal = NULL;
419 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000420 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000421 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000422 + length;
423 self->zst.avail_out = length;
424 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000425
Jeremy Hylton9714f992001-10-16 21:19:45 +0000426 Py_BEGIN_ALLOW_THREADS
427 err = deflate(&(self->zst), Z_NO_FLUSH);
428 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000429 }
Tim Peters977e5402001-10-17 03:57:20 +0000430 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000431 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000432 condition.
433 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000434
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000435 if (err != Z_OK && err != Z_BUF_ERROR) {
436 zlib_error(self->zst, err, "while compressing");
437 Py_DECREF(RetVal);
438 RetVal = NULL;
439 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000440 }
Tim Peters977e5402001-10-17 03:57:20 +0000441 if (_PyString_Resize(&RetVal,
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000442 self->zst.total_out - start_total_out) < 0)
443 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000444
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000445 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000446 LEAVE_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000447 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000448}
449
Guido van Rossum3c540301997-06-03 22:21:03 +0000450static char decomp_decompress__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +0000451"decompress(data, max_length) -- Return a string containing the decompressed\n"
452"version of the data.\n"
453"\n"
454"After calling this function, some of the input data may still be stored in\n"
455"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000456"Call the flush() method to clear these buffers.\n"
457"If the max_length parameter is specified then the return value will be\n"
458"no longer than max_length. Unconsumed input data will be stored in\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000459"the unconsumed_tail attribute.";
Guido van Rossum3c540301997-06-03 22:21:03 +0000460
Guido van Rossumfb221561997-04-29 15:38:09 +0000461static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000462PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000463{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000464 int err, inplen, old_length, length = DEFAULTALLOC;
465 int max_length = 0;
466 PyObject *RetVal;
467 Byte *input;
468 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000469
Tim Peters977e5402001-10-17 03:57:20 +0000470 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000471 &inplen, &max_length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000472 return NULL;
473 if (max_length < 0) {
474 PyErr_SetString(PyExc_ValueError,
475 "max_length must be greater than zero");
476 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000477 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000478
Jeremy Hylton9714f992001-10-16 21:19:45 +0000479 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000480 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000481 length = max_length;
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000482 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000483 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000484
485 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000486
Jeremy Hylton9714f992001-10-16 21:19:45 +0000487 start_total_out = self->zst.total_out;
488 self->zst.avail_in = inplen;
489 self->zst.next_in = input;
490 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000491 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000492
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000493 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000494 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000495 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000496
Jeremy Hylton9714f992001-10-16 21:19:45 +0000497 /* While Z_OK and the output buffer is full, there might be more output.
498 So extend the output buffer and try again.
499 */
Tim Peters977e5402001-10-17 03:57:20 +0000500 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000501 /* If max_length set, don't continue decompressing if we've already
502 reached the limit.
503 */
504 if (max_length && length >= max_length)
505 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000506
Jeremy Hylton9714f992001-10-16 21:19:45 +0000507 /* otherwise, ... */
508 old_length = length;
509 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000510 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000511 length = max_length;
512
513 if (_PyString_Resize(&RetVal, length) == -1) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000514 RetVal = NULL;
515 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000516 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000517 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000518 + old_length;
519 self->zst.avail_out = length - old_length;
520
521 Py_BEGIN_ALLOW_THREADS
522 err = inflate(&(self->zst), Z_SYNC_FLUSH);
523 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000524 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000525
526 /* Not all of the compressed data could be accomodated in the output buffer
527 of specified size. Return the unconsumed tail in an attribute.*/
528 if(max_length) {
529 Py_DECREF(self->unconsumed_tail);
Jack Jansen72af01a2001-10-23 22:29:06 +0000530 self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000531 self->zst.avail_in);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000532 if(!self->unconsumed_tail) {
533 Py_DECREF(RetVal);
534 RetVal = NULL;
535 goto error;
536 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000537 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000538
Tim Peters977e5402001-10-17 03:57:20 +0000539 /* The end of the compressed data has been reached, so set the
540 unused_data attribute to a string containing the remainder of the
541 data in the string. Note that this is also a logical place to call
Jeremy Hylton9714f992001-10-16 21:19:45 +0000542 inflateEnd, but the old behaviour of only calling it on flush() is
543 preserved.
544 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000545 if (err == Z_STREAM_END) {
546 Py_XDECREF(self->unused_data); /* Free original empty string */
547 self->unused_data = PyString_FromStringAndSize(
548 (char *)self->zst.next_in, self->zst.avail_in);
549 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000550 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000551 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000552 }
Tim Peters977e5402001-10-17 03:57:20 +0000553 /* We will only get Z_BUF_ERROR if the output buffer was full
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000554 but there wasn't more output when we tried again, so it is
555 not an error condition.
556 */
557 } else if (err != Z_OK && err != Z_BUF_ERROR) {
558 zlib_error(self->zst, err, "while decompressing");
559 Py_DECREF(RetVal);
560 RetVal = NULL;
561 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000562 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000563
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000564 if (_PyString_Resize(&RetVal, self->zst.total_out - start_total_out) < 0)
565 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000566
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000567 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000568 LEAVE_ZLIB
569
570 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000571}
572
Guido van Rossum3c540301997-06-03 22:21:03 +0000573static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000574"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000575"\n"
576"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000577"default value used when mode is not specified is Z_FINISH.\n"
578"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000579"calling the flush() method. Otherwise, more data can still be compressed.\n";
Guido van Rossum3c540301997-06-03 22:21:03 +0000580
Guido van Rossumfb221561997-04-29 15:38:09 +0000581static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000582PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000583{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000584 int err, length = DEFAULTALLOC;
585 PyObject *RetVal;
586 int flushmode = Z_FINISH;
587 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000588
Jeremy Hylton9714f992001-10-16 21:19:45 +0000589 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
590 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000591
Jeremy Hylton9714f992001-10-16 21:19:45 +0000592 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
593 doing any work at all; just return an empty string. */
594 if (flushmode == Z_NO_FLUSH) {
595 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000596 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000597
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000598 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000599 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000600
601 ENTER_ZLIB
Tim Peters977e5402001-10-17 03:57:20 +0000602
Jeremy Hylton9714f992001-10-16 21:19:45 +0000603 start_total_out = self->zst.total_out;
604 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000605 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000606 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000607
608 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000609 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000610 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000611
Jeremy Hylton9714f992001-10-16 21:19:45 +0000612 /* while Z_OK and the output buffer is full, there might be more output,
613 so extend the output buffer and try again */
614 while (err == Z_OK && self->zst.avail_out == 0) {
615 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000616 RetVal = NULL;
617 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000618 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000619 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000620 + length;
621 self->zst.avail_out = length;
622 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000623
Jeremy Hylton9714f992001-10-16 21:19:45 +0000624 Py_BEGIN_ALLOW_THREADS
625 err = deflate(&(self->zst), flushmode);
626 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000627 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000628
Jeremy Hylton9714f992001-10-16 21:19:45 +0000629 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000630 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000631 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000632 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
633 err = deflateEnd(&(self->zst));
634 if (err != Z_OK) {
635 zlib_error(self->zst, err, "from deflateEnd()");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000636 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000637 RetVal = NULL;
638 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000639 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000640 else
641 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000642
643 /* We will only get Z_BUF_ERROR if the output buffer was full
644 but there wasn't more output when we tried again, so it is
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000645 not an error condition.
646 */
647 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
648 zlib_error(self->zst, err, "while flushing");
649 Py_DECREF(RetVal);
650 RetVal = NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000651 }
Tim Peters977e5402001-10-17 03:57:20 +0000652
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000653 if (_PyString_Resize(&RetVal, self->zst.total_out - start_total_out) < 0)
654 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000655
Tim Peters977e5402001-10-17 03:57:20 +0000656 error:
Tim Petersb1a37c02001-10-17 03:56:45 +0000657 LEAVE_ZLIB
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000658
659 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000660}
661
Guido van Rossum3c540301997-06-03 22:21:03 +0000662static char decomp_flush__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +0000663"flush() -- Return a string containing any remaining decompressed data.\n"
664"\n"
665"The decompressor object can no longer be used after this call.";
Guido van Rossum3c540301997-06-03 22:21:03 +0000666
Guido van Rossumfb221561997-04-29 15:38:09 +0000667static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000668PyZlib_unflush(compobject *self, PyObject *args)
Tim Peters977e5402001-10-17 03:57:20 +0000669/*decompressor flush is a no-op because all pending data would have been
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000670 flushed by the decompress method. However, this routine previously called
Tim Peters977e5402001-10-17 03:57:20 +0000671 inflateEnd, causing any further decompress or flush calls to raise
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000672 exceptions. This behaviour has been preserved.*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000673{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000674 int err;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000675 PyObject * retval = NULL;
Tim Peters977e5402001-10-17 03:57:20 +0000676
Jeremy Hylton9714f992001-10-16 21:19:45 +0000677 if (!PyArg_ParseTuple(args, ""))
678 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000679
Jeremy Hylton9714f992001-10-16 21:19:45 +0000680 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000681
Jeremy Hylton9714f992001-10-16 21:19:45 +0000682 err = inflateEnd(&(self->zst));
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000683 if (err != Z_OK)
Jeremy Hylton0965e082001-10-16 21:56:09 +0000684 zlib_error(self->zst, err, "from inflateEnd()");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000685 else {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000686 self->is_initialised = 0;
687 retval = PyString_FromStringAndSize(NULL, 0);
688 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000689
Jeremy Hylton9714f992001-10-16 21:19:45 +0000690 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000691
Jeremy Hylton9714f992001-10-16 21:19:45 +0000692 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000693}
694
695static PyMethodDef comp_methods[] =
696{
Tim Peters977e5402001-10-17 03:57:20 +0000697 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000698 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000699 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000700 comp_flush__doc__},
701 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000702};
703
704static PyMethodDef Decomp_methods[] =
705{
Tim Peters977e5402001-10-17 03:57:20 +0000706 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000707 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000708 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000709 decomp_flush__doc__},
710 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000711};
712
713static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000714Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000715{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000716 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
717 internal data. */
718
719 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000720}
721
722static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000723Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000724{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000725 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000726
Jeremy Hylton9714f992001-10-16 21:19:45 +0000727 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000728
Tim Peters977e5402001-10-17 03:57:20 +0000729 if (strcmp(name, "unused_data") == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000730 Py_INCREF(self->unused_data);
731 retval = self->unused_data;
Tim Peters977e5402001-10-17 03:57:20 +0000732 } else if (strcmp(name, "unconsumed_tail") == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000733 Py_INCREF(self->unconsumed_tail);
734 retval = self->unconsumed_tail;
Tim Peters977e5402001-10-17 03:57:20 +0000735 } else
Jeremy Hylton9714f992001-10-16 21:19:45 +0000736 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000737
Jeremy Hylton9714f992001-10-16 21:19:45 +0000738 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000739
Jeremy Hylton9714f992001-10-16 21:19:45 +0000740 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000741}
742
Tim Peters977e5402001-10-17 03:57:20 +0000743static char adler32__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +0000744"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
745"\n"
746"An optional starting value can be specified. The returned checksum is\n"
747"an integer.";
Guido van Rossum3c540301997-06-03 22:21:03 +0000748
Guido van Rossumfb221561997-04-29 15:38:09 +0000749static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000750PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000751{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000752 uLong adler32val = adler32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000753 Byte *buf;
754 int len;
Tim Peters977e5402001-10-17 03:57:20 +0000755
Guido van Rossum43713e52000-02-29 13:59:29 +0000756 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000757 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000758 adler32val = adler32(adler32val, buf, len);
759 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000760}
Tim Peters977e5402001-10-17 03:57:20 +0000761
762static char crc32__doc__[] =
Tim Petersadbd35b2001-10-17 04:16:15 +0000763"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
764"\n"
765"An optional starting value can be specified. The returned checksum is\n"
766"an integer.";
Guido van Rossumfb221561997-04-29 15:38:09 +0000767
768static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000769PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000770{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000771 uLong crc32val = crc32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000772 Byte *buf;
773 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000774 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000775 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000776 crc32val = crc32(crc32val, buf, len);
777 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000778}
Tim Peters977e5402001-10-17 03:57:20 +0000779
Guido van Rossumfb221561997-04-29 15:38:09 +0000780
781static PyMethodDef zlib_methods[] =
782{
Tim Peters977e5402001-10-17 03:57:20 +0000783 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000784 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000785 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000786 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000787 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000788 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000789 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
790 crc32__doc__},
791 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000792 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000793 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000794 decompressobj__doc__},
795 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000796};
797
798statichere PyTypeObject Comptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000799 PyObject_HEAD_INIT(0)
800 0,
Guido van Rossum14648392001-12-08 18:02:58 +0000801 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000802 sizeof(compobject),
803 0,
804 (destructor)Comp_dealloc, /*tp_dealloc*/
805 0, /*tp_print*/
806 (getattrfunc)Comp_getattr, /*tp_getattr*/
807 0, /*tp_setattr*/
808 0, /*tp_compare*/
809 0, /*tp_repr*/
810 0, /*tp_as_number*/
811 0, /*tp_as_sequence*/
812 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000813};
814
815statichere PyTypeObject Decomptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000816 PyObject_HEAD_INIT(0)
817 0,
Guido van Rossum14648392001-12-08 18:02:58 +0000818 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000819 sizeof(compobject),
820 0,
821 (destructor)Decomp_dealloc, /*tp_dealloc*/
822 0, /*tp_print*/
823 (getattrfunc)Decomp_getattr, /*tp_getattr*/
824 0, /*tp_setattr*/
825 0, /*tp_compare*/
826 0, /*tp_repr*/
827 0, /*tp_as_number*/
828 0, /*tp_as_sequence*/
829 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000830};
831
Guido van Rossum3c540301997-06-03 22:21:03 +0000832static char zlib_module_documentation[]=
Tim Petersadbd35b2001-10-17 04:16:15 +0000833"The functions in this module allow compression and decompression using the\n"
834"zlib library, which is based on GNU zip.\n"
835"\n"
836"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
837"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000838"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000839"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000840"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000841"decompressobj([wbits]) -- Return a decompressor object.\n"
842"\n"
843"'wbits' is window buffer size.\n"
844"Compressor objects support compress() and flush() methods; decompressor\n"
845"objects support decompress() and flush().";
Guido van Rossum3c540301997-06-03 22:21:03 +0000846
Guido van Rossum3886bb61998-12-04 18:50:17 +0000847DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000848PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000849{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000850 PyObject *m, *d, *ver;
851 Comptype.ob_type = &PyType_Type;
852 Decomptype.ob_type = &PyType_Type;
853 m = Py_InitModule4("zlib", zlib_methods,
854 zlib_module_documentation,
855 (PyObject*)NULL,PYTHON_API_VERSION);
856 d = PyModule_GetDict(m);
857 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
858 if (ZlibError != NULL)
859 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000860
Jeremy Hylton9714f992001-10-16 21:19:45 +0000861 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
862 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
863 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
864 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
865 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
866 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
867 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
868 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
869 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +0000870
Jeremy Hylton9714f992001-10-16 21:19:45 +0000871 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
872 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
873 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
874 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +0000875
Jeremy Hylton9714f992001-10-16 21:19:45 +0000876 ver = PyString_FromString(ZLIB_VERSION);
877 if (ver != NULL) {
878 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
879 Py_DECREF(ver);
880 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000881
882#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +0000883 zlib_lock = PyThread_allocate_lock();
Sjoerd Mullender556a9382002-03-11 09:20:47 +0000884#endif /* WITH_THREAD */
Guido van Rossumfb221561997-04-29 15:38:09 +0000885}