contrib/python-zstandard/c-ext/frameparams.c
changeset 30895 c32454d69b85
child 31796 e0dc40530c5a
equal deleted inserted replaced
30894:5b60464efbde 30895:c32454d69b85
       
     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(&params, (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 }