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