12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /**
- * 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;
- 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 (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*:get_frame_parameters",
- kwlist, &source)) {
- return NULL;
- }
- zresult = ZSTD_getFrameHeader(&header, source.buf, source.len);
- if (ZSTD_isError(zresult)) {
- PyErr_Format(ZstdError, "cannot get frame parameters: %s",
- ZSTD_getErrorName(zresult));
- goto finally;
- }
- if (zresult) {
- PyErr_Format(ZstdError,
- "not enough data for frame parameters; need %zu bytes",
- zresult);
- goto finally;
- }
- result = PyObject_New(FrameParametersObject, FrameParametersType);
- if (!result) {
- goto finally;
- }
- result->frameContentSize = header.frameContentSize;
- result->windowSize = header.windowSize;
- result->dictID = header.dictID;
- result->checksumFlag = header.checksumFlag ? 1 : 0;
- finally:
- PyBuffer_Release(&source);
- 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"},
- {"window_size", T_ULONGLONG, 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}};
- PyType_Slot FrameParametersSlots[] = {
- {Py_tp_dealloc, FrameParameters_dealloc},
- {Py_tp_members, FrameParameters_members},
- {0, NULL},
- };
- PyType_Spec FrameParametersSpec = {
- "zstd.FrameParameters",
- sizeof(FrameParametersObject),
- 0,
- Py_TPFLAGS_DEFAULT,
- FrameParametersSlots,
- };
- PyTypeObject *FrameParametersType;
- void frameparams_module_init(PyObject *mod) {
- FrameParametersType = (PyTypeObject *)PyType_FromSpec(&FrameParametersSpec);
- if (PyType_Ready(FrameParametersType) < 0) {
- return;
- }
- Py_INCREF(FrameParametersType);
- PyModule_AddObject(mod, "FrameParameters", (PyObject *)FrameParametersType);
- }
|