Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(43)

Side by Side Diff: Modules/zlibmodule.c

Issue 63060: [issue5804] Add an 'offset' argument to zlib.decompress Base URL: http://svn.python.org/view/*checkout*/python/trunk/
Patch Set: Created 3 years ago , Downloaded from: http://bugs.python.org/file13751/zlibpatch2.patch
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
« Lib/test/test_zlib.py ('K') | « Lib/test/test_zlib.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* zlibmodule.c -- gzip-compatible data compression */ 1 /* zlibmodule.c -- gzip-compatible data compression */
2 /* See http://www.gzip.org/zlib/ */ 2 /* See http://www.gzip.org/zlib/ */
3 3
4 /* Windows users: read Python's PCbuild\readme.txt */ 4 /* Windows users: read Python's PCbuild\readme.txt */
5 5
6 6
7 #include "Python.h" 7 #include "Python.h"
8 #include "zlib.h" 8 #include "zlib.h"
9 9
10 #ifdef WITH_THREAD 10 #ifdef WITH_THREAD
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 else 179 else
180 zlib_error(zst, err, "while finishing compression"); 180 zlib_error(zst, err, "while finishing compression");
181 181
182 error: 182 error:
183 free(output); 183 free(output);
184 184
185 return ReturnVal; 185 return ReturnVal;
186 } 186 }
187 187
188 PyDoc_STRVAR(decompress__doc__, 188 PyDoc_STRVAR(decompress__doc__,
189 "decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n" 189 "decompress(string[, wbits[, bufsize[, offset]]]) -- Return decompressed string. \n"
190 "\n" 190 "\n"
191 "Optional arg wbits is the window buffer size. Optional arg bufsize is\n" 191 "Optional arg wbits is the window buffer size. Optional arg bufsize is\n"
192 "the initial output buffer size."); 192 "the initial output buffer size. Optional arg offset specifies\n"
193 "the start position in the string to start decompresion and, if spceified,\n"
gregory.p.smith 2009/05/10 21:05:27 typo: specified.
194 "causes the return value to be a tuple, with the second element being\n"
195 "the position in the string just afer the last piece of compressed data.");
193 196
194 static PyObject * 197 static PyObject *
195 PyZlib_decompress(PyObject *self, PyObject *args) 198 PyZlib_decompress(PyObject *self, PyObject *args, PyObject *kw)
196 { 199 {
197 PyObject *result_str; 200 PyObject *result_str;
198 Byte *input; 201 Byte *input;
199 int length, err; 202 int length, err;
200 int wsize=DEF_WBITS; 203 int wsize=DEF_WBITS;
201 Py_ssize_t r_strlen=DEFAULTALLOC; 204 Py_ssize_t r_strlen=DEFAULTALLOC;
205 Py_ssize_t offset = -1;
202 z_stream zst; 206 z_stream zst;
207 char *keywords[] = {"string", "wbits", "bufsize", "offset", 0};
203 208
204 if (!PyArg_ParseTuple(args, "s#|in:decompress", 209 if (!PyArg_ParseTupleAndKeywords(args, kw, "s#|inn:decompress", keywords,
205 » » » &input, &length, &wsize, &r_strlen)) 210 » » » &input, &length, &wsize, &r_strlen, &offset))
206 return NULL; 211 return NULL;
207
208 if (r_strlen <= 0) 212 if (r_strlen <= 0)
209 r_strlen = 1; 213 r_strlen = 1;
214
215 /* if specified, don't start at the beginning of the input string */
216 if (offset > 0) {
217 if (offset > length)
218 offset = length;
219 length -= offset;
220 input += offset;
221 }
210 222
211 zst.avail_in = length; 223 zst.avail_in = length;
212 zst.avail_out = r_strlen; 224 zst.avail_out = r_strlen;
213 225
214 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen))) 226 if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))
215 return NULL; 227 return NULL;
216 228
217 zst.zalloc = (alloc_func)NULL; 229 zst.zalloc = (alloc_func)NULL;
218 zst.zfree = (free_func)Z_NULL; 230 zst.zfree = (free_func)Z_NULL;
219 zst.next_out = (Byte *)PyString_AS_STRING(result_str); 231 zst.next_out = (Byte *)PyString_AS_STRING(result_str);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 } 284 }
273 } while (err != Z_STREAM_END); 285 } while (err != Z_STREAM_END);
274 286
275 err = inflateEnd(&zst); 287 err = inflateEnd(&zst);
276 if (err != Z_OK) { 288 if (err != Z_OK) {
277 zlib_error(zst, err, "while finishing data decompression"); 289 zlib_error(zst, err, "while finishing data decompression");
278 goto error; 290 goto error;
279 } 291 }
280 292
281 _PyString_Resize(&result_str, zst.total_out); 293 _PyString_Resize(&result_str, zst.total_out);
294 if (result_str != NULL && offset >= 0) {
295 /* compute new offset to current pos */
296 offset = length-zst.avail_in+offset;
gregory.p.smith 2009/05/10 21:05:27 leave spaces around your - and + operators and thi
297 return Py_BuildValue("Nn", result_str, offset);
298 }
282 return result_str; 299 return result_str;
283 300
284 error: 301 error:
285 Py_XDECREF(result_str); 302 Py_XDECREF(result_str);
286 return NULL; 303 return NULL;
287 } 304 }
288 305
289 static PyObject * 306 static PyObject *
290 PyZlib_compressobj(PyObject *selfptr, PyObject *args) 307 PyZlib_compressobj(PyObject *selfptr, PyObject *args)
291 { 308 {
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 static PyMethodDef zlib_methods[] = 951 static PyMethodDef zlib_methods[] =
935 { 952 {
936 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS, 953 {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,
937 adler32__doc__}, 954 adler32__doc__},
938 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS, 955 {"compress", (PyCFunction)PyZlib_compress, METH_VARARGS,
939 compress__doc__}, 956 compress__doc__},
940 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS, 957 {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,
941 compressobj__doc__}, 958 compressobj__doc__},
942 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS, 959 {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,
943 crc32__doc__}, 960 crc32__doc__},
944 {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS, 961 {"decompress", (PyCFunction)PyZlib_decompress, METH_KEYWORDS,
945 decompress__doc__}, 962 decompress__doc__},
946 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS, 963 {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,
947 decompressobj__doc__}, 964 decompressobj__doc__},
948 {NULL, NULL} 965 {NULL, NULL}
949 }; 966 };
950 967
951 static PyTypeObject Comptype = { 968 static PyTypeObject Comptype = {
952 PyVarObject_HEAD_INIT(0, 0) 969 PyVarObject_HEAD_INIT(0, 0)
953 "zlib.Compress", 970 "zlib.Compress",
954 sizeof(compobject), 971 sizeof(compobject),
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 ver = PyString_FromString(ZLIB_VERSION); 1047 ver = PyString_FromString(ZLIB_VERSION);
1031 if (ver != NULL) 1048 if (ver != NULL)
1032 PyModule_AddObject(m, "ZLIB_VERSION", ver); 1049 PyModule_AddObject(m, "ZLIB_VERSION", ver);
1033 1050
1034 PyModule_AddStringConstant(m, "__version__", "1.0"); 1051 PyModule_AddStringConstant(m, "__version__", "1.0");
1035 1052
1036 #ifdef WITH_THREAD 1053 #ifdef WITH_THREAD
1037 zlib_lock = PyThread_allocate_lock(); 1054 zlib_lock = PyThread_allocate_lock();
1038 #endif /* WITH_THREAD */ 1055 #endif /* WITH_THREAD */
1039 } 1056 }
OLDNEW
« Lib/test/test_zlib.py ('K') | « Lib/test/test_zlib.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld 855:fffdfa546f68