--- a/contrib/python-zstandard/c-ext/frameparams.c Sun Apr 08 01:08:43 2018 +0200
+++ b/contrib/python-zstandard/c-ext/frameparams.c Mon Apr 09 10:13:29 2018 -0700
@@ -13,50 +13,56 @@
PyDoc_STRVAR(FrameParameters__doc__,
"FrameParameters: information about a zstd frame");
-FrameParametersObject* get_frame_parameters(PyObject* self, PyObject* args) {
- const char* source;
- Py_ssize_t sourceSize;
- ZSTD_frameParams params;
+FrameParametersObject* get_frame_parameters(PyObject* self, PyObject* args, PyObject* kwargs) {
+ static char* kwlist[] = {
+ "data",
+ NULL
+ };
+
+ Py_buffer source;
+ ZSTD_frameHeader header;
FrameParametersObject* result = NULL;
size_t zresult;
#if PY_MAJOR_VERSION >= 3
- if (!PyArg_ParseTuple(args, "y#:get_frame_parameters",
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*:get_frame_parameters",
#else
- if (!PyArg_ParseTuple(args, "s#:get_frame_parameters",
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*:get_frame_parameters",
#endif
- &source, &sourceSize)) {
+ kwlist, &source)) {
return NULL;
}
- /* Needed for Python 2 to reject unicode */
- if (!PyBytes_Check(PyTuple_GET_ITEM(args, 0))) {
- PyErr_SetString(PyExc_TypeError, "argument must be bytes");
- return NULL;
+ if (!PyBuffer_IsContiguous(&source, 'C') || source.ndim > 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "data buffer should be contiguous and have at most one dimension");
+ goto finally;
}
- zresult = ZSTD_getFrameParams(¶ms, (void*)source, sourceSize);
+ zresult = ZSTD_getFrameHeader(&header, source.buf, source.len);
if (ZSTD_isError(zresult)) {
PyErr_Format(ZstdError, "cannot get frame parameters: %s", ZSTD_getErrorName(zresult));
- return NULL;
+ goto finally;
}
if (zresult) {
PyErr_Format(ZstdError, "not enough data for frame parameters; need %zu bytes", zresult);
- return NULL;
+ goto finally;
}
result = PyObject_New(FrameParametersObject, &FrameParametersType);
if (!result) {
- return NULL;
+ goto finally;
}
- result->frameContentSize = params.frameContentSize;
- result->windowSize = params.windowSize;
- result->dictID = params.dictID;
- result->checksumFlag = params.checksumFlag ? 1 : 0;
+ result->frameContentSize = header.frameContentSize;
+ result->windowSize = header.windowSize;
+ result->dictID = header.dictID;
+ result->checksumFlag = header.checksumFlag ? 1 : 0;
+finally:
+ PyBuffer_Release(&source);
return result;
}
@@ -68,7 +74,7 @@
{ "content_size", T_ULONGLONG,
offsetof(FrameParametersObject, frameContentSize), READONLY,
"frame content size" },
- { "window_size", T_UINT,
+ { "window_size", T_ULONGLONG,
offsetof(FrameParametersObject, windowSize), READONLY,
"window size" },
{ "dict_id", T_UINT,