|
1 /** |
|
2 * Copyright (c) 2017-present, Gregory Szorc |
|
3 * All rights reserved. |
|
4 * |
|
5 * This software may be modified and distributed under the terms |
|
6 * of the BSD license. See the LICENSE file for details. |
|
7 */ |
|
8 |
|
9 #include "python-zstandard.h" |
|
10 |
|
11 extern PyObject* ZstdError; |
|
12 |
|
13 PyDoc_STRVAR(FrameParameters__doc__, |
|
14 "FrameParameters: information about a zstd frame"); |
|
15 |
|
16 FrameParametersObject* get_frame_parameters(PyObject* self, PyObject* args) { |
|
17 const char* source; |
|
18 Py_ssize_t sourceSize; |
|
19 ZSTD_frameParams params; |
|
20 FrameParametersObject* result = NULL; |
|
21 size_t zresult; |
|
22 |
|
23 #if PY_MAJOR_VERSION >= 3 |
|
24 if (!PyArg_ParseTuple(args, "y#:get_frame_parameters", |
|
25 #else |
|
26 if (!PyArg_ParseTuple(args, "s#:get_frame_parameters", |
|
27 #endif |
|
28 &source, &sourceSize)) { |
|
29 return NULL; |
|
30 } |
|
31 |
|
32 /* Needed for Python 2 to reject unicode */ |
|
33 if (!PyBytes_Check(PyTuple_GET_ITEM(args, 0))) { |
|
34 PyErr_SetString(PyExc_TypeError, "argument must be bytes"); |
|
35 return NULL; |
|
36 } |
|
37 |
|
38 zresult = ZSTD_getFrameParams(¶ms, (void*)source, sourceSize); |
|
39 |
|
40 if (ZSTD_isError(zresult)) { |
|
41 PyErr_Format(ZstdError, "cannot get frame parameters: %s", ZSTD_getErrorName(zresult)); |
|
42 return NULL; |
|
43 } |
|
44 |
|
45 if (zresult) { |
|
46 PyErr_Format(ZstdError, "not enough data for frame parameters; need %zu bytes", zresult); |
|
47 return NULL; |
|
48 } |
|
49 |
|
50 result = PyObject_New(FrameParametersObject, &FrameParametersType); |
|
51 if (!result) { |
|
52 return NULL; |
|
53 } |
|
54 |
|
55 result->frameContentSize = params.frameContentSize; |
|
56 result->windowSize = params.windowSize; |
|
57 result->dictID = params.dictID; |
|
58 result->checksumFlag = params.checksumFlag ? 1 : 0; |
|
59 |
|
60 return result; |
|
61 } |
|
62 |
|
63 static void FrameParameters_dealloc(PyObject* self) { |
|
64 PyObject_Del(self); |
|
65 } |
|
66 |
|
67 static PyMemberDef FrameParameters_members[] = { |
|
68 { "content_size", T_ULONGLONG, |
|
69 offsetof(FrameParametersObject, frameContentSize), READONLY, |
|
70 "frame content size" }, |
|
71 { "window_size", T_UINT, |
|
72 offsetof(FrameParametersObject, windowSize), READONLY, |
|
73 "window size" }, |
|
74 { "dict_id", T_UINT, |
|
75 offsetof(FrameParametersObject, dictID), READONLY, |
|
76 "dictionary ID" }, |
|
77 { "has_checksum", T_BOOL, |
|
78 offsetof(FrameParametersObject, checksumFlag), READONLY, |
|
79 "checksum flag" }, |
|
80 { NULL } |
|
81 }; |
|
82 |
|
83 PyTypeObject FrameParametersType = { |
|
84 PyVarObject_HEAD_INIT(NULL, 0) |
|
85 "FrameParameters", /* tp_name */ |
|
86 sizeof(FrameParametersObject), /* tp_basicsize */ |
|
87 0, /* tp_itemsize */ |
|
88 (destructor)FrameParameters_dealloc, /* tp_dealloc */ |
|
89 0, /* tp_print */ |
|
90 0, /* tp_getattr */ |
|
91 0, /* tp_setattr */ |
|
92 0, /* tp_compare */ |
|
93 0, /* tp_repr */ |
|
94 0, /* tp_as_number */ |
|
95 0, /* tp_as_sequence */ |
|
96 0, /* tp_as_mapping */ |
|
97 0, /* tp_hash */ |
|
98 0, /* tp_call */ |
|
99 0, /* tp_str */ |
|
100 0, /* tp_getattro */ |
|
101 0, /* tp_setattro */ |
|
102 0, /* tp_as_buffer */ |
|
103 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
104 FrameParameters__doc__, /* tp_doc */ |
|
105 0, /* tp_traverse */ |
|
106 0, /* tp_clear */ |
|
107 0, /* tp_richcompare */ |
|
108 0, /* tp_weaklistoffset */ |
|
109 0, /* tp_iter */ |
|
110 0, /* tp_iternext */ |
|
111 0, /* tp_methods */ |
|
112 FrameParameters_members, /* tp_members */ |
|
113 0, /* tp_getset */ |
|
114 0, /* tp_base */ |
|
115 0, /* tp_dict */ |
|
116 0, /* tp_descr_get */ |
|
117 0, /* tp_descr_set */ |
|
118 0, /* tp_dictoffset */ |
|
119 0, /* tp_init */ |
|
120 0, /* tp_alloc */ |
|
121 0, /* tp_new */ |
|
122 }; |
|
123 |
|
124 void frameparams_module_init(PyObject* mod) { |
|
125 Py_TYPE(&FrameParametersType) = &PyType_Type; |
|
126 if (PyType_Ready(&FrameParametersType) < 0) { |
|
127 return; |
|
128 } |
|
129 |
|
130 Py_IncRef((PyObject*)&FrameParametersType); |
|
131 PyModule_AddObject(mod, "FrameParameters", (PyObject*)&FrameParametersType); |
|
132 } |