blob: da31e8b2827d48c63bdb5d314ccc1d74e9695385 [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
Jeremy Hylton938ace62002-07-17 16:30:39 +000058static PyTypeObject Comptype;
59static PyTypeObject Decomptype;
Guido van Rossumfb221561997-04-29 15:38:09 +000060
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
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000081PyDoc_STRVAR(compressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +000082"compressobj([level]) -- Return a compressor object.\n"
83"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000084"Optional arg level is the compression level, in 1-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +000085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000086PyDoc_STRVAR(decompressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +000087"decompressobj([wbits]) -- Return a decompressor object.\n"
88"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000089"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
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000112PyDoc_STRVAR(compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000113"compress(string[, level]) -- Returned compressed string.\n"
114"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000115"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
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000188PyDoc_STRVAR(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"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000192"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 */
Tim Peters5de98422002-04-27 18:44:32 +0000258 if (_PyString_Resize(&result_str, r_strlen << 1) < 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000259 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000260 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000261 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000262 zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000263 + r_strlen;
264 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000265 r_strlen = r_strlen << 1;
266 break;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000267 default:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000268 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000269 zlib_error(zst, err, "while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000270 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000271 }
272 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000273
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000274 err = inflateEnd(&zst);
275 if (err != Z_OK) {
276 zlib_error(zst, err, "while finishing data decompression");
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000277 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000278 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000279
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000280 _PyString_Resize(&result_str, zst.total_out);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000281 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000282
283 error:
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000284 Py_XDECREF(result_str);
285 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000286}
287
288static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000289PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000290{
Jeremy Hylton499000002001-10-16 21:59:35 +0000291 compobject *self;
292 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
293 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000294
Jeremy Hylton499000002001-10-16 21:59:35 +0000295 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
296 &memLevel, &strategy))
297 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000298
Jeremy Hylton499000002001-10-16 21:59:35 +0000299 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000300 if (self==NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000301 return(NULL);
302 self->zst.zalloc = (alloc_func)NULL;
303 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000304 self->zst.next_in = NULL;
305 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000306 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
307 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000308 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000309 self->is_initialised = 1;
310 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000311 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000312 Py_DECREF(self);
313 PyErr_SetString(PyExc_MemoryError,
314 "Can't allocate memory for compression object");
315 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000316 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000317 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000318 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000319 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000320 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000321 zlib_error(self->zst, err, "while creating compression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000322 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000323 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000324 }
325}
326
327static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000328PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000329{
Jeremy Hylton499000002001-10-16 21:59:35 +0000330 int wbits=DEF_WBITS, err;
331 compobject *self;
332 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
333 return NULL;
334
335 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000336 if (self == NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000337 return(NULL);
338 self->zst.zalloc = (alloc_func)NULL;
339 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000340 self->zst.next_in = NULL;
341 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000342 err = inflateInit2(&self->zst, wbits);
343 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000344 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000345 self->is_initialised = 1;
346 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000347 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000348 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000349 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000350 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000351 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000352 Py_DECREF(self);
353 PyErr_SetString(PyExc_MemoryError,
354 "Can't allocate memory for decompression object");
355 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000356 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000357 zlib_error(self->zst, err, "while creating decompression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000358 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000359 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000360 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000361}
362
363static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000364Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000365{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000366 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000367 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000368 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000369 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000370 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000371}
372
373static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000374Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000375{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000376 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000377 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000378 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000379 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000380 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000381}
382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000383PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000384"compress(data) -- Return a string containing data compressed.\n"
385"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000386"After calling this function, some of the input data may still\n"
387"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000388"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000389
390
Guido van Rossumfb221561997-04-29 15:38:09 +0000391static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000392PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000393{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000394 int err, inplen, length = DEFAULTALLOC;
395 PyObject *RetVal;
396 Byte *input;
397 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000398
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000399 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000400 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000401
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000402 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000403 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000404
405 ENTER_ZLIB
406
Jeremy Hylton9714f992001-10-16 21:19:45 +0000407 start_total_out = self->zst.total_out;
408 self->zst.avail_in = inplen;
409 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000410 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000411 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000412
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000413 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000414 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000415 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000416
Jeremy Hylton9714f992001-10-16 21:19:45 +0000417 /* while Z_OK and the output buffer is full, there might be more output,
418 so extend the output buffer and try again */
419 while (err == Z_OK && self->zst.avail_out == 0) {
Tim Peters5de98422002-04-27 18:44:32 +0000420 if (_PyString_Resize(&RetVal, length << 1) < 0)
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000421 goto error;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000422 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000423 + length;
424 self->zst.avail_out = length;
425 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000426
Jeremy Hylton9714f992001-10-16 21:19:45 +0000427 Py_BEGIN_ALLOW_THREADS
428 err = deflate(&(self->zst), Z_NO_FLUSH);
429 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000430 }
Tim Peters977e5402001-10-17 03:57:20 +0000431 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000432 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000433 condition.
434 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000435
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000436 if (err != Z_OK && err != Z_BUF_ERROR) {
437 zlib_error(self->zst, err, "while compressing");
438 Py_DECREF(RetVal);
439 RetVal = NULL;
440 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000441 }
Tim Peters5de98422002-04-27 18:44:32 +0000442 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000443
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000444 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000445 LEAVE_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000446 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000447}
448
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000449PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000450"decompress(data, max_length) -- Return a string containing the decompressed\n"
451"version of the data.\n"
452"\n"
453"After calling this function, some of the input data may still be stored in\n"
454"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000455"Call the flush() method to clear these buffers.\n"
456"If the max_length parameter is specified then the return value will be\n"
457"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000458"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000459
Guido van Rossumfb221561997-04-29 15:38:09 +0000460static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000461PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000462{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000463 int err, inplen, old_length, length = DEFAULTALLOC;
464 int max_length = 0;
465 PyObject *RetVal;
466 Byte *input;
467 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000468
Tim Peters977e5402001-10-17 03:57:20 +0000469 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000470 &inplen, &max_length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000471 return NULL;
472 if (max_length < 0) {
473 PyErr_SetString(PyExc_ValueError,
474 "max_length must be greater than zero");
475 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000476 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000477
Jeremy Hylton9714f992001-10-16 21:19:45 +0000478 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000479 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000480 length = max_length;
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000481 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000482 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000483
484 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000485
Jeremy Hylton9714f992001-10-16 21:19:45 +0000486 start_total_out = self->zst.total_out;
487 self->zst.avail_in = inplen;
488 self->zst.next_in = input;
489 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000490 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000491
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000492 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000493 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000494 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000495
Jeremy Hylton9714f992001-10-16 21:19:45 +0000496 /* While Z_OK and the output buffer is full, there might be more output.
497 So extend the output buffer and try again.
498 */
Tim Peters977e5402001-10-17 03:57:20 +0000499 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000500 /* If max_length set, don't continue decompressing if we've already
501 reached the limit.
502 */
503 if (max_length && length >= max_length)
504 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000505
Jeremy Hylton9714f992001-10-16 21:19:45 +0000506 /* otherwise, ... */
507 old_length = length;
508 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000509 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000510 length = max_length;
511
Tim Peters5de98422002-04-27 18:44:32 +0000512 if (_PyString_Resize(&RetVal, length) < 0)
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000513 goto error;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000514 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000515 + old_length;
516 self->zst.avail_out = length - old_length;
517
518 Py_BEGIN_ALLOW_THREADS
519 err = inflate(&(self->zst), Z_SYNC_FLUSH);
520 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000521 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000522
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000523 /* Not all of the compressed data could be accommodated in the output buffer
Jeremy Hylton9714f992001-10-16 21:19:45 +0000524 of specified size. Return the unconsumed tail in an attribute.*/
525 if(max_length) {
526 Py_DECREF(self->unconsumed_tail);
Jack Jansen72af01a2001-10-23 22:29:06 +0000527 self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000528 self->zst.avail_in);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000529 if(!self->unconsumed_tail) {
530 Py_DECREF(RetVal);
531 RetVal = NULL;
532 goto error;
533 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000534 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000535
Tim Peters977e5402001-10-17 03:57:20 +0000536 /* The end of the compressed data has been reached, so set the
537 unused_data attribute to a string containing the remainder of the
538 data in the string. Note that this is also a logical place to call
Jeremy Hylton9714f992001-10-16 21:19:45 +0000539 inflateEnd, but the old behaviour of only calling it on flush() is
540 preserved.
541 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000542 if (err == Z_STREAM_END) {
543 Py_XDECREF(self->unused_data); /* Free original empty string */
544 self->unused_data = PyString_FromStringAndSize(
545 (char *)self->zst.next_in, self->zst.avail_in);
546 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000547 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000548 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000549 }
Tim Peters977e5402001-10-17 03:57:20 +0000550 /* We will only get Z_BUF_ERROR if the output buffer was full
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000551 but there wasn't more output when we tried again, so it is
552 not an error condition.
553 */
554 } else if (err != Z_OK && err != Z_BUF_ERROR) {
555 zlib_error(self->zst, err, "while decompressing");
556 Py_DECREF(RetVal);
557 RetVal = NULL;
558 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000559 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000560
Tim Peters5de98422002-04-27 18:44:32 +0000561 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000562
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000563 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000564 LEAVE_ZLIB
565
566 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000567}
568
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000569PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000570"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000571"\n"
572"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000573"default value used when mode is not specified is Z_FINISH.\n"
574"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000575"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000576
Guido van Rossumfb221561997-04-29 15:38:09 +0000577static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000578PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000579{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000580 int err, length = DEFAULTALLOC;
581 PyObject *RetVal;
582 int flushmode = Z_FINISH;
583 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000584
Jeremy Hylton9714f992001-10-16 21:19:45 +0000585 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
586 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000587
Jeremy Hylton9714f992001-10-16 21:19:45 +0000588 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
589 doing any work at all; just return an empty string. */
590 if (flushmode == Z_NO_FLUSH) {
591 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000592 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000593
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000594 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000595 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000596
597 ENTER_ZLIB
Tim Peters977e5402001-10-17 03:57:20 +0000598
Jeremy Hylton9714f992001-10-16 21:19:45 +0000599 start_total_out = self->zst.total_out;
600 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000601 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000602 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000603
604 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000605 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000606 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000607
Jeremy Hylton9714f992001-10-16 21:19:45 +0000608 /* while Z_OK and the output buffer is full, there might be more output,
609 so extend the output buffer and try again */
610 while (err == Z_OK && self->zst.avail_out == 0) {
Tim Peters5de98422002-04-27 18:44:32 +0000611 if (_PyString_Resize(&RetVal, length << 1) < 0)
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000612 goto error;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000613 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000614 + length;
615 self->zst.avail_out = length;
616 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000617
Jeremy Hylton9714f992001-10-16 21:19:45 +0000618 Py_BEGIN_ALLOW_THREADS
619 err = deflate(&(self->zst), flushmode);
620 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000621 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000622
Jeremy Hylton9714f992001-10-16 21:19:45 +0000623 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000624 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000625 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000626 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
627 err = deflateEnd(&(self->zst));
628 if (err != Z_OK) {
629 zlib_error(self->zst, err, "from deflateEnd()");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000630 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000631 RetVal = NULL;
632 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000633 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000634 else
635 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000636
637 /* We will only get Z_BUF_ERROR if the output buffer was full
638 but there wasn't more output when we tried again, so it is
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000639 not an error condition.
640 */
641 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
642 zlib_error(self->zst, err, "while flushing");
643 Py_DECREF(RetVal);
644 RetVal = NULL;
Jeremy Hyltonc72737e2002-04-19 14:37:07 +0000645 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000646 }
Tim Peters977e5402001-10-17 03:57:20 +0000647
Tim Peters5de98422002-04-27 18:44:32 +0000648 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000649
Tim Peters977e5402001-10-17 03:57:20 +0000650 error:
Tim Petersb1a37c02001-10-17 03:56:45 +0000651 LEAVE_ZLIB
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000652
653 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000654}
655
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000656#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000657PyDoc_STRVAR(comp_copy__doc__,
658"copy() -- Return a copy of the compression object.");
659
660static PyObject *
661PyZlib_copy(compobject *self)
662{
663 compobject *retval = NULL;
664 int err;
665
666 retval = newcompobject(&Comptype);
667 if (!retval) return NULL;
668
669 /* Copy the zstream state
670 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
671 */
672 ENTER_ZLIB
673 err = deflateCopy(&retval->zst, &self->zst);
674 switch(err) {
675 case(Z_OK):
676 break;
677 case(Z_STREAM_ERROR):
678 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
679 goto error;
680 case(Z_MEM_ERROR):
681 PyErr_SetString(PyExc_MemoryError,
682 "Can't allocate memory for compression object");
683 goto error;
684 default:
685 zlib_error(self->zst, err, "while copying compression object");
686 goto error;
687 }
688
689 Py_INCREF(self->unused_data);
690 Py_INCREF(self->unconsumed_tail);
691 Py_XDECREF(retval->unused_data);
692 Py_XDECREF(retval->unconsumed_tail);
693 retval->unused_data = self->unused_data;
694 retval->unconsumed_tail = self->unconsumed_tail;
695
696 /* Mark it as being initialized */
697 retval->is_initialised = 1;
698
699 LEAVE_ZLIB
700 return (PyObject *)retval;
701
702error:
703 LEAVE_ZLIB
704 Py_XDECREF(retval);
705 return NULL;
706}
707
708PyDoc_STRVAR(decomp_copy__doc__,
709"copy() -- Return a copy of the decompression object.");
710
711static PyObject *
712PyZlib_uncopy(compobject *self)
713{
714 compobject *retval = NULL;
715 int err;
716
717 retval = newcompobject(&Decomptype);
718 if (!retval) return NULL;
719
720 /* Copy the zstream state
721 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
722 */
723 ENTER_ZLIB
724 err = inflateCopy(&retval->zst, &self->zst);
725 switch(err) {
726 case(Z_OK):
727 break;
728 case(Z_STREAM_ERROR):
729 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
730 goto error;
731 case(Z_MEM_ERROR):
732 PyErr_SetString(PyExc_MemoryError,
733 "Can't allocate memory for decompression object");
734 goto error;
735 default:
736 zlib_error(self->zst, err, "while copying decompression object");
737 goto error;
738 }
739
740 Py_INCREF(self->unused_data);
741 Py_INCREF(self->unconsumed_tail);
742 Py_XDECREF(retval->unused_data);
743 Py_XDECREF(retval->unconsumed_tail);
744 retval->unused_data = self->unused_data;
745 retval->unconsumed_tail = self->unconsumed_tail;
746
747 /* Mark it as being initialized */
748 retval->is_initialised = 1;
749
750 LEAVE_ZLIB
751 return (PyObject *)retval;
752
753error:
754 LEAVE_ZLIB
755 Py_XDECREF(retval);
756 return NULL;
757}
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000758#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000760PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000761"flush( [length] ) -- Return a string containing any remaining\n"
762"decompressed data. length, if given, is the initial size of the\n"
763"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000764"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000765"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000766
Guido van Rossumfb221561997-04-29 15:38:09 +0000767static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000768PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000769{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000770 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000771 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000772 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000773
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000774 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000775 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000776 if (!(retval = PyString_FromStringAndSize(NULL, length)))
777 return NULL;
778
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000779
Jeremy Hylton9714f992001-10-16 21:19:45 +0000780 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000781
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000782 start_total_out = self->zst.total_out;
783 self->zst.avail_out = length;
784 self->zst.next_out = (Byte *)PyString_AS_STRING(retval);
785
786 Py_BEGIN_ALLOW_THREADS
787 err = inflate(&(self->zst), Z_FINISH);
788 Py_END_ALLOW_THREADS
789
790 /* while Z_OK and the output buffer is full, there might be more output,
791 so extend the output buffer and try again */
792 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
793 if (_PyString_Resize(&retval, length << 1) < 0)
794 goto error;
795 self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length;
796 self->zst.avail_out = length;
797 length = length << 1;
798
799 Py_BEGIN_ALLOW_THREADS
800 err = inflate(&(self->zst), Z_FINISH);
801 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000802 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000803
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000804 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
805 various data structures. Note we should only get Z_STREAM_END when
806 flushmode is Z_FINISH */
807 if (err == Z_STREAM_END) {
808 err = inflateEnd(&(self->zst));
809 self->is_initialised = 0;
810 if (err != Z_OK) {
811 zlib_error(self->zst, err, "from inflateEnd()");
812 Py_DECREF(retval);
813 retval = NULL;
814 goto error;
815 }
816 }
817 _PyString_Resize(&retval, self->zst.total_out - start_total_out);
818
819error:
820
Jeremy Hylton9714f992001-10-16 21:19:45 +0000821 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000822
Jeremy Hylton9714f992001-10-16 21:19:45 +0000823 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000824}
825
826static PyMethodDef comp_methods[] =
827{
Tim Peters977e5402001-10-17 03:57:20 +0000828 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000829 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000830 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000831 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000832#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000833 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
834 comp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000835#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000836 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000837};
838
839static PyMethodDef Decomp_methods[] =
840{
Tim Peters977e5402001-10-17 03:57:20 +0000841 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000842 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000843 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000844 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000845#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000846 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
847 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000848#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000849 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000850};
851
852static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000853Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000854{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000855 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
856 internal data. */
857
858 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000859}
860
861static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000862Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000863{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000864 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000865
Jeremy Hylton9714f992001-10-16 21:19:45 +0000866 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000867
Tim Peters977e5402001-10-17 03:57:20 +0000868 if (strcmp(name, "unused_data") == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000869 Py_INCREF(self->unused_data);
870 retval = self->unused_data;
Tim Peters977e5402001-10-17 03:57:20 +0000871 } else if (strcmp(name, "unconsumed_tail") == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000872 Py_INCREF(self->unconsumed_tail);
873 retval = self->unconsumed_tail;
Tim Peters977e5402001-10-17 03:57:20 +0000874 } else
Jeremy Hylton9714f992001-10-16 21:19:45 +0000875 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000876
Jeremy Hylton9714f992001-10-16 21:19:45 +0000877 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000878
Jeremy Hylton9714f992001-10-16 21:19:45 +0000879 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000880}
881
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000882PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000883"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
884"\n"
885"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000886"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000887
Guido van Rossumfb221561997-04-29 15:38:09 +0000888static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000889PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000890{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000891 uLong adler32val = adler32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000892 Byte *buf;
893 int len;
Tim Peters977e5402001-10-17 03:57:20 +0000894
Andrew M. Kuchlingbb7e8002005-11-22 15:32:28 +0000895 if (!PyArg_ParseTuple(args, "s#|k:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000896 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000897 adler32val = adler32(adler32val, buf, len);
898 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000899}
Tim Peters977e5402001-10-17 03:57:20 +0000900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000901PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000902"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
903"\n"
904"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000905"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +0000906
907static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000908PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000909{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000910 uLong crc32val = crc32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000911 Byte *buf;
912 int len;
Andrew M. Kuchlingbb7e8002005-11-22 15:32:28 +0000913 if (!PyArg_ParseTuple(args, "s#|k:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000914 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000915 crc32val = crc32(crc32val, buf, len);
916 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000917}
Tim Peters977e5402001-10-17 03:57:20 +0000918
Guido van Rossumfb221561997-04-29 15:38:09 +0000919
920static PyMethodDef zlib_methods[] =
921{
Tim Peters977e5402001-10-17 03:57:20 +0000922 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000923 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000924 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000925 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000926 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000927 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000928 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
929 crc32__doc__},
930 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000931 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000932 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000933 decompressobj__doc__},
934 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000935};
936
Tim Peters0c322792002-07-17 16:49:03 +0000937static PyTypeObject Comptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000938 PyObject_HEAD_INIT(0)
939 0,
Guido van Rossum14648392001-12-08 18:02:58 +0000940 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000941 sizeof(compobject),
942 0,
943 (destructor)Comp_dealloc, /*tp_dealloc*/
944 0, /*tp_print*/
945 (getattrfunc)Comp_getattr, /*tp_getattr*/
946 0, /*tp_setattr*/
947 0, /*tp_compare*/
948 0, /*tp_repr*/
949 0, /*tp_as_number*/
950 0, /*tp_as_sequence*/
951 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000952};
953
Tim Peters0c322792002-07-17 16:49:03 +0000954static PyTypeObject Decomptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000955 PyObject_HEAD_INIT(0)
956 0,
Guido van Rossum14648392001-12-08 18:02:58 +0000957 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000958 sizeof(compobject),
959 0,
960 (destructor)Decomp_dealloc, /*tp_dealloc*/
961 0, /*tp_print*/
962 (getattrfunc)Decomp_getattr, /*tp_getattr*/
963 0, /*tp_setattr*/
964 0, /*tp_compare*/
965 0, /*tp_repr*/
966 0, /*tp_as_number*/
967 0, /*tp_as_sequence*/
968 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000969};
970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000971PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +0000972"The functions in this module allow compression and decompression using the\n"
973"zlib library, which is based on GNU zip.\n"
974"\n"
975"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
976"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000977"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000978"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000979"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000980"decompressobj([wbits]) -- Return a decompressor object.\n"
981"\n"
982"'wbits' is window buffer size.\n"
983"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000984"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +0000985
Mark Hammond62b1ab12002-07-23 06:31:15 +0000986PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000987PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000988{
Fred Drake4baedc12002-04-01 14:53:37 +0000989 PyObject *m, *ver;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000990 Comptype.ob_type = &PyType_Type;
991 Decomptype.ob_type = &PyType_Type;
992 m = Py_InitModule4("zlib", zlib_methods,
993 zlib_module_documentation,
994 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000995 if (m == NULL)
996 return;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000997
Fred Drake4baedc12002-04-01 14:53:37 +0000998 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
999 if (ZlibError != NULL) {
1000 Py_INCREF(ZlibError);
1001 PyModule_AddObject(m, "error", ZlibError);
1002 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001003 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1004 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1005 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1006 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1007 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1008 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1009 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1010 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1011 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001012
Jeremy Hylton9714f992001-10-16 21:19:45 +00001013 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1014 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1015 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1016 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001017
Jeremy Hylton9714f992001-10-16 21:19:45 +00001018 ver = PyString_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001019 if (ver != NULL)
1020 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001021
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001022 PyModule_AddStringConstant(m, "__version__", "1.0");
1023
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001024#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +00001025 zlib_lock = PyThread_allocate_lock();
Sjoerd Mullender556a9382002-03-11 09:20:47 +00001026#endif /* WITH_THREAD */
Guido van Rossumfb221561997-04-29 15:38:09 +00001027}