Mercurial > hg
comparison contrib/python-zstandard/c-ext/frameparams.c @ 37495:b1fb341d8a61
zstandard: vendor python-zstandard 0.9.0
This was just released. It features a number of goodies. More info at
https://gregoryszorc.com/blog/2018/04/09/release-of-python-zstandard-0.9/.
The clang-format ignore list was updated to reflect the new source
of files.
The project contains a vendored copy of zstandard 1.3.4. The old
version was 1.1.3. One of the changes between those versions is that
zstandard is now dual licensed BSD + GPLv2 and the patent rights grant
has been removed. Good riddance.
The API should be backwards compatible. So no changes in core
should be needed. However, there were a number of changes in the
library that we'll want to adapt to. Those will be addressed in
subsequent commits.
Differential Revision: https://phab.mercurial-scm.org/D3198
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 09 Apr 2018 10:13:29 -0700 |
parents | e0dc40530c5a |
children | e92ca942ddca |
comparison
equal
deleted
inserted
replaced
37494:1ce7a55b09d1 | 37495:b1fb341d8a61 |
---|---|
11 extern PyObject* ZstdError; | 11 extern PyObject* ZstdError; |
12 | 12 |
13 PyDoc_STRVAR(FrameParameters__doc__, | 13 PyDoc_STRVAR(FrameParameters__doc__, |
14 "FrameParameters: information about a zstd frame"); | 14 "FrameParameters: information about a zstd frame"); |
15 | 15 |
16 FrameParametersObject* get_frame_parameters(PyObject* self, PyObject* args) { | 16 FrameParametersObject* get_frame_parameters(PyObject* self, PyObject* args, PyObject* kwargs) { |
17 const char* source; | 17 static char* kwlist[] = { |
18 Py_ssize_t sourceSize; | 18 "data", |
19 ZSTD_frameParams params; | 19 NULL |
20 }; | |
21 | |
22 Py_buffer source; | |
23 ZSTD_frameHeader header; | |
20 FrameParametersObject* result = NULL; | 24 FrameParametersObject* result = NULL; |
21 size_t zresult; | 25 size_t zresult; |
22 | 26 |
23 #if PY_MAJOR_VERSION >= 3 | 27 #if PY_MAJOR_VERSION >= 3 |
24 if (!PyArg_ParseTuple(args, "y#:get_frame_parameters", | 28 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*:get_frame_parameters", |
25 #else | 29 #else |
26 if (!PyArg_ParseTuple(args, "s#:get_frame_parameters", | 30 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*:get_frame_parameters", |
27 #endif | 31 #endif |
28 &source, &sourceSize)) { | 32 kwlist, &source)) { |
29 return NULL; | 33 return NULL; |
30 } | 34 } |
31 | 35 |
32 /* Needed for Python 2 to reject unicode */ | 36 if (!PyBuffer_IsContiguous(&source, 'C') || source.ndim > 1) { |
33 if (!PyBytes_Check(PyTuple_GET_ITEM(args, 0))) { | 37 PyErr_SetString(PyExc_ValueError, |
34 PyErr_SetString(PyExc_TypeError, "argument must be bytes"); | 38 "data buffer should be contiguous and have at most one dimension"); |
35 return NULL; | 39 goto finally; |
36 } | 40 } |
37 | 41 |
38 zresult = ZSTD_getFrameParams(¶ms, (void*)source, sourceSize); | 42 zresult = ZSTD_getFrameHeader(&header, source.buf, source.len); |
39 | 43 |
40 if (ZSTD_isError(zresult)) { | 44 if (ZSTD_isError(zresult)) { |
41 PyErr_Format(ZstdError, "cannot get frame parameters: %s", ZSTD_getErrorName(zresult)); | 45 PyErr_Format(ZstdError, "cannot get frame parameters: %s", ZSTD_getErrorName(zresult)); |
42 return NULL; | 46 goto finally; |
43 } | 47 } |
44 | 48 |
45 if (zresult) { | 49 if (zresult) { |
46 PyErr_Format(ZstdError, "not enough data for frame parameters; need %zu bytes", zresult); | 50 PyErr_Format(ZstdError, "not enough data for frame parameters; need %zu bytes", zresult); |
47 return NULL; | 51 goto finally; |
48 } | 52 } |
49 | 53 |
50 result = PyObject_New(FrameParametersObject, &FrameParametersType); | 54 result = PyObject_New(FrameParametersObject, &FrameParametersType); |
51 if (!result) { | 55 if (!result) { |
52 return NULL; | 56 goto finally; |
53 } | 57 } |
54 | 58 |
55 result->frameContentSize = params.frameContentSize; | 59 result->frameContentSize = header.frameContentSize; |
56 result->windowSize = params.windowSize; | 60 result->windowSize = header.windowSize; |
57 result->dictID = params.dictID; | 61 result->dictID = header.dictID; |
58 result->checksumFlag = params.checksumFlag ? 1 : 0; | 62 result->checksumFlag = header.checksumFlag ? 1 : 0; |
59 | 63 |
64 finally: | |
65 PyBuffer_Release(&source); | |
60 return result; | 66 return result; |
61 } | 67 } |
62 | 68 |
63 static void FrameParameters_dealloc(PyObject* self) { | 69 static void FrameParameters_dealloc(PyObject* self) { |
64 PyObject_Del(self); | 70 PyObject_Del(self); |
66 | 72 |
67 static PyMemberDef FrameParameters_members[] = { | 73 static PyMemberDef FrameParameters_members[] = { |
68 { "content_size", T_ULONGLONG, | 74 { "content_size", T_ULONGLONG, |
69 offsetof(FrameParametersObject, frameContentSize), READONLY, | 75 offsetof(FrameParametersObject, frameContentSize), READONLY, |
70 "frame content size" }, | 76 "frame content size" }, |
71 { "window_size", T_UINT, | 77 { "window_size", T_ULONGLONG, |
72 offsetof(FrameParametersObject, windowSize), READONLY, | 78 offsetof(FrameParametersObject, windowSize), READONLY, |
73 "window size" }, | 79 "window size" }, |
74 { "dict_id", T_UINT, | 80 { "dict_id", T_UINT, |
75 offsetof(FrameParametersObject, dictID), READONLY, | 81 offsetof(FrameParametersObject, dictID), READONLY, |
76 "dictionary ID" }, | 82 "dictionary ID" }, |