blob: 6519194fb57f0a70ed64d2fdcbbc59428d7af504 [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;
Nadeem Vawda1c385462011-08-13 15:22:40 +020046 char eof;
Jeremy Hylton9714f992001-10-16 21:19:45 +000047 int is_initialised;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020048 PyObject *zdict;
Antoine Pitrou31f30b12009-01-02 17:34:35 +000049 #ifdef WITH_THREAD
50 PyThread_type_lock lock;
51 #endif
Guido van Rossumfb221561997-04-29 15:38:09 +000052} compobject;
53
Jeremy Hylton0965e082001-10-16 21:56:09 +000054static void
55zlib_error(z_stream zst, int err, char *msg)
56{
Nadeem Vawda524148a2011-08-28 11:26:46 +020057 const char *zmsg = Z_NULL;
58 /* In case of a version mismatch, zst.msg won't be initialized.
59 Check for this case first, before looking at zst.msg. */
60 if (err == Z_VERSION_ERROR)
61 zmsg = "library version mismatch";
62 if (zmsg == Z_NULL)
63 zmsg = zst.msg;
Antoine Pitrou96f212b2010-05-11 23:49:58 +000064 if (zmsg == Z_NULL) {
65 switch (err) {
66 case Z_BUF_ERROR:
67 zmsg = "incomplete or truncated stream";
68 break;
69 case Z_STREAM_ERROR:
70 zmsg = "inconsistent stream state";
71 break;
72 case Z_DATA_ERROR:
73 zmsg = "invalid input data";
74 break;
75 }
76 }
77 if (zmsg == Z_NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000078 PyErr_Format(ZlibError, "Error %d %s", err, msg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000079 else
Antoine Pitrou96f212b2010-05-11 23:49:58 +000080 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg);
Jeremy Hylton0965e082001-10-16 21:56:09 +000081}
82
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000083PyDoc_STRVAR(compressobj__doc__,
Nadeem Vawda2180c972012-06-22 01:40:49 +020084"compressobj(level=-1, method=DEFLATED, wbits=15, memlevel=8,\n"
85" strategy=Z_DEFAULT_STRATEGY[, zdict])\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020086" -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +000087"\n"
Nadeem Vawda2180c972012-06-22 01:40:49 +020088"level is the compression level (an integer in the range 0-9; default is 6).\n"
89"Higher compression levels are slower, but produce smaller results.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +020090"\n"
Nadeem Vawda2180c972012-06-22 01:40:49 +020091"method is the compression algorithm. If given, this must be DEFLATED.\n"
92"\n"
93"wbits is the base two logarithm of the window size (range: 8..15).\n"
94"\n"
95"memlevel controls the amount of memory used for internal compression state.\n"
96"Valid values range from 1 to 9. Higher values result in higher memory usage,\n"
97"faster compression, and smaller output.\n"
98"\n"
99"strategy is used to tune the compression algorithm. Possible values are\n"
100"Z_DEFAULT_STRATEGY, Z_FILTERED, and Z_HUFFMAN_ONLY.\n"
101"\n"
102"zdict is the predefined compression dictionary - a sequence of bytes\n"
103"containing subsequences that are likely to occur in the input data.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000104
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105PyDoc_STRVAR(decompressobj__doc__,
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200106"decompressobj([wbits[, zdict]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000107"\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200108"Optional arg wbits is the window buffer size.\n"
109"\n"
110"Optional arg zdict is the predefined compression dictionary. This must be\n"
111"the same dictionary as used by the compressor that produced the input data.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000112
Guido van Rossumfb221561997-04-29 15:38:09 +0000113static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000114newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +0000115{
Tim Peters977e5402001-10-17 03:57:20 +0000116 compobject *self;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000117 self = PyObject_New(compobject, type);
118 if (self == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000119 return NULL;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200120 self->eof = 0;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000121 self->is_initialised = 0;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200122 self->zdict = NULL;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000123 self->unused_data = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000124 if (self->unused_data == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000125 Py_DECREF(self);
126 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000127 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000128 self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000129 if (self->unconsumed_tail == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000130 Py_DECREF(self);
131 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000132 }
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000133#ifdef WITH_THREAD
134 self->lock = PyThread_allocate_lock();
135#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +0000136 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000137}
138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000139PyDoc_STRVAR(compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000140"compress(string[, level]) -- Returned compressed string.\n"
141"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000142"Optional arg level is the compression level, in 1-9.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000143
Guido van Rossumfb221561997-04-29 15:38:09 +0000144static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000145PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000146{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000147 PyObject *ReturnVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000148 Py_buffer pinput;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200149 Byte *input, *output = NULL;
150 unsigned int length;
151 int level=Z_DEFAULT_COMPRESSION, err;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000152 z_stream zst;
Tim Peters977e5402001-10-17 03:57:20 +0000153
Jeremy Hylton9714f992001-10-16 21:19:45 +0000154 /* require Python string object, optional 'level' arg */
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000155 if (!PyArg_ParseTuple(args, "y*|i:compress", &pinput, &level))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000156 return NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200157
158 if (pinput.len > UINT_MAX) {
159 PyErr_SetString(PyExc_OverflowError,
160 "Size does not fit in an unsigned int");
161 goto error;
162 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000163 input = pinput.buf;
164 length = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000165
Jeremy Hylton9714f992001-10-16 21:19:45 +0000166 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000167
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000168 output = (Byte*)malloc(zst.avail_out);
169 if (output == NULL) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000170 PyErr_SetString(PyExc_MemoryError,
171 "Can't allocate memory to compress data");
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200172 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000173 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000174
Jeremy Hylton9714f992001-10-16 21:19:45 +0000175 /* Past the point of no return. From here on out, we need to make sure
176 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000177
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000178 zst.zalloc = (alloc_func)NULL;
179 zst.zfree = (free_func)Z_NULL;
180 zst.next_out = (Byte *)output;
181 zst.next_in = (Byte *)input;
182 zst.avail_in = length;
183 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000184
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000185 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000186 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000187 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000188 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000189 PyErr_SetString(PyExc_MemoryError,
190 "Out of memory while compressing data");
191 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000192 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000193 PyErr_SetString(ZlibError,
194 "Bad compression level");
195 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000196 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000197 deflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000198 zlib_error(zst, err, "while compressing data");
199 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000200 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000201
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000202 Py_BEGIN_ALLOW_THREADS;
203 err = deflate(&zst, Z_FINISH);
204 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000205
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000206 if (err != Z_STREAM_END) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000207 zlib_error(zst, err, "while compressing data");
208 deflateEnd(&zst);
209 goto error;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000210 }
Tim Peters977e5402001-10-17 03:57:20 +0000211
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000212 err=deflateEnd(&zst);
213 if (err == Z_OK)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000214 ReturnVal = PyBytes_FromStringAndSize((char *)output,
Guido van Rossum776152b2007-05-22 22:44:07 +0000215 zst.total_out);
Tim Peters977e5402001-10-17 03:57:20 +0000216 else
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000217 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000218
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000219 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000220 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000221 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000222
Jeremy Hylton9714f992001-10-16 21:19:45 +0000223 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000224}
225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000226PyDoc_STRVAR(decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000227"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
228"\n"
229"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000230"the initial output buffer size.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000231
Guido van Rossumfb221561997-04-29 15:38:09 +0000232static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000233PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000234{
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200235 PyObject *result_str = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000236 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000237 Byte *input;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200238 unsigned int length;
239 int err;
Guido van Rossumcd4d4522007-11-22 00:30:02 +0000240 int wsize=DEF_WBITS;
241 Py_ssize_t r_strlen=DEFAULTALLOC;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000242 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000243
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000244 if (!PyArg_ParseTuple(args, "y*|in:decompress",
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000245 &pinput, &wsize, &r_strlen))
246 return NULL;
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200247
248 if (pinput.len > UINT_MAX) {
249 PyErr_SetString(PyExc_OverflowError,
250 "Size does not fit in an unsigned int");
251 goto error;
252 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000253 input = pinput.buf;
254 length = pinput.len;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000255
Jeremy Hylton9714f992001-10-16 21:19:45 +0000256 if (r_strlen <= 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000257 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000258
Jeremy Hylton9714f992001-10-16 21:19:45 +0000259 zst.avail_in = length;
260 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000261
Nadeem Vawda1b8a4172011-05-14 22:26:55 +0200262 if (!(result_str = PyBytes_FromStringAndSize(NULL, r_strlen)))
263 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000264
Jeremy Hylton9714f992001-10-16 21:19:45 +0000265 zst.zalloc = (alloc_func)NULL;
266 zst.zfree = (free_func)Z_NULL;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000267 zst.next_out = (Byte *)PyBytes_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000268 zst.next_in = (Byte *)input;
269 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000270
Jeremy Hylton9714f992001-10-16 21:19:45 +0000271 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000272 case(Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000273 break;
Tim Peters977e5402001-10-17 03:57:20 +0000274 case(Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000275 PyErr_SetString(PyExc_MemoryError,
276 "Out of memory while decompressing data");
277 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000278 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000279 inflateEnd(&zst);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000280 zlib_error(zst, err, "while preparing to decompress data");
281 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000282 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000283
Jeremy Hylton9714f992001-10-16 21:19:45 +0000284 do {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000285 Py_BEGIN_ALLOW_THREADS
286 err=inflate(&zst, Z_FINISH);
287 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000288
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000289 switch(err) {
290 case(Z_STREAM_END):
291 break;
292 case(Z_BUF_ERROR):
293 /*
294 * If there is at least 1 byte of room according to zst.avail_out
295 * and we get this error, assume that it means zlib cannot
296 * process the inflate call() due to an error in the data.
297 */
298 if (zst.avail_out > 0) {
Antoine Pitrou96f212b2010-05-11 23:49:58 +0000299 zlib_error(zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000300 inflateEnd(&zst);
301 goto error;
302 }
303 /* fall through */
304 case(Z_OK):
305 /* need more memory */
306 if (_PyBytes_Resize(&result_str, r_strlen << 1) < 0) {
307 inflateEnd(&zst);
308 goto error;
309 }
310 zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000311 (unsigned char *)PyBytes_AS_STRING(result_str) + r_strlen;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000312 zst.avail_out = r_strlen;
313 r_strlen = r_strlen << 1;
314 break;
315 default:
316 inflateEnd(&zst);
317 zlib_error(zst, err, "while decompressing data");
318 goto error;
319 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000320 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000321
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000322 err = inflateEnd(&zst);
323 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200324 zlib_error(zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000325 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000326 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000327
Gregory P. Smith693fc462008-09-06 20:13:06 +0000328 if (_PyBytes_Resize(&result_str, zst.total_out) < 0)
Guido van Rossum776152b2007-05-22 22:44:07 +0000329 goto error;
330
Martin v. Löwis423be952008-08-13 15:53:07 +0000331 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000332 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000333
334 error:
Martin v. Löwis423be952008-08-13 15:53:07 +0000335 PyBuffer_Release(&pinput);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000336 Py_XDECREF(result_str);
337 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000338}
339
340static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200341PyZlib_compressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000342{
Jeremy Hylton499000002001-10-16 21:59:35 +0000343 compobject *self;
344 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
345 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200346 Py_buffer zdict;
347 static char *kwlist[] = {"level", "method", "wbits",
348 "memLevel", "strategy", "zdict", NULL};
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000349
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200350 zdict.buf = NULL; /* Sentinel, so we can tell whether zdict was supplied. */
351 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iiiiiy*:compressobj",
352 kwlist, &level, &method, &wbits,
353 &memLevel, &strategy, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000354 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000355
Jeremy Hylton499000002001-10-16 21:59:35 +0000356 self = newcompobject(&Comptype);
Tim Peters977e5402001-10-17 03:57:20 +0000357 if (self==NULL)
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200358 goto error;
Jeremy Hylton499000002001-10-16 21:59:35 +0000359 self->zst.zalloc = (alloc_func)NULL;
360 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000361 self->zst.next_in = NULL;
362 self->zst.avail_in = 0;
Jeremy Hylton499000002001-10-16 21:59:35 +0000363 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
364 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000365 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000366 self->is_initialised = 1;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200367 if (zdict.buf == NULL) {
368 goto success;
369 } else {
370 err = deflateSetDictionary(&self->zst, zdict.buf, zdict.len);
371 switch (err) {
372 case (Z_OK):
373 goto success;
374 case (Z_STREAM_ERROR):
375 PyErr_SetString(PyExc_ValueError, "Invalid dictionary");
376 goto error;
377 default:
378 PyErr_SetString(PyExc_ValueError, "deflateSetDictionary()");
379 goto error;
380 }
381 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000382 case (Z_MEM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000383 PyErr_SetString(PyExc_MemoryError,
384 "Can't allocate memory for compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200385 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000386 case(Z_STREAM_ERROR):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000387 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200388 goto error;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000389 default:
390 zlib_error(self->zst, err, "while creating compression object");
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200391 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000392 }
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200393
394 error:
395 Py_XDECREF(self);
396 self = NULL;
397 success:
398 if (zdict.buf != NULL)
399 PyBuffer_Release(&zdict);
400 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000401}
402
403static PyObject *
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200404PyZlib_decompressobj(PyObject *selfptr, PyObject *args, PyObject *kwargs)
Guido van Rossumfb221561997-04-29 15:38:09 +0000405{
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200406 static char *kwlist[] = {"wbits", "zdict", NULL};
Jeremy Hylton499000002001-10-16 21:59:35 +0000407 int wbits=DEF_WBITS, err;
408 compobject *self;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200409 PyObject *zdict=NULL;
410
411 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iO:decompressobj",
412 kwlist, &wbits, &zdict))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000413 return NULL;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200414 if (zdict != NULL && !PyObject_CheckBuffer(zdict)) {
415 PyErr_SetString(PyExc_TypeError,
416 "zdict argument must support the buffer protocol");
417 return NULL;
418 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000419
420 self = newcompobject(&Decomptype);
Tim Peters977e5402001-10-17 03:57:20 +0000421 if (self == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000422 return(NULL);
Jeremy Hylton499000002001-10-16 21:59:35 +0000423 self->zst.zalloc = (alloc_func)NULL;
424 self->zst.zfree = (free_func)Z_NULL;
Andrew M. Kuchling3b585b32004-12-28 20:10:48 +0000425 self->zst.next_in = NULL;
426 self->zst.avail_in = 0;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200427 if (zdict != NULL) {
428 Py_INCREF(zdict);
429 self->zdict = zdict;
430 }
Jeremy Hylton499000002001-10-16 21:59:35 +0000431 err = inflateInit2(&self->zst, wbits);
432 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000433 case (Z_OK):
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000434 self->is_initialised = 1;
435 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000436 case(Z_STREAM_ERROR):
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000437 Py_DECREF(self);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000438 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
439 return NULL;
440 case (Z_MEM_ERROR):
441 Py_DECREF(self);
442 PyErr_SetString(PyExc_MemoryError,
443 "Can't allocate memory for decompression object");
444 return NULL;
445 default:
446 zlib_error(self->zst, err, "while creating decompression object");
447 Py_DECREF(self);
448 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000449 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000450}
451
452static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000453Dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000454{
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000455#ifdef WITH_THREAD
456 PyThread_free_lock(self->lock);
457#endif
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000458 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000459 Py_XDECREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200460 Py_XDECREF(self->zdict);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000461 PyObject_Del(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000462}
463
464static void
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000465Comp_dealloc(compobject *self)
466{
467 if (self->is_initialised)
468 deflateEnd(&self->zst);
469 Dealloc(self);
470}
471
472static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000473Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000474{
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000475 if (self->is_initialised)
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000476 inflateEnd(&self->zst);
477 Dealloc(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000478}
479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000480PyDoc_STRVAR(comp_compress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000481"compress(data) -- Return a string containing data compressed.\n"
482"\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000483"After calling this function, some of the input data may still\n"
484"be stored in internal buffers for later processing.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000485"Call the flush() method to clear these buffers.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000486
487
Guido van Rossumfb221561997-04-29 15:38:09 +0000488static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000489PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000490{
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200491 int err;
492 unsigned int inplen;
Antoine Pitrou4b3fe142010-05-07 17:08:54 +0000493 Py_ssize_t length = DEFAULTALLOC;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200494 PyObject *RetVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000495 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000496 Byte *input;
497 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000498
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000499 if (!PyArg_ParseTuple(args, "y*:compress", &pinput))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000500 return NULL;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200501 if (pinput.len > UINT_MAX) {
502 PyErr_SetString(PyExc_OverflowError,
503 "Size does not fit in an unsigned int");
504 goto error_outer;
505 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000506 input = pinput.buf;
507 inplen = pinput.len;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000508
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200509 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
510 goto error_outer;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000511
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000512 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000513
Jeremy Hylton9714f992001-10-16 21:19:45 +0000514 start_total_out = self->zst.total_out;
515 self->zst.avail_in = inplen;
516 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000517 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000518 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000519
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000520 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000521 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000522 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000523
Jeremy Hylton9714f992001-10-16 21:19:45 +0000524 /* while Z_OK and the output buffer is full, there might be more output,
525 so extend the output buffer and try again */
526 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000527 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000528 Py_DECREF(RetVal);
529 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000530 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000531 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000532 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000533 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000534 self->zst.avail_out = length;
535 length = length << 1;
Tim Peters977e5402001-10-17 03:57:20 +0000536
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000537 Py_BEGIN_ALLOW_THREADS
538 err = deflate(&(self->zst), Z_NO_FLUSH);
539 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000540 }
Tim Peters977e5402001-10-17 03:57:20 +0000541 /* We will only get Z_BUF_ERROR if the output buffer was full but
Jeremy Hylton9714f992001-10-16 21:19:45 +0000542 there wasn't more output when we tried again, so it is not an error
Tim Peters977e5402001-10-17 03:57:20 +0000543 condition.
544 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000545
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000546 if (err != Z_OK && err != Z_BUF_ERROR) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200547 zlib_error(self->zst, err, "while compressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000548 Py_DECREF(RetVal);
549 RetVal = NULL;
550 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000551 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000552 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000553 Py_DECREF(RetVal);
554 RetVal = NULL;
555 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000556
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000557 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000558 LEAVE_ZLIB(self);
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200559 error_outer:
Martin v. Löwis423be952008-08-13 15:53:07 +0000560 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000561 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000562}
563
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000564PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000565"decompress(data, max_length) -- Return a string containing the decompressed\n"
566"version of the data.\n"
567"\n"
568"After calling this function, some of the input data may still be stored in\n"
569"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000570"Call the flush() method to clear these buffers.\n"
571"If the max_length parameter is specified then the return value will be\n"
572"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000573"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000574
Guido van Rossumfb221561997-04-29 15:38:09 +0000575static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000576PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000577{
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200578 int err, max_length = 0;
579 unsigned int inplen;
Antoine Pitrou4b3fe142010-05-07 17:08:54 +0000580 Py_ssize_t old_length, length = DEFAULTALLOC;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200581 PyObject *RetVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000582 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000583 Byte *input;
584 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000585
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000586 if (!PyArg_ParseTuple(args, "y*|i:decompress", &pinput,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000587 &max_length))
588 return NULL;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200589 if (pinput.len > UINT_MAX) {
590 PyErr_SetString(PyExc_OverflowError,
591 "Size does not fit in an unsigned int");
592 goto error_outer;
593 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000594 input = pinput.buf;
595 inplen = pinput.len;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000596 if (max_length < 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000597 PyErr_SetString(PyExc_ValueError,
598 "max_length must be greater than zero");
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200599 goto error_outer;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000600 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000601
Jeremy Hylton9714f992001-10-16 21:19:45 +0000602 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000603 if (max_length && length > max_length)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000604 length = max_length;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200605 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
606 goto error_outer;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000607
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000608 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000609
Jeremy Hylton9714f992001-10-16 21:19:45 +0000610 start_total_out = self->zst.total_out;
611 self->zst.avail_in = inplen;
612 self->zst.next_in = input;
613 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000614 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000615
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000616 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000617 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000618 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000619
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200620 if (err == Z_NEED_DICT && self->zdict != NULL) {
621 Py_buffer zdict_buf;
622 if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
623 Py_DECREF(RetVal);
624 RetVal = NULL;
625 goto error;
626 }
627 err = inflateSetDictionary(&(self->zst), zdict_buf.buf, zdict_buf.len);
628 PyBuffer_Release(&zdict_buf);
629 if (err != Z_OK) {
630 zlib_error(self->zst, err, "while decompressing data");
631 Py_DECREF(RetVal);
632 RetVal = NULL;
633 goto error;
634 }
Nadeem Vawdacf5e1d82012-06-22 00:35:57 +0200635 /* Repeat the call to inflate. */
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200636 Py_BEGIN_ALLOW_THREADS
637 err = inflate(&(self->zst), Z_SYNC_FLUSH);
638 Py_END_ALLOW_THREADS
639 }
640
Jeremy Hylton9714f992001-10-16 21:19:45 +0000641 /* While Z_OK and the output buffer is full, there might be more output.
642 So extend the output buffer and try again.
643 */
Tim Peters977e5402001-10-17 03:57:20 +0000644 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000645 /* If max_length set, don't continue decompressing if we've already
646 reached the limit.
647 */
648 if (max_length && length >= max_length)
649 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000650
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000651 /* otherwise, ... */
652 old_length = length;
653 length = length << 1;
654 if (max_length && length > max_length)
655 length = max_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000656
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000657 if (_PyBytes_Resize(&RetVal, length) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000658 Py_DECREF(RetVal);
659 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000660 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000661 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000662 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000663 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000664 self->zst.avail_out = length - old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000665
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000666 Py_BEGIN_ALLOW_THREADS
667 err = inflate(&(self->zst), Z_SYNC_FLUSH);
668 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000669 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000670
Jeremy Hylton9714f992001-10-16 21:19:45 +0000671 if(max_length) {
Nadeem Vawda7619e882011-05-14 14:05:20 +0200672 /* Not all of the compressed data could be accommodated in a buffer of
673 the specified size. Return the unconsumed tail in an attribute. */
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000674 Py_DECREF(self->unconsumed_tail);
675 self->unconsumed_tail = PyBytes_FromStringAndSize((char *)self->zst.next_in,
676 self->zst.avail_in);
Nadeem Vawda7619e882011-05-14 14:05:20 +0200677 }
678 else if (PyBytes_GET_SIZE(self->unconsumed_tail) > 0) {
679 /* All of the compressed data was consumed. Clear unconsumed_tail. */
680 Py_DECREF(self->unconsumed_tail);
681 self->unconsumed_tail = PyBytes_FromStringAndSize("", 0);
682 }
683 if (self->unconsumed_tail == NULL) {
684 Py_DECREF(RetVal);
685 RetVal = NULL;
686 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000687 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000688
Tim Peters977e5402001-10-17 03:57:20 +0000689 /* The end of the compressed data has been reached, so set the
690 unused_data attribute to a string containing the remainder of the
691 data in the string. Note that this is also a logical place to call
Jeremy Hylton9714f992001-10-16 21:19:45 +0000692 inflateEnd, but the old behaviour of only calling it on flush() is
693 preserved.
694 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000695 if (err == Z_STREAM_END) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000696 Py_XDECREF(self->unused_data); /* Free original empty string */
697 self->unused_data = PyBytes_FromStringAndSize(
698 (char *)self->zst.next_in, self->zst.avail_in);
699 if (self->unused_data == NULL) {
700 Py_DECREF(RetVal);
701 goto error;
702 }
Nadeem Vawda1c385462011-08-13 15:22:40 +0200703 self->eof = 1;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000704 /* We will only get Z_BUF_ERROR if the output buffer was full
705 but there wasn't more output when we tried again, so it is
706 not an error condition.
707 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000708 } else if (err != Z_OK && err != Z_BUF_ERROR) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200709 zlib_error(self->zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000710 Py_DECREF(RetVal);
711 RetVal = NULL;
712 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000713 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000714
Gregory P. Smith693fc462008-09-06 20:13:06 +0000715 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000716 Py_DECREF(RetVal);
717 RetVal = NULL;
718 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000719
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000720 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000721 LEAVE_ZLIB(self);
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200722 error_outer:
Martin v. Löwis423be952008-08-13 15:53:07 +0000723 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000724 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000725}
726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000727PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000728"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000729"\n"
730"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000731"default value used when mode is not specified is Z_FINISH.\n"
732"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000733"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000734
Guido van Rossumfb221561997-04-29 15:38:09 +0000735static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000736PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000737{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000738 int err, length = DEFAULTALLOC;
739 PyObject *RetVal;
740 int flushmode = Z_FINISH;
741 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000742
Jeremy Hylton9714f992001-10-16 21:19:45 +0000743 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000744 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000745
Jeremy Hylton9714f992001-10-16 21:19:45 +0000746 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
747 doing any work at all; just return an empty string. */
748 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000749 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000750 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000751
Gregory P. Smith693fc462008-09-06 20:13:06 +0000752 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000753 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000754
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000755 ENTER_ZLIB(self);
Tim Peters977e5402001-10-17 03:57:20 +0000756
Jeremy Hylton9714f992001-10-16 21:19:45 +0000757 start_total_out = self->zst.total_out;
758 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000759 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000760 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000761
762 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000763 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000764 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000765
Jeremy Hylton9714f992001-10-16 21:19:45 +0000766 /* while Z_OK and the output buffer is full, there might be more output,
767 so extend the output buffer and try again */
768 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000769 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000770 Py_DECREF(RetVal);
771 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000772 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000773 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000774 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000775 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000776 self->zst.avail_out = length;
777 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000778
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000779 Py_BEGIN_ALLOW_THREADS
780 err = deflate(&(self->zst), flushmode);
781 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000782 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000783
Jeremy Hylton9714f992001-10-16 21:19:45 +0000784 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000785 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000786 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000787 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000788 err = deflateEnd(&(self->zst));
789 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200790 zlib_error(self->zst, err, "while finishing compression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000791 Py_DECREF(RetVal);
792 RetVal = NULL;
793 goto error;
794 }
795 else
796 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000797
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000798 /* We will only get Z_BUF_ERROR if the output buffer was full
799 but there wasn't more output when we tried again, so it is
800 not an error condition.
801 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000802 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000803 zlib_error(self->zst, err, "while flushing");
804 Py_DECREF(RetVal);
805 RetVal = NULL;
806 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000807 }
Tim Peters977e5402001-10-17 03:57:20 +0000808
Gregory P. Smith693fc462008-09-06 20:13:06 +0000809 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000810 Py_DECREF(RetVal);
811 RetVal = NULL;
812 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000813
Tim Peters977e5402001-10-17 03:57:20 +0000814 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000815 LEAVE_ZLIB(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000816
817 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000818}
819
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000820#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000821PyDoc_STRVAR(comp_copy__doc__,
822"copy() -- Return a copy of the compression object.");
823
824static PyObject *
825PyZlib_copy(compobject *self)
826{
827 compobject *retval = NULL;
828 int err;
829
830 retval = newcompobject(&Comptype);
831 if (!retval) return NULL;
832
833 /* Copy the zstream state
834 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
835 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000836 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000837 err = deflateCopy(&retval->zst, &self->zst);
838 switch(err) {
839 case(Z_OK):
840 break;
841 case(Z_STREAM_ERROR):
842 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
843 goto error;
844 case(Z_MEM_ERROR):
845 PyErr_SetString(PyExc_MemoryError,
846 "Can't allocate memory for compression object");
847 goto error;
848 default:
849 zlib_error(self->zst, err, "while copying compression object");
850 goto error;
851 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000852 Py_INCREF(self->unused_data);
853 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200854 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000855 Py_XDECREF(retval->unused_data);
856 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200857 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000858 retval->unused_data = self->unused_data;
859 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200860 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200861 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000862
863 /* Mark it as being initialized */
864 retval->is_initialised = 1;
865
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000866 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000867 return (PyObject *)retval;
868
869error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000870 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000871 Py_XDECREF(retval);
872 return NULL;
873}
874
875PyDoc_STRVAR(decomp_copy__doc__,
876"copy() -- Return a copy of the decompression object.");
877
878static PyObject *
879PyZlib_uncopy(compobject *self)
880{
881 compobject *retval = NULL;
882 int err;
883
884 retval = newcompobject(&Decomptype);
885 if (!retval) return NULL;
886
887 /* Copy the zstream state
888 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
889 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000890 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000891 err = inflateCopy(&retval->zst, &self->zst);
892 switch(err) {
893 case(Z_OK):
894 break;
895 case(Z_STREAM_ERROR):
896 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
897 goto error;
898 case(Z_MEM_ERROR):
899 PyErr_SetString(PyExc_MemoryError,
900 "Can't allocate memory for decompression object");
901 goto error;
902 default:
903 zlib_error(self->zst, err, "while copying decompression object");
904 goto error;
905 }
906
907 Py_INCREF(self->unused_data);
908 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200909 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000910 Py_XDECREF(retval->unused_data);
911 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200912 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000913 retval->unused_data = self->unused_data;
914 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200915 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200916 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000917
918 /* Mark it as being initialized */
919 retval->is_initialised = 1;
920
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000921 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000922 return (PyObject *)retval;
923
924error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000925 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000926 Py_XDECREF(retval);
927 return NULL;
928}
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000929#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000931PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000932"flush( [length] ) -- Return a string containing any remaining\n"
933"decompressed data. length, if given, is the initial size of the\n"
934"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000935"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000937
Guido van Rossumfb221561997-04-29 15:38:09 +0000938static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000939PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000940{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000941 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000942 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000943 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000944
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000945 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000946 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000947 if (length <= 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000948 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
949 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000950 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000951 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000952 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000953
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000954
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000955 ENTER_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000956
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000957 start_total_out = self->zst.total_out;
958 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000959 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000960
961 Py_BEGIN_ALLOW_THREADS
962 err = inflate(&(self->zst), Z_FINISH);
963 Py_END_ALLOW_THREADS
964
965 /* while Z_OK and the output buffer is full, there might be more output,
966 so extend the output buffer and try again */
967 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000968 if (_PyBytes_Resize(&retval, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000969 Py_DECREF(retval);
970 retval = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000971 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000972 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000973 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
974 self->zst.avail_out = length;
975 length = length << 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000976
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000977 Py_BEGIN_ALLOW_THREADS
978 err = inflate(&(self->zst), Z_FINISH);
979 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +0000980 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000981
Nadeem Vawda3bf71c52011-08-13 15:42:50 +0200982 /* If at end of stream, clean up any memory allocated by zlib. */
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000983 if (err == Z_STREAM_END) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200984 self->eof = 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000985 self->is_initialised = 0;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200986 err = inflateEnd(&(self->zst));
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000987 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200988 zlib_error(self->zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000989 Py_DECREF(retval);
990 retval = NULL;
991 goto error;
992 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000993 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000994 if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000995 Py_DECREF(retval);
996 retval = NULL;
997 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000998
999error:
1000
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001001 LEAVE_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001002
Jeremy Hylton9714f992001-10-16 21:19:45 +00001003 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +00001004}
1005
1006static PyMethodDef comp_methods[] =
1007{
Tim Peters977e5402001-10-17 03:57:20 +00001008 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001009 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001010 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001011 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001012#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001013 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
1014 comp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001015#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001016 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001017};
1018
1019static PyMethodDef Decomp_methods[] =
1020{
Tim Peters977e5402001-10-17 03:57:20 +00001021 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001022 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001023 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001024 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001025#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001026 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
1027 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001028#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001029 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001030};
1031
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001032#define COMP_OFF(x) offsetof(compobject, x)
1033static PyMemberDef Decomp_members[] = {
1034 {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
1035 {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
Nadeem Vawda1c385462011-08-13 15:22:40 +02001036 {"eof", T_BOOL, COMP_OFF(eof), READONLY},
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001037 {NULL},
1038};
Guido van Rossumfb221561997-04-29 15:38:09 +00001039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001040PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001041"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
1042"\n"
1043"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001044"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +00001045
Guido van Rossumfb221561997-04-29 15:38:09 +00001046static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001047PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001048{
Christian Heimescc47b052008-03-25 14:56:36 +00001049 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001050 Py_buffer pbuf;
Tim Peters977e5402001-10-17 03:57:20 +00001051
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001052 if (!PyArg_ParseTuple(args, "y*|I:adler32", &pbuf, &adler32val))
1053 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001054 /* Releasing the GIL for very small buffers is inefficient
1055 and may lower performance */
1056 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001057 unsigned char *buf = pbuf.buf;
1058 Py_ssize_t len = pbuf.len;
1059
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001060 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001061 /* Avoid truncation of length for very large buffers. adler32() takes
1062 length as an unsigned int, which may be narrower than Py_ssize_t. */
1063 while (len > (size_t) UINT_MAX) {
1064 adler32val = adler32(adler32val, buf, UINT_MAX);
1065 buf += (size_t) UINT_MAX;
1066 len -= (size_t) UINT_MAX;
1067 }
1068 adler32val = adler32(adler32val, buf, len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001069 Py_END_ALLOW_THREADS
1070 } else {
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001071 adler32val = adler32(adler32val, pbuf.buf, pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001072 }
1073 PyBuffer_Release(&pbuf);
Gregory P. Smith27275032008-03-20 06:20:09 +00001074 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001075}
Tim Peters977e5402001-10-17 03:57:20 +00001076
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001077PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001078"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
1079"\n"
1080"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001081"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +00001082
1083static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001084PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001085{
Christian Heimescc47b052008-03-25 14:56:36 +00001086 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +00001087 Py_buffer pbuf;
1088 int signed_val;
Christian Heimescc47b052008-03-25 14:56:36 +00001089
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001090 if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001091 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001092 /* Releasing the GIL for very small buffers is inefficient
1093 and may lower performance */
1094 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001095 unsigned char *buf = pbuf.buf;
1096 Py_ssize_t len = pbuf.len;
1097
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001098 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001099 /* Avoid truncation of length for very large buffers. crc32() takes
1100 length as an unsigned int, which may be narrower than Py_ssize_t. */
1101 while (len > (size_t) UINT_MAX) {
1102 crc32val = crc32(crc32val, buf, UINT_MAX);
1103 buf += (size_t) UINT_MAX;
1104 len -= (size_t) UINT_MAX;
1105 }
1106 signed_val = crc32(crc32val, buf, len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001107 Py_END_ALLOW_THREADS
1108 } else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001109 signed_val = crc32(crc32val, pbuf.buf, pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001110 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001111 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +00001112 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001113}
Tim Peters977e5402001-10-17 03:57:20 +00001114
Guido van Rossumfb221561997-04-29 15:38:09 +00001115
1116static PyMethodDef zlib_methods[] =
1117{
Tim Peters977e5402001-10-17 03:57:20 +00001118 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001119 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001120 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001121 compress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001122 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001123 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001124 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
1125 crc32__doc__},
1126 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001127 decompress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001128 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001129 decompressobj__doc__},
1130 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001131};
1132
Tim Peters0c322792002-07-17 16:49:03 +00001133static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001134 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001135 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001136 sizeof(compobject),
1137 0,
1138 (destructor)Comp_dealloc, /*tp_dealloc*/
1139 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001140 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001141 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001142 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001143 0, /*tp_repr*/
1144 0, /*tp_as_number*/
1145 0, /*tp_as_sequence*/
1146 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001147 0, /*tp_hash*/
1148 0, /*tp_call*/
1149 0, /*tp_str*/
1150 0, /*tp_getattro*/
1151 0, /*tp_setattro*/
1152 0, /*tp_as_buffer*/
1153 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1154 0, /*tp_doc*/
1155 0, /*tp_traverse*/
1156 0, /*tp_clear*/
1157 0, /*tp_richcompare*/
1158 0, /*tp_weaklistoffset*/
1159 0, /*tp_iter*/
1160 0, /*tp_iternext*/
1161 comp_methods, /*tp_methods*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001162};
1163
Tim Peters0c322792002-07-17 16:49:03 +00001164static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001165 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001166 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001167 sizeof(compobject),
1168 0,
1169 (destructor)Decomp_dealloc, /*tp_dealloc*/
1170 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001171 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001172 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001173 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001174 0, /*tp_repr*/
1175 0, /*tp_as_number*/
1176 0, /*tp_as_sequence*/
1177 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001178 0, /*tp_hash*/
1179 0, /*tp_call*/
1180 0, /*tp_str*/
1181 0, /*tp_getattro*/
1182 0, /*tp_setattro*/
1183 0, /*tp_as_buffer*/
1184 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1185 0, /*tp_doc*/
1186 0, /*tp_traverse*/
1187 0, /*tp_clear*/
1188 0, /*tp_richcompare*/
1189 0, /*tp_weaklistoffset*/
1190 0, /*tp_iter*/
1191 0, /*tp_iternext*/
1192 Decomp_methods, /*tp_methods*/
1193 Decomp_members, /*tp_members*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001194};
1195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001196PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001197"The functions in this module allow compression and decompression using the\n"
1198"zlib library, which is based on GNU zip.\n"
1199"\n"
1200"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
1201"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001202"compressobj([level[, ...]]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001203"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001204"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001205"decompressobj([wbits[, zdict]]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001206"\n"
1207"'wbits' is window buffer size.\n"
1208"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001209"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001210
Martin v. Löwis1a214512008-06-11 05:26:20 +00001211static struct PyModuleDef zlibmodule = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001212 PyModuleDef_HEAD_INIT,
1213 "zlib",
1214 zlib_module_documentation,
1215 -1,
1216 zlib_methods,
1217 NULL,
1218 NULL,
1219 NULL,
1220 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001221};
1222
Mark Hammond62b1ab12002-07-23 06:31:15 +00001223PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001224PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001225{
Fred Drake4baedc12002-04-01 14:53:37 +00001226 PyObject *m, *ver;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001227 if (PyType_Ready(&Comptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001228 return NULL;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001229 if (PyType_Ready(&Decomptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001230 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001231 m = PyModule_Create(&zlibmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001232 if (m == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001233 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001234
Fred Drake4baedc12002-04-01 14:53:37 +00001235 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1236 if (ZlibError != NULL) {
1237 Py_INCREF(ZlibError);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001238 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001239 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001240 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1241 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1242 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1243 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1244 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1245 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1246 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1247 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1248 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001249
Jeremy Hylton9714f992001-10-16 21:19:45 +00001250 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1251 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1252 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1253 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001254
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001255 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001256 if (ver != NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001257 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001258
Nadeem Vawda64d25dd2011-09-12 00:04:13 +02001259 ver = PyUnicode_FromString(zlibVersion());
1260 if (ver != NULL)
1261 PyModule_AddObject(m, "ZLIB_RUNTIME_VERSION", ver);
1262
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001263 PyModule_AddStringConstant(m, "__version__", "1.0");
1264
Martin v. Löwis1a214512008-06-11 05:26:20 +00001265 return m;
Guido van Rossumfb221561997-04-29 15:38:09 +00001266}