blob: 35f7bbb1d20f338b9aaba96baefebe1570c04ac9 [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"
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00008#include "structmember.h"
Guido van Rossum97b54571997-06-03 22:21:47 +00009#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +000010
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000011#ifdef WITH_THREAD
12#include "pythread.h"
13
14/* #defs ripped off from _tkinter.c, even though the situation here is much
15 simpler, because we don't have to worry about waiting for Tcl
16 events! And, since zlib itself is threadsafe, we don't need to worry
17 about re-entering zlib functions.
18
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000019 N.B.
20
21 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions
22 that modify the components of preexisting de/compress objects, it
23 could prove to be a performance gain on multiprocessor machines if
24 there was an de/compress object-specific lock. However, for the
25 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL
26 de/compress objects.
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000027 */
28
29static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */
30
31#define ENTER_ZLIB \
Tim Peters6605c642001-10-17 03:43:54 +000032 Py_BEGIN_ALLOW_THREADS \
33 PyThread_acquire_lock(zlib_lock, 1); \
34 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000035
36#define LEAVE_ZLIB \
Tim Peters6605c642001-10-17 03:43:54 +000037 PyThread_release_lock(zlib_lock);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000038
39#else
40
41#define ENTER_ZLIB
42#define LEAVE_ZLIB
43
44#endif
45
Guido van Rossumfb221561997-04-29 15:38:09 +000046/* The following parameters are copied from zutil.h, version 0.95 */
47#define DEFLATED 8
48#if MAX_MEM_LEVEL >= 8
49# define DEF_MEM_LEVEL 8
50#else
51# define DEF_MEM_LEVEL MAX_MEM_LEVEL
52#endif
53#define DEF_WBITS MAX_WBITS
54
Guido van Rossumb729a1d1999-04-07 20:23:17 +000055/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
56#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000057
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;
Gregory P. Smith693fc462008-09-06 20:13:06 +000099 self->unused_data = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000100 if (self->unused_data == NULL) {
101 Py_DECREF(self);
102 return NULL;
103 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000104 self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000105 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;
Martin v. Löwis423be952008-08-13 15:53:07 +0000121 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000122 Byte *input, *output;
123 int length, level=Z_DEFAULT_COMPRESSION, err;
124 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000125
Jeremy Hylton9714f992001-10-16 21:19:45 +0000126 /* require Python string object, optional 'level' arg */
Martin v. Löwis423be952008-08-13 15:53:07 +0000127 if (!PyArg_ParseTuple(args, "s*|i:compress", &pinput, &level))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000128 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000129 input = pinput.buf;
130 length = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000131
Jeremy Hylton9714f992001-10-16 21:19:45 +0000132 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000133
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000134 output = (Byte*)malloc(zst.avail_out);
135 if (output == NULL) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000136 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000137 PyErr_SetString(PyExc_MemoryError,
138 "Can't allocate memory to compress data");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000139 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000140 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000141
Jeremy Hylton9714f992001-10-16 21:19:45 +0000142 /* Past the point of no return. From here on out, we need to make sure
143 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000144
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000145 zst.zalloc = (alloc_func)NULL;
146 zst.zfree = (free_func)Z_NULL;
147 zst.next_out = (Byte *)output;
148 zst.next_in = (Byte *)input;
149 zst.avail_in = length;
150 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000151
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000152 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000153 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000154 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000155 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000156 PyErr_SetString(PyExc_MemoryError,
157 "Out of memory while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000158 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000159 case(Z_STREAM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000160 PyErr_SetString(ZlibError,
161 "Bad compression level");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000162 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000163 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000164 deflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000165 zlib_error(zst, err, "while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000166 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000167 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000168
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000169 Py_BEGIN_ALLOW_THREADS;
170 err = deflate(&zst, Z_FINISH);
171 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000172
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000173 if (err != Z_STREAM_END) {
174 zlib_error(zst, err, "while compressing data");
175 deflateEnd(&zst);
176 goto error;
177 }
Tim Peters977e5402001-10-17 03:57:20 +0000178
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000179 err=deflateEnd(&zst);
180 if (err == Z_OK)
Gregory P. Smith693fc462008-09-06 20:13:06 +0000181 ReturnVal = PyBytes_FromStringAndSize((char *)output,
Guido van Rossum776152b2007-05-22 22:44:07 +0000182 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000183 else
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000184 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000185
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000186 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000187 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000188 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000189
Jeremy Hylton9714f992001-10-16 21:19:45 +0000190 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000191}
192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000193PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000194"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
195"\n"
196"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000197"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000198
Guido van Rossumfb221561997-04-29 15:38:09 +0000199static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000200PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000201{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000202 PyObject *result_str;
Martin v. Löwis423be952008-08-13 15:53:07 +0000203 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000204 Byte *input;
205 int length, err;
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000206 int wsize=DEF_WBITS;
207 Py_ssize_t r_strlen=DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000208 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000209
Martin v. Löwis423be952008-08-13 15:53:07 +0000210 if (!PyArg_ParseTuple(args, "s*|in:decompress",
211 &pinput, &wsize, &r_strlen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000212 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000213 input = pinput.buf;
214 length = pinput.len;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000215
Jeremy Hylton9714f992001-10-16 21:19:45 +0000216 if (r_strlen <= 0)
217 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000218
Jeremy Hylton9714f992001-10-16 21:19:45 +0000219 zst.avail_in = length;
220 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000221
Gregory P. Smith693fc462008-09-06 20:13:06 +0000222 if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen))) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000223 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000224 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000225 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000226
Jeremy Hylton9714f992001-10-16 21:19:45 +0000227 zst.zalloc = (alloc_func)NULL;
228 zst.zfree = (free_func)Z_NULL;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000229 zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000230 zst.next_in = (Byte *)input;
231 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000232
Jeremy Hylton9714f992001-10-16 21:19:45 +0000233 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000234 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000235 break;
Tim Peters977e5402001-10-17 03:57:20 +0000236 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000237 PyErr_SetString(PyExc_MemoryError,
238 "Out of memory while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000239 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000240 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000241 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000242 zlib_error(zst, err, "while preparing to decompress data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000243 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000244 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000245
Jeremy Hylton9714f992001-10-16 21:19:45 +0000246 do {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000247 Py_BEGIN_ALLOW_THREADS
248 err=inflate(&zst, Z_FINISH);
249 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000250
Jeremy Hylton9714f992001-10-16 21:19:45 +0000251 switch(err) {
252 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000253 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000254 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000255 /*
256 * If there is at least 1 byte of room according to zst.avail_out
257 * and we get this error, assume that it means zlib cannot
258 * process the inflate call() due to an error in the data.
259 */
Jeremy Hylton0965e082001-10-16 21:56:09 +0000260 if (zst.avail_out > 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000261 PyErr_Format(ZlibError, "Error %i while decompressing data",
262 err);
263 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000264 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000265 }
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000266 /* fall through */
267 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000268 /* need more memory */
Gregory P. Smith693fc462008-09-06 20:13:06 +0000269 if (_PyBytes_Resize(&result_str, r_strlen << 1) < 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000270 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000271 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000272 }
Guido van Rossum776152b2007-05-22 22:44:07 +0000273 zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000274 (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000275 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000276 r_strlen = r_strlen << 1;
277 break;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000278 default:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000279 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000280 zlib_error(zst, err, "while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000281 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000282 }
283 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000284
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000285 err = inflateEnd(&zst);
286 if (err != Z_OK) {
287 zlib_error(zst, err, "while finishing data decompression");
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000288 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000289 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000290
Gregory P. Smith693fc462008-09-06 20:13:06 +0000291 if (_PyBytes_Resize(&result_str, zst.total_out) < 0)
Guido van Rossum776152b2007-05-22 22:44:07 +0000292 goto error;
293
Martin v. Löwis423be952008-08-13 15:53:07 +0000294 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000295 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000296
297 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000298 PyBuffer_Release(&pinput);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000299 Py_XDECREF(result_str);
300 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000301}
302
303static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000304PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000305{
Jeremy Hylton499000002001-10-16 21:59:35 +0000306 compobject *self;
307 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
308 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000309
Jeremy Hylton499000002001-10-16 21:59:35 +0000310 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
311 &memLevel, &strategy))
312 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000313
Jeremy Hylton499000002001-10-16 21:59:35 +0000314 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000315 if (self==NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000316 return(NULL);
317 self->zst.zalloc = (alloc_func)NULL;
318 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000319 self->zst.next_in = NULL;
320 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000321 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
322 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000323 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000324 self->is_initialised = 1;
325 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000326 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000327 Py_DECREF(self);
328 PyErr_SetString(PyExc_MemoryError,
329 "Can't allocate memory for compression object");
330 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000331 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000332 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000333 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000334 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000335 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000336 zlib_error(self->zst, err, "while creating compression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000337 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000338 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000339 }
340}
341
342static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000343PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000344{
Jeremy Hylton499000002001-10-16 21:59:35 +0000345 int wbits=DEF_WBITS, err;
346 compobject *self;
347 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
348 return NULL;
349
350 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000351 if (self == NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000352 return(NULL);
353 self->zst.zalloc = (alloc_func)NULL;
354 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000355 self->zst.next_in = NULL;
356 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000357 err = inflateInit2(&self->zst, wbits);
358 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000359 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000360 self->is_initialised = 1;
361 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000362 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000363 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000364 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000365 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000366 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000367 Py_DECREF(self);
368 PyErr_SetString(PyExc_MemoryError,
369 "Can't allocate memory for decompression object");
370 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000371 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000372 zlib_error(self->zst, err, "while creating decompression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000373 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000374 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000375 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000376}
377
378static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000379Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000380{
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000381 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000382 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000383 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000384 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000385 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000386}
387
388static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000389Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000390{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000391 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000392 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000393 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000394 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000395 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000396}
397
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000398PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000399"compress(data) -- Return a string containing data compressed.\n"
400"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000401"After calling this function, some of the input data may still\n"
402"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000403"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000404
405
Guido van Rossumfb221561997-04-29 15:38:09 +0000406static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000407PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000408{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000409 int err, inplen, length = DEFAULTALLOC;
410 PyObject *RetVal;
Martin v. Löwis423be952008-08-13 15:53:07 +0000411 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000412 Byte *input;
413 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000414
Martin v. Löwis423be952008-08-13 15:53:07 +0000415 if (!PyArg_ParseTuple(args, "s*:compress", &pinput))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000416 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000417 input = pinput.buf;
418 inplen = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000419
Gregory P. Smith693fc462008-09-06 20:13:06 +0000420 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000421 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000422 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000423 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000424
425 ENTER_ZLIB
426
Jeremy Hylton9714f992001-10-16 21:19:45 +0000427 start_total_out = self->zst.total_out;
428 self->zst.avail_in = inplen;
429 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000430 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000431 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000432
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000433 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000434 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000435 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000436
Jeremy Hylton9714f992001-10-16 21:19:45 +0000437 /* while Z_OK and the output buffer is full, there might be more output,
438 so extend the output buffer and try again */
439 while (err == Z_OK && self->zst.avail_out == 0) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000440 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000441 Py_DECREF(RetVal);
442 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000443 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000444 }
445 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000446 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000447 self->zst.avail_out = length;
448 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000449
Jeremy Hylton9714f992001-10-16 21:19:45 +0000450 Py_BEGIN_ALLOW_THREADS
451 err = deflate(&(self->zst), Z_NO_FLUSH);
452 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000453 }
Tim Peters977e5402001-10-17 03:57:20 +0000454 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000455 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000456 condition.
457 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000458
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000459 if (err != Z_OK && err != Z_BUF_ERROR) {
460 zlib_error(self->zst, err, "while compressing");
461 Py_DECREF(RetVal);
462 RetVal = NULL;
463 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000464 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000465 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000466 Py_DECREF(RetVal);
467 RetVal = NULL;
468 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000469
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000470 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000471 LEAVE_ZLIB
Martin v. Löwis423be952008-08-13 15:53:07 +0000472 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000473 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000474}
475
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000476PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000477"decompress(data, max_length) -- Return a string containing the decompressed\n"
478"version of the data.\n"
479"\n"
480"After calling this function, some of the input data may still be stored in\n"
481"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000482"Call the flush() method to clear these buffers.\n"
483"If the max_length parameter is specified then the return value will be\n"
484"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000485"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000486
Guido van Rossumfb221561997-04-29 15:38:09 +0000487static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000488PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000489{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000490 int err, inplen, old_length, length = DEFAULTALLOC;
491 int max_length = 0;
492 PyObject *RetVal;
Martin v. Löwis423be952008-08-13 15:53:07 +0000493 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000494 Byte *input;
495 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000496
Martin v. Löwis423be952008-08-13 15:53:07 +0000497 if (!PyArg_ParseTuple(args, "s*|i:decompress", &pinput,
498 &max_length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000499 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000500 input = pinput.buf;
501 inplen = pinput.len;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000502 if (max_length < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000503 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000504 PyErr_SetString(PyExc_ValueError,
505 "max_length must be greater than zero");
506 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000507 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000508
Jeremy Hylton9714f992001-10-16 21:19:45 +0000509 /* limit amount of data allocated to max_length */
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;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000512 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000513 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000514 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000515 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000516
517 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000518
Jeremy Hylton9714f992001-10-16 21:19:45 +0000519 start_total_out = self->zst.total_out;
520 self->zst.avail_in = inplen;
521 self->zst.next_in = input;
522 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000523 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000524
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000525 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000526 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000527 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000528
Jeremy Hylton9714f992001-10-16 21:19:45 +0000529 /* While Z_OK and the output buffer is full, there might be more output.
530 So extend the output buffer and try again.
531 */
Tim Peters977e5402001-10-17 03:57:20 +0000532 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000533 /* If max_length set, don't continue decompressing if we've already
534 reached the limit.
535 */
536 if (max_length && length >= max_length)
537 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000538
Jeremy Hylton9714f992001-10-16 21:19:45 +0000539 /* otherwise, ... */
540 old_length = length;
541 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000542 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000543 length = max_length;
544
Gregory P. Smith693fc462008-09-06 20:13:06 +0000545 if (_PyBytes_Resize(&RetVal, length) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000546 Py_DECREF(RetVal);
547 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000548 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000549 }
550 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000551 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000552 self->zst.avail_out = length - old_length;
553
554 Py_BEGIN_ALLOW_THREADS
555 err = inflate(&(self->zst), Z_SYNC_FLUSH);
556 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000557 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000558
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000559 /* Not all of the compressed data could be accommodated in the output buffer
Jeremy Hylton9714f992001-10-16 21:19:45 +0000560 of specified size. Return the unconsumed tail in an attribute.*/
561 if(max_length) {
562 Py_DECREF(self->unconsumed_tail);
Gregory P. Smith693fc462008-09-06 20:13:06 +0000563 self->unconsumed_tail = PyBytes_FromStringAndSize((char *)self->zst.next_in,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000564 self->zst.avail_in);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000565 if(!self->unconsumed_tail) {
566 Py_DECREF(RetVal);
567 RetVal = NULL;
568 goto error;
569 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000570 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000571
Tim Peters977e5402001-10-17 03:57:20 +0000572 /* The end of the compressed data has been reached, so set the
573 unused_data attribute to a string containing the remainder of the
574 data in the string. Note that this is also a logical place to call
Jeremy Hylton9714f992001-10-16 21:19:45 +0000575 inflateEnd, but the old behaviour of only calling it on flush() is
576 preserved.
577 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000578 if (err == Z_STREAM_END) {
579 Py_XDECREF(self->unused_data); /* Free original empty string */
Gregory P. Smith693fc462008-09-06 20:13:06 +0000580 self->unused_data = PyBytes_FromStringAndSize(
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000581 (char *)self->zst.next_in, self->zst.avail_in);
582 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000583 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000584 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000585 }
Tim Peters977e5402001-10-17 03:57:20 +0000586 /* We will only get Z_BUF_ERROR if the output buffer was full
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000587 but there wasn't more output when we tried again, so it is
588 not an error condition.
589 */
590 } else if (err != Z_OK && err != Z_BUF_ERROR) {
591 zlib_error(self->zst, err, "while decompressing");
592 Py_DECREF(RetVal);
593 RetVal = NULL;
594 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000595 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000596
Gregory P. Smith693fc462008-09-06 20:13:06 +0000597 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000598 Py_DECREF(RetVal);
599 RetVal = NULL;
600 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000601
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000602 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000603 LEAVE_ZLIB
Martin v. Löwis423be952008-08-13 15:53:07 +0000604 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000605 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000606}
607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000608PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000609"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000610"\n"
611"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000612"default value used when mode is not specified is Z_FINISH.\n"
613"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000614"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000615
Guido van Rossumfb221561997-04-29 15:38:09 +0000616static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000617PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000618{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000619 int err, length = DEFAULTALLOC;
620 PyObject *RetVal;
621 int flushmode = Z_FINISH;
622 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000623
Jeremy Hylton9714f992001-10-16 21:19:45 +0000624 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
625 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000626
Jeremy Hylton9714f992001-10-16 21:19:45 +0000627 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
628 doing any work at all; just return an empty string. */
629 if (flushmode == Z_NO_FLUSH) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000630 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000631 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000632
Gregory P. Smith693fc462008-09-06 20:13:06 +0000633 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000634 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000635
636 ENTER_ZLIB
Tim Peters977e5402001-10-17 03:57:20 +0000637
Jeremy Hylton9714f992001-10-16 21:19:45 +0000638 start_total_out = self->zst.total_out;
639 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000640 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000641 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000642
643 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000644 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000645 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000646
Jeremy Hylton9714f992001-10-16 21:19:45 +0000647 /* while Z_OK and the output buffer is full, there might be more output,
648 so extend the output buffer and try again */
649 while (err == Z_OK && self->zst.avail_out == 0) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000650 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000651 Py_DECREF(RetVal);
652 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000653 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000654 }
655 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000656 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000657 self->zst.avail_out = length;
658 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000659
Jeremy Hylton9714f992001-10-16 21:19:45 +0000660 Py_BEGIN_ALLOW_THREADS
661 err = deflate(&(self->zst), flushmode);
662 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000663 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000664
Jeremy Hylton9714f992001-10-16 21:19:45 +0000665 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000666 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000667 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000668 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
669 err = deflateEnd(&(self->zst));
670 if (err != Z_OK) {
671 zlib_error(self->zst, err, "from deflateEnd()");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000672 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000673 RetVal = NULL;
674 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000675 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000676 else
677 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000678
679 /* We will only get Z_BUF_ERROR if the output buffer was full
680 but there wasn't more output when we tried again, so it is
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000681 not an error condition.
682 */
683 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
684 zlib_error(self->zst, err, "while flushing");
685 Py_DECREF(RetVal);
686 RetVal = NULL;
Jeremy Hyltonc72737e2002-04-19 14:37:07 +0000687 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000688 }
Tim Peters977e5402001-10-17 03:57:20 +0000689
Gregory P. Smith693fc462008-09-06 20:13:06 +0000690 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000691 Py_DECREF(RetVal);
692 RetVal = NULL;
693 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000694
Tim Peters977e5402001-10-17 03:57:20 +0000695 error:
Tim Petersb1a37c02001-10-17 03:56:45 +0000696 LEAVE_ZLIB
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000697
698 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000699}
700
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000701#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000702PyDoc_STRVAR(comp_copy__doc__,
703"copy() -- Return a copy of the compression object.");
704
705static PyObject *
706PyZlib_copy(compobject *self)
707{
708 compobject *retval = NULL;
709 int err;
710
711 retval = newcompobject(&Comptype);
712 if (!retval) return NULL;
713
714 /* Copy the zstream state
715 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
716 */
717 ENTER_ZLIB
718 err = deflateCopy(&retval->zst, &self->zst);
719 switch(err) {
720 case(Z_OK):
721 break;
722 case(Z_STREAM_ERROR):
723 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
724 goto error;
725 case(Z_MEM_ERROR):
726 PyErr_SetString(PyExc_MemoryError,
727 "Can't allocate memory for compression object");
728 goto error;
729 default:
730 zlib_error(self->zst, err, "while copying compression object");
731 goto error;
732 }
733
734 Py_INCREF(self->unused_data);
735 Py_INCREF(self->unconsumed_tail);
736 Py_XDECREF(retval->unused_data);
737 Py_XDECREF(retval->unconsumed_tail);
738 retval->unused_data = self->unused_data;
739 retval->unconsumed_tail = self->unconsumed_tail;
740
741 /* Mark it as being initialized */
742 retval->is_initialised = 1;
743
744 LEAVE_ZLIB
745 return (PyObject *)retval;
746
747error:
748 LEAVE_ZLIB
749 Py_XDECREF(retval);
750 return NULL;
751}
752
753PyDoc_STRVAR(decomp_copy__doc__,
754"copy() -- Return a copy of the decompression object.");
755
756static PyObject *
757PyZlib_uncopy(compobject *self)
758{
759 compobject *retval = NULL;
760 int err;
761
762 retval = newcompobject(&Decomptype);
763 if (!retval) return NULL;
764
765 /* Copy the zstream state
766 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
767 */
768 ENTER_ZLIB
769 err = inflateCopy(&retval->zst, &self->zst);
770 switch(err) {
771 case(Z_OK):
772 break;
773 case(Z_STREAM_ERROR):
774 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
775 goto error;
776 case(Z_MEM_ERROR):
777 PyErr_SetString(PyExc_MemoryError,
778 "Can't allocate memory for decompression object");
779 goto error;
780 default:
781 zlib_error(self->zst, err, "while copying decompression object");
782 goto error;
783 }
784
785 Py_INCREF(self->unused_data);
786 Py_INCREF(self->unconsumed_tail);
787 Py_XDECREF(retval->unused_data);
788 Py_XDECREF(retval->unconsumed_tail);
789 retval->unused_data = self->unused_data;
790 retval->unconsumed_tail = self->unconsumed_tail;
791
792 /* Mark it as being initialized */
793 retval->is_initialised = 1;
794
795 LEAVE_ZLIB
796 return (PyObject *)retval;
797
798error:
799 LEAVE_ZLIB
800 Py_XDECREF(retval);
801 return NULL;
802}
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000803#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000804
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000805PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000806"flush( [length] ) -- Return a string containing any remaining\n"
807"decompressed data. length, if given, is the initial size of the\n"
808"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000809"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000810"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000811
Guido van Rossumfb221561997-04-29 15:38:09 +0000812static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000813PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000814{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000815 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000816 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000817 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000818
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000819 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000820 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000821 if (length <= 0) {
822 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
823 return NULL;
824 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000825 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000826 return NULL;
827
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000828
Jeremy Hylton9714f992001-10-16 21:19:45 +0000829 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000830
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000831 start_total_out = self->zst.total_out;
832 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000833 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000834
835 Py_BEGIN_ALLOW_THREADS
836 err = inflate(&(self->zst), Z_FINISH);
837 Py_END_ALLOW_THREADS
838
839 /* while Z_OK and the output buffer is full, there might be more output,
840 so extend the output buffer and try again */
841 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000842 if (_PyBytes_Resize(&retval, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000843 Py_DECREF(retval);
844 retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000845 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000846 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000847 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000848 self->zst.avail_out = length;
849 length = length << 1;
850
851 Py_BEGIN_ALLOW_THREADS
852 err = inflate(&(self->zst), Z_FINISH);
853 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000854 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000855
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000856 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
857 various data structures. Note we should only get Z_STREAM_END when
858 flushmode is Z_FINISH */
859 if (err == Z_STREAM_END) {
860 err = inflateEnd(&(self->zst));
861 self->is_initialised = 0;
862 if (err != Z_OK) {
863 zlib_error(self->zst, err, "from inflateEnd()");
864 Py_DECREF(retval);
865 retval = NULL;
866 goto error;
867 }
868 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000869 if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000870 Py_DECREF(retval);
871 retval = NULL;
872 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000873
874error:
875
Jeremy Hylton9714f992001-10-16 21:19:45 +0000876 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000877
Jeremy Hylton9714f992001-10-16 21:19:45 +0000878 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000879}
880
881static PyMethodDef comp_methods[] =
882{
Tim Peters977e5402001-10-17 03:57:20 +0000883 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000884 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000885 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000886 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000887#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000888 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
889 comp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000890#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000891 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000892};
893
894static PyMethodDef Decomp_methods[] =
895{
Tim Peters977e5402001-10-17 03:57:20 +0000896 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000897 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000898 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000899 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000900#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000901 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
902 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000903#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000904 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000905};
906
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000907#define COMP_OFF(x) offsetof(compobject, x)
908static PyMemberDef Decomp_members[] = {
909 {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
910 {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
911 {NULL},
912};
Guido van Rossumfb221561997-04-29 15:38:09 +0000913
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000914PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000915"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
916"\n"
917"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000918"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000919
Guido van Rossumfb221561997-04-29 15:38:09 +0000920static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000921PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000922{
Christian Heimescc47b052008-03-25 14:56:36 +0000923 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000924 Byte *buf;
925 int len;
Tim Peters977e5402001-10-17 03:57:20 +0000926
Gregory P. Smith27275032008-03-20 06:20:09 +0000927 if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000928 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000929 adler32val = adler32(adler32val, buf, len);
Gregory P. Smith27275032008-03-20 06:20:09 +0000930 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +0000931}
Tim Peters977e5402001-10-17 03:57:20 +0000932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000933PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000934"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
935"\n"
936"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000937"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +0000938
939static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000940PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000941{
Christian Heimescc47b052008-03-25 14:56:36 +0000942 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +0000943 Py_buffer pbuf;
944 int signed_val;
Christian Heimescc47b052008-03-25 14:56:36 +0000945
Martin v. Löwis423be952008-08-13 15:53:07 +0000946 if (!PyArg_ParseTuple(args, "s*|I:crc32", &pbuf, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000947 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000948 signed_val = crc32(crc32val, pbuf.buf, pbuf.len);
949 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +0000950 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +0000951}
Tim Peters977e5402001-10-17 03:57:20 +0000952
Guido van Rossumfb221561997-04-29 15:38:09 +0000953
954static PyMethodDef zlib_methods[] =
955{
Tim Peters977e5402001-10-17 03:57:20 +0000956 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000957 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000958 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000959 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000960 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000961 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000962 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
963 crc32__doc__},
964 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000965 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000966 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000967 decompressobj__doc__},
968 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000969};
970
Tim Peters0c322792002-07-17 16:49:03 +0000971static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000972 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000973 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000974 sizeof(compobject),
975 0,
976 (destructor)Comp_dealloc, /*tp_dealloc*/
977 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000978 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +0000979 0, /*tp_setattr*/
980 0, /*tp_compare*/
981 0, /*tp_repr*/
982 0, /*tp_as_number*/
983 0, /*tp_as_sequence*/
984 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000985 0, /*tp_hash*/
986 0, /*tp_call*/
987 0, /*tp_str*/
988 0, /*tp_getattro*/
989 0, /*tp_setattro*/
990 0, /*tp_as_buffer*/
991 Py_TPFLAGS_DEFAULT, /*tp_flags*/
992 0, /*tp_doc*/
993 0, /*tp_traverse*/
994 0, /*tp_clear*/
995 0, /*tp_richcompare*/
996 0, /*tp_weaklistoffset*/
997 0, /*tp_iter*/
998 0, /*tp_iternext*/
999 comp_methods, /*tp_methods*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001000};
1001
Tim Peters0c322792002-07-17 16:49:03 +00001002static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001003 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001004 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001005 sizeof(compobject),
1006 0,
1007 (destructor)Decomp_dealloc, /*tp_dealloc*/
1008 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001009 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001010 0, /*tp_setattr*/
1011 0, /*tp_compare*/
1012 0, /*tp_repr*/
1013 0, /*tp_as_number*/
1014 0, /*tp_as_sequence*/
1015 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001016 0, /*tp_hash*/
1017 0, /*tp_call*/
1018 0, /*tp_str*/
1019 0, /*tp_getattro*/
1020 0, /*tp_setattro*/
1021 0, /*tp_as_buffer*/
1022 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1023 0, /*tp_doc*/
1024 0, /*tp_traverse*/
1025 0, /*tp_clear*/
1026 0, /*tp_richcompare*/
1027 0, /*tp_weaklistoffset*/
1028 0, /*tp_iter*/
1029 0, /*tp_iternext*/
1030 Decomp_methods, /*tp_methods*/
1031 Decomp_members, /*tp_members*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001032};
1033
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001034PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001035"The functions in this module allow compression and decompression using the\n"
1036"zlib library, which is based on GNU zip.\n"
1037"\n"
1038"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
1039"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001040"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001041"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001042"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001043"decompressobj([wbits]) -- Return a decompressor object.\n"
1044"\n"
1045"'wbits' is window buffer size.\n"
1046"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001047"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001048
Martin v. Löwis1a214512008-06-11 05:26:20 +00001049static struct PyModuleDef zlibmodule = {
1050 PyModuleDef_HEAD_INIT,
1051 "zlib",
1052 zlib_module_documentation,
1053 -1,
1054 zlib_methods,
1055 NULL,
1056 NULL,
1057 NULL,
1058 NULL
1059};
1060
Mark Hammond62b1ab12002-07-23 06:31:15 +00001061PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001062PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001063{
Fred Drake4baedc12002-04-01 14:53:37 +00001064 PyObject *m, *ver;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001065 if (PyType_Ready(&Comptype) < 0)
1066 return NULL;
1067 if (PyType_Ready(&Decomptype) < 0)
1068 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001069 m = PyModule_Create(&zlibmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001070 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001071 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001072
Fred Drake4baedc12002-04-01 14:53:37 +00001073 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1074 if (ZlibError != NULL) {
1075 Py_INCREF(ZlibError);
1076 PyModule_AddObject(m, "error", ZlibError);
1077 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001078 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1079 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1080 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1081 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1082 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1083 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1084 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1085 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1086 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001087
Jeremy Hylton9714f992001-10-16 21:19:45 +00001088 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1089 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1090 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1091 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001092
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001093 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001094 if (ver != NULL)
1095 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001096
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001097 PyModule_AddStringConstant(m, "__version__", "1.0");
1098
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001099#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +00001100 zlib_lock = PyThread_allocate_lock();
Sjoerd Mullender556a9382002-03-11 09:20:47 +00001101#endif /* WITH_THREAD */
Martin v. Löwis1a214512008-06-11 05:26:20 +00001102 return m;
Guido van Rossumfb221561997-04-29 15:38:09 +00001103}