diff options
author | Andrew M. Kuchling <amk@amk.ca> | 1999-03-25 21:21:08 (GMT) |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 1999-03-25 21:21:08 (GMT) |
commit | b95227db4f028d2eae32898be368e7e301d0d759 (patch) | |
tree | c0ca7468f40127a666ec1a1704ff810e20126f45 /Modules/zlibmodule.c | |
parent | 1195023b8987a44be54399a075bbfe26c693786c (diff) | |
download | cpython-b95227db4f028d2eae32898be368e7e301d0d759.zip cpython-b95227db4f028d2eae32898be368e7e301d0d759.tar.gz cpython-b95227db4f028d2eae32898be368e7e301d0d759.tar.bz2 |
Add an .unused_data attribute to decompressor objects. If .unused_data
is not an empty string, this means that you have arrived at the
end of the stream of compressed data, and the contents of .unused_data are
whatever follows the compressed stream.
Diffstat (limited to 'Modules/zlibmodule.c')
-rw-r--r-- | Modules/zlibmodule.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c index 486c0ed..f664e98 100644 --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -30,6 +30,7 @@ typedef struct { PyObject_HEAD z_stream zst; + PyObject *unused_data; int is_initialised; } compobject; @@ -52,6 +53,7 @@ newcompobject(type) if (self == NULL) return NULL; self->is_initialised = 0; + self->unused_data = PyString_FromString(""); return self; } @@ -369,6 +371,7 @@ Comp_dealloc(self) { if (self->is_initialised) deflateEnd(&self->zst); + Py_XDECREF(self->unused_data); PyMem_DEL(self); } @@ -377,6 +380,7 @@ Decomp_dealloc(self) compobject *self; { inflateEnd(&self->zst); + Py_XDECREF(self->unused_data); PyMem_DEL(self); } @@ -495,6 +499,19 @@ PyZlib_objdecompress(self, args) Py_DECREF(RetVal); return NULL; } + + if (err == Z_STREAM_END) + { + /* 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. */ + int pos = self->zst.next_in - input; /* Position in the string */ + Py_XDECREF(self->unused_data); /* Free the original, empty string */ + + self->unused_data = PyString_FromStringAndSize(input+pos, inplen-pos); + if (self->unused_data == NULL) return NULL; + } + _PyString_Resize(&RetVal, self->zst.total_out - start_total_out); return RetVal; } @@ -700,6 +717,11 @@ Decomp_getattr(self, name) compobject *self; char *name; { + if (strcmp(name, "unused_data") == 0) + { + Py_INCREF(self->unused_data); + return self->unused_data; + } return Py_FindMethod(Decomp_methods, (PyObject *)self, name); } |