contrib/python-zstandard/c-ext/frameparams.c
changeset 37495 b1fb341d8a61
parent 31796 e0dc40530c5a
child 46374 e92ca942ddca
--- 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(&params, (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,