##// END OF EJS Templates
simplemerge: make minimize() a free function...
simplemerge: make minimize() a free function IMO, `Merge3Text` should be about merging text without knowing about conflict markers. "Conflict minimization" is about making conflict markers smaller, so it should be moved out. This patch does that. I'll refactor it next. Differential Revision: https://phab.mercurial-scm.org/D11980

File last commit:

r47090:e92ca942 default
r49395:a0cb1623 default
Show More
compressobj.c
256 lines | 6.6 KiB | text/x-c | CLexer
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 /**
* Copyright (c) 2016-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(ZstdCompressionObj__doc__,
"Perform compression using a standard library compatible API.\n"
);
static void ZstdCompressionObj_dealloc(ZstdCompressionObj* self) {
PyMem_Free(self->output.dst);
self->output.dst = NULL;
Py_XDECREF(self->compressor);
PyObject_Del(self);
}
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 static PyObject* ZstdCompressionObj_compress(ZstdCompressionObj* self, PyObject* args, PyObject* kwargs) {
static char* kwlist[] = {
"data",
NULL
};
Py_buffer source;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 ZSTD_inBuffer input;
size_t zresult;
PyObject* result = NULL;
Py_ssize_t resultSize = 0;
Gregory Szorc
zstd: vendor python-zstandard 0.6.0...
r30822 if (self->finished) {
PyErr_SetString(ZstdError, "cannot call compress() after compressor finished");
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 return NULL;
}
#if PY_MAJOR_VERSION >= 3
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "y*:compress",
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 #else
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*:compress",
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 #endif
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 kwlist, &source)) {
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 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;
}
input.src = source.buf;
input.size = source.len;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 input.pos = 0;
Gregory Szorc
zstandard: vendor python-zstandard 0.11...
r42237 while (input.pos < (size_t)source.len) {
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 Py_BEGIN_ALLOW_THREADS
Gregory Szorc
zstandard: vendor python-zstandard 0.11...
r42237 zresult = ZSTD_compressStream2(self->compressor->cctx, &self->output,
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 &input, ZSTD_e_continue);
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 Py_END_ALLOW_THREADS
if (ZSTD_isError(zresult)) {
PyErr_Format(ZstdError, "zstd compress error: %s", ZSTD_getErrorName(zresult));
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 Py_CLEAR(result);
goto finally;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 }
if (self->output.pos) {
if (result) {
resultSize = PyBytes_GET_SIZE(result);
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513
if (safe_pybytes_resize(&result, resultSize + self->output.pos)) {
Py_CLEAR(result);
goto finally;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 }
memcpy(PyBytes_AS_STRING(result) + resultSize,
self->output.dst, self->output.pos);
}
else {
result = PyBytes_FromStringAndSize(self->output.dst, self->output.pos);
if (!result) {
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 goto finally;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 }
}
self->output.pos = 0;
}
}
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 if (NULL == result) {
result = PyBytes_FromString("");
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 }
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513
finally:
PyBuffer_Release(&source);
return result;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 }
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 static PyObject* ZstdCompressionObj_flush(ZstdCompressionObj* self, PyObject* args, PyObject* kwargs) {
static char* kwlist[] = {
"flush_mode",
NULL
};
Gregory Szorc
zstd: vendor python-zstandard 0.6.0...
r30822 int flushMode = compressorobj_flush_finish;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 size_t zresult;
PyObject* result = NULL;
Py_ssize_t resultSize = 0;
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 ZSTD_inBuffer input;
Gregory Szorc
zstandard: vendor python-zstandard 0.10.1...
r40157 ZSTD_EndDirective zFlushMode;
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:flush", kwlist, &flushMode)) {
Gregory Szorc
zstd: vendor python-zstandard 0.6.0...
r30822 return NULL;
}
if (flushMode != compressorobj_flush_finish && flushMode != compressorobj_flush_block) {
PyErr_SetString(PyExc_ValueError, "flush mode not recognized");
return NULL;
}
if (self->finished) {
PyErr_SetString(ZstdError, "compressor object already finished");
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 return NULL;
}
Gregory Szorc
zstandard: vendor python-zstandard 0.10.1...
r40157 switch (flushMode) {
case compressorobj_flush_block:
zFlushMode = ZSTD_e_flush;
break;
case compressorobj_flush_finish:
zFlushMode = ZSTD_e_end;
self->finished = 1;
break;
default:
PyErr_SetString(ZstdError, "unhandled flush mode");
return NULL;
}
Gregory Szorc
zstd: vendor python-zstandard 0.6.0...
r30822 assert(self->output.pos == 0);
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 input.src = NULL;
input.size = 0;
input.pos = 0;
Gregory Szorc
zstandard: vendor python-zstandard 0.10.1...
r40157 while (1) {
Gregory Szorc
zstd: vendor python-zstandard 0.6.0...
r30822 Py_BEGIN_ALLOW_THREADS
Gregory Szorc
zstandard: vendor python-zstandard 0.11...
r42237 zresult = ZSTD_compressStream2(self->compressor->cctx, &self->output,
Gregory Szorc
zstandard: vendor python-zstandard 0.10.1...
r40157 &input, zFlushMode);
Gregory Szorc
zstd: vendor python-zstandard 0.6.0...
r30822 Py_END_ALLOW_THREADS
if (ZSTD_isError(zresult)) {
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 PyErr_Format(ZstdError, "error ending compression stream: %s",
ZSTD_getErrorName(zresult));
return NULL;
}
if (self->output.pos) {
if (result) {
resultSize = PyBytes_GET_SIZE(result);
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513
if (safe_pybytes_resize(&result, resultSize + self->output.pos)) {
Py_XDECREF(result);
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 return NULL;
}
memcpy(PyBytes_AS_STRING(result) + resultSize,
self->output.dst, self->output.pos);
}
else {
result = PyBytes_FromStringAndSize(self->output.dst, self->output.pos);
if (!result) {
return NULL;
}
}
self->output.pos = 0;
}
if (!zresult) {
break;
}
}
if (result) {
return result;
}
else {
return PyBytes_FromString("");
}
}
static PyMethodDef ZstdCompressionObj_methods[] = {
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 { "compress", (PyCFunction)ZstdCompressionObj_compress, METH_VARARGS | METH_KEYWORDS,
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 PyDoc_STR("compress data") },
Gregory Szorc
zstandard: vendor python-zstandard 0.9.0...
r37513 { "flush", (PyCFunction)ZstdCompressionObj_flush, METH_VARARGS | METH_KEYWORDS,
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 PyDoc_STR("finish compression operation") },
{ NULL, NULL }
};
PyTypeObject ZstdCompressionObjType = {
PyVarObject_HEAD_INIT(NULL, 0)
"zstd.ZstdCompressionObj", /* tp_name */
sizeof(ZstdCompressionObj), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)ZstdCompressionObj_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 | Py_TPFLAGS_BASETYPE, /* tp_flags */
ZstdCompressionObj__doc__, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
ZstdCompressionObj_methods, /* tp_methods */
0, /* 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 */
PyType_GenericNew, /* tp_new */
};
void compressobj_module_init(PyObject* module) {
Victor Stinner
cext: add Python 3.10 support...
r47090 Py_SET_TYPE(&ZstdCompressionObjType, &PyType_Type);
Gregory Szorc
zstd: vendor python-zstandard 0.5.0...
r30435 if (PyType_Ready(&ZstdCompressionObjType) < 0) {
return;
}
}