frameparams.c
138 lines
| 4.2 KiB
| text/x-c
|
CLexer
Gregory Szorc
|
r30895 | /** | ||
* Copyright (c) 2017-present, Gregory Szorc | ||||
* All rights reserved. | ||||
* | ||||
* This software may be modified and distributed under the terms | ||||
* of the BSD license. See the LICENSE file for details. | ||||
*/ | ||||
#include "python-zstandard.h" | ||||
extern PyObject* ZstdError; | ||||
PyDoc_STRVAR(FrameParameters__doc__, | ||||
"FrameParameters: information about a zstd frame"); | ||||
Gregory Szorc
|
r37513 | FrameParametersObject* get_frame_parameters(PyObject* self, PyObject* args, PyObject* kwargs) { | ||
static char* kwlist[] = { | ||||
"data", | ||||
NULL | ||||
}; | ||||
Py_buffer source; | ||||
ZSTD_frameHeader header; | ||||
Gregory Szorc
|
r30895 | FrameParametersObject* result = NULL; | ||
size_t zresult; | ||||
#if PY_MAJOR_VERSION >= 3 | ||||
Gregory Szorc
|
r37513 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*:get_frame_parameters", | ||
Gregory Szorc
|
r30895 | #else | ||
Gregory Szorc
|
r37513 | if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*:get_frame_parameters", | ||
Gregory Szorc
|
r30895 | #endif | ||
Gregory Szorc
|
r37513 | kwlist, &source)) { | ||
Gregory Szorc
|
r30895 | return NULL; | ||
} | ||||
Gregory Szorc
|
r37513 | 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; | ||||
Gregory Szorc
|
r30895 | } | ||
Gregory Szorc
|
r37513 | zresult = ZSTD_getFrameHeader(&header, source.buf, source.len); | ||
Gregory Szorc
|
r30895 | |||
if (ZSTD_isError(zresult)) { | ||||
PyErr_Format(ZstdError, "cannot get frame parameters: %s", ZSTD_getErrorName(zresult)); | ||||
Gregory Szorc
|
r37513 | goto finally; | ||
Gregory Szorc
|
r30895 | } | ||
if (zresult) { | ||||
PyErr_Format(ZstdError, "not enough data for frame parameters; need %zu bytes", zresult); | ||||
Gregory Szorc
|
r37513 | goto finally; | ||
Gregory Szorc
|
r30895 | } | ||
result = PyObject_New(FrameParametersObject, &FrameParametersType); | ||||
if (!result) { | ||||
Gregory Szorc
|
r37513 | goto finally; | ||
Gregory Szorc
|
r30895 | } | ||
Gregory Szorc
|
r37513 | result->frameContentSize = header.frameContentSize; | ||
result->windowSize = header.windowSize; | ||||
result->dictID = header.dictID; | ||||
result->checksumFlag = header.checksumFlag ? 1 : 0; | ||||
Gregory Szorc
|
r30895 | |||
Gregory Szorc
|
r37513 | finally: | ||
PyBuffer_Release(&source); | ||||
Gregory Szorc
|
r30895 | return result; | ||
} | ||||
static void FrameParameters_dealloc(PyObject* self) { | ||||
PyObject_Del(self); | ||||
} | ||||
static PyMemberDef FrameParameters_members[] = { | ||||
{ "content_size", T_ULONGLONG, | ||||
offsetof(FrameParametersObject, frameContentSize), READONLY, | ||||
"frame content size" }, | ||||
Gregory Szorc
|
r37513 | { "window_size", T_ULONGLONG, | ||
Gregory Szorc
|
r30895 | offsetof(FrameParametersObject, windowSize), READONLY, | ||
"window size" }, | ||||
{ "dict_id", T_UINT, | ||||
offsetof(FrameParametersObject, dictID), READONLY, | ||||
"dictionary ID" }, | ||||
{ "has_checksum", T_BOOL, | ||||
offsetof(FrameParametersObject, checksumFlag), READONLY, | ||||
"checksum flag" }, | ||||
{ NULL } | ||||
}; | ||||
PyTypeObject FrameParametersType = { | ||||
PyVarObject_HEAD_INIT(NULL, 0) | ||||
"FrameParameters", /* tp_name */ | ||||
sizeof(FrameParametersObject), /* tp_basicsize */ | ||||
0, /* tp_itemsize */ | ||||
(destructor)FrameParameters_dealloc, /* tp_dealloc */ | ||||
0, /* tp_print */ | ||||
0, /* tp_getattr */ | ||||
0, /* tp_setattr */ | ||||
0, /* tp_compare */ | ||||
0, /* tp_repr */ | ||||
0, /* tp_as_number */ | ||||
0, /* tp_as_sequence */ | ||||
0, /* tp_as_mapping */ | ||||
0, /* tp_hash */ | ||||
0, /* tp_call */ | ||||
0, /* tp_str */ | ||||
0, /* tp_getattro */ | ||||
0, /* tp_setattro */ | ||||
0, /* tp_as_buffer */ | ||||
Py_TPFLAGS_DEFAULT, /* tp_flags */ | ||||
FrameParameters__doc__, /* tp_doc */ | ||||
0, /* tp_traverse */ | ||||
0, /* tp_clear */ | ||||
0, /* tp_richcompare */ | ||||
0, /* tp_weaklistoffset */ | ||||
0, /* tp_iter */ | ||||
0, /* tp_iternext */ | ||||
0, /* tp_methods */ | ||||
FrameParameters_members, /* tp_members */ | ||||
0, /* tp_getset */ | ||||
0, /* tp_base */ | ||||
0, /* tp_dict */ | ||||
0, /* tp_descr_get */ | ||||
0, /* tp_descr_set */ | ||||
0, /* tp_dictoffset */ | ||||
0, /* tp_init */ | ||||
0, /* tp_alloc */ | ||||
0, /* tp_new */ | ||||
}; | ||||
void frameparams_module_init(PyObject* mod) { | ||||
Py_TYPE(&FrameParametersType) = &PyType_Type; | ||||
if (PyType_Ready(&FrameParametersType) < 0) { | ||||
return; | ||||
} | ||||
Gregory Szorc
|
r31796 | Py_INCREF(&FrameParametersType); | ||
Gregory Szorc
|
r30895 | PyModule_AddObject(mod, "FrameParameters", (PyObject*)&FrameParametersType); | ||
} | ||||