##// END OF EJS Templates
copies-rust: use the entry API to overwrite deleted entry...
copies-rust: use the entry API to overwrite deleted entry This is more efficient, more idiomatic and more compact. The main motivation for this change is to cleanup that area before start to do "overwrite" tracking. Such tracking will ultimately help to avoid costly is_ancestors call when merging changeset. Differential Revision: https://phab.mercurial-scm.org/D9494

File last commit:

r37513:b1fb341d default
r46767:e166e8a0 default
Show More
frameparams.c
138 lines | 4.2 KiB | text/x-c | CLexer
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
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
zstandard: vendor python-zstandard 0.9.0...
r37513 FrameParametersObject* get_frame_parameters(PyObject* self, PyObject* args, PyObject* kwargs) {
static char* kwlist[] = {
"data",
NULL
};
Py_buffer source;
ZSTD_frameHeader header;
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 FrameParametersObject* result = NULL;
size_t zresult;
#if PY_MAJOR_VERSION >= 3
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*:get_frame_parameters",
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 #else
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*:get_frame_parameters",
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 #endif
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 kwlist, &source)) {
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 return NULL;
}
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
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
zstd: vendor python-zstandard 0.7.0...
r30895 }
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 zresult = ZSTD_getFrameHeader(&header, source.buf, source.len);
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895
if (ZSTD_isError(zresult)) {
PyErr_Format(ZstdError, "cannot get frame parameters: %s", ZSTD_getErrorName(zresult));
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 goto finally;
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 }
if (zresult) {
PyErr_Format(ZstdError, "not enough data for frame parameters; need %zu bytes", zresult);
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 goto finally;
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 }
result = PyObject_New(FrameParametersObject, &FrameParametersType);
if (!result) {
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 goto finally;
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 }
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 result->frameContentSize = header.frameContentSize;
result->windowSize = header.windowSize;
result->dictID = header.dictID;
result->checksumFlag = header.checksumFlag ? 1 : 0;
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 finally:
PyBuffer_Release(&source);
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
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
zstandard: vendor python-zstandard 0.9.0...
r37513 { "window_size", T_ULONGLONG,
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
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
zstd: vendor python-zstandard 0.8.0...
r31796 Py_INCREF(&FrameParametersType);
Gregory Szorc
zstd: vendor python-zstandard 0.7.0...
r30895 PyModule_AddObject(mod, "FrameParameters", (PyObject*)&FrameParametersType);
}