summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/zlibmodule.c1162
1 files changed, 576 insertions, 586 deletions
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index 2d9e777..7a9dcf0 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -75,11 +75,11 @@ static PyObject *ZlibError;
typedef struct
{
- PyObject_HEAD
- z_stream zst;
- PyObject *unused_data;
- PyObject *unconsumed_tail;
- int is_initialised;
+ PyObject_HEAD
+ z_stream zst;
+ PyObject *unused_data;
+ PyObject *unconsumed_tail;
+ int is_initialised;
} compobject;
static char compressobj__doc__[] =
@@ -95,22 +95,22 @@ static char decompressobj__doc__[] =
static compobject *
newcompobject(PyTypeObject *type)
{
- compobject *self;
- self = PyObject_New(compobject, type);
- if (self == NULL)
- return NULL;
- self->is_initialised = 0;
- self->unused_data = PyString_FromString("");
- if (self->unused_data == NULL) {
- Py_DECREF(self);
- return NULL;
- }
- self->unconsumed_tail = PyString_FromString("");
- if (self->unconsumed_tail == NULL) {
- Py_DECREF(self);
- return NULL;
- }
- return self;
+ compobject *self;
+ self = PyObject_New(compobject, type);
+ if (self == NULL)
+ return NULL;
+ self->is_initialised = 0;
+ self->unused_data = PyString_FromString("");
+ if (self->unused_data == NULL) {
+ Py_DECREF(self);
+ return NULL;
+ }
+ self->unconsumed_tail = PyString_FromString("");
+ if (self->unconsumed_tail == NULL) {
+ Py_DECREF(self);
+ return NULL;
+ }
+ return self;
}
static char compress__doc__[] =
@@ -123,62 +123,61 @@ static char compress__doc__[] =
static PyObject *
PyZlib_compress(PyObject *self, PyObject *args)
{
- PyObject *ReturnVal = NULL;
- Byte *input, *output;
- int length, level=Z_DEFAULT_COMPRESSION, err;
- z_stream zst;
- int return_error;
- PyObject * inputString;
+ PyObject *ReturnVal = NULL;
+ Byte *input, *output;
+ int length, level=Z_DEFAULT_COMPRESSION, err;
+ z_stream zst;
+ int return_error;
+ PyObject * inputString;
- /* require Python string object, optional 'level' arg */
- if (!PyArg_ParseTuple(args, "S|i:compress", &inputString, &level))
- return NULL;
+ /* require Python string object, optional 'level' arg */
+ if (!PyArg_ParseTuple(args, "S|i:compress", &inputString, &level))
+ return NULL;
- /* now get a pointer to the internal string */
- if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
- return NULL;
+ /* now get a pointer to the internal string */
+ if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
+ return NULL;
- zst.avail_out = length + length/1000 + 12 + 1;
+ zst.avail_out = length + length/1000 + 12 + 1;
- output=(Byte*)malloc(zst.avail_out);
- if (output==NULL)
+ output=(Byte*)malloc(zst.avail_out);
+ if (output==NULL)
{
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to compress data");
- free(output);
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to compress data");
+ free(output);
- return NULL;
+ return NULL;
}
- /* Past the point of no return. From here on out, we need to make sure
- we clean up mallocs & INCREFs. */
+ /* Past the point of no return. From here on out, we need to make sure
+ we clean up mallocs & INCREFs. */
- Py_INCREF(inputString); /* increment so that we hold ref */
+ Py_INCREF(inputString); /* increment so that we hold ref */
- zst.zalloc=(alloc_func)NULL;
- zst.zfree=(free_func)Z_NULL;
- zst.next_out=(Byte *)output;
- zst.next_in =(Byte *)input;
- zst.avail_in=length;
- err=deflateInit(&zst, level);
+ zst.zalloc=(alloc_func)NULL;
+ zst.zfree=(free_func)Z_NULL;
+ zst.next_out=(Byte *)output;
+ zst.next_in =(Byte *)input;
+ zst.avail_in=length;
+ err=deflateInit(&zst, level);
- return_error = 0;
- switch(err)
+ return_error = 0;
+ switch(err)
{
case(Z_OK):
- break;
+ break;
case(Z_MEM_ERROR):
- PyErr_SetString(PyExc_MemoryError,
- "Out of memory while compressing data");
- return_error = 1;
- break;
+ PyErr_SetString(PyExc_MemoryError,
+ "Out of memory while compressing data");
+ return_error = 1;
+ break;
case(Z_STREAM_ERROR):
- PyErr_SetString(ZlibError,
- "Bad compression level");
- return_error = 1;
- break;
- default:
- {
+ PyErr_SetString(ZlibError,
+ "Bad compression level");
+ return_error = 1;
+ break;
+ default: {
if (zst.msg == Z_NULL)
PyErr_Format(ZlibError, "Error %i while compressing data",
err);
@@ -187,57 +186,55 @@ PyZlib_compress(PyObject *self, PyObject *args)
err, zst.msg);
deflateEnd(&zst);
return_error = 1;
- }
+ }
}
- if (!return_error) {
- Py_BEGIN_ALLOW_THREADS
- err=deflate(&zst, Z_FINISH);
- Py_END_ALLOW_THREADS
+ if (!return_error) {
+ Py_BEGIN_ALLOW_THREADS;
+ err=deflate(&zst, Z_FINISH);
+ Py_END_ALLOW_THREADS;
- switch(err)
- {
- case(Z_STREAM_END):
- break;
- /* Are there other errors to be trapped here? */
- default:
+ switch(err)
{
- if (zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i while compressing data",
- err);
- else
- PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
- err, zst.msg);
+ case(Z_STREAM_END):
+ break;
+ /* Are there other errors to be trapped here? */
+ default: {
+ if (zst.msg == Z_NULL)
+ PyErr_Format(ZlibError, "Error %i while compressing data",
+ err);
+ else
+ PyErr_Format(ZlibError, "Error %i while compressing data: %.200s",
+ err, zst.msg);
- deflateEnd(&zst);
+ deflateEnd(&zst);
- return_error = 1;
+ return_error = 1;
+ }
}
- }
- if (!return_error) {
- err=deflateEnd(&zst);
- if (err == Z_OK)
- ReturnVal = PyString_FromStringAndSize((char *)output, zst.total_out);
- else {
- {
- if (zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i while finishing compression",
- err);
- else
- PyErr_Format(ZlibError,
- "Error %i while finishing compression: %.200s",
- err, zst.msg);
+ if (!return_error) {
+ err=deflateEnd(&zst);
+ if (err == Z_OK)
+ ReturnVal = PyString_FromStringAndSize((char *)output,
+ zst.total_out);
+ else {
+ if (zst.msg == Z_NULL)
+ PyErr_Format(ZlibError,
+ "Error %i while finishing compression",
+ err);
+ else
+ PyErr_Format(ZlibError,
+ "Error %i while finishing compression: %.200s",
+ err, zst.msg);
+ }
}
- }
-
}
- }
- free(output);
- Py_DECREF(inputString);
+ free(output);
+ Py_DECREF(inputString);
- return ReturnVal;
+ return ReturnVal;
}
static char decompress__doc__[] =
@@ -249,54 +246,52 @@ static char decompress__doc__[] =
static PyObject *
PyZlib_decompress(PyObject *self, PyObject *args)
{
- PyObject *result_str;
- Byte *input;
- int length, err;
- int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
- z_stream zst;
- int return_error;
- PyObject * inputString;
-
- if (!PyArg_ParseTuple(args, "S|ii:decompress", &inputString, &wsize, &r_strlen))
- return NULL;
- if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
- return NULL;
-
- if (r_strlen <= 0)
- r_strlen = 1;
-
- zst.avail_in=length;
- zst.avail_out=r_strlen;
-
- if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
- {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to decompress data");
- return NULL;
- }
+ PyObject *result_str;
+ Byte *input;
+ int length, err;
+ int wsize=DEF_WBITS, r_strlen=DEFAULTALLOC;
+ z_stream zst;
+ int return_error;
+ PyObject * inputString;
+
+ if (!PyArg_ParseTuple(args, "S|ii:decompress",
+ &inputString, &wsize, &r_strlen))
+ return NULL;
+ if (PyString_AsStringAndSize(inputString, (char**)&input, &length) == -1)
+ return NULL;
- /* Past the point of no return. From here on out, we need to make sure
- we clean up mallocs & INCREFs. */
+ if (r_strlen <= 0)
+ r_strlen = 1;
- Py_INCREF(inputString); /* increment so that we hold ref */
+ zst.avail_in = length;
+ zst.avail_out = r_strlen;
- zst.zalloc=(alloc_func)NULL;
- zst.zfree=(free_func)Z_NULL;
- zst.next_out=(Byte *)PyString_AsString(result_str);
- zst.next_in =(Byte *)input;
- err=inflateInit2(&zst, wsize);
+ if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen))) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to decompress data");
+ return NULL;
+ }
- return_error = 0;
- switch(err)
- {
+ /* Past the point of no return. From here on out, we need to make sure
+ we clean up mallocs & INCREFs. */
+
+ Py_INCREF(inputString); /* increment so that we hold ref */
+
+ zst.zalloc = (alloc_func)NULL;
+ zst.zfree = (free_func)Z_NULL;
+ zst.next_out = (Byte *)PyString_AsString(result_str);
+ zst.next_in = (Byte *)input;
+ err = inflateInit2(&zst, wsize);
+
+ return_error = 0;
+ switch(err) {
case(Z_OK):
- break;
+ break;
case(Z_MEM_ERROR):
- PyErr_SetString(PyExc_MemoryError,
- "Out of memory while decompressing data");
- return_error = 1;
- default:
- {
+ PyErr_SetString(PyExc_MemoryError,
+ "Out of memory while decompressing data");
+ return_error = 1;
+ default: {
if (zst.msg == Z_NULL)
PyErr_Format(ZlibError, "Error %i preparing to decompress data",
err);
@@ -307,21 +302,19 @@ PyZlib_decompress(PyObject *self, PyObject *args)
inflateEnd(&zst);
return_error = 1;
- }
+ }
}
- do
- {
- if (return_error)
- break;
+ do {
+ if (return_error)
+ break;
- Py_BEGIN_ALLOW_THREADS
- err=inflate(&zst, Z_FINISH);
- Py_END_ALLOW_THREADS
+ Py_BEGIN_ALLOW_THREADS
+ err=inflate(&zst, Z_FINISH);
+ Py_END_ALLOW_THREADS
- switch(err)
- {
- case(Z_STREAM_END):
+ switch(err) {
+ case(Z_STREAM_END):
break;
case(Z_BUF_ERROR):
/*
@@ -330,69 +323,66 @@ PyZlib_decompress(PyObject *self, PyObject *args)
* process the inflate call() due to an error in the data.
*/
if (zst.avail_out > 0)
- {
- PyErr_Format(ZlibError, "Error %i while decompressing data",
- err);
- inflateEnd(&zst);
- return_error = 1;
- break;
- }
+ {
+ PyErr_Format(ZlibError, "Error %i while decompressing data",
+ err);
+ inflateEnd(&zst);
+ return_error = 1;
+ break;
+ }
/* fall through */
case(Z_OK):
/* need more memory */
- if (_PyString_Resize(&result_str, r_strlen << 1) == -1)
- {
- PyErr_SetString(PyExc_MemoryError,
- "Out of memory while decompressing data");
- inflateEnd(&zst);
- result_str = NULL;
- return_error = 1;
- }
- zst.next_out = (unsigned char *)PyString_AsString(result_str) + r_strlen;
- zst.avail_out=r_strlen;
+ if (_PyString_Resize(&result_str, r_strlen << 1) == -1) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Out of memory while decompressing data");
+ inflateEnd(&zst);
+ result_str = NULL;
+ return_error = 1;
+ }
+ zst.next_out = (unsigned char *)PyString_AsString(result_str) \
+ + r_strlen;
+ zst.avail_out = r_strlen;
r_strlen = r_strlen << 1;
break;
- default:
- {
- if (zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i while decompressing data",
- err);
- else
- PyErr_Format(ZlibError,
- "Error %i while decompressing data: %.200s",
- err, zst.msg);
- inflateEnd(&zst);
+ default: {
+ if (zst.msg == Z_NULL)
+ PyErr_Format(ZlibError, "Error %i while decompressing data",
+ err);
+ else
+ PyErr_Format(ZlibError,
+ "Error %i while decompressing data: %.200s",
+ err, zst.msg);
+ inflateEnd(&zst);
return_error = 1;
- }
- }
- } while(err!=Z_STREAM_END);
+ }
+ }
+ } while (err != Z_STREAM_END);
- if (!return_error) {
- err=inflateEnd(&zst);
- if (err!=Z_OK)
- {
- if (zst.msg == Z_NULL)
- PyErr_Format(ZlibError,
- "Error %i while finishing data decompression",
- err);
- else
- PyErr_Format(ZlibError,
- "Error %i while finishing data decompression: %.200s",
- err, zst.msg);
+ if (!return_error) {
+ err = inflateEnd(&zst);
+ if (err != Z_OK) {
+ if (zst.msg == Z_NULL)
+ PyErr_Format(ZlibError,
+ "Error %i while finishing data decompression",
+ err);
+ else
+ PyErr_Format(ZlibError,
+ "Error %i while finishing data decompression: %.200s",
+ err, zst.msg);
- return_error = 1;
- return NULL;
+ return_error = 1;
+ return NULL;
+ }
}
- }
- if (!return_error)
- _PyString_Resize(&result_str, zst.total_out);
- else {
- Py_XDECREF(result_str); /* sets result_str == NULL, if not already */
- }
- Py_DECREF(inputString);
+ if (!return_error)
+ _PyString_Resize(&result_str, zst.total_out);
+ else
+ Py_XDECREF(result_str); /* sets result_str == NULL, if not already */
+ Py_DECREF(inputString);
- return result_str;
+ return result_str;
}
static PyObject *
@@ -526,84 +516,87 @@ static char comp_compress__doc__[] =
static PyObject *
PyZlib_objcompress(compobject *self, PyObject *args)
{
- int err, inplen, length = DEFAULTALLOC;
- PyObject *RetVal;
- Byte *input;
- unsigned long start_total_out;
- int return_error;
- PyObject * inputString;
+ int err, inplen, length = DEFAULTALLOC;
+ PyObject *RetVal;
+ Byte *input;
+ unsigned long start_total_out;
+ int return_error;
+ PyObject * inputString;
- if (!PyArg_ParseTuple(args, "S:compress", &inputString))
- return NULL;
- if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
- return NULL;
-
- if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to compress data");
- return NULL;
- }
+ if (!PyArg_ParseTuple(args, "S:compress", &inputString))
+ return NULL;
+ if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
+ return NULL;
+
+ if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to compress data");
+ return NULL;
+ }
- ENTER_ZLIB
+ ENTER_ZLIB
- Py_INCREF(inputString);
+ Py_INCREF(inputString);
- start_total_out = self->zst.total_out;
- self->zst.avail_in = inplen;
- self->zst.next_in = input;
- self->zst.avail_out = length;
- self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
-
- Py_BEGIN_ALLOW_THREADS
- err = deflate(&(self->zst), Z_NO_FLUSH);
- Py_END_ALLOW_THREADS
-
- return_error = 0;
-
- /* while Z_OK and the output buffer is full, there might be more output,
- so extend the output buffer and try again */
- while (err == Z_OK && self->zst.avail_out == 0) {
- if (_PyString_Resize(&RetVal, length << 1) == -1) {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to compress data");
- return_error = 1;
- break;
- }
- self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
+ start_total_out = self->zst.total_out;
+ self->zst.avail_in = inplen;
+ self->zst.next_in = input;
self->zst.avail_out = length;
- length = length << 1;
-
+ self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
+
Py_BEGIN_ALLOW_THREADS
err = deflate(&(self->zst), Z_NO_FLUSH);
Py_END_ALLOW_THREADS
- }
- /* We will only get Z_BUF_ERROR if the output buffer was full but there
- wasn't more output when we tried again, so it is not an error condition */
-
- if (!return_error) {
- if (err != Z_OK && err != Z_BUF_ERROR) {
- if (self->zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i while compressing",
- err);
- else
- PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
- err, self->zst.msg);
-
- return_error = 1;
- Py_DECREF(RetVal);
+
+ return_error = 0;
+
+ /* while Z_OK and the output buffer is full, there might be more output,
+ so extend the output buffer and try again */
+ while (err == Z_OK && self->zst.avail_out == 0) {
+ if (_PyString_Resize(&RetVal, length << 1) == -1) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to compress data");
+ return_error = 1;
+ break;
+ }
+ self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) \
+ + length;
+ self->zst.avail_out = length;
+ length = length << 1;
+
+ Py_BEGIN_ALLOW_THREADS
+ err = deflate(&(self->zst), Z_NO_FLUSH);
+ Py_END_ALLOW_THREADS
}
- }
+ /* We will only get Z_BUF_ERROR if the output buffer was full but
+ there wasn't more output when we tried again, so it is not an error
+ condition.
+ */
- if (return_error)
- RetVal = NULL; /* should have been handled by DECREF */
- else
- _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
+ if (!return_error) {
+ if (err != Z_OK && err != Z_BUF_ERROR) {
+ if (self->zst.msg == Z_NULL)
+ PyErr_Format(ZlibError, "Error %i while compressing",
+ err);
+ else
+ PyErr_Format(ZlibError, "Error %i while compressing: %.200s",
+ err, self->zst.msg);
+
+ return_error = 1;
+ Py_DECREF(RetVal);
+ }
+ }
+
+ if (return_error)
+ RetVal = NULL; /* should have been handled by DECREF */
+ else
+ _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
- Py_DECREF(inputString);
+ Py_DECREF(inputString);
- LEAVE_ZLIB
+ LEAVE_ZLIB
- return RetVal;
+ return RetVal;
}
static char decomp_decompress__doc__[] =
@@ -620,130 +613,134 @@ static char decomp_decompress__doc__[] =
static PyObject *
PyZlib_objdecompress(compobject *self, PyObject *args)
{
- int err, inplen, old_length, length = DEFAULTALLOC;
- int max_length = 0;
- PyObject *RetVal;
- Byte *input;
- unsigned long start_total_out;
- int return_error;
- PyObject * inputString;
-
- if (!PyArg_ParseTuple(args, "S|i:decompress", &inputString, &max_length))
- return NULL;
- if (max_length < 0) {
- PyErr_SetString(PyExc_ValueError,
- "max_length must be greater than zero");
- return NULL;
- }
+ int err, inplen, old_length, length = DEFAULTALLOC;
+ int max_length = 0;
+ PyObject *RetVal;
+ Byte *input;
+ unsigned long start_total_out;
+ int return_error;
+ PyObject * inputString;
+
+ if (!PyArg_ParseTuple(args, "S|i:decompress", &inputString, &max_length))
+ return NULL;
+ if (max_length < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "max_length must be greater than zero");
+ return NULL;
+ }
- if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
- return NULL;
+ if (PyString_AsStringAndSize(inputString, (char**)&input, &inplen) == -1)
+ return NULL;
- /* limit amount of data allocated to max_length */
- if (max_length && length > max_length)
- length = max_length;
- if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to compress data");
- return NULL;
- }
+ /* limit amount of data allocated to max_length */
+ if (max_length && length > max_length)
+ length = max_length;
+ if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to compress data");
+ return NULL;
+ }
- ENTER_ZLIB
- return_error = 0;
+ ENTER_ZLIB
+ return_error = 0;
- Py_INCREF(inputString);
+ Py_INCREF(inputString);
- start_total_out = self->zst.total_out;
- self->zst.avail_in = inplen;
- self->zst.next_in = input;
- self->zst.avail_out = length;
- self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
+ start_total_out = self->zst.total_out;
+ self->zst.avail_in = inplen;
+ self->zst.next_in = input;
+ self->zst.avail_out = length;
+ self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
- Py_BEGIN_ALLOW_THREADS
- err = inflate(&(self->zst), Z_SYNC_FLUSH);
- Py_END_ALLOW_THREADS
+ Py_BEGIN_ALLOW_THREADS
+ err = inflate(&(self->zst), Z_SYNC_FLUSH);
+ Py_END_ALLOW_THREADS
- /* While Z_OK and the output buffer is full, there might be more output.
- So extend the output buffer and try again.
- */
- while (err == Z_OK && self->zst.avail_out == 0) {
- /* If max_length set, don't continue decompressing if we've already
- reached the limit.
+ /* While Z_OK and the output buffer is full, there might be more output.
+ So extend the output buffer and try again.
*/
- if (max_length && length >= max_length)
- break;
+ while (err == Z_OK && self->zst.avail_out == 0) {
+ /* If max_length set, don't continue decompressing if we've already
+ reached the limit.
+ */
+ if (max_length && length >= max_length)
+ break;
- /* otherwise, ... */
- old_length = length;
- length = length << 1;
- if (max_length && length > max_length)
- length = max_length;
+ /* otherwise, ... */
+ old_length = length;
+ length = length << 1;
+ if (max_length && length > max_length)
+ length = max_length;
- if (_PyString_Resize(&RetVal, length) == -1) {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to compress data");
- return_error = 1;
- break;
- }
- self->zst.next_out = (unsigned char *)PyString_AsString(RetVal)+old_length;
- self->zst.avail_out = length - old_length;
-
- Py_BEGIN_ALLOW_THREADS
- err = inflate(&(self->zst), Z_SYNC_FLUSH);
- Py_END_ALLOW_THREADS
- }
+ if (_PyString_Resize(&RetVal, length) == -1) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to compress data");
+ return_error = 1;
+ break;
+ }
+ self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) \
+ + old_length;
+ self->zst.avail_out = length - old_length;
- /* Not all of the compressed data could be accomodated in the output buffer
- of specified size. Return the unconsumed tail in an attribute.*/
- if(max_length) {
- Py_DECREF(self->unconsumed_tail);
- self->unconsumed_tail = PyString_FromStringAndSize(self->zst.next_in,
- self->zst.avail_in);
- if(!self->unconsumed_tail)
- return_error = 1;
- }
+ Py_BEGIN_ALLOW_THREADS
+ err = inflate(&(self->zst), Z_SYNC_FLUSH);
+ Py_END_ALLOW_THREADS
+ }
- /* The end of the compressed data has been reached, so set the unused_data
- attribute to a string containing the remainder of the data in the string.
- Note that this is also a logical place to call inflateEnd, but the old
- behaviour of only calling it on flush() is preserved.*/
- if (!return_error) {
- if (err == Z_STREAM_END) {
- Py_XDECREF(self->unused_data); /* Free the original, empty string */
- self->unused_data = PyString_FromStringAndSize((char *)self->zst.next_in,
- self->zst.avail_in);
- if (self->unused_data == NULL) {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to unused_data");
- Py_DECREF(RetVal);
- return_error = 1;
+ /* Not all of the compressed data could be accomodated in the output buffer
+ of specified size. Return the unconsumed tail in an attribute.*/
+ if(max_length) {
+ Py_DECREF(self->unconsumed_tail);
+ self->unconsumed_tail = PyString_FromStringAndSize(self->zst.next_in,
+ self->zst.avail_in);
+ if(!self->unconsumed_tail)
+ return_error = 1;
}
- /* We will only get Z_BUF_ERROR if the output buffer was full but there
- wasn't more output when we tried again, so it is not an error
- condition */
- } else if (err != Z_OK && err != Z_BUF_ERROR) {
- if (self->zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i while decompressing",
- err);
- else
- PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
- err, self->zst.msg);
- Py_DECREF(RetVal);
- return_error = 1;
+
+ /* The end of the compressed data has been reached, so set the
+ unused_data attribute to a string containing the remainder of the
+ data in the string. Note that this is also a logical place to call
+ inflateEnd, but the old behaviour of only calling it on flush() is
+ preserved.
+ */
+ if (!return_error) {
+ if (err == Z_STREAM_END) {
+ Py_XDECREF(self->unused_data); /* Free original empty string */
+ self->unused_data = PyString_FromStringAndSize(
+ (char *)self->zst.next_in, self->zst.avail_in);
+ if (self->unused_data == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to unused_data");
+ Py_DECREF(RetVal);
+ return_error = 1;
+ }
+ /* We will only get Z_BUF_ERROR if the output buffer was full
+ but there wasn't more output when we tried again, so it is
+ not an error condition.
+ */
+ } else if (err != Z_OK && err != Z_BUF_ERROR) {
+ if (self->zst.msg == Z_NULL)
+ PyErr_Format(ZlibError, "Error %i while decompressing",
+ err);
+ else
+ PyErr_Format(ZlibError, "Error %i while decompressing: %.200s",
+ err, self->zst.msg);
+ Py_DECREF(RetVal);
+ return_error = 1;
+ }
}
- }
- if (!return_error) {
- _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
- }
- else
- RetVal = NULL; /* should be handled by DECREF */
+ if (!return_error) {
+ _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
+ }
+ else
+ RetVal = NULL; /* should be handled by DECREF */
- Py_DECREF(inputString);
+ Py_DECREF(inputString);
- LEAVE_ZLIB
+ LEAVE_ZLIB
- return RetVal;
+ return RetVal;
}
static char comp_flush__doc__[] =
@@ -757,101 +754,103 @@ static char comp_flush__doc__[] =
static PyObject *
PyZlib_flush(compobject *self, PyObject *args)
{
- int err, length=DEFAULTALLOC;
- PyObject *RetVal;
- int flushmode = Z_FINISH;
- unsigned long start_total_out;
- int return_error;
-
- if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
- return NULL;
-
- /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
- doing any work at all; just return an empty string. */
- if (flushmode == Z_NO_FLUSH) {
- return PyString_FromStringAndSize(NULL, 0);
- }
-
- if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to compress data");
- return NULL;
- }
-
- ENTER_ZLIB
-
- start_total_out = self->zst.total_out;
- self->zst.avail_in = 0;
- self->zst.avail_out = length;
- self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
+ int err, length = DEFAULTALLOC;
+ PyObject *RetVal;
+ int flushmode = Z_FINISH;
+ unsigned long start_total_out;
+ int return_error;
- Py_BEGIN_ALLOW_THREADS
- err = deflate(&(self->zst), flushmode);
- Py_END_ALLOW_THREADS
+ if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))
+ return NULL;
- return_error = 0;
+ /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in
+ doing any work at all; just return an empty string. */
+ if (flushmode == Z_NO_FLUSH) {
+ return PyString_FromStringAndSize(NULL, 0);
+ }
- /* while Z_OK and the output buffer is full, there might be more output,
- so extend the output buffer and try again */
- while (err == Z_OK && self->zst.avail_out == 0) {
- if (_PyString_Resize(&RetVal, length << 1) == -1) {
- PyErr_SetString(PyExc_MemoryError,
- "Can't allocate memory to compress data");
- return_error = 1;
- break;
+ if (!(RetVal = PyString_FromStringAndSize(NULL, length))) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to compress data");
+ return NULL;
}
- self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) + length;
+
+ ENTER_ZLIB
+
+ start_total_out = self->zst.total_out;
+ self->zst.avail_in = 0;
self->zst.avail_out = length;
- length = length << 1;
+ self->zst.next_out = (unsigned char *)PyString_AsString(RetVal);
Py_BEGIN_ALLOW_THREADS
err = deflate(&(self->zst), flushmode);
Py_END_ALLOW_THREADS
- }
- /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
- various data structures. Note we should only get Z_STREAM_END when
- flushmode is Z_FINISH, but checking both for safety*/
- if (!return_error) {
- if (err == Z_STREAM_END && flushmode == Z_FINISH) {
- err=deflateEnd(&(self->zst));
- if (err!=Z_OK) {
- if (self->zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i from deflateEnd()",
- err);
- else
- PyErr_Format(ZlibError,"Error %i from deflateEnd(): %.200s",
- err, self->zst.msg);
+ return_error = 0;
- Py_DECREF(RetVal);
- return_error = 1;
- }
- else
- self->is_initialised = 0;
+ /* while Z_OK and the output buffer is full, there might be more output,
+ so extend the output buffer and try again */
+ while (err == Z_OK && self->zst.avail_out == 0) {
+ if (_PyString_Resize(&RetVal, length << 1) == -1) {
+ PyErr_SetString(PyExc_MemoryError,
+ "Can't allocate memory to compress data");
+ return_error = 1;
+ break;
+ }
+ self->zst.next_out = (unsigned char *)PyString_AsString(RetVal) \
+ + length;
+ self->zst.avail_out = length;
+ length = length << 1;
+
+ Py_BEGIN_ALLOW_THREADS
+ err = deflate(&(self->zst), flushmode);
+ Py_END_ALLOW_THREADS
+ }
- /* We will only get Z_BUF_ERROR if the output buffer was full but there
- wasn't more output when we tried again, so it is not an error
- condition */
- } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
- if (self->zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i while flushing",
- err);
- else
- PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
- err, self->zst.msg);
- Py_DECREF(RetVal);
- return_error = 1;
+ /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free
+ various data structures. Note we should only get Z_STREAM_END when
+ flushmode is Z_FINISH, but checking both for safety*/
+ if (!return_error) {
+ if (err == Z_STREAM_END && flushmode == Z_FINISH) {
+ err = deflateEnd(&(self->zst));
+ if (err != Z_OK) {
+ if (self->zst.msg == Z_NULL)
+ PyErr_Format(ZlibError, "Error %i from deflateEnd()",
+ err);
+ else
+ PyErr_Format(ZlibError,
+ "Error %i from deflateEnd(): %.200s",
+ err, self->zst.msg);
+
+ Py_DECREF(RetVal);
+ return_error = 1;
+ } else
+ self->is_initialised = 0;
+
+ /* We will only get Z_BUF_ERROR if the output buffer was full
+ but there wasn't more output when we tried again, so it is
+ not an error condition.
+ */
+ } else if (err!=Z_OK && err!=Z_BUF_ERROR) {
+ if (self->zst.msg == Z_NULL)
+ PyErr_Format(ZlibError, "Error %i while flushing",
+ err);
+ else
+ PyErr_Format(ZlibError, "Error %i while flushing: %.200s",
+ err, self->zst.msg);
+ Py_DECREF(RetVal);
+ return_error = 1;
+ }
}
- }
- if (!return_error)
- _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
- else
- RetVal = NULL; /* should have been handled by DECREF */
+ if (!return_error)
+ _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);
+ else
+ RetVal = NULL; /* should have been handled by DECREF */
- LEAVE_ZLIB
+ LEAVE_ZLIB
- return RetVal;
+ return RetVal;
}
static char decomp_flush__doc__[] =
@@ -866,51 +865,50 @@ PyZlib_unflush(compobject *self, PyObject *args)
inflateEnd, causing any further decompress or flush calls to raise
exceptions. This behaviour has been preserved.*/
{
- int err;
- PyObject * retval;
+ int err;
+ PyObject * retval;
- if (!PyArg_ParseTuple(args, ""))
- return NULL;
-
- ENTER_ZLIB
+ if (!PyArg_ParseTuple(args, ""))
+ return NULL;
- err=inflateEnd(&(self->zst));
- if (err!=Z_OK) {
- if (self->zst.msg == Z_NULL)
- PyErr_Format(ZlibError, "Error %i from inflateEnd()",
- err);
- else
- PyErr_Format(ZlibError, "Error %i from inflateEnd(): %.200s",
- err, self->zst.msg);
+ ENTER_ZLIB
- retval = NULL;
+ err = inflateEnd(&(self->zst));
+ if (err != Z_OK) {
+ if (self->zst.msg == Z_NULL)
+ PyErr_Format(ZlibError, "Error %i from inflateEnd()",
+ err);
+ else
+ PyErr_Format(ZlibError, "Error %i from inflateEnd(): %.200s",
+ err, self->zst.msg);
- } else {
- self->is_initialised = 0;
- retval = PyString_FromStringAndSize(NULL, 0);
- }
+ retval = NULL;
+ } else {
+ self->is_initialised = 0;
+ retval = PyString_FromStringAndSize(NULL, 0);
+ }
- LEAVE_ZLIB
+ LEAVE_ZLIB
- return retval;
+ return retval;
}
static PyMethodDef comp_methods[] =
{
- {"compress", (binaryfunc)PyZlib_objcompress,
- METH_VARARGS, comp_compress__doc__},
- {"flush", (binaryfunc)PyZlib_flush,
- METH_VARARGS, comp_flush__doc__},
- {NULL, NULL}
+ {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,
+ comp_compress__doc__},
+ {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,
+ comp_flush__doc__},
+ {NULL, NULL}
};
static PyMethodDef Decomp_methods[] =
{
- {"decompress", (binaryfunc)PyZlib_objdecompress,
- METH_VARARGS, decomp_decompress__doc__},
- {"flush", (binaryfunc)PyZlib_unflush,
- METH_VARARGS, decomp_flush__doc__},
- {NULL, NULL}
+ {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,
+ decomp_decompress__doc__},
+ {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,
+ decomp_flush__doc__},
+ {NULL, NULL}
};
static PyObject *
@@ -925,26 +923,22 @@ Comp_getattr(compobject *self, char *name)
static PyObject *
Decomp_getattr(compobject *self, char *name)
{
- PyObject * retval;
-
- ENTER_ZLIB
-
- if (strcmp(name, "unused_data") == 0)
- {
- Py_INCREF(self->unused_data);
- retval = self->unused_data;
- }
- else if (strcmp(name, "unconsumed_tail") == 0)
- {
- Py_INCREF(self->unconsumed_tail);
- retval = self->unconsumed_tail;
- }
- else
- retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
-
- LEAVE_ZLIB
-
- return retval;
+ PyObject * retval;
+
+ ENTER_ZLIB
+
+ if (strcmp(name, "unused_data") == 0) {
+ Py_INCREF(self->unused_data);
+ retval = self->unused_data;
+ } else if (strcmp(name, "unconsumed_tail") == 0) {
+ Py_INCREF(self->unconsumed_tail);
+ retval = self->unconsumed_tail;
+ } else
+ retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);
+
+ LEAVE_ZLIB
+
+ return retval;
}
static char adler32__doc__[] =
@@ -957,14 +951,12 @@ static char adler32__doc__[] =
static PyObject *
PyZlib_adler32(PyObject *self, PyObject *args)
{
- uLong adler32val=adler32(0L, Z_NULL, 0);
+ uLong adler32val = adler32(0L, Z_NULL, 0);
Byte *buf;
int len;
if (!PyArg_ParseTuple(args, "s#|l:adler32", &buf, &len, &adler32val))
- {
return NULL;
- }
adler32val = adler32(adler32val, buf, len);
return PyInt_FromLong(adler32val);
}
@@ -979,13 +971,11 @@ static char crc32__doc__[] =
static PyObject *
PyZlib_crc32(PyObject *self, PyObject *args)
{
- uLong crc32val=crc32(0L, Z_NULL, 0);
+ uLong crc32val = crc32(0L, Z_NULL, 0);
Byte *buf;
int len;
if (!PyArg_ParseTuple(args, "s#|l:crc32", &buf, &len, &crc32val))
- {
return NULL;
- }
crc32val = crc32(crc32val, buf, len);
return PyInt_FromLong(crc32val);
}
@@ -993,53 +983,53 @@ PyZlib_crc32(PyObject *self, PyObject *args)
static PyMethodDef zlib_methods[] =
{
- {"adler32", (PyCFunction)PyZlib_adler32,
- METH_VARARGS, adler32__doc__},
- {"compress", (PyCFunction)PyZlib_compress,
- METH_VARARGS, compress__doc__},
- {"compressobj", (PyCFunction)PyZlib_compressobj,
- METH_VARARGS, compressobj__doc__},
- {"crc32", (PyCFunction)PyZlib_crc32,
- METH_VARARGS, crc32__doc__},
- {"decompress", (PyCFunction)PyZlib_decompress,
- METH_VARARGS, decompress__doc__},
- {"decompressobj", (PyCFunction)PyZlib_decompressobj,
- METH_VARARGS, decompressobj__doc__},
- {NULL, NULL}
+ {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
+ adler32__doc__},
+ {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
+ compress__doc__},
+ {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
+ compressobj__doc__},
+ {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
+ crc32__doc__},
+ {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,
+ decompress__doc__},
+ {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
+ decompressobj__doc__},
+ {NULL, NULL}
};
statichere PyTypeObject Comptype = {
- PyObject_HEAD_INIT(0)
- 0,
- "Compress",
- sizeof(compobject),
- 0,
- (destructor)Comp_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- (getattrfunc)Comp_getattr, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
+ PyObject_HEAD_INIT(0)
+ 0,
+ "Compress",
+ sizeof(compobject),
+ 0,
+ (destructor)Comp_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ (getattrfunc)Comp_getattr, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
};
statichere PyTypeObject Decomptype = {
- PyObject_HEAD_INIT(0)
- 0,
- "Decompress",
- sizeof(compobject),
- 0,
- (destructor)Decomp_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- (getattrfunc)Decomp_getattr, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
+ PyObject_HEAD_INIT(0)
+ 0,
+ "Decompress",
+ sizeof(compobject),
+ 0,
+ (destructor)Decomp_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ (getattrfunc)Decomp_getattr, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
};
/* The following insint() routine was blatantly ripped off from
@@ -1080,39 +1070,39 @@ static char zlib_module_documentation[]=
DL_EXPORT(void)
PyInit_zlib(void)
{
- PyObject *m, *d, *ver;
- Comptype.ob_type = &PyType_Type;
- Decomptype.ob_type = &PyType_Type;
- m = Py_InitModule4("zlib", zlib_methods,
- zlib_module_documentation,
- (PyObject*)NULL,PYTHON_API_VERSION);
- d = PyModule_GetDict(m);
- ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
- if (ZlibError != NULL)
- PyDict_SetItemString(d, "error", ZlibError);
-
- insint(d, "MAX_WBITS", MAX_WBITS);
- insint(d, "DEFLATED", DEFLATED);
- insint(d, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
- insint(d, "Z_BEST_SPEED", Z_BEST_SPEED);
- insint(d, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
- insint(d, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
- insint(d, "Z_FILTERED", Z_FILTERED);
- insint(d, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
- insint(d, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
-
- insint(d, "Z_FINISH", Z_FINISH);
- insint(d, "Z_NO_FLUSH", Z_NO_FLUSH);
- insint(d, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
- insint(d, "Z_FULL_FLUSH", Z_FULL_FLUSH);
-
- ver = PyString_FromString(ZLIB_VERSION);
- if (ver != NULL) {
- PyDict_SetItemString(d, "ZLIB_VERSION", ver);
- Py_DECREF(ver);
- }
+ PyObject *m, *d, *ver;
+ Comptype.ob_type = &PyType_Type;
+ Decomptype.ob_type = &PyType_Type;
+ m = Py_InitModule4("zlib", zlib_methods,
+ zlib_module_documentation,
+ (PyObject*)NULL,PYTHON_API_VERSION);
+ d = PyModule_GetDict(m);
+ ZlibError = PyErr_NewException("zlib.error", NULL, NULL);
+ if (ZlibError != NULL)
+ PyDict_SetItemString(d, "error", ZlibError);
+
+ PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);
+ PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);
+ PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);
+ PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);
+ PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);
+ PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);
+ PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);
+ PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);
+ PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);
+
+ PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);
+ PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);
+ PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);
+ PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);
+
+ ver = PyString_FromString(ZLIB_VERSION);
+ if (ver != NULL) {
+ PyDict_SetItemString(d, "ZLIB_VERSION", ver);
+ Py_DECREF(ver);
+ }
#ifdef WITH_THREAD
- zlib_lock = PyThread_allocate_lock();
+ zlib_lock = PyThread_allocate_lock();
#endif // WITH_THREAD
}