blob: 353d11a49413b20bfb918222e43801ac7ae49273 [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
Antoine Pitrou31f30b12009-01-02 17:34:35 +000012 #include "pythread.h"
13 #define ENTER_ZLIB(obj) \
14 Py_BEGIN_ALLOW_THREADS; \
15 PyThread_acquire_lock((obj)->lock, 1); \
16 Py_END_ALLOW_THREADS;
17 #define LEAVE_ZLIB(obj) PyThread_release_lock((obj)->lock);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000018#else
Antoine Pitrou31f30b12009-01-02 17:34:35 +000019 #define ENTER_ZLIB(obj)
20 #define LEAVE_ZLIB(obj)
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000021#endif
22
Guido van Rossumfb221561997-04-29 15:38:09 +000023/* The following parameters are copied from zutil.h, version 0.95 */
24#define DEFLATED 8
25#if MAX_MEM_LEVEL >= 8
26# define DEF_MEM_LEVEL 8
27#else
28# define DEF_MEM_LEVEL MAX_MEM_LEVEL
29#endif
30#define DEF_WBITS MAX_WBITS
31
Guido van Rossumb729a1d1999-04-07 20:23:17 +000032/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
33#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000034
Jeremy Hylton938ace62002-07-17 16:30:39 +000035static PyTypeObject Comptype;
36static PyTypeObject Decomptype;
Guido van Rossumfb221561997-04-29 15:38:09 +000037
38static PyObject *ZlibError;
39
Tim Peters977e5402001-10-17 03:57:20 +000040typedef struct
Guido van Rossumfb221561997-04-29 15:38:09 +000041{
Jeremy Hylton9714f992001-10-16 21:19:45 +000042 PyObject_HEAD
43 z_stream zst;
44 PyObject *unused_data;
45 PyObject *unconsumed_tail;
46 int is_initialised;
Antoine Pitrou31f30b12009-01-02 17:34:35 +000047 #ifdef WITH_THREAD
48 PyThread_type_lock lock;
49 #endif
Guido van Rossumfb221561997-04-29 15:38:09 +000050} compobject;
51
Jeremy Hylton0965e082001-10-16 21:56:09 +000052static void
53zlib_error(z_stream zst, int err, char *msg)
54{
55 if (zst.msg == Z_NULL)
56 PyErr_Format(ZlibError, "Error %d %s", err, msg);
57 else
58 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
59}
60
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000061PyDoc_STRVAR(compressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +000062"compressobj([level]) -- Return a compressor object.\n"
63"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064"Optional arg level is the compression level, in 1-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +000065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000066PyDoc_STRVAR(decompressobj__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +000067"decompressobj([wbits]) -- Return a decompressor object.\n"
68"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000069"Optional arg wbits is the window buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +000070
Guido van Rossumfb221561997-04-29 15:38:09 +000071static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +000072newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +000073{
Tim Peters977e5402001-10-17 03:57:20 +000074 compobject *self;
Jeremy Hylton9714f992001-10-16 21:19:45 +000075 self = PyObject_New(compobject, type);
76 if (self == NULL)
77 return NULL;
78 self->is_initialised = 0;
Gregory P. Smith693fc462008-09-06 20:13:06 +000079 self->unused_data = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +000080 if (self->unused_data == NULL) {
81 Py_DECREF(self);
82 return NULL;
83 }
Gregory P. Smith693fc462008-09-06 20:13:06 +000084 self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +000085 if (self->unconsumed_tail == NULL) {
86 Py_DECREF(self);
87 return NULL;
88 }
Antoine Pitrou31f30b12009-01-02 17:34:35 +000089#ifdef WITH_THREAD
90 self->lock = PyThread_allocate_lock();
91#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +000092 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +000093}
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095PyDoc_STRVAR(compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +000096"compress(string[, level]) -- Returned compressed string.\n"
97"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000098"Optional arg level is the compression level, in 1-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +000099
Guido van Rossumfb221561997-04-29 15:38:09 +0000100static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000101PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000102{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000103 PyObject *ReturnVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000104 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000105 Byte *input, *output;
106 int length, level=Z_DEFAULT_COMPRESSION, err;
107 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000108
Jeremy Hylton9714f992001-10-16 21:19:45 +0000109 /* require Python string object, optional 'level' arg */
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000110 if (!PyArg_ParseTuple(args, "y*|i:compress", &pinput, &level))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000111 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000112 input = pinput.buf;
113 length = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000114
Jeremy Hylton9714f992001-10-16 21:19:45 +0000115 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000116
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000117 output = (Byte*)malloc(zst.avail_out);
118 if (output == NULL) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000119 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000120 PyErr_SetString(PyExc_MemoryError,
121 "Can't allocate memory to compress data");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000122 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000123 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000124
Jeremy Hylton9714f992001-10-16 21:19:45 +0000125 /* Past the point of no return. From here on out, we need to make sure
126 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000127
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000128 zst.zalloc = (alloc_func)NULL;
129 zst.zfree = (free_func)Z_NULL;
130 zst.next_out = (Byte *)output;
131 zst.next_in = (Byte *)input;
132 zst.avail_in = length;
133 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000134
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000135 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000136 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000137 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000138 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000139 PyErr_SetString(PyExc_MemoryError,
140 "Out of memory while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000141 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000142 case(Z_STREAM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000143 PyErr_SetString(ZlibError,
144 "Bad compression level");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000145 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000146 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000147 deflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000148 zlib_error(zst, err, "while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000149 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000150 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000151
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000152 Py_BEGIN_ALLOW_THREADS;
153 err = deflate(&zst, Z_FINISH);
154 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000155
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000156 if (err != Z_STREAM_END) {
157 zlib_error(zst, err, "while compressing data");
158 deflateEnd(&zst);
159 goto error;
160 }
Tim Peters977e5402001-10-17 03:57:20 +0000161
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000162 err=deflateEnd(&zst);
163 if (err == Z_OK)
Gregory P. Smith693fc462008-09-06 20:13:06 +0000164 ReturnVal = PyBytes_FromStringAndSize((char *)output,
Guido van Rossum776152b2007-05-22 22:44:07 +0000165 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000166 else
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000167 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000168
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000169 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000170 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000171 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000172
Jeremy Hylton9714f992001-10-16 21:19:45 +0000173 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000174}
175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000176PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000177"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
178"\n"
179"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000180"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000181
Guido van Rossumfb221561997-04-29 15:38:09 +0000182static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000183PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000184{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000185 PyObject *result_str;
Martin v. Löwis423be952008-08-13 15:53:07 +0000186 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000187 Byte *input;
188 int length, err;
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000189 int wsize=DEF_WBITS;
190 Py_ssize_t r_strlen=DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000191 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000192
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000193 if (!PyArg_ParseTuple(args, "y*|in:decompress",
Martin v. Löwis423be952008-08-13 15:53:07 +0000194 &pinput, &wsize, &r_strlen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000195 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000196 input = pinput.buf;
197 length = pinput.len;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000198
Jeremy Hylton9714f992001-10-16 21:19:45 +0000199 if (r_strlen <= 0)
200 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000201
Jeremy Hylton9714f992001-10-16 21:19:45 +0000202 zst.avail_in = length;
203 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000204
Gregory P. Smith693fc462008-09-06 20:13:06 +0000205 if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen))) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000206 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000207 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000208 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000209
Jeremy Hylton9714f992001-10-16 21:19:45 +0000210 zst.zalloc = (alloc_func)NULL;
211 zst.zfree = (free_func)Z_NULL;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000212 zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000213 zst.next_in = (Byte *)input;
214 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000215
Jeremy Hylton9714f992001-10-16 21:19:45 +0000216 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000217 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000218 break;
Tim Peters977e5402001-10-17 03:57:20 +0000219 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000220 PyErr_SetString(PyExc_MemoryError,
221 "Out of memory while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000222 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000223 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000224 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000225 zlib_error(zst, err, "while preparing to decompress data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000226 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000227 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000228
Jeremy Hylton9714f992001-10-16 21:19:45 +0000229 do {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000230 Py_BEGIN_ALLOW_THREADS
231 err=inflate(&zst, Z_FINISH);
232 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000233
Jeremy Hylton9714f992001-10-16 21:19:45 +0000234 switch(err) {
235 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000236 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000237 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000238 /*
239 * If there is at least 1 byte of room according to zst.avail_out
240 * and we get this error, assume that it means zlib cannot
241 * process the inflate call() due to an error in the data.
242 */
Jeremy Hylton0965e082001-10-16 21:56:09 +0000243 if (zst.avail_out > 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000244 PyErr_Format(ZlibError, "Error %i while decompressing data",
245 err);
246 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000247 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000248 }
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000249 /* fall through */
250 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000251 /* need more memory */
Gregory P. Smith693fc462008-09-06 20:13:06 +0000252 if (_PyBytes_Resize(&result_str, r_strlen << 1) < 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000253 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000254 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000255 }
Guido van Rossum776152b2007-05-22 22:44:07 +0000256 zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000257 (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000258 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000259 r_strlen = r_strlen << 1;
260 break;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000261 default:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000262 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000263 zlib_error(zst, err, "while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000264 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000265 }
266 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000267
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000268 err = inflateEnd(&zst);
269 if (err != Z_OK) {
270 zlib_error(zst, err, "while finishing data decompression");
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000271 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000272 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000273
Gregory P. Smith693fc462008-09-06 20:13:06 +0000274 if (_PyBytes_Resize(&result_str, zst.total_out) < 0)
Guido van Rossum776152b2007-05-22 22:44:07 +0000275 goto error;
276
Martin v. Löwis423be952008-08-13 15:53:07 +0000277 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000278 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000279
280 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000281 PyBuffer_Release(&pinput);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000282 Py_XDECREF(result_str);
283 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000284}
285
286static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000287PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000288{
Jeremy Hylton499000002001-10-16 21:59:35 +0000289 compobject *self;
290 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
291 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000292
Jeremy Hylton499000002001-10-16 21:59:35 +0000293 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
294 &memLevel, &strategy))
295 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000296
Jeremy Hylton499000002001-10-16 21:59:35 +0000297 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000298 if (self==NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000299 return(NULL);
300 self->zst.zalloc = (alloc_func)NULL;
301 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000302 self->zst.next_in = NULL;
303 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000304 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
305 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000306 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000307 self->is_initialised = 1;
308 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000309 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000310 Py_DECREF(self);
311 PyErr_SetString(PyExc_MemoryError,
312 "Can't allocate memory for compression object");
313 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000314 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000315 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000316 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000317 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000318 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000319 zlib_error(self->zst, err, "while creating compression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000320 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000321 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000322 }
323}
324
325static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000326PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000327{
Jeremy Hylton499000002001-10-16 21:59:35 +0000328 int wbits=DEF_WBITS, err;
329 compobject *self;
330 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
331 return NULL;
332
333 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000334 if (self == NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000335 return(NULL);
336 self->zst.zalloc = (alloc_func)NULL;
337 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000338 self->zst.next_in = NULL;
339 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000340 err = inflateInit2(&self->zst, wbits);
341 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000342 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000343 self->is_initialised = 1;
344 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000345 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000346 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000347 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000348 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000349 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000350 Py_DECREF(self);
351 PyErr_SetString(PyExc_MemoryError,
352 "Can't allocate memory for decompression object");
353 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000354 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000355 zlib_error(self->zst, err, "while creating decompression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000356 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000357 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000358 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000359}
360
361static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000362Dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000363{
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000364#ifdef WITH_THREAD
365 PyThread_free_lock(self->lock);
366#endif
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000367 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000368 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000369 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000370}
371
372static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000373Comp_dealloc(compobject *self)
374{
375 if (self->is_initialised)
376 deflateEnd(&self->zst);
377 Dealloc(self);
378}
379
380static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000381Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000382{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000383 if (self->is_initialised)
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000384 inflateEnd(&self->zst);
385 Dealloc(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000386}
387
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000388PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000389"compress(data) -- Return a string containing data compressed.\n"
390"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000391"After calling this function, some of the input data may still\n"
392"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000393"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000394
395
Guido van Rossumfb221561997-04-29 15:38:09 +0000396static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000397PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000398{
Antoine Pitrou4b3fe142010-05-07 17:08:54 +0000399 int err, inplen;
400 Py_ssize_t length = DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000401 PyObject *RetVal;
Martin v. Löwis423be952008-08-13 15:53:07 +0000402 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000403 Byte *input;
404 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000405
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000406 if (!PyArg_ParseTuple(args, "y*:compress", &pinput))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000407 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000408 input = pinput.buf;
409 inplen = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000410
Gregory P. Smith693fc462008-09-06 20:13:06 +0000411 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000412 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000413 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000414 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000415
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000416 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000417
Jeremy Hylton9714f992001-10-16 21:19:45 +0000418 start_total_out = self->zst.total_out;
419 self->zst.avail_in = inplen;
420 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000421 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000422 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000423
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000424 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000425 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000426 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000427
Jeremy Hylton9714f992001-10-16 21:19:45 +0000428 /* while Z_OK and the output buffer is full, there might be more output,
429 so extend the output buffer and try again */
430 while (err == Z_OK && self->zst.avail_out == 0) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000431 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000432 Py_DECREF(RetVal);
433 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000434 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000435 }
436 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000437 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000438 self->zst.avail_out = length;
439 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000440
Jeremy Hylton9714f992001-10-16 21:19:45 +0000441 Py_BEGIN_ALLOW_THREADS
442 err = deflate(&(self->zst), Z_NO_FLUSH);
443 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000444 }
Tim Peters977e5402001-10-17 03:57:20 +0000445 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000446 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000447 condition.
448 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000449
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000450 if (err != Z_OK && err != Z_BUF_ERROR) {
451 zlib_error(self->zst, err, "while compressing");
452 Py_DECREF(RetVal);
453 RetVal = NULL;
454 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000455 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000456 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000457 Py_DECREF(RetVal);
458 RetVal = NULL;
459 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000460
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000461 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000462 LEAVE_ZLIB(self);
Martin v. Löwis423be952008-08-13 15:53:07 +0000463 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000464 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000465}
466
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000467PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000468"decompress(data, max_length) -- Return a string containing the decompressed\n"
469"version of the data.\n"
470"\n"
471"After calling this function, some of the input data may still be stored in\n"
472"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000473"Call the flush() method to clear these buffers.\n"
474"If the max_length parameter is specified then the return value will be\n"
475"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000476"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000477
Guido van Rossumfb221561997-04-29 15:38:09 +0000478static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000479PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000480{
Antoine Pitrou4b3fe142010-05-07 17:08:54 +0000481 int err, inplen, max_length = 0;
482 Py_ssize_t old_length, length = DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000483 PyObject *RetVal;
Martin v. Löwis423be952008-08-13 15:53:07 +0000484 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000485 Byte *input;
486 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000487
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000488 if (!PyArg_ParseTuple(args, "y*|i:decompress", &pinput,
Martin v. Löwis423be952008-08-13 15:53:07 +0000489 &max_length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000490 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000491 input = pinput.buf;
492 inplen = pinput.len;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000493 if (max_length < 0) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000494 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000495 PyErr_SetString(PyExc_ValueError,
496 "max_length must be greater than zero");
497 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000498 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000499
Jeremy Hylton9714f992001-10-16 21:19:45 +0000500 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000501 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000502 length = max_length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000503 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length))) {
Martin v. Löwis423be952008-08-13 15:53:07 +0000504 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000505 return NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000506 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000507
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000508 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000509
Jeremy Hylton9714f992001-10-16 21:19:45 +0000510 start_total_out = self->zst.total_out;
511 self->zst.avail_in = inplen;
512 self->zst.next_in = input;
513 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000514 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000515
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000516 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000517 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000518 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000519
Jeremy Hylton9714f992001-10-16 21:19:45 +0000520 /* While Z_OK and the output buffer is full, there might be more output.
521 So extend the output buffer and try again.
522 */
Tim Peters977e5402001-10-17 03:57:20 +0000523 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000524 /* If max_length set, don't continue decompressing if we've already
525 reached the limit.
526 */
527 if (max_length && length >= max_length)
528 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000529
Jeremy Hylton9714f992001-10-16 21:19:45 +0000530 /* otherwise, ... */
531 old_length = length;
532 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000533 if (max_length && length > max_length)
Jeremy Hylton9714f992001-10-16 21:19:45 +0000534 length = max_length;
535
Gregory P. Smith693fc462008-09-06 20:13:06 +0000536 if (_PyBytes_Resize(&RetVal, length) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000537 Py_DECREF(RetVal);
538 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000539 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000540 }
541 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000542 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000543 self->zst.avail_out = length - old_length;
544
545 Py_BEGIN_ALLOW_THREADS
546 err = inflate(&(self->zst), Z_SYNC_FLUSH);
547 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000548 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000549
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000550 /* Not all of the compressed data could be accommodated in the output buffer
Jeremy Hylton9714f992001-10-16 21:19:45 +0000551 of specified size. Return the unconsumed tail in an attribute.*/
552 if(max_length) {
553 Py_DECREF(self->unconsumed_tail);
Gregory P. Smith693fc462008-09-06 20:13:06 +0000554 self->unconsumed_tail = PyBytes_FromStringAndSize((char *)self->zst.next_in,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000555 self->zst.avail_in);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000556 if(!self->unconsumed_tail) {
557 Py_DECREF(RetVal);
558 RetVal = NULL;
559 goto error;
560 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000561 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000562
Tim Peters977e5402001-10-17 03:57:20 +0000563 /* The end of the compressed data has been reached, so set the
564 unused_data attribute to a string containing the remainder of the
565 data in the string. Note that this is also a logical place to call
Jeremy Hylton9714f992001-10-16 21:19:45 +0000566 inflateEnd, but the old behaviour of only calling it on flush() is
567 preserved.
568 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000569 if (err == Z_STREAM_END) {
570 Py_XDECREF(self->unused_data); /* Free original empty string */
Gregory P. Smith693fc462008-09-06 20:13:06 +0000571 self->unused_data = PyBytes_FromStringAndSize(
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000572 (char *)self->zst.next_in, self->zst.avail_in);
573 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000574 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000575 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000576 }
Tim Peters977e5402001-10-17 03:57:20 +0000577 /* We will only get Z_BUF_ERROR if the output buffer was full
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000578 but there wasn't more output when we tried again, so it is
579 not an error condition.
580 */
581 } else if (err != Z_OK && err != Z_BUF_ERROR) {
582 zlib_error(self->zst, err, "while decompressing");
583 Py_DECREF(RetVal);
584 RetVal = NULL;
585 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000586 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000587
Gregory P. Smith693fc462008-09-06 20:13:06 +0000588 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000589 Py_DECREF(RetVal);
590 RetVal = NULL;
591 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000592
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000593 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000594 LEAVE_ZLIB(self);
Martin v. Löwis423be952008-08-13 15:53:07 +0000595 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000596 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000597}
598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000599PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000600"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000601"\n"
602"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000603"default value used when mode is not specified is Z_FINISH.\n"
604"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000605"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000606
Guido van Rossumfb221561997-04-29 15:38:09 +0000607static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000608PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000609{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000610 int err, length = DEFAULTALLOC;
611 PyObject *RetVal;
612 int flushmode = Z_FINISH;
613 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000614
Jeremy Hylton9714f992001-10-16 21:19:45 +0000615 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
616 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000617
Jeremy Hylton9714f992001-10-16 21:19:45 +0000618 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
619 doing any work at all; just return an empty string. */
620 if (flushmode == Z_NO_FLUSH) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000621 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000622 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000623
Gregory P. Smith693fc462008-09-06 20:13:06 +0000624 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000625 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000626
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000627 ENTER_ZLIB(self);
Tim Peters977e5402001-10-17 03:57:20 +0000628
Jeremy Hylton9714f992001-10-16 21:19:45 +0000629 start_total_out = self->zst.total_out;
630 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000631 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000632 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000633
634 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000635 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000636 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000637
Jeremy Hylton9714f992001-10-16 21:19:45 +0000638 /* while Z_OK and the output buffer is full, there might be more output,
639 so extend the output buffer and try again */
640 while (err == Z_OK && self->zst.avail_out == 0) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000641 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000642 Py_DECREF(RetVal);
643 RetVal = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000644 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000645 }
646 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000647 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000648 self->zst.avail_out = length;
649 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000650
Jeremy Hylton9714f992001-10-16 21:19:45 +0000651 Py_BEGIN_ALLOW_THREADS
652 err = deflate(&(self->zst), flushmode);
653 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000654 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000655
Jeremy Hylton9714f992001-10-16 21:19:45 +0000656 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000657 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000658 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000659 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
660 err = deflateEnd(&(self->zst));
661 if (err != Z_OK) {
662 zlib_error(self->zst, err, "from deflateEnd()");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000663 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000664 RetVal = NULL;
665 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000666 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000667 else
668 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000669
670 /* We will only get Z_BUF_ERROR if the output buffer was full
671 but there wasn't more output when we tried again, so it is
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000672 not an error condition.
673 */
674 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
675 zlib_error(self->zst, err, "while flushing");
676 Py_DECREF(RetVal);
677 RetVal = NULL;
Jeremy Hyltonc72737e2002-04-19 14:37:07 +0000678 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000679 }
Tim Peters977e5402001-10-17 03:57:20 +0000680
Gregory P. Smith693fc462008-09-06 20:13:06 +0000681 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000682 Py_DECREF(RetVal);
683 RetVal = NULL;
684 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000685
Tim Peters977e5402001-10-17 03:57:20 +0000686 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000687 LEAVE_ZLIB(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000688
689 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000690}
691
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000692#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000693PyDoc_STRVAR(comp_copy__doc__,
694"copy() -- Return a copy of the compression object.");
695
696static PyObject *
697PyZlib_copy(compobject *self)
698{
699 compobject *retval = NULL;
700 int err;
701
702 retval = newcompobject(&Comptype);
703 if (!retval) return NULL;
704
705 /* Copy the zstream state
706 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
707 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000708 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000709 err = deflateCopy(&retval->zst, &self->zst);
710 switch(err) {
711 case(Z_OK):
712 break;
713 case(Z_STREAM_ERROR):
714 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
715 goto error;
716 case(Z_MEM_ERROR):
717 PyErr_SetString(PyExc_MemoryError,
718 "Can't allocate memory for compression object");
719 goto error;
720 default:
721 zlib_error(self->zst, err, "while copying compression object");
722 goto error;
723 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000724 Py_INCREF(self->unused_data);
725 Py_INCREF(self->unconsumed_tail);
726 Py_XDECREF(retval->unused_data);
727 Py_XDECREF(retval->unconsumed_tail);
728 retval->unused_data = self->unused_data;
729 retval->unconsumed_tail = self->unconsumed_tail;
730
731 /* Mark it as being initialized */
732 retval->is_initialised = 1;
733
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000734 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000735 return (PyObject *)retval;
736
737error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000738 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000739 Py_XDECREF(retval);
740 return NULL;
741}
742
743PyDoc_STRVAR(decomp_copy__doc__,
744"copy() -- Return a copy of the decompression object.");
745
746static PyObject *
747PyZlib_uncopy(compobject *self)
748{
749 compobject *retval = NULL;
750 int err;
751
752 retval = newcompobject(&Decomptype);
753 if (!retval) return NULL;
754
755 /* Copy the zstream state
756 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
757 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000758 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000759 err = inflateCopy(&retval->zst, &self->zst);
760 switch(err) {
761 case(Z_OK):
762 break;
763 case(Z_STREAM_ERROR):
764 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
765 goto error;
766 case(Z_MEM_ERROR):
767 PyErr_SetString(PyExc_MemoryError,
768 "Can't allocate memory for decompression object");
769 goto error;
770 default:
771 zlib_error(self->zst, err, "while copying decompression object");
772 goto error;
773 }
774
775 Py_INCREF(self->unused_data);
776 Py_INCREF(self->unconsumed_tail);
777 Py_XDECREF(retval->unused_data);
778 Py_XDECREF(retval->unconsumed_tail);
779 retval->unused_data = self->unused_data;
780 retval->unconsumed_tail = self->unconsumed_tail;
781
782 /* Mark it as being initialized */
783 retval->is_initialised = 1;
784
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000785 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000786 return (PyObject *)retval;
787
788error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000789 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790 Py_XDECREF(retval);
791 return NULL;
792}
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000793#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000795PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000796"flush( [length] ) -- Return a string containing any remaining\n"
797"decompressed data. length, if given, is the initial size of the\n"
798"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000799"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000800"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000801
Guido van Rossumfb221561997-04-29 15:38:09 +0000802static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000803PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000804{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000805 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000806 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000807 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000808
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000809 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000810 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000811 if (length <= 0) {
812 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
813 return NULL;
814 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000815 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000816 return NULL;
817
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000818
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000819 ENTER_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000820
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000821 start_total_out = self->zst.total_out;
822 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000823 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000824
825 Py_BEGIN_ALLOW_THREADS
826 err = inflate(&(self->zst), Z_FINISH);
827 Py_END_ALLOW_THREADS
828
829 /* while Z_OK and the output buffer is full, there might be more output,
830 so extend the output buffer and try again */
831 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Gregory P. Smith693fc462008-09-06 20:13:06 +0000832 if (_PyBytes_Resize(&retval, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000833 Py_DECREF(retval);
834 retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000835 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000836 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000837 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000838 self->zst.avail_out = length;
839 length = length << 1;
840
841 Py_BEGIN_ALLOW_THREADS
842 err = inflate(&(self->zst), Z_FINISH);
843 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000844 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000845
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000846 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
847 various data structures. Note we should only get Z_STREAM_END when
848 flushmode is Z_FINISH */
849 if (err == Z_STREAM_END) {
850 err = inflateEnd(&(self->zst));
851 self->is_initialised = 0;
852 if (err != Z_OK) {
853 zlib_error(self->zst, err, "from inflateEnd()");
854 Py_DECREF(retval);
855 retval = NULL;
856 goto error;
857 }
858 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000859 if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000860 Py_DECREF(retval);
861 retval = NULL;
862 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000863
864error:
865
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000866 LEAVE_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000867
Jeremy Hylton9714f992001-10-16 21:19:45 +0000868 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000869}
870
871static PyMethodDef comp_methods[] =
872{
Tim Peters977e5402001-10-17 03:57:20 +0000873 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000874 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000875 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000876 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000877#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000878 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
879 comp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000880#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000881 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000882};
883
884static PyMethodDef Decomp_methods[] =
885{
Tim Peters977e5402001-10-17 03:57:20 +0000886 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000887 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000888 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000889 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000890#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000891 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
892 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000893#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000894 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000895};
896
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000897#define COMP_OFF(x) offsetof(compobject, x)
898static PyMemberDef Decomp_members[] = {
899 {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
900 {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
901 {NULL},
902};
Guido van Rossumfb221561997-04-29 15:38:09 +0000903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000904PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000905"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
906"\n"
907"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000908"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000909
Guido van Rossumfb221561997-04-29 15:38:09 +0000910static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000911PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000912{
Christian Heimescc47b052008-03-25 14:56:36 +0000913 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000914 Py_buffer pbuf;
Tim Peters977e5402001-10-17 03:57:20 +0000915
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000916 if (!PyArg_ParseTuple(args, "y*|I:adler32", &pbuf, &adler32val))
917 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000918 /* Releasing the GIL for very small buffers is inefficient
919 and may lower performance */
920 if (pbuf.len > 1024*5) {
921 Py_BEGIN_ALLOW_THREADS
922 adler32val = adler32(adler32val, pbuf.buf, pbuf.len);
923 Py_END_ALLOW_THREADS
924 } else {
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000925 adler32val = adler32(adler32val, pbuf.buf, pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000926 }
927 PyBuffer_Release(&pbuf);
Gregory P. Smith27275032008-03-20 06:20:09 +0000928 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +0000929}
Tim Peters977e5402001-10-17 03:57:20 +0000930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000931PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000932"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
933"\n"
934"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +0000936
937static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000938PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000939{
Christian Heimescc47b052008-03-25 14:56:36 +0000940 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +0000941 Py_buffer pbuf;
942 int signed_val;
Christian Heimescc47b052008-03-25 14:56:36 +0000943
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000944 if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000945 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000946 /* Releasing the GIL for very small buffers is inefficient
947 and may lower performance */
948 if (pbuf.len > 1024*5) {
949 Py_BEGIN_ALLOW_THREADS
950 signed_val = crc32(crc32val, pbuf.buf, pbuf.len);
951 Py_END_ALLOW_THREADS
952 } else {
953 signed_val = crc32(crc32val, pbuf.buf, pbuf.len);
954 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000955 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +0000956 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +0000957}
Tim Peters977e5402001-10-17 03:57:20 +0000958
Guido van Rossumfb221561997-04-29 15:38:09 +0000959
960static PyMethodDef zlib_methods[] =
961{
Tim Peters977e5402001-10-17 03:57:20 +0000962 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000963 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000964 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000965 compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000966 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000967 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000968 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
969 crc32__doc__},
970 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000971 decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +0000972 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +0000973 decompressobj__doc__},
974 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000975};
976
Tim Peters0c322792002-07-17 16:49:03 +0000977static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000978 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +0000979 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +0000980 sizeof(compobject),
981 0,
982 (destructor)Comp_dealloc, /*tp_dealloc*/
983 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000984 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +0000985 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +0000986 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +0000987 0, /*tp_repr*/
988 0, /*tp_as_number*/
989 0, /*tp_as_sequence*/
990 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000991 0, /*tp_hash*/
992 0, /*tp_call*/
993 0, /*tp_str*/
994 0, /*tp_getattro*/
995 0, /*tp_setattro*/
996 0, /*tp_as_buffer*/
997 Py_TPFLAGS_DEFAULT, /*tp_flags*/
998 0, /*tp_doc*/
999 0, /*tp_traverse*/
1000 0, /*tp_clear*/
1001 0, /*tp_richcompare*/
1002 0, /*tp_weaklistoffset*/
1003 0, /*tp_iter*/
1004 0, /*tp_iternext*/
1005 comp_methods, /*tp_methods*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001006};
1007
Tim Peters0c322792002-07-17 16:49:03 +00001008static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001009 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001010 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001011 sizeof(compobject),
1012 0,
1013 (destructor)Decomp_dealloc, /*tp_dealloc*/
1014 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001015 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001016 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001017 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001018 0, /*tp_repr*/
1019 0, /*tp_as_number*/
1020 0, /*tp_as_sequence*/
1021 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001022 0, /*tp_hash*/
1023 0, /*tp_call*/
1024 0, /*tp_str*/
1025 0, /*tp_getattro*/
1026 0, /*tp_setattro*/
1027 0, /*tp_as_buffer*/
1028 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1029 0, /*tp_doc*/
1030 0, /*tp_traverse*/
1031 0, /*tp_clear*/
1032 0, /*tp_richcompare*/
1033 0, /*tp_weaklistoffset*/
1034 0, /*tp_iter*/
1035 0, /*tp_iternext*/
1036 Decomp_methods, /*tp_methods*/
1037 Decomp_members, /*tp_members*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001038};
1039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001040PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001041"The functions in this module allow compression and decompression using the\n"
1042"zlib library, which is based on GNU zip.\n"
1043"\n"
1044"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
1045"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +00001046"compressobj([level]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001047"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001048"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001049"decompressobj([wbits]) -- Return a decompressor object.\n"
1050"\n"
1051"'wbits' is window buffer size.\n"
1052"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001053"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001054
Martin v. Löwis1a214512008-06-11 05:26:20 +00001055static struct PyModuleDef zlibmodule = {
1056 PyModuleDef_HEAD_INIT,
1057 "zlib",
1058 zlib_module_documentation,
1059 -1,
1060 zlib_methods,
1061 NULL,
1062 NULL,
1063 NULL,
1064 NULL
1065};
1066
Mark Hammond62b1ab12002-07-23 06:31:15 +00001067PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001068PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001069{
Fred Drake4baedc12002-04-01 14:53:37 +00001070 PyObject *m, *ver;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001071 if (PyType_Ready(&Comptype) < 0)
1072 return NULL;
1073 if (PyType_Ready(&Decomptype) < 0)
1074 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001075 m = PyModule_Create(&zlibmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001076 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001077 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001078
Fred Drake4baedc12002-04-01 14:53:37 +00001079 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1080 if (ZlibError != NULL) {
1081 Py_INCREF(ZlibError);
1082 PyModule_AddObject(m, "error", ZlibError);
1083 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001084 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1085 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1086 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1087 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1088 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1089 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1090 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1091 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1092 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001093
Jeremy Hylton9714f992001-10-16 21:19:45 +00001094 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1095 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1096 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1097 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001098
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001099 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001100 if (ver != NULL)
1101 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001102
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001103 PyModule_AddStringConstant(m, "__version__", "1.0");
1104
Martin v. Löwis1a214512008-06-11 05:26:20 +00001105 return m;
Guido van Rossumfb221561997-04-29 15:38:09 +00001106}