source: python/vendor/Python-2.6.5/Modules/zlibmodule.c

Last change on this file was 2, checked in by Yuri Dario, 15 years ago

Initial import for vendor code.

  • Property svn:eol-style set to native
File size: 28.9 KB
Line 
1/* zlibmodule.c -- gzip-compatible data compression */
2/* See http://www.gzip.org/zlib/ */
3
4/* Windows users: read Python's PCbuild\readme.txt */
5
6
7#include "Python.h"
8#include "zlib.h"
9
10#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 N.B.
19
20 Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions
21 that modify the components of preexisting de/compress objects, it
22 could prove to be a performance gain on multiprocessor machines if
23 there was an de/compress object-specific lock. However, for the
24 moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL
25 de/compress objects.
26 */
27
28static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */
29
30#define ENTER_ZLIB \
31 Py_BEGIN_ALLOW_THREADS \
32 PyThread_acquire_lock(zlib_lock, 1); \
33 Py_END_ALLOW_THREADS
34
35#define LEAVE_ZLIB \
36 PyThread_release_lock(zlib_lock);
37
38#else
39
40#define ENTER_ZLIB
41#define LEAVE_ZLIB
42
43#endif
44
45/* The following parameters are copied from zutil.h, version 0.95 */
46#define DEFLATED 8
47#if MAX_MEM_LEVEL >= 8
48# define DEF_MEM_LEVEL 8
49#else
50# define DEF_MEM_LEVEL MAX_MEM_LEVEL
51#endif
52#define DEF_WBITS MAX_WBITS
53
54/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */
55#define DEFAULTALLOC (16*1024)
56#define PyInit_zlib initzlib
57
58static PyTypeObject Comptype;
59static PyTypeObject Decomptype;
60
61static PyObject *ZlibError;
62
63typedef struct
64{
65 PyObject_HEAD
66 z_stream zst;
67 PyObject *unused_data;
68 PyObject *unconsumed_tail;
69 int is_initialised;
70} compobject;
71
72static void
73zlib_error(z_stream zst, int err, char *msg)
74{
75 if (zst.msg == Z_NULL)
76 PyErr_Format(ZlibError, "Error %d %s", err, msg);
77 else
78 PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zst.msg);
79}
80
81PyDoc_STRVAR(compressobj__doc__,
82"compressobj([level]) -- Return a compressor object.\n"
83"\n"
84"Optional arg level is the compression level, in 1-9.");
85
86PyDoc_STRVAR(decompressobj__doc__,
87"decompressobj([wbits]) -- Return a decompressor object.\n"
88"\n"
89"Optional arg wbits is the window buffer size.");
90
91static compobject *
92newcompobject(PyTypeObject *type)
93{
94 compobject *self;
95 self = PyObject_New(compobject, type);
96 if (self == NULL)
97 return NULL;
98 self->is_initialised = 0;
99 self->unused_data = PyString_FromString("");
100 if (self->unused_data == NULL) {
101 Py_DECREF(self);
102 return NULL;
103 }
104 self->unconsumed_tail = PyString_FromString("");
105 if (self->unconsumed_tail == NULL) {
106 Py_DECREF(self);
107 return NULL;
108 }
109 return self;
110}
111
112PyDoc_STRVAR(compress__doc__,
113"compress(string[, level]) -- Returned compressed string.\n"
114"\n"
115"Optional arg level is the compression level, in 1-9.");
116
117static PyObject *
118PyZlib_compress(PyObject *self, PyObject *args)
119{
120 PyObject *ReturnVal = NULL;
121 Byte *input, *output;
122 int length, level=Z_DEFAULT_COMPRESSION, err;
123 z_stream zst;
124
125 /* require Python string object, optional 'level' arg */
126 if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))
127 return NULL;
128
129 zst.avail_out = length + length/1000 + 12 + 1;
130
131 output = (Byte*)malloc(zst.avail_out);
132 if (output == NULL) {
133 PyErr_SetString(PyExc_MemoryError,
134 "Can't allocate memory to compress data");
135 return NULL;
136 }
137
138 /* Past the point of no return. From here on out, we need to make sure
139 we clean up mallocs & INCREFs. */
140
141 zst.zalloc = (alloc_func)NULL;
142 zst.zfree = (free_func)Z_NULL;
143 zst.next_out = (Byte *)output;
144 zst.next_in = (Byte *)input;
145 zst.avail_in = length;
146 err = deflateInit(&zst, level);
147
148 switch(err) {
149 case(Z_OK):
150 break;
151 case(Z_MEM_ERROR):
152 PyErr_SetString(PyExc_MemoryError,
153 "Out of memory while compressing data");
154 goto error;
155 case(Z_STREAM_ERROR):
156 PyErr_SetString(ZlibError,
157 "Bad compression level");
158 goto error;
159 default:
160 deflateEnd(&zst);
161 zlib_error(zst, err, "while compressing data");
162 goto error;
163 }
164
165 Py_BEGIN_ALLOW_THREADS;
166 err = deflate(&zst, Z_FINISH);
167 Py_END_ALLOW_THREADS;
168
169 if (err != Z_STREAM_END) {
170 zlib_error(zst, err, "while compressing data");
171 deflateEnd(&zst);
172 goto error;
173 }
174
175 err=deflateEnd(&zst);
176 if (err == Z_OK)
177 ReturnVal = PyString_FromStringAndSize((char *)output,
178 zst.total_out);
179 else
180 zlib_error(zst, err, "while finishing compression");
181
182 error:
183 free(output);
184
185 return ReturnVal;
186}
187
188PyDoc_STRVAR(decompress__doc__,
189"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"
190"\n"
191"Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
192"the initial output buffer size.");
193
194static PyObject *
195PyZlib_decompress(PyObject *self, PyObject *args)
196{
197 PyObject *result_str;
198 Byte *input;
199 int length, err;
200 int wsize=DEF_WBITS;
201 Py_ssize_t r_strlen=DEFAULTALLOC;
202 z_stream zst;
203
204 if (!PyArg_ParseTuple(args, "s#|in:decompress",
205 &input, &length, &wsize, &r_strlen))
206 return NULL;
207
208 if (r_strlen <= 0)
209 r_strlen = 1;
210
211 zst.avail_in = length;
212 zst.avail_out = r_strlen;
213
214 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
215 return NULL;
216
217 zst.zalloc = (alloc_func)NULL;
218 zst.zfree = (free_func)Z_NULL;
219 zst.next_out = (Byte *)PyString_AS_STRING(result_str);
220 zst.next_in = (Byte *)input;
221 err = inflateInit2(&zst, wsize);
222
223 switch(err) {
224 case(Z_OK):
225 break;
226 case(Z_MEM_ERROR):
227 PyErr_SetString(PyExc_MemoryError,
228 "Out of memory while decompressing data");
229 goto error;
230 default:
231 inflateEnd(&zst);
232 zlib_error(zst, err, "while preparing to decompress data");
233 goto error;
234 }
235
236 do {
237 Py_BEGIN_ALLOW_THREADS
238 err=inflate(&zst, Z_FINISH);
239 Py_END_ALLOW_THREADS
240
241 switch(err) {
242 case(Z_STREAM_END):
243 break;
244 case(Z_BUF_ERROR):
245 /*
246 * If there is at least 1 byte of room according to zst.avail_out
247 * and we get this error, assume that it means zlib cannot
248 * process the inflate call() due to an error in the data.
249 */
250 if (zst.avail_out > 0) {
251 PyErr_Format(ZlibError, "Error %i while decompressing data",
252 err);
253 inflateEnd(&zst);
254 goto error;
255 }
256 /* fall through */
257 case(Z_OK):
258 /* need more memory */
259 if (_PyString_Resize(&result_str, r_strlen << 1) < 0) {
260 inflateEnd(&zst);
261 goto error;
262 }
263 zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \
264 + r_strlen;
265 zst.avail_out = r_strlen;
266 r_strlen = r_strlen << 1;
267 break;
268 default:
269 inflateEnd(&zst);
270 zlib_error(zst, err, "while decompressing data");
271 goto error;
272 }
273 } while (err != Z_STREAM_END);
274
275 err = inflateEnd(&zst);
276 if (err != Z_OK) {
277 zlib_error(zst, err, "while finishing data decompression");
278 goto error;
279 }
280
281 _PyString_Resize(&result_str, zst.total_out);
282 return result_str;
283
284 error:
285 Py_XDECREF(result_str);
286 return NULL;
287}
288
289static PyObject *
290PyZlib_compressobj(PyObject *selfptr, PyObject *args)
291{
292 compobject *self;
293 int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;
294 int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;
295
296 if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,
297 &memLevel, &strategy))
298 return NULL;
299
300 self = newcompobject(&Comptype);
301 if (self==NULL)
302 return(NULL);
303 self->zst.zalloc = (alloc_func)NULL;
304 self->zst.zfree = (free_func)Z_NULL;
305 self->zst.next_in = NULL;
306 self->zst.avail_in = 0;
307 err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);
308 switch(err) {
309 case (Z_OK):
310 self->is_initialised = 1;
311 return (PyObject*)self;
312 case (Z_MEM_ERROR):
313 Py_DECREF(self);
314 PyErr_SetString(PyExc_MemoryError,
315 "Can't allocate memory for compression object");
316 return NULL;
317 case(Z_STREAM_ERROR):
318 Py_DECREF(self);
319 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
320 return NULL;
321 default:
322 zlib_error(self->zst, err, "while creating compression object");
323 Py_DECREF(self);
324 return NULL;
325 }
326}
327
328static PyObject *
329PyZlib_decompressobj(PyObject *selfptr, PyObject *args)
330{
331 int wbits=DEF_WBITS, err;
332 compobject *self;
333 if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))
334 return NULL;
335
336 self = newcompobject(&Decomptype);
337 if (self == NULL)
338 return(NULL);
339 self->zst.zalloc = (alloc_func)NULL;
340 self->zst.zfree = (free_func)Z_NULL;
341 self->zst.next_in = NULL;
342 self->zst.avail_in = 0;
343 err = inflateInit2(&self->zst, wbits);
344 switch(err) {
345 case (Z_OK):
346 self->is_initialised = 1;
347 return (PyObject*)self;
348 case(Z_STREAM_ERROR):
349 Py_DECREF(self);
350 PyErr_SetString(PyExc_ValueError, "Invalid initialization option");
351 return NULL;
352 case (Z_MEM_ERROR):
353 Py_DECREF(self);
354 PyErr_SetString(PyExc_MemoryError,
355 "Can't allocate memory for decompression object");
356 return NULL;
357 default:
358 zlib_error(self->zst, err, "while creating decompression object");
359 Py_DECREF(self);
360 return NULL;
361 }
362}
363
364static void
365Comp_dealloc(compobject *self)
366{
367 if (self->is_initialised)
368 deflateEnd(&self->zst);
369 Py_XDECREF(self->unused_data);
370 Py_XDECREF(self->unconsumed_tail);
371 PyObject_Del(self);
372}
373
374static void
375Decomp_dealloc(compobject *self)
376{
377 if (self->is_initialised)
378 inflateEnd(&self->zst);
379 Py_XDECREF(self->unused_data);
380 Py_XDECREF(self->unconsumed_tail);
381 PyObject_Del(self);
382}
383
384PyDoc_STRVAR(comp_compress__doc__,
385"compress(data) -- Return a string containing data compressed.\n"
386"\n"
387"After calling this function, some of the input data may still\n"
388"be stored in internal buffers for later processing.\n"
389"Call the flush() method to clear these buffers.");
390
391
392static PyObject *
393PyZlib_objcompress(compobject *self, PyObject *args)
394{
395 int err, inplen, length = DEFAULTALLOC;
396 PyObject *RetVal;
397 Byte *input;
398 unsigned long start_total_out;
399
400 if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))
401 return NULL;
402
403 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
404 return NULL;
405
406 ENTER_ZLIB
407
408 start_total_out = self->zst.total_out;
409 self->zst.avail_in = inplen;
410 self->zst.next_in = input;
411 self->zst.avail_out = length;
412 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
413
414 Py_BEGIN_ALLOW_THREADS
415 err = deflate(&(self->zst), Z_NO_FLUSH);
416 Py_END_ALLOW_THREADS
417
418 /* while Z_OK and the output buffer is full, there might be more output,
419 so extend the output buffer and try again */
420 while (err == Z_OK && self->zst.avail_out == 0) {
421 if (_PyString_Resize(&RetVal, length << 1) < 0)
422 goto error;
423 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
424 + length;
425 self->zst.avail_out = length;
426 length = length << 1;
427
428 Py_BEGIN_ALLOW_THREADS
429 err = deflate(&(self->zst), Z_NO_FLUSH);
430 Py_END_ALLOW_THREADS
431 }
432 /* We will only get Z_BUF_ERROR if the output buffer was full but
433 there wasn't more output when we tried again, so it is not an error
434 condition.
435 */
436
437 if (err != Z_OK && err != Z_BUF_ERROR) {
438 zlib_error(self->zst, err, "while compressing");
439 Py_DECREF(RetVal);
440 RetVal = NULL;
441 goto error;
442 }
443 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
444
445 error:
446 LEAVE_ZLIB
447 return RetVal;
448}
449
450PyDoc_STRVAR(decomp_decompress__doc__,
451"decompress(data, max_length) -- Return a string containing the decompressed\n"
452"version of the data.\n"
453"\n"
454"After calling this function, some of the input data may still be stored in\n"
455"internal buffers for later processing.\n"
456"Call the flush() method to clear these buffers.\n"
457"If the max_length parameter is specified then the return value will be\n"
458"no longer than max_length. Unconsumed input data will be stored in\n"
459"the unconsumed_tail attribute.");
460
461static PyObject *
462PyZlib_objdecompress(compobject *self, PyObject *args)
463{
464 int err, inplen, old_length, length = DEFAULTALLOC;
465 int max_length = 0;
466 PyObject *RetVal;
467 Byte *input;
468 unsigned long start_total_out;
469
470 if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,
471 &inplen, &max_length))
472 return NULL;
473 if (max_length < 0) {
474 PyErr_SetString(PyExc_ValueError,
475 "max_length must be greater than zero");
476 return NULL;
477 }
478
479 /* limit amount of data allocated to max_length */
480 if (max_length && length > max_length)
481 length = max_length;
482 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
483 return NULL;
484
485 ENTER_ZLIB
486
487 start_total_out = self->zst.total_out;
488 self->zst.avail_in = inplen;
489 self->zst.next_in = input;
490 self->zst.avail_out = length;
491 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
492
493 Py_BEGIN_ALLOW_THREADS
494 err = inflate(&(self->zst), Z_SYNC_FLUSH);
495 Py_END_ALLOW_THREADS
496
497 /* While Z_OK and the output buffer is full, there might be more output.
498 So extend the output buffer and try again.
499 */
500 while (err == Z_OK && self->zst.avail_out == 0) {
501 /* If max_length set, don't continue decompressing if we've already
502 reached the limit.
503 */
504 if (max_length && length >= max_length)
505 break;
506
507 /* otherwise, ... */
508 old_length = length;
509 length = length << 1;
510 if (max_length && length > max_length)
511 length = max_length;
512
513 if (_PyString_Resize(&RetVal, length) < 0)
514 goto error;
515 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
516 + old_length;
517 self->zst.avail_out = length - old_length;
518
519 Py_BEGIN_ALLOW_THREADS
520 err = inflate(&(self->zst), Z_SYNC_FLUSH);
521 Py_END_ALLOW_THREADS
522 }
523
524 /* Not all of the compressed data could be accommodated in the output buffer
525 of specified size. Return the unconsumed tail in an attribute.*/
526 if(max_length) {
527 Py_DECREF(self->unconsumed_tail);
528 self->unconsumed_tail = PyString_FromStringAndSize((char *)self->zst.next_in,
529 self->zst.avail_in);
530 if(!self->unconsumed_tail) {
531 Py_DECREF(RetVal);
532 RetVal = NULL;
533 goto error;
534 }
535 }
536
537 /* The end of the compressed data has been reached, so set the
538 unused_data attribute to a string containing the remainder of the
539 data in the string. Note that this is also a logical place to call
540 inflateEnd, but the old behaviour of only calling it on flush() is
541 preserved.
542 */
543 if (err == Z_STREAM_END) {
544 Py_XDECREF(self->unused_data); /* Free original empty string */
545 self->unused_data = PyString_FromStringAndSize(
546 (char *)self->zst.next_in, self->zst.avail_in);
547 if (self->unused_data == NULL) {
548 Py_DECREF(RetVal);
549 goto error;
550 }
551 /* We will only get Z_BUF_ERROR if the output buffer was full
552 but there wasn't more output when we tried again, so it is
553 not an error condition.
554 */
555 } else if (err != Z_OK && err != Z_BUF_ERROR) {
556 zlib_error(self->zst, err, "while decompressing");
557 Py_DECREF(RetVal);
558 RetVal = NULL;
559 goto error;
560 }
561
562 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
563
564 error:
565 LEAVE_ZLIB
566
567 return RetVal;
568}
569
570PyDoc_STRVAR(comp_flush__doc__,
571"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"
572"\n"
573"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"
574"default value used when mode is not specified is Z_FINISH.\n"
575"If mode == Z_FINISH, the compressor object can no longer be used after\n"
576"calling the flush() method. Otherwise, more data can still be compressed.");
577
578static PyObject *
579PyZlib_flush(compobject *self, PyObject *args)
580{
581 int err, length = DEFAULTALLOC;
582 PyObject *RetVal;
583 int flushmode = Z_FINISH;
584 unsigned long start_total_out;
585
586 if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
587 return NULL;
588
589 /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
590 doing any work at all; just return an empty string. */
591 if (flushmode == Z_NO_FLUSH) {
592 return PyString_FromStringAndSize(NULL, 0);
593 }
594
595 if (!(RetVal = PyString_FromStringAndSize(NULL, length)))
596 return NULL;
597
598 ENTER_ZLIB
599
600 start_total_out = self->zst.total_out;
601 self->zst.avail_in = 0;
602 self->zst.avail_out = length;
603 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);
604
605 Py_BEGIN_ALLOW_THREADS
606 err = deflate(&(self->zst), flushmode);
607 Py_END_ALLOW_THREADS
608
609 /* while Z_OK and the output buffer is full, there might be more output,
610 so extend the output buffer and try again */
611 while (err == Z_OK && self->zst.avail_out == 0) {
612 if (_PyString_Resize(&RetVal, length << 1) < 0)
613 goto error;
614 self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \
615 + length;
616 self->zst.avail_out = length;
617 length = length << 1;
618
619 Py_BEGIN_ALLOW_THREADS
620 err = deflate(&(self->zst), flushmode);
621 Py_END_ALLOW_THREADS
622 }
623
624 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
625 various data structures. Note we should only get Z_STREAM_END when
626 flushmode is Z_FINISH, but checking both for safety*/
627 if (err == Z_STREAM_END && flushmode == Z_FINISH) {
628 err = deflateEnd(&(self->zst));
629 if (err != Z_OK) {
630 zlib_error(self->zst, err, "from deflateEnd()");
631 Py_DECREF(RetVal);
632 RetVal = NULL;
633 goto error;
634 }
635 else
636 self->is_initialised = 0;
637
638 /* We will only get Z_BUF_ERROR if the output buffer was full
639 but there wasn't more output when we tried again, so it is
640 not an error condition.
641 */
642 } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
643 zlib_error(self->zst, err, "while flushing");
644 Py_DECREF(RetVal);
645 RetVal = NULL;
646 goto error;
647 }
648
649 _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
650
651 error:
652 LEAVE_ZLIB
653
654 return RetVal;
655}
656
657#ifdef HAVE_ZLIB_COPY
658PyDoc_STRVAR(comp_copy__doc__,
659"copy() -- Return a copy of the compression object.");
660
661static PyObject *
662PyZlib_copy(compobject *self)
663{
664 compobject *retval = NULL;
665 int err;
666
667 retval = newcompobject(&Comptype);
668 if (!retval) return NULL;
669
670 /* Copy the zstream state
671 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
672 */
673 ENTER_ZLIB
674 err = deflateCopy(&retval->zst, &self->zst);
675 switch(err) {
676 case(Z_OK):
677 break;
678 case(Z_STREAM_ERROR):
679 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
680 goto error;
681 case(Z_MEM_ERROR):
682 PyErr_SetString(PyExc_MemoryError,
683 "Can't allocate memory for compression object");
684 goto error;
685 default:
686 zlib_error(self->zst, err, "while copying compression object");
687 goto error;
688 }
689
690 Py_INCREF(self->unused_data);
691 Py_INCREF(self->unconsumed_tail);
692 Py_XDECREF(retval->unused_data);
693 Py_XDECREF(retval->unconsumed_tail);
694 retval->unused_data = self->unused_data;
695 retval->unconsumed_tail = self->unconsumed_tail;
696
697 /* Mark it as being initialized */
698 retval->is_initialised = 1;
699
700 LEAVE_ZLIB
701 return (PyObject *)retval;
702
703error:
704 LEAVE_ZLIB
705 Py_XDECREF(retval);
706 return NULL;
707}
708
709PyDoc_STRVAR(decomp_copy__doc__,
710"copy() -- Return a copy of the decompression object.");
711
712static PyObject *
713PyZlib_uncopy(compobject *self)
714{
715 compobject *retval = NULL;
716 int err;
717
718 retval = newcompobject(&Decomptype);
719 if (!retval) return NULL;
720
721 /* Copy the zstream state
722 * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe
723 */
724 ENTER_ZLIB
725 err = inflateCopy(&retval->zst, &self->zst);
726 switch(err) {
727 case(Z_OK):
728 break;
729 case(Z_STREAM_ERROR):
730 PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");
731 goto error;
732 case(Z_MEM_ERROR):
733 PyErr_SetString(PyExc_MemoryError,
734 "Can't allocate memory for decompression object");
735 goto error;
736 default:
737 zlib_error(self->zst, err, "while copying decompression object");
738 goto error;
739 }
740
741 Py_INCREF(self->unused_data);
742 Py_INCREF(self->unconsumed_tail);
743 Py_XDECREF(retval->unused_data);
744 Py_XDECREF(retval->unconsumed_tail);
745 retval->unused_data = self->unused_data;
746 retval->unconsumed_tail = self->unconsumed_tail;
747
748 /* Mark it as being initialized */
749 retval->is_initialised = 1;
750
751 LEAVE_ZLIB
752 return (PyObject *)retval;
753
754error:
755 LEAVE_ZLIB
756 Py_XDECREF(retval);
757 return NULL;
758}
759#endif
760
761PyDoc_STRVAR(decomp_flush__doc__,
762"flush( [length] ) -- Return a string containing any remaining\n"
763"decompressed data. length, if given, is the initial size of the\n"
764"output buffer.\n"
765"\n"
766"The decompressor object can no longer be used after this call.");
767
768static PyObject *
769PyZlib_unflush(compobject *self, PyObject *args)
770{
771 int err, length = DEFAULTALLOC;
772 PyObject * retval = NULL;
773 unsigned long start_total_out;
774
775 if (!PyArg_ParseTuple(args, "|i:flush", &length))
776 return NULL;
777 if (length <= 0) {
778 PyErr_SetString(PyExc_ValueError, "length must be greater than zero");
779 return NULL;
780 }
781 if (!(retval = PyString_FromStringAndSize(NULL, length)))
782 return NULL;
783
784
785 ENTER_ZLIB
786
787 start_total_out = self->zst.total_out;
788 self->zst.avail_out = length;
789 self->zst.next_out = (Byte *)PyString_AS_STRING(retval);
790
791 Py_BEGIN_ALLOW_THREADS
792 err = inflate(&(self->zst), Z_FINISH);
793 Py_END_ALLOW_THREADS
794
795 /* while Z_OK and the output buffer is full, there might be more output,
796 so extend the output buffer and try again */
797 while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {
798 if (_PyString_Resize(&retval, length << 1) < 0)
799 goto error;
800 self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length;
801 self->zst.avail_out = length;
802 length = length << 1;
803
804 Py_BEGIN_ALLOW_THREADS
805 err = inflate(&(self->zst), Z_FINISH);
806 Py_END_ALLOW_THREADS
807 }
808
809 /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
810 various data structures. Note we should only get Z_STREAM_END when
811 flushmode is Z_FINISH */
812 if (err == Z_STREAM_END) {
813 err = inflateEnd(&(self->zst));
814 self->is_initialised = 0;
815 if (err != Z_OK) {
816 zlib_error(self->zst, err, "from inflateEnd()");
817 Py_DECREF(retval);
818 retval = NULL;
819 goto error;
820 }
821 }
822 _PyString_Resize(&retval, self->zst.total_out - start_total_out);
823
824error:
825
826 LEAVE_ZLIB
827
828 return retval;
829}
830
831static PyMethodDef comp_methods[] =
832{
833 {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
834 comp_compress__doc__},
835 {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
836 comp_flush__doc__},
837#ifdef HAVE_ZLIB_COPY
838 {"copy", (PyCFunction)PyZlib_copy, METH_NOARGS,
839 comp_copy__doc__},
840#endif
841 {NULL, NULL}
842};
843
844static PyMethodDef Decomp_methods[] =
845{
846 {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
847 decomp_decompress__doc__},
848 {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
849 decomp_flush__doc__},
850#ifdef HAVE_ZLIB_COPY
851 {"copy", (PyCFunction)PyZlib_uncopy, METH_NOARGS,
852 decomp_copy__doc__},
853#endif
854 {NULL, NULL}
855};
856
857static PyObject *
858Comp_getattr(compobject *self, char *name)
859{
860 /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch
861 internal data. */
862
863 return Py_FindMethod(comp_methods, (PyObject *)self, name);
864}
865
866static PyObject *
867Decomp_getattr(compobject *self, char *name)
868{
869 PyObject * retval;
870
871 ENTER_ZLIB
872
873 if (strcmp(name, "unused_data") == 0) {
874 Py_INCREF(self->unused_data);
875 retval = self->unused_data;
876 } else if (strcmp(name, "unconsumed_tail") == 0) {
877 Py_INCREF(self->unconsumed_tail);
878 retval = self->unconsumed_tail;
879 } else
880 retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
881
882 LEAVE_ZLIB
883
884 return retval;
885}
886
887PyDoc_STRVAR(adler32__doc__,
888"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"
889"\n"
890"An optional starting value can be specified. The returned checksum is\n"
891"a signed integer.");
892
893static PyObject *
894PyZlib_adler32(PyObject *self, PyObject *args)
895{
896 unsigned int adler32val = 1; /* adler32(0L, Z_NULL, 0) */
897 Byte *buf;
898 int len, signed_val;
899
900 if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val))
901 return NULL;
902 /* In Python 2.x we return a signed integer regardless of native platform
903 * long size (the 32bit unsigned long is treated as 32-bit signed and sign
904 * extended into a 64-bit long inside the integer object). 3.0 does the
905 * right thing and returns unsigned. http://bugs.python.org/issue1202 */
906 signed_val = adler32(adler32val, buf, len);
907 return PyInt_FromLong(signed_val);
908}
909
910PyDoc_STRVAR(crc32__doc__,
911"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"
912"\n"
913"An optional starting value can be specified. The returned checksum is\n"
914"a signed integer.");
915
916static PyObject *
917PyZlib_crc32(PyObject *self, PyObject *args)
918{
919 unsigned int crc32val = 0; /* crc32(0L, Z_NULL, 0) */
920 Byte *buf;
921 int len, signed_val;
922
923 if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))
924 return NULL;
925 /* In Python 2.x we return a signed integer regardless of native platform
926 * long size (the 32bit unsigned long is treated as 32-bit signed and sign
927 * extended into a 64-bit long inside the integer object). 3.0 does the
928 * right thing and returns unsigned. http://bugs.python.org/issue1202 */
929 signed_val = crc32(crc32val, buf, len);
930 return PyInt_FromLong(signed_val);
931}
932
933
934static PyMethodDef zlib_methods[] =
935{
936 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
937 adler32__doc__},
938 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
939 compress__doc__},
940 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
941 compressobj__doc__},
942 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
943 crc32__doc__},
944 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
945 decompress__doc__},
946 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
947 decompressobj__doc__},
948 {NULL, NULL}
949};
950
951static PyTypeObject Comptype = {
952 PyVarObject_HEAD_INIT(0, 0)
953 "zlib.Compress",
954 sizeof(compobject),
955 0,
956 (destructor)Comp_dealloc, /*tp_dealloc*/
957 0, /*tp_print*/
958 (getattrfunc)Comp_getattr, /*tp_getattr*/
959 0, /*tp_setattr*/
960 0, /*tp_compare*/
961 0, /*tp_repr*/
962 0, /*tp_as_number*/
963 0, /*tp_as_sequence*/
964 0, /*tp_as_mapping*/
965};
966
967static PyTypeObject Decomptype = {
968 PyVarObject_HEAD_INIT(0, 0)
969 "zlib.Decompress",
970 sizeof(compobject),
971 0,
972 (destructor)Decomp_dealloc, /*tp_dealloc*/
973 0, /*tp_print*/
974 (getattrfunc)Decomp_getattr, /*tp_getattr*/
975 0, /*tp_setattr*/
976 0, /*tp_compare*/
977 0, /*tp_repr*/
978 0, /*tp_as_number*/
979 0, /*tp_as_sequence*/
980 0, /*tp_as_mapping*/
981};
982
983PyDoc_STRVAR(zlib_module_documentation,
984"The functions in this module allow compression and decompression using the\n"
985"zlib library, which is based on GNU zip.\n"
986"\n"
987"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"
988"compress(string[, level]) -- Compress string, with compression level in 1-9.\n"
989"compressobj([level]) -- Return a compressor object.\n"
990"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"
991"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"
992"decompressobj([wbits]) -- Return a decompressor object.\n"
993"\n"
994"'wbits' is window buffer size.\n"
995"Compressor objects support compress() and flush() methods; decompressor\n"
996"objects support decompress() and flush().");
997
998PyMODINIT_FUNC
999PyInit_zlib(void)
1000{
1001 PyObject *m, *ver;
1002 Py_TYPE(&Comptype) = &PyType_Type;
1003 Py_TYPE(&Decomptype) = &PyType_Type;
1004 m = Py_InitModule4("zlib", zlib_methods,
1005 zlib_module_documentation,
1006 (PyObject*)NULL,PYTHON_API_VERSION);
1007 if (m == NULL)
1008 return;
1009
1010 ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
1011 if (ZlibError != NULL) {
1012 Py_INCREF(ZlibError);
1013 PyModule_AddObject(m, "error", ZlibError);
1014 }
1015 PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
1016 PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
1017 PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
1018 PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
1019 PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
1020 PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
1021 PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
1022 PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
1023 PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
1024
1025 PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
1026 PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
1027 PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
1028 PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
1029
1030 ver = PyString_FromString(ZLIB_VERSION);
1031 if (ver != NULL)
1032 PyModule_AddObject(m, "ZLIB_VERSION", ver);
1033
1034 PyModule_AddStringConstant(m, "__version__", "1.0");
1035
1036#ifdef WITH_THREAD
1037 zlib_lock = PyThread_allocate_lock();
1038#endif /* WITH_THREAD */
1039}
Note: See TracBrowser for help on using the repository browser.