blob: f103879851e2bfec3dfee23414de3d42c0eff786 [file] [log] [blame]
Guido van Rossumfb221561997-04-29 15:38:09 +00001/* zlibmodule.c -- gzip-compatible data compression */
Martin v. Löwis1dbce442001-10-09 10:54:31 +00002/* See http://www.gzip.org/zlib/ */
Mark Hammondae8c2682001-01-31 10:28:03 +00003
Tim Petersee826f82001-01-31 19:39:44 +00004/* Windows users: read Python's PCbuild\readme.txt */
Mark Hammondae8c2682001-01-31 10:28:03 +00005
Guido van Rossumfb221561997-04-29 15:38:09 +00006
Guido van Rossum97b54571997-06-03 22:21:47 +00007#include "Python.h"
8#include "zlib.h"
Guido van Rossumfb221561997-04-29 15:38:09 +00009
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000010#ifdef WITH_THREAD
11#include "pythread.h"
12
13/* #defs ripped off from _tkinter.c, even though the situation here is much
14 simpler, because we don't have to worry about waiting for Tcl
15 events! And, since zlib itself is threadsafe, we don't need to worry
16 about re-entering zlib functions.
17
18 What we _do_ have to worry about is releasing the global lock _in
19 general_ in the zlibmodule functions, because of all the calls to
20 Python functions, which assume that the global lock is held. So
21 only two types of calls are wrapped in Py_BEGIN/END_ALLOW_THREADS:
22 those that grab the zlib lock, and those that involve other
23 time-consuming functions where we need to worry about holding up
24 other Python threads.
25
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000026 N.B.
27
28 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions
29 that modify the components of preexisting de/compress objects, it
30 could prove to be a performance gain on multiprocessor machines if
31 there was an de/compress object-specific lock. However, for the
32 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL
33 de/compress objects.
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000034 */
35
36static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */
37
38#define ENTER_ZLIB \
Tim Peters6605c642001-10-17 03:43:54 +000039 Py_BEGIN_ALLOW_THREADS \
40 PyThread_acquire_lock(zlib_lock, 1); \
41 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000042
43#define LEAVE_ZLIB \
Tim Peters6605c642001-10-17 03:43:54 +000044 PyThread_release_lock(zlib_lock);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +000045
46#else
47
48#define ENTER_ZLIB
49#define LEAVE_ZLIB
50
51#endif
52
Guido van Rossumfb221561997-04-29 15:38:09 +000053/* The following parameters are copied from zutil.h, version 0.95 */
54#define DEFLATED 8
55#if MAX_MEM_LEVEL >= 8
56# define DEF_MEM_LEVEL 8
57#else
58# define DEF_MEM_LEVEL MAX_MEM_LEVEL
59#endif
60#define DEF_WBITS MAX_WBITS
61
Guido van Rossumb729a1d1999-04-07 20:23:17 +000062/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
63#define DEFAULTALLOC (16*1024)
Guido van Rossumfb221561997-04-29 15:38:09 +000064#define PyInit_zlib initzlib
65
66staticforward PyTypeObject Comptype;
67staticforward PyTypeObject Decomptype;
68
69static PyObject *ZlibError;
70
71typedef struct
72{
Jeremy Hylton9714f992001-10-16 21:19:45 +000073 PyObject_HEAD
74 z_stream zst;
75 PyObject *unused_data;
76 PyObject *unconsumed_tail;
77 int is_initialised;
Guido van Rossumfb221561997-04-29 15:38:09 +000078} compobject;
79
Jeremy Hylton0965e082001-10-16 21:56:09 +000080static void
81zlib_error(z_stream zst, int err, char *msg)
82{
83 if (zst.msg == Z_NULL)
84 PyErr_Format(ZlibError, "Error %d %s", err, msg);
85 else
86 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
87}
88
Guido van Rossum3c540301997-06-03 22:21:03 +000089static char compressobj__doc__[] =
90"compressobj() -- Return a compressor object.\n"
91"compressobj(level) -- Return a compressor object, using the given compression level.\n"
92;
93
94static char decompressobj__doc__[] =
95"decompressobj() -- Return a decompressor object.\n"
96"decompressobj(wbits) -- Return a decompressor object, setting the window buffer size to wbits.\n"
97;
98
Guido van Rossumfb221561997-04-29 15:38:09 +000099static compobject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000100newcompobject(PyTypeObject *type)
Guido van Rossumfb221561997-04-29 15:38:09 +0000101{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000102 compobject *self;
103 self = PyObject_New(compobject, type);
104 if (self == NULL)
105 return NULL;
106 self->is_initialised = 0;
107 self->unused_data = PyString_FromString("");
108 if (self->unused_data == NULL) {
109 Py_DECREF(self);
110 return NULL;
111 }
112 self->unconsumed_tail = PyString_FromString("");
113 if (self->unconsumed_tail == NULL) {
114 Py_DECREF(self);
115 return NULL;
116 }
117 return self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000118}
119
Guido van Rossum3c540301997-06-03 22:21:03 +0000120static char compress__doc__[] =
121"compress(string) -- Compress string using the default compression level, "
122"returning a string containing compressed data.\n"
123"compress(string, level) -- Compress string, using the chosen compression "
124"level (from 1 to 9). Return a string containing the compressed data.\n"
125;
126
Guido van Rossumfb221561997-04-29 15:38:09 +0000127static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000128PyZlib_compress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000129{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000130 PyObject *ReturnVal = NULL;
131 Byte *input, *output;
132 int length, level=Z_DEFAULT_COMPRESSION, err;
133 z_stream zst;
Guido van Rossumfb221561997-04-29 15:38:09 +0000134
Jeremy Hylton9714f992001-10-16 21:19:45 +0000135 /* require Python string object, optional 'level' arg */
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000136 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000137 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000138
Jeremy Hylton9714f992001-10-16 21:19:45 +0000139 zst.avail_out = length + length/1000 + 12 + 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000140
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000141 output = (Byte*)malloc(zst.avail_out);
142 if (output == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000143 PyErr_SetString(PyExc_MemoryError,
144 "Can't allocate memory to compress data");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000145 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000146 }
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000147
Jeremy Hylton9714f992001-10-16 21:19:45 +0000148 /* Past the point of no return. From here on out, we need to make sure
149 we clean up mallocs & INCREFs. */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000150
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000151 zst.zalloc = (alloc_func)NULL;
152 zst.zfree = (free_func)Z_NULL;
153 zst.next_out = (Byte *)output;
154 zst.next_in = (Byte *)input;
155 zst.avail_in = length;
156 err = deflateInit(&zst, level);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000157
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000158 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000159 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000160 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000161 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000162 PyErr_SetString(PyExc_MemoryError,
163 "Out of memory while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000164 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000165 case(Z_STREAM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000166 PyErr_SetString(ZlibError,
167 "Bad compression level");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000168 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000169 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000170 deflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000171 zlib_error(zst, err, "while compressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000172 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000173 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000174
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000175 Py_BEGIN_ALLOW_THREADS;
176 err = deflate(&zst, Z_FINISH);
177 Py_END_ALLOW_THREADS;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000178
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000179 if (err != Z_STREAM_END) {
180 zlib_error(zst, err, "while compressing data");
181 deflateEnd(&zst);
182 goto error;
183 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000184
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000185 err=deflateEnd(&zst);
186 if (err == Z_OK)
187 ReturnVal = PyString_FromStringAndSize((char *)output,
188 zst.total_out);
189 else
190 zlib_error(zst, err, "while finishing compression");
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000191
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000192 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000193 free(output);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000194
Jeremy Hylton9714f992001-10-16 21:19:45 +0000195 return ReturnVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000196}
197
Guido van Rossum3c540301997-06-03 22:21:03 +0000198static char decompress__doc__[] =
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000199"decompress(string) -- Decompress the data in string, returning a string containing the decompressed data.\n"
200"decompress(string, wbits) -- Decompress the data in string with a window buffer size of wbits.\n"
201"decompress(string, wbits, bufsize) -- Decompress the data in string with a window buffer size of wbits and an initial output buffer size of bufsize.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000202;
203
Guido van Rossumfb221561997-04-29 15:38:09 +0000204static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000205PyZlib_decompress(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000206{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000207 PyObject *result_str;
208 Byte *input;
209 int length, err;
210 int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
211 z_stream zst;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000212
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000213 if (!PyArg_ParseTuple(args, "s#|ii:decompress",
214 &input, &length, &wsize, &r_strlen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000215 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000216
Jeremy Hylton9714f992001-10-16 21:19:45 +0000217 if (r_strlen <= 0)
218 r_strlen = 1;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000219
Jeremy Hylton9714f992001-10-16 21:19:45 +0000220 zst.avail_in = length;
221 zst.avail_out = r_strlen;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000222
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000223 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000224 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000225
Jeremy Hylton9714f992001-10-16 21:19:45 +0000226 zst.zalloc = (alloc_func)NULL;
227 zst.zfree = (free_func)Z_NULL;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000228 zst.next_out = (Byte *)PyString_AS_STRING(result_str);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000229 zst.next_in = (Byte *)input;
230 err = inflateInit2(&zst, wsize);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000231
Jeremy Hylton9714f992001-10-16 21:19:45 +0000232 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000233 case(Z_OK):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000234 break;
Guido van Rossumfb221561997-04-29 15:38:09 +0000235 case(Z_MEM_ERROR):
Jeremy Hylton9714f992001-10-16 21:19:45 +0000236 PyErr_SetString(PyExc_MemoryError,
237 "Out of memory while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000238 goto error;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000239 default:
Guido van Rossumfb221561997-04-29 15:38:09 +0000240 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000241 zlib_error(zst, err, "while preparing to decompress data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000242 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000243 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000244
Jeremy Hylton9714f992001-10-16 21:19:45 +0000245 do {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000246 Py_BEGIN_ALLOW_THREADS
247 err=inflate(&zst, Z_FINISH);
248 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000249
Jeremy Hylton9714f992001-10-16 21:19:45 +0000250 switch(err) {
251 case(Z_STREAM_END):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000252 break;
Guido van Rossum115f5171998-04-23 20:22:11 +0000253 case(Z_BUF_ERROR):
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000254 /*
255 * If there is at least 1 byte of room according to zst.avail_out
256 * and we get this error, assume that it means zlib cannot
257 * process the inflate call() due to an error in the data.
258 */
Jeremy Hylton0965e082001-10-16 21:56:09 +0000259 if (zst.avail_out > 0) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000260 PyErr_Format(ZlibError, "Error %i while decompressing data",
261 err);
262 inflateEnd(&zst);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000263 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000264 }
Andrew M. Kuchlingd9238312000-10-09 14:18:10 +0000265 /* fall through */
266 case(Z_OK):
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000267 /* need more memory */
Jeremy Hylton9714f992001-10-16 21:19:45 +0000268 if (_PyString_Resize(&result_str, r_strlen << 1) == -1) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000269 inflateEnd(&zst);
270 result_str = NULL;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000271 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000272 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000273 zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000274 + r_strlen;
275 zst.avail_out = r_strlen;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000276 r_strlen = r_strlen << 1;
277 break;
Jeremy Hylton0965e082001-10-16 21:56:09 +0000278 default:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000279 inflateEnd(&zst);
Jeremy Hylton0965e082001-10-16 21:56:09 +0000280 zlib_error(zst, err, "while decompressing data");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000281 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000282 }
283 } while (err != Z_STREAM_END);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000284
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000285 err = inflateEnd(&zst);
286 if (err != Z_OK) {
287 zlib_error(zst, err, "while finishing data decompression");
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000288 goto error;
Guido van Rossumfb221561997-04-29 15:38:09 +0000289 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000290
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000291 _PyString_Resize(&result_str, zst.total_out);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000292 return result_str;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000293
294 error:
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000295 Py_XDECREF(result_str);
296 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000297}
298
299static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000300PyZlib_compressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000301{
Jeremy Hylton499000002001-10-16 21:59:35 +0000302 compobject *self;
303 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
304 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000305
Jeremy Hylton499000002001-10-16 21:59:35 +0000306 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
307 &memLevel, &strategy))
308 return NULL;
Jeremy Hylton41b9f001997-08-13 23:19:55 +0000309
Jeremy Hylton499000002001-10-16 21:59:35 +0000310 self = newcompobject(&Comptype);
311 if (self==NULL)
312 return(NULL);
313 self->zst.zalloc = (alloc_func)NULL;
314 self->zst.zfree = (free_func)Z_NULL;
315 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
316 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000317 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000318 self->is_initialised = 1;
319 return (PyObject*)self;
Guido van Rossumfb221561997-04-29 15:38:09 +0000320 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000321 Py_DECREF(self);
322 PyErr_SetString(PyExc_MemoryError,
323 "Can't allocate memory for compression object");
324 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000325 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000326 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000327 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000328 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000329 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000330 zlib_error(self->zst, err, "while creating compression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000331 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000332 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000333 }
334}
335
336static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000337PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000338{
Jeremy Hylton499000002001-10-16 21:59:35 +0000339 int wbits=DEF_WBITS, err;
340 compobject *self;
341 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
342 return NULL;
343
344 self = newcompobject(&Decomptype);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000345 if (self == NULL)
Jeremy Hylton499000002001-10-16 21:59:35 +0000346 return(NULL);
347 self->zst.zalloc = (alloc_func)NULL;
348 self->zst.zfree = (free_func)Z_NULL;
349 err = inflateInit2(&self->zst, wbits);
350 switch(err) {
Guido van Rossumfb221561997-04-29 15:38:09 +0000351 case (Z_OK):
Jeremy Hylton499000002001-10-16 21:59:35 +0000352 self->is_initialised = 1;
353 return (PyObject*)self;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000354 case(Z_STREAM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000355 Py_DECREF(self);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000356 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
Jeremy Hylton499000002001-10-16 21:59:35 +0000357 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000358 case (Z_MEM_ERROR):
Jeremy Hylton499000002001-10-16 21:59:35 +0000359 Py_DECREF(self);
360 PyErr_SetString(PyExc_MemoryError,
361 "Can't allocate memory for decompression object");
362 return NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000363 default:
Jeremy Hylton0965e082001-10-16 21:56:09 +0000364 zlib_error(self->zst, err, "while creating decompression object");
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000365 Py_DECREF(self);
Guido van Rossumfb221561997-04-29 15:38:09 +0000366 return NULL;
Jeremy Hylton499000002001-10-16 21:59:35 +0000367 }
Guido van Rossumfb221561997-04-29 15:38:09 +0000368}
369
370static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000371Comp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000372{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000373 ENTER_ZLIB
374
Andrew M. Kuchling1c7aaa21999-01-29 21:49:34 +0000375 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000376 deflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000377 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000378 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000379 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000380
381 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000382}
383
384static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000385Decomp_dealloc(compobject *self)
Guido van Rossumfb221561997-04-29 15:38:09 +0000386{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000387 ENTER_ZLIB
388
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000389 if (self->is_initialised)
Jeremy Hylton499000002001-10-16 21:59:35 +0000390 inflateEnd(&self->zst);
Andrew M. Kuchlingb95227d1999-03-25 21:21:08 +0000391 Py_XDECREF(self->unused_data);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000392 Py_XDECREF(self->unconsumed_tail);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000393 PyObject_Del(self);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000394
395 LEAVE_ZLIB
Guido van Rossumfb221561997-04-29 15:38:09 +0000396}
397
Guido van Rossum3c540301997-06-03 22:21:03 +0000398static char comp_compress__doc__[] =
399"compress(data) -- Return a string containing a compressed version of the data.\n\n"
400"After calling this function, some of the input data may still\n"
401"be stored in internal buffers for later processing.\n"
402"Call the flush() method to clear these buffers."
403;
404
405
Guido van Rossumfb221561997-04-29 15:38:09 +0000406static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000407PyZlib_objcompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000408{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000409 int err, inplen, length = DEFAULTALLOC;
410 PyObject *RetVal;
411 Byte *input;
412 unsigned long start_total_out;
Guido van Rossumfb221561997-04-29 15:38:09 +0000413
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000414 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000415 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000416
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000417 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000418 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000419
420 ENTER_ZLIB
421
Jeremy Hylton9714f992001-10-16 21:19:45 +0000422 start_total_out = self->zst.total_out;
423 self->zst.avail_in = inplen;
424 self->zst.next_in = input;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000425 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000426 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton9714f992001-10-16 21:19:45 +0000427
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000428 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000429 err = deflate(&(self->zst), Z_NO_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000430 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000431
Jeremy Hylton9714f992001-10-16 21:19:45 +0000432 /* while Z_OK and the output buffer is full, there might be more output,
433 so extend the output buffer and try again */
434 while (err == Z_OK && self->zst.avail_out == 0) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000435 if (_PyString_Resize(&RetVal, length << 1) == -1) {
436 RetVal = NULL;
437 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000438 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000439 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000440 + length;
441 self->zst.avail_out = length;
442 length = length << 1;
443
444 Py_BEGIN_ALLOW_THREADS
445 err = deflate(&(self->zst), Z_NO_FLUSH);
446 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000447 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000448 /* We will only get Z_BUF_ERROR if the output buffer was full but
449 there wasn't more output when we tried again, so it is not an error
450 condition.
451 */
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000452
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000453 if (err != Z_OK && err != Z_BUF_ERROR) {
454 zlib_error(self->zst, err, "while compressing");
455 Py_DECREF(RetVal);
456 RetVal = NULL;
457 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000458 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000459 if (_PyString_Resize(&RetVal,
460 self->zst.total_out - start_total_out) < 0)
461 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000462
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000463 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000464 LEAVE_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000465 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000466}
467
Guido van Rossum3c540301997-06-03 22:21:03 +0000468static char decomp_decompress__doc__[] =
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000469"decompress(data, max_length) -- Return a string containing\n"
470"the decompressed version of the data.\n\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000471"After calling this function, some of the input data may still\n"
472"be stored in internal buffers for later processing.\n"
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000473"Call the flush() method to clear these buffers.\n"
474"If the max_length parameter is specified then the return value will be\n"
475"no longer than max_length. Unconsumed input data will be stored in\n"
476"the unconsumed_tail attribute."
Guido van Rossum3c540301997-06-03 22:21:03 +0000477;
478
Guido van Rossumfb221561997-04-29 15:38:09 +0000479static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000480PyZlib_objdecompress(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000481{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000482 int err, inplen, old_length, length = DEFAULTALLOC;
483 int max_length = 0;
484 PyObject *RetVal;
485 Byte *input;
486 unsigned long start_total_out;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000487
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000488 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
489 &inplen, &max_length))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000490 return NULL;
491 if (max_length < 0) {
492 PyErr_SetString(PyExc_ValueError,
493 "max_length must be greater than zero");
494 return NULL;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000495 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000496
Jeremy Hylton9714f992001-10-16 21:19:45 +0000497 /* limit amount of data allocated to max_length */
498 if (max_length && length > max_length)
499 length = max_length;
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000500 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000501 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000502
503 ENTER_ZLIB
Jeremy Hylton9714f992001-10-16 21:19:45 +0000504
Jeremy Hylton9714f992001-10-16 21:19:45 +0000505 start_total_out = self->zst.total_out;
506 self->zst.avail_in = inplen;
507 self->zst.next_in = input;
508 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000509 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000510
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000511 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000512 err = inflate(&(self->zst), Z_SYNC_FLUSH);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000513 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000514
Jeremy Hylton9714f992001-10-16 21:19:45 +0000515 /* While Z_OK and the output buffer is full, there might be more output.
516 So extend the output buffer and try again.
517 */
518 while (err == Z_OK && self->zst.avail_out == 0) {
519 /* If max_length set, don't continue decompressing if we've already
520 reached the limit.
521 */
522 if (max_length && length >= max_length)
523 break;
Jeremy Hylton511e2ca2001-10-16 20:39:49 +0000524
Jeremy Hylton9714f992001-10-16 21:19:45 +0000525 /* otherwise, ... */
526 old_length = length;
527 length = length << 1;
528 if (max_length && length > max_length)
529 length = max_length;
530
531 if (_PyString_Resize(&RetVal, length) == -1) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000532 RetVal = NULL;
533 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000534 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000535 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000536 + old_length;
537 self->zst.avail_out = length - old_length;
538
539 Py_BEGIN_ALLOW_THREADS
540 err = inflate(&(self->zst), Z_SYNC_FLUSH);
541 Py_END_ALLOW_THREADS
Guido van Rossumfb221561997-04-29 15:38:09 +0000542 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000543
544 /* Not all of the compressed data could be accomodated in the output buffer
545 of specified size. Return the unconsumed tail in an attribute.*/
546 if(max_length) {
547 Py_DECREF(self->unconsumed_tail);
548 self->unconsumed_tail = PyString_FromStringAndSize(self->zst.next_in,
549 self->zst.avail_in);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000550 if(!self->unconsumed_tail) {
551 Py_DECREF(RetVal);
552 RetVal = NULL;
553 goto error;
554 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000555 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000556
Jeremy Hylton9714f992001-10-16 21:19:45 +0000557 /* The end of the compressed data has been reached, so set the
558 unused_data attribute to a string containing the remainder of the
559 data in the string. Note that this is also a logical place to call
560 inflateEnd, but the old behaviour of only calling it on flush() is
561 preserved.
562 */
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000563 if (err == Z_STREAM_END) {
564 Py_XDECREF(self->unused_data); /* Free original empty string */
565 self->unused_data = PyString_FromStringAndSize(
566 (char *)self->zst.next_in, self->zst.avail_in);
567 if (self->unused_data == NULL) {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000568 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000569 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000570 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000571 /* We will only get Z_BUF_ERROR if the output buffer was full
572 but there wasn't more output when we tried again, so it is
573 not an error condition.
574 */
575 } else if (err != Z_OK && err != Z_BUF_ERROR) {
576 zlib_error(self->zst, err, "while decompressing");
577 Py_DECREF(RetVal);
578 RetVal = NULL;
579 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000580 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000581
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000582 if (_PyString_Resize(&RetVal, self->zst.total_out - start_total_out) < 0)
583 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000584
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000585 error:
Jeremy Hylton9714f992001-10-16 21:19:45 +0000586 LEAVE_ZLIB
587
588 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000589}
590
Guido van Rossum3c540301997-06-03 22:21:03 +0000591static char comp_flush__doc__[] =
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000592"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
593"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the \n"
594"default value used when mode is not specified is Z_FINISH.\n"
595"If mode == Z_FINISH, the compressor object can no longer be used after\n"
596"calling the flush() method. Otherwise, more data can still be compressed.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000597;
598
Guido van Rossumfb221561997-04-29 15:38:09 +0000599static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000600PyZlib_flush(compobject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000601{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000602 int err, length = DEFAULTALLOC;
603 PyObject *RetVal;
604 int flushmode = Z_FINISH;
605 unsigned long start_total_out;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000606
Jeremy Hylton9714f992001-10-16 21:19:45 +0000607 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
608 return NULL;
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000609
Jeremy Hylton9714f992001-10-16 21:19:45 +0000610 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
611 doing any work at all; just return an empty string. */
612 if (flushmode == Z_NO_FLUSH) {
613 return PyString_FromStringAndSize(NULL, 0);
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000614 }
Jeremy Hylton9714f992001-10-16 21:19:45 +0000615
Jeremy Hylton9bc9d662001-10-16 21:23:58 +0000616 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
Jeremy Hylton9714f992001-10-16 21:19:45 +0000617 return NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000618
619 ENTER_ZLIB
620
621 start_total_out = self->zst.total_out;
622 self->zst.avail_in = 0;
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000623 self->zst.avail_out = length;
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000624 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000625
626 Py_BEGIN_ALLOW_THREADS
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000627 err = deflate(&(self->zst), flushmode);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000628 Py_END_ALLOW_THREADS
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000629
Jeremy Hylton9714f992001-10-16 21:19:45 +0000630 /* while Z_OK and the output buffer is full, there might be more output,
631 so extend the output buffer and try again */
632 while (err == Z_OK && self->zst.avail_out == 0) {
633 if (_PyString_Resize(&RetVal, length << 1) == -1) {
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000634 RetVal = NULL;
635 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000636 }
Jeremy Hyltonba3dd992001-10-16 23:26:08 +0000637 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
Jeremy Hylton9714f992001-10-16 21:19:45 +0000638 + length;
639 self->zst.avail_out = length;
640 length = length << 1;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000641
Jeremy Hylton9714f992001-10-16 21:19:45 +0000642 Py_BEGIN_ALLOW_THREADS
643 err = deflate(&(self->zst), flushmode);
644 Py_END_ALLOW_THREADS
Jeremy Hyltona37e2441998-12-18 22:13:11 +0000645 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000646
Jeremy Hylton9714f992001-10-16 21:19:45 +0000647 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
648 various data structures. Note we should only get Z_STREAM_END when
649 flushmode is Z_FINISH, but checking both for safety*/
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000650 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
651 err = deflateEnd(&(self->zst));
652 if (err != Z_OK) {
653 zlib_error(self->zst, err, "from deflateEnd()");
Jeremy Hylton9714f992001-10-16 21:19:45 +0000654 Py_DECREF(RetVal);
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000655 RetVal = NULL;
656 goto error;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000657 }
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000658 else
659 self->is_initialised = 0;
660
661 /* We will only get Z_BUF_ERROR if the output buffer was full
662 but there wasn't more output when we tried again, so it is
663 not an error condition.
664 */
665 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
666 zlib_error(self->zst, err, "while flushing");
667 Py_DECREF(RetVal);
668 RetVal = NULL;
Jeremy Hylton9714f992001-10-16 21:19:45 +0000669 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000670
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000671 if (_PyString_Resize(&RetVal, self->zst.total_out - start_total_out) < 0)
672 RetVal = NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000673
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000674 error:
675 LEAVE_ZLIB;
676
677 return RetVal;
Guido van Rossumfb221561997-04-29 15:38:09 +0000678}
679
Guido van Rossum3c540301997-06-03 22:21:03 +0000680static char decomp_flush__doc__[] =
681"flush() -- Return a string containing any remaining decompressed data. "
682"The decompressor object can no longer be used after this call."
683;
684
Guido van Rossumfb221561997-04-29 15:38:09 +0000685static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000686PyZlib_unflush(compobject *self, PyObject *args)
Andrew M. Kuchling9aff4a22001-02-21 02:15:56 +0000687/*decompressor flush is a no-op because all pending data would have been
688 flushed by the decompress method. However, this routine previously called
689 inflateEnd, causing any further decompress or flush calls to raise
690 exceptions. This behaviour has been preserved.*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000691{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000692 int err;
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000693 PyObject * retval = NULL;
Guido van Rossumfb221561997-04-29 15:38:09 +0000694
Jeremy Hylton9714f992001-10-16 21:19:45 +0000695 if (!PyArg_ParseTuple(args, ""))
696 return NULL;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000697
Jeremy Hylton9714f992001-10-16 21:19:45 +0000698 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000699
Jeremy Hylton9714f992001-10-16 21:19:45 +0000700 err = inflateEnd(&(self->zst));
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000701 if (err != Z_OK)
Jeremy Hylton0965e082001-10-16 21:56:09 +0000702 zlib_error(self->zst, err, "from inflateEnd()");
Jeremy Hylton9d620d02001-10-16 23:02:32 +0000703 else {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000704 self->is_initialised = 0;
705 retval = PyString_FromStringAndSize(NULL, 0);
706 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000707
Jeremy Hylton9714f992001-10-16 21:19:45 +0000708 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000709
Jeremy Hylton9714f992001-10-16 21:19:45 +0000710 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000711}
712
713static PyMethodDef comp_methods[] =
714{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000715 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
716 comp_compress__doc__},
717 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
718 comp_flush__doc__},
719 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000720};
721
722static PyMethodDef Decomp_methods[] =
723{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000724 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
725 decomp_decompress__doc__},
726 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
727 decomp_flush__doc__},
728 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000729};
730
731static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000732Comp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000733{
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000734 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
735 internal data. */
736
737 return Py_FindMethod(comp_methods, (PyObject *)self, name);
Guido van Rossumfb221561997-04-29 15:38:09 +0000738}
739
740static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000741Decomp_getattr(compobject *self, char *name)
Guido van Rossumfb221561997-04-29 15:38:09 +0000742{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000743 PyObject * retval;
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000744
Jeremy Hylton9714f992001-10-16 21:19:45 +0000745 ENTER_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000746
Jeremy Hylton9714f992001-10-16 21:19:45 +0000747 if (strcmp(name, "unused_data") == 0) {
748 Py_INCREF(self->unused_data);
749 retval = self->unused_data;
750 } else if (strcmp(name, "unconsumed_tail") == 0) {
751 Py_INCREF(self->unconsumed_tail);
752 retval = self->unconsumed_tail;
753 } else
754 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000755
Jeremy Hylton9714f992001-10-16 21:19:45 +0000756 LEAVE_ZLIB
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000757
Jeremy Hylton9714f992001-10-16 21:19:45 +0000758 return retval;
Guido van Rossumfb221561997-04-29 15:38:09 +0000759}
760
Guido van Rossum3c540301997-06-03 22:21:03 +0000761static char adler32__doc__[] =
762"adler32(string) -- Compute an Adler-32 checksum of string, using "
763"a default starting value, and returning an integer value.\n"
764"adler32(string, value) -- Compute an Adler-32 checksum of string, using "
765"the starting value provided, and returning an integer value\n"
766;
767
Guido van Rossumfb221561997-04-29 15:38:09 +0000768static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000769PyZlib_adler32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000770{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000771 uLong adler32val = adler32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000772 Byte *buf;
773 int len;
Guido van Rossumfb221561997-04-29 15:38:09 +0000774
Guido van Rossum43713e52000-02-29 13:59:29 +0000775 if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000776 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000777 adler32val = adler32(adler32val, buf, len);
778 return PyInt_FromLong(adler32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000779}
780
Guido van Rossum3c540301997-06-03 22:21:03 +0000781static char crc32__doc__[] =
782"crc32(string) -- Compute a CRC-32 checksum of string, using "
783"a default starting value, and returning an integer value.\n"
784"crc32(string, value) -- Compute a CRC-32 checksum of string, using "
785"the starting value provided, and returning an integer value.\n"
786;
Guido van Rossumfb221561997-04-29 15:38:09 +0000787
788static PyObject *
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000789PyZlib_crc32(PyObject *self, PyObject *args)
Guido van Rossumfb221561997-04-29 15:38:09 +0000790{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000791 uLong crc32val = crc32(0L, Z_NULL, 0);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000792 Byte *buf;
793 int len;
Guido van Rossum43713e52000-02-29 13:59:29 +0000794 if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000795 return NULL;
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000796 crc32val = crc32(crc32val, buf, len);
797 return PyInt_FromLong(crc32val);
Guido van Rossumfb221561997-04-29 15:38:09 +0000798}
799
800
801static PyMethodDef zlib_methods[] =
802{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000803 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
804 adler32__doc__},
805 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
806 compress__doc__},
807 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
808 compressobj__doc__},
809 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
810 crc32__doc__},
811 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
812 decompress__doc__},
813 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
814 decompressobj__doc__},
815 {NULL, NULL}
Guido van Rossumfb221561997-04-29 15:38:09 +0000816};
817
818statichere PyTypeObject Comptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000819 PyObject_HEAD_INIT(0)
820 0,
821 "Compress",
822 sizeof(compobject),
823 0,
824 (destructor)Comp_dealloc, /*tp_dealloc*/
825 0, /*tp_print*/
826 (getattrfunc)Comp_getattr, /*tp_getattr*/
827 0, /*tp_setattr*/
828 0, /*tp_compare*/
829 0, /*tp_repr*/
830 0, /*tp_as_number*/
831 0, /*tp_as_sequence*/
832 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000833};
834
835statichere PyTypeObject Decomptype = {
Jeremy Hylton9714f992001-10-16 21:19:45 +0000836 PyObject_HEAD_INIT(0)
837 0,
838 "Decompress",
839 sizeof(compobject),
840 0,
841 (destructor)Decomp_dealloc, /*tp_dealloc*/
842 0, /*tp_print*/
843 (getattrfunc)Decomp_getattr, /*tp_getattr*/
844 0, /*tp_setattr*/
845 0, /*tp_compare*/
846 0, /*tp_repr*/
847 0, /*tp_as_number*/
848 0, /*tp_as_sequence*/
849 0, /*tp_as_mapping*/
Guido van Rossumfb221561997-04-29 15:38:09 +0000850};
851
852/* The following insint() routine was blatantly ripped off from
853 socketmodule.c */
854
855/* Convenience routine to export an integer value.
856 For simplicity, errors (which are unlikely anyway) are ignored. */
857static void
Peter Schneider-Kampa788a7f2000-07-10 09:57:19 +0000858insint(PyObject *d, char *name, int value)
Guido van Rossumfb221561997-04-29 15:38:09 +0000859{
860 PyObject *v = PyInt_FromLong((long) value);
861 if (v == NULL) {
862 /* Don't bother reporting this error */
863 PyErr_Clear();
864 }
865 else {
866 PyDict_SetItemString(d, name, v);
867 Py_DECREF(v);
868 }
869}
870
Guido van Rossum3c540301997-06-03 22:21:03 +0000871static char zlib_module_documentation[]=
872"The functions in this module allow compression and decompression "
873"using the zlib library, which is based on GNU zip. \n\n"
874"adler32(string) -- Compute an Adler-32 checksum.\n"
875"adler32(string, start) -- Compute an Adler-32 checksum using a given starting value.\n"
876"compress(string) -- Compress a string.\n"
877"compress(string, level) -- Compress a string with the given level of compression (1--9).\n"
878"compressobj([level]) -- Return a compressor object.\n"
879"crc32(string) -- Compute a CRC-32 checksum.\n"
880"crc32(string, start) -- Compute a CRC-32 checksum using a given starting value.\n"
Andrew M. Kuchling313a3e31999-12-20 22:13:38 +0000881"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
Guido van Rossum3c540301997-06-03 22:21:03 +0000882"decompressobj([wbits]) -- Return a decompressor object (wbits=window buffer size).\n\n"
883"Compressor objects support compress() and flush() methods; decompressor \n"
884"objects support decompress() and flush()."
885;
886
Guido van Rossum3886bb61998-12-04 18:50:17 +0000887DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000888PyInit_zlib(void)
Guido van Rossumfb221561997-04-29 15:38:09 +0000889{
Jeremy Hylton9714f992001-10-16 21:19:45 +0000890 PyObject *m, *d, *ver;
891 Comptype.ob_type = &PyType_Type;
892 Decomptype.ob_type = &PyType_Type;
893 m = Py_InitModule4("zlib", zlib_methods,
894 zlib_module_documentation,
895 (PyObject*)NULL,PYTHON_API_VERSION);
896 d = PyModule_GetDict(m);
897 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
898 if (ZlibError != NULL)
899 PyDict_SetItemString(d, "error", ZlibError);
Jeremy Hyltoncb914041997-09-04 23:39:23 +0000900
Jeremy Hylton9714f992001-10-16 21:19:45 +0000901 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
902 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
903 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
904 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
905 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
906 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
907 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
908 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
909 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
910
911 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
912 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
913 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
914 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
915
916 ver = PyString_FromString(ZLIB_VERSION);
917 if (ver != NULL) {
918 PyDict_SetItemString(d, "ZLIB_VERSION", ver);
919 Py_DECREF(ver);
920 }
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000921
922#ifdef WITH_THREAD
Jeremy Hylton9714f992001-10-16 21:19:45 +0000923 zlib_lock = PyThread_allocate_lock();
Martin v. Löwis3bd8c1e2001-09-07 16:27:31 +0000924#endif // WITH_THREAD
Guido van Rossumfb221561997-04-29 15:38:09 +0000925}