blob: e718795fa70582ea4c790c0217367bbb16e6f921 [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"
Nadeem Vawda19e568d2012-11-11 14:04:14 +0100142"Optional arg level is the compression level, in 0-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
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100564/* Helper for objdecompress() and unflush(). Saves any unconsumed input data in
565 self->unused_data or self->unconsumed_tail, as appropriate. */
566static int
567save_unconsumed_input(compobject *self, int err)
568{
569 if (err == Z_STREAM_END) {
570 /* The end of the compressed data has been reached. Store the leftover
571 input data in self->unused_data. */
572 if (self->zst.avail_in > 0) {
573 Py_ssize_t old_size = PyBytes_GET_SIZE(self->unused_data);
574 Py_ssize_t new_size;
575 PyObject *new_data;
576 if (self->zst.avail_in > PY_SSIZE_T_MAX - old_size) {
577 PyErr_NoMemory();
578 return -1;
579 }
580 new_size = old_size + self->zst.avail_in;
581 new_data = PyBytes_FromStringAndSize(NULL, new_size);
582 if (new_data == NULL)
583 return -1;
584 Py_MEMCPY(PyBytes_AS_STRING(new_data),
585 PyBytes_AS_STRING(self->unused_data), old_size);
586 Py_MEMCPY(PyBytes_AS_STRING(new_data) + old_size,
587 self->zst.next_in, self->zst.avail_in);
588 Py_DECREF(self->unused_data);
589 self->unused_data = new_data;
590 self->zst.avail_in = 0;
591 }
592 }
593 if (self->zst.avail_in > 0 || PyBytes_GET_SIZE(self->unconsumed_tail)) {
594 /* This code handles two distinct cases:
595 1. Output limit was reached. Save leftover input in unconsumed_tail.
596 2. All input data was consumed. Clear unconsumed_tail. */
597 PyObject *new_data = PyBytes_FromStringAndSize(
598 (char *)self->zst.next_in, self->zst.avail_in);
599 if (new_data == NULL)
600 return -1;
601 Py_DECREF(self->unconsumed_tail);
602 self->unconsumed_tail = new_data;
603 }
604 return 0;
605}
606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000607PyDoc_STRVAR(decomp_decompress__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +0000608"decompress(data, max_length) -- Return a string containing the decompressed\n"
609"version of the data.\n"
610"\n"
611"After calling this function, some of the input data may still be stored in\n"
612"internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000613"Call the flush() method to clear these buffers.\n"
614"If the max_length parameter is specified then the return value will be\n"
615"no longer than max_length. Unconsumed input data will be stored in\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000616"the unconsumed_tail attribute.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000617
Guido van Rossumfb221561997-04-29 15:38:09 +0000618static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000619PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000620{
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200621 int err, max_length = 0;
622 unsigned int inplen;
Antoine Pitrou4b3fe142010-05-07 17:08:54 +0000623 Py_ssize_t old_length, length = DEFAULTALLOC;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200624 PyObject *RetVal = NULL;
Martin v. Löwis423be952008-08-13 15:53:07 +0000625 Py_buffer pinput;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000626 Byte *input;
627 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000628
Antoine Pitrouc8428d32009-12-14 18:23:30 +0000629 if (!PyArg_ParseTuple(args, "y*|i:decompress", &pinput,
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000630 &max_length))
631 return NULL;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200632 if (pinput.len > UINT_MAX) {
633 PyErr_SetString(PyExc_OverflowError,
634 "Size does not fit in an unsigned int");
635 goto error_outer;
636 }
Martin v. Löwis423be952008-08-13 15:53:07 +0000637 input = pinput.buf;
638 inplen = pinput.len;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000639 if (max_length < 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000640 PyErr_SetString(PyExc_ValueError,
641 "max_length must be greater than zero");
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200642 goto error_outer;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000643 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000644
Jeremy Hylton9714f992001-10-16 21:19:45 +0000645 /* limit amount of data allocated to max_length */
Tim Peters977e5402001-10-17 03:57:20 +0000646 if (max_length && length > max_length)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000647 length = max_length;
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200648 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
649 goto error_outer;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000650
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000651 ENTER_ZLIB(self);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000652
Jeremy Hylton9714f992001-10-16 21:19:45 +0000653 start_total_out = self->zst.total_out;
654 self->zst.avail_in = inplen;
655 self->zst.next_in = input;
656 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000657 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000658
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000659 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000660 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000661 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000662
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200663 if (err == Z_NEED_DICT && self->zdict != NULL) {
664 Py_buffer zdict_buf;
665 if (PyObject_GetBuffer(self->zdict, &zdict_buf, PyBUF_SIMPLE) == -1) {
666 Py_DECREF(RetVal);
667 RetVal = NULL;
668 goto error;
669 }
670 err = inflateSetDictionary(&(self->zst), zdict_buf.buf, zdict_buf.len);
671 PyBuffer_Release(&zdict_buf);
672 if (err != Z_OK) {
673 zlib_error(self->zst, err, "while decompressing data");
674 Py_DECREF(RetVal);
675 RetVal = NULL;
676 goto error;
677 }
Nadeem Vawdacf5e1d82012-06-22 00:35:57 +0200678 /* Repeat the call to inflate. */
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200679 Py_BEGIN_ALLOW_THREADS
680 err = inflate(&(self->zst), Z_SYNC_FLUSH);
681 Py_END_ALLOW_THREADS
682 }
683
Jeremy Hylton9714f992001-10-16 21:19:45 +0000684 /* While Z_OK and the output buffer is full, there might be more output.
685 So extend the output buffer and try again.
686 */
Tim Peters977e5402001-10-17 03:57:20 +0000687 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000688 /* If max_length set, don't continue decompressing if we've already
689 reached the limit.
690 */
691 if (max_length && length >= max_length)
692 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000693
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000694 /* otherwise, ... */
695 old_length = length;
696 length = length << 1;
697 if (max_length && length > max_length)
698 length = max_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000699
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000700 if (_PyBytes_Resize(&RetVal, length) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000701 Py_DECREF(RetVal);
702 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000703 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000704 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000705 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000706 (unsigned char *)PyBytes_AS_STRING(RetVal) + old_length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000707 self->zst.avail_out = length - old_length;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000708
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000709 Py_BEGIN_ALLOW_THREADS
710 err = inflate(&(self->zst), Z_SYNC_FLUSH);
711 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000712 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000713
Nadeem Vawdaee7889d2012-11-11 02:14:36 +0100714 if (save_unconsumed_input(self, err) < 0) {
Nadeem Vawda7619e882011-05-14 14:05:20 +0200715 Py_DECREF(RetVal);
716 RetVal = NULL;
717 goto error;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000718 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000719
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000720 if (err == Z_STREAM_END) {
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100721 /* This is the logical place to call inflateEnd, but the old behaviour
722 of only calling it on flush() is preserved. */
Nadeem Vawda1c385462011-08-13 15:22:40 +0200723 self->eof = 1;
Nadeem Vawdadd1253a2012-11-11 02:21:22 +0100724 } else if (err != Z_OK && err != Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000725 /* We will only get Z_BUF_ERROR if the output buffer was full
726 but there wasn't more output when we tried again, so it is
727 not an error condition.
728 */
Nadeem Vawda1c385462011-08-13 15:22:40 +0200729 zlib_error(self->zst, err, "while decompressing data");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000730 Py_DECREF(RetVal);
731 RetVal = NULL;
732 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000733 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000734
Gregory P. Smith693fc462008-09-06 20:13:06 +0000735 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000736 Py_DECREF(RetVal);
737 RetVal = NULL;
738 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000739
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000740 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000741 LEAVE_ZLIB(self);
Nadeem Vawda0c3d96a2011-05-15 00:19:50 +0200742 error_outer:
Martin v. Löwis423be952008-08-13 15:53:07 +0000743 PyBuffer_Release(&pinput);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000744 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000745}
746
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000747PyDoc_STRVAR(comp_flush__doc__,
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000748"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000749"\n"
750"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000751"default value used when mode is not specified is Z_FINISH.\n"
752"If mode == Z_FINISH, the compressor object can no longer be used after\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000753"calling the flush() method. Otherwise, more data can still be compressed.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000754
Guido van Rossumfb221561997-04-29 15:38:09 +0000755static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000756PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000757{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000758 int err, length = DEFAULTALLOC;
759 PyObject *RetVal;
760 int flushmode = Z_FINISH;
761 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000762
Jeremy Hylton9714f992001-10-16 21:19:45 +0000763 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000764 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000765
Jeremy Hylton9714f992001-10-16 21:19:45 +0000766 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
767 doing any work at all; just return an empty string. */
768 if (flushmode == Z_NO_FLUSH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000769 return PyBytes_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000770 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000771
Gregory P. Smith693fc462008-09-06 20:13:06 +0000772 if (!(RetVal = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000773 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000774
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000775 ENTER_ZLIB(self);
Tim Peters977e5402001-10-17 03:57:20 +0000776
Jeremy Hylton9714f992001-10-16 21:19:45 +0000777 start_total_out = self->zst.total_out;
778 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000779 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000780 self->zst.next_out = (unsigned char *)PyBytes_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000781
782 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000783 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000784 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000785
Jeremy Hylton9714f992001-10-16 21:19:45 +0000786 /* while Z_OK and the output buffer is full, there might be more output,
787 so extend the output buffer and try again */
788 while (err == Z_OK && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000789 if (_PyBytes_Resize(&RetVal, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000790 Py_DECREF(RetVal);
791 RetVal = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000792 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000793 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000794 self->zst.next_out =
Gregory P. Smith693fc462008-09-06 20:13:06 +0000795 (unsigned char *)PyBytes_AS_STRING(RetVal) + length;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000796 self->zst.avail_out = length;
797 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000798
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000799 Py_BEGIN_ALLOW_THREADS
800 err = deflate(&(self->zst), flushmode);
801 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000802 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000803
Jeremy Hylton9714f992001-10-16 21:19:45 +0000804 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
Tim Peters977e5402001-10-17 03:57:20 +0000805 various data structures. Note we should only get Z_STREAM_END when
Jeremy Hylton9714f992001-10-16 21:19:45 +0000806 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000807 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000808 err = deflateEnd(&(self->zst));
809 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +0200810 zlib_error(self->zst, err, "while finishing compression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000811 Py_DECREF(RetVal);
812 RetVal = NULL;
813 goto error;
814 }
815 else
816 self->is_initialised = 0;
Tim Peters977e5402001-10-17 03:57:20 +0000817
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000818 /* We will only get Z_BUF_ERROR if the output buffer was full
819 but there wasn't more output when we tried again, so it is
820 not an error condition.
821 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000822 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000823 zlib_error(self->zst, err, "while flushing");
824 Py_DECREF(RetVal);
825 RetVal = NULL;
826 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000827 }
Tim Peters977e5402001-10-17 03:57:20 +0000828
Gregory P. Smith693fc462008-09-06 20:13:06 +0000829 if (_PyBytes_Resize(&RetVal, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000830 Py_DECREF(RetVal);
831 RetVal = NULL;
832 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000833
Tim Peters977e5402001-10-17 03:57:20 +0000834 error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000835 LEAVE_ZLIB(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000836
837 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000838}
839
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000840#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +0000841PyDoc_STRVAR(comp_copy__doc__,
842"copy() -- Return a copy of the compression object.");
843
844static PyObject *
845PyZlib_copy(compobject *self)
846{
847 compobject *retval = NULL;
848 int err;
849
850 retval = newcompobject(&Comptype);
851 if (!retval) return NULL;
852
853 /* Copy the zstream state
854 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
855 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000856 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000857 err = deflateCopy(&retval->zst, &self->zst);
858 switch(err) {
859 case(Z_OK):
860 break;
861 case(Z_STREAM_ERROR):
862 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
863 goto error;
864 case(Z_MEM_ERROR):
865 PyErr_SetString(PyExc_MemoryError,
866 "Can't allocate memory for compression object");
867 goto error;
868 default:
869 zlib_error(self->zst, err, "while copying compression object");
870 goto error;
871 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000872 Py_INCREF(self->unused_data);
873 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200874 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000875 Py_XDECREF(retval->unused_data);
876 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200877 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000878 retval->unused_data = self->unused_data;
879 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200880 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200881 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000882
883 /* Mark it as being initialized */
884 retval->is_initialised = 1;
885
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000886 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000887 return (PyObject *)retval;
888
889error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000890 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000891 Py_XDECREF(retval);
892 return NULL;
893}
894
895PyDoc_STRVAR(decomp_copy__doc__,
896"copy() -- Return a copy of the decompression object.");
897
898static PyObject *
899PyZlib_uncopy(compobject *self)
900{
901 compobject *retval = NULL;
902 int err;
903
904 retval = newcompobject(&Decomptype);
905 if (!retval) return NULL;
906
907 /* Copy the zstream state
908 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
909 */
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000910 ENTER_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000911 err = inflateCopy(&retval->zst, &self->zst);
912 switch(err) {
913 case(Z_OK):
914 break;
915 case(Z_STREAM_ERROR):
916 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
917 goto error;
918 case(Z_MEM_ERROR):
919 PyErr_SetString(PyExc_MemoryError,
920 "Can't allocate memory for decompression object");
921 goto error;
922 default:
923 zlib_error(self->zst, err, "while copying decompression object");
924 goto error;
925 }
926
927 Py_INCREF(self->unused_data);
928 Py_INCREF(self->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200929 Py_XINCREF(self->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000930 Py_XDECREF(retval->unused_data);
931 Py_XDECREF(retval->unconsumed_tail);
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200932 Py_XDECREF(retval->zdict);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000933 retval->unused_data = self->unused_data;
934 retval->unconsumed_tail = self->unconsumed_tail;
Nadeem Vawdafd8a8382012-06-21 02:13:12 +0200935 retval->zdict = self->zdict;
Nadeem Vawda1c385462011-08-13 15:22:40 +0200936 retval->eof = self->eof;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000937
938 /* Mark it as being initialized */
939 retval->is_initialised = 1;
940
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000941 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000942 return (PyObject *)retval;
943
944error:
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000945 LEAVE_ZLIB(self);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000946 Py_XDECREF(retval);
947 return NULL;
948}
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000949#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000950
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000951PyDoc_STRVAR(decomp_flush__doc__,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000952"flush( [length] ) -- Return a string containing any remaining\n"
953"decompressed data. length, if given, is the initial size of the\n"
954"output buffer.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +0000955"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000956"The decompressor object can no longer be used after this call.");
Guido van Rossum3c540301997-06-03 22:21:03 +0000957
Guido van Rossumfb221561997-04-29 15:38:09 +0000958static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000959PyZlib_unflush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000960{
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000961 int err, length = DEFAULTALLOC;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000962 PyObject * retval = NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000963 unsigned long start_total_out;
Tim Peters977e5402001-10-17 03:57:20 +0000964
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000965 if (!PyArg_ParseTuple(args, "|i:flush", &length))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000966 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000967 if (length <= 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000968 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
969 return NULL;
Christian Heimes5e696852008-04-09 08:37:03 +0000970 }
Gregory P. Smith693fc462008-09-06 20:13:06 +0000971 if (!(retval = PyBytes_FromStringAndSize(NULL, length)))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000972 return NULL;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000973
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000974
Antoine Pitrou31f30b12009-01-02 17:34:35 +0000975 ENTER_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000976
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000977 start_total_out = self->zst.total_out;
Nadeem Vawda7ee95552012-11-11 03:15:32 +0100978 self->zst.avail_in = PyBytes_GET_SIZE(self->unconsumed_tail);
979 self->zst.next_in = (Byte *)PyBytes_AS_STRING(self->unconsumed_tail);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000980 self->zst.avail_out = length;
Gregory P. Smith693fc462008-09-06 20:13:06 +0000981 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval);
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000982
983 Py_BEGIN_ALLOW_THREADS
984 err = inflate(&(self->zst), Z_FINISH);
985 Py_END_ALLOW_THREADS
986
987 /* while Z_OK and the output buffer is full, there might be more output,
988 so extend the output buffer and try again */
989 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000990 if (_PyBytes_Resize(&retval, length << 1) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +0000991 Py_DECREF(retval);
992 retval = NULL;
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000993 goto error;
Guido van Rossum776152b2007-05-22 22:44:07 +0000994 }
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000995 self->zst.next_out = (Byte *)PyBytes_AS_STRING(retval) + length;
996 self->zst.avail_out = length;
997 length = length << 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +0000998
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000999 Py_BEGIN_ALLOW_THREADS
1000 err = inflate(&(self->zst), Z_FINISH);
1001 Py_END_ALLOW_THREADS
Jeremy Hylton9714f992001-10-16 21:19:45 +00001002 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001003
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001004 if (save_unconsumed_input(self, err) < 0) {
1005 Py_DECREF(retval);
1006 retval = NULL;
1007 goto error;
1008 }
1009
Nadeem Vawda3bf71c52011-08-13 15:42:50 +02001010 /* If at end of stream, clean up any memory allocated by zlib. */
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001011 if (err == Z_STREAM_END) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001012 self->eof = 1;
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001013 self->is_initialised = 0;
Nadeem Vawda1c385462011-08-13 15:22:40 +02001014 err = inflateEnd(&(self->zst));
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001015 if (err != Z_OK) {
Nadeem Vawda1c385462011-08-13 15:22:40 +02001016 zlib_error(self->zst, err, "while finishing decompression");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001017 Py_DECREF(retval);
1018 retval = NULL;
1019 goto error;
1020 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001021 }
Nadeem Vawdaee7889d2012-11-11 02:14:36 +01001022
Gregory P. Smith693fc462008-09-06 20:13:06 +00001023 if (_PyBytes_Resize(&retval, self->zst.total_out - start_total_out) < 0) {
Guido van Rossum776152b2007-05-22 22:44:07 +00001024 Py_DECREF(retval);
1025 retval = NULL;
1026 }
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001027
1028error:
1029
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001030 LEAVE_ZLIB(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001031
Jeremy Hylton9714f992001-10-16 21:19:45 +00001032 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +00001033}
1034
1035static PyMethodDef comp_methods[] =
1036{
Tim Peters977e5402001-10-17 03:57:20 +00001037 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001038 comp_compress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001039 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001040 comp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001041#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001042 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
1043 comp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001044#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001045 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001046};
1047
1048static PyMethodDef Decomp_methods[] =
1049{
Tim Peters977e5402001-10-17 03:57:20 +00001050 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001051 decomp_decompress__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001052 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001053 decomp_flush__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001054#ifdef HAVE_ZLIB_COPY
Thomas Wouters477c8d52006-05-27 19:21:47 +00001055 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
1056 decomp_copy__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001057#endif
Jeremy Hylton9714f992001-10-16 21:19:45 +00001058 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001059};
1060
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001061#define COMP_OFF(x) offsetof(compobject, x)
1062static PyMemberDef Decomp_members[] = {
1063 {"unused_data", T_OBJECT, COMP_OFF(unused_data), READONLY},
1064 {"unconsumed_tail", T_OBJECT, COMP_OFF(unconsumed_tail), READONLY},
Nadeem Vawda1c385462011-08-13 15:22:40 +02001065 {"eof", T_BOOL, COMP_OFF(eof), READONLY},
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001066 {NULL},
1067};
Guido van Rossumfb221561997-04-29 15:38:09 +00001068
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001069PyDoc_STRVAR(adler32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001070"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
1071"\n"
1072"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001073"an integer.");
Guido van Rossum3c540301997-06-03 22:21:03 +00001074
Guido van Rossumfb221561997-04-29 15:38:09 +00001075static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001076PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001077{
Christian Heimescc47b052008-03-25 14:56:36 +00001078 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001079 Py_buffer pbuf;
Tim Peters977e5402001-10-17 03:57:20 +00001080
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001081 if (!PyArg_ParseTuple(args, "y*|I:adler32", &pbuf, &adler32val))
1082 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001083 /* Releasing the GIL for very small buffers is inefficient
1084 and may lower performance */
1085 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001086 unsigned char *buf = pbuf.buf;
1087 Py_ssize_t len = pbuf.len;
1088
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001089 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001090 /* Avoid truncation of length for very large buffers. adler32() takes
1091 length as an unsigned int, which may be narrower than Py_ssize_t. */
1092 while (len > (size_t) UINT_MAX) {
1093 adler32val = adler32(adler32val, buf, UINT_MAX);
1094 buf += (size_t) UINT_MAX;
1095 len -= (size_t) UINT_MAX;
1096 }
1097 adler32val = adler32(adler32val, buf, len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001098 Py_END_ALLOW_THREADS
1099 } else {
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001100 adler32val = adler32(adler32val, pbuf.buf, pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001101 }
1102 PyBuffer_Release(&pbuf);
Gregory P. Smith27275032008-03-20 06:20:09 +00001103 return PyLong_FromUnsignedLong(adler32val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001104}
Tim Peters977e5402001-10-17 03:57:20 +00001105
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001106PyDoc_STRVAR(crc32__doc__,
Tim Petersadbd35b2001-10-17 04:16:15 +00001107"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
1108"\n"
1109"An optional starting value can be specified. The returned checksum is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001110"an integer.");
Guido van Rossumfb221561997-04-29 15:38:09 +00001111
1112static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +00001113PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +00001114{
Christian Heimescc47b052008-03-25 14:56:36 +00001115 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
Martin v. Löwis423be952008-08-13 15:53:07 +00001116 Py_buffer pbuf;
1117 int signed_val;
Christian Heimescc47b052008-03-25 14:56:36 +00001118
Antoine Pitrouc8428d32009-12-14 18:23:30 +00001119 if (!PyArg_ParseTuple(args, "y*|I:crc32", &pbuf, &crc32val))
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001120 return NULL;
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001121 /* Releasing the GIL for very small buffers is inefficient
1122 and may lower performance */
1123 if (pbuf.len > 1024*5) {
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001124 unsigned char *buf = pbuf.buf;
1125 Py_ssize_t len = pbuf.len;
1126
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001127 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou9e719b62011-02-28 23:48:16 +00001128 /* Avoid truncation of length for very large buffers. crc32() takes
1129 length as an unsigned int, which may be narrower than Py_ssize_t. */
1130 while (len > (size_t) UINT_MAX) {
1131 crc32val = crc32(crc32val, buf, UINT_MAX);
1132 buf += (size_t) UINT_MAX;
1133 len -= (size_t) UINT_MAX;
1134 }
1135 signed_val = crc32(crc32val, buf, len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001136 Py_END_ALLOW_THREADS
1137 } else {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001138 signed_val = crc32(crc32val, pbuf.buf, pbuf.len);
Antoine Pitrou31f30b12009-01-02 17:34:35 +00001139 }
Martin v. Löwis423be952008-08-13 15:53:07 +00001140 PyBuffer_Release(&pbuf);
Christian Heimescc47b052008-03-25 14:56:36 +00001141 return PyLong_FromUnsignedLong(signed_val & 0xffffffffU);
Guido van Rossumfb221561997-04-29 15:38:09 +00001142}
Tim Peters977e5402001-10-17 03:57:20 +00001143
Guido van Rossumfb221561997-04-29 15:38:09 +00001144
1145static PyMethodDef zlib_methods[] =
1146{
Tim Peters977e5402001-10-17 03:57:20 +00001147 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001148 adler32__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001149 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001150 compress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001151 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001152 compressobj__doc__},
Tim Peters977e5402001-10-17 03:57:20 +00001153 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
1154 crc32__doc__},
1155 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001156 decompress__doc__},
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001157 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS|METH_KEYWORDS,
Jeremy Hylton9714f992001-10-16 21:19:45 +00001158 decompressobj__doc__},
1159 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +00001160};
1161
Tim Peters0c322792002-07-17 16:49:03 +00001162static PyTypeObject Comptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001163 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001164 "zlib.Compress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001165 sizeof(compobject),
1166 0,
1167 (destructor)Comp_dealloc, /*tp_dealloc*/
1168 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001169 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001170 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001171 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001172 0, /*tp_repr*/
1173 0, /*tp_as_number*/
1174 0, /*tp_as_sequence*/
1175 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001176 0, /*tp_hash*/
1177 0, /*tp_call*/
1178 0, /*tp_str*/
1179 0, /*tp_getattro*/
1180 0, /*tp_setattro*/
1181 0, /*tp_as_buffer*/
1182 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1183 0, /*tp_doc*/
1184 0, /*tp_traverse*/
1185 0, /*tp_clear*/
1186 0, /*tp_richcompare*/
1187 0, /*tp_weaklistoffset*/
1188 0, /*tp_iter*/
1189 0, /*tp_iternext*/
1190 comp_methods, /*tp_methods*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001191};
1192
Tim Peters0c322792002-07-17 16:49:03 +00001193static PyTypeObject Decomptype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00001194 PyVarObject_HEAD_INIT(0, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00001195 "zlib.Decompress",
Jeremy Hylton9714f992001-10-16 21:19:45 +00001196 sizeof(compobject),
1197 0,
1198 (destructor)Decomp_dealloc, /*tp_dealloc*/
1199 0, /*tp_print*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001200 0, /*tp_getattr*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001201 0, /*tp_setattr*/
Mark Dickinsone94c6792009-02-02 20:36:42 +00001202 0, /*tp_reserved*/
Jeremy Hylton9714f992001-10-16 21:19:45 +00001203 0, /*tp_repr*/
1204 0, /*tp_as_number*/
1205 0, /*tp_as_sequence*/
1206 0, /*tp_as_mapping*/
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001207 0, /*tp_hash*/
1208 0, /*tp_call*/
1209 0, /*tp_str*/
1210 0, /*tp_getattro*/
1211 0, /*tp_setattro*/
1212 0, /*tp_as_buffer*/
1213 Py_TPFLAGS_DEFAULT, /*tp_flags*/
1214 0, /*tp_doc*/
1215 0, /*tp_traverse*/
1216 0, /*tp_clear*/
1217 0, /*tp_richcompare*/
1218 0, /*tp_weaklistoffset*/
1219 0, /*tp_iter*/
1220 0, /*tp_iternext*/
1221 Decomp_methods, /*tp_methods*/
1222 Decomp_members, /*tp_members*/
Guido van Rossumfb221561997-04-29 15:38:09 +00001223};
1224
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001225PyDoc_STRVAR(zlib_module_documentation,
Tim Petersadbd35b2001-10-17 04:16:15 +00001226"The functions in this module allow compression and decompression using the\n"
1227"zlib library, which is based on GNU zip.\n"
1228"\n"
1229"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
Nadeem Vawda19e568d2012-11-11 14:04:14 +01001230"compress(string[, level]) -- Compress string, with compression level in 0-9.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001231"compressobj([level[, ...]]) -- Return a compressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001232"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +00001233"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Nadeem Vawdafd8a8382012-06-21 02:13:12 +02001234"decompressobj([wbits[, zdict]]]) -- Return a decompressor object.\n"
Tim Petersadbd35b2001-10-17 04:16:15 +00001235"\n"
1236"'wbits' is window buffer size.\n"
1237"Compressor objects support compress() and flush() methods; decompressor\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001238"objects support decompress() and flush().");
Guido van Rossum3c540301997-06-03 22:21:03 +00001239
Martin v. Löwis1a214512008-06-11 05:26:20 +00001240static struct PyModuleDef zlibmodule = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001241 PyModuleDef_HEAD_INIT,
1242 "zlib",
1243 zlib_module_documentation,
1244 -1,
1245 zlib_methods,
1246 NULL,
1247 NULL,
1248 NULL,
1249 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001250};
1251
Mark Hammond62b1ab12002-07-23 06:31:15 +00001252PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001253PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +00001254{
Fred Drake4baedc12002-04-01 14:53:37 +00001255 PyObject *m, *ver;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001256 if (PyType_Ready(&Comptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001257 return NULL;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001258 if (PyType_Ready(&Decomptype) < 0)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001259 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001260 m = PyModule_Create(&zlibmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001261 if (m == NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001262 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +00001263
Fred Drake4baedc12002-04-01 14:53:37 +00001264 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1265 if (ZlibError != NULL) {
1266 Py_INCREF(ZlibError);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001267 PyModule_AddObject(m, "error", ZlibError);
Fred Drake4baedc12002-04-01 14:53:37 +00001268 }
Jeremy Hylton9714f992001-10-16 21:19:45 +00001269 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1270 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1271 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1272 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1273 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1274 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1275 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1276 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1277 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
Tim Peters977e5402001-10-17 03:57:20 +00001278
Jeremy Hylton9714f992001-10-16 21:19:45 +00001279 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1280 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1281 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1282 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
Tim Peters977e5402001-10-17 03:57:20 +00001283
Neal Norwitz53cbdaa2007-08-23 21:42:55 +00001284 ver = PyUnicode_FromString(ZLIB_VERSION);
Fred Drake4baedc12002-04-01 14:53:37 +00001285 if (ver != NULL)
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +00001286 PyModule_AddObject(m, "ZLIB_VERSION", ver);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +00001287
Nadeem Vawda64d25dd2011-09-12 00:04:13 +02001288 ver = PyUnicode_FromString(zlibVersion());
1289 if (ver != NULL)
1290 PyModule_AddObject(m, "ZLIB_RUNTIME_VERSION", ver);
1291
Guido van Rossum7d9ea502003-02-03 20:45:52 +00001292 PyModule_AddStringConstant(m, "__version__", "1.0");
1293
Martin v. Löwis1a214512008-06-11 05:26:20 +00001294 return m;
Guido van Rossumfb221561997-04-29 15:38:09 +00001295}