aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Modules/_zstd/zdict.c
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_zstd/zdict.c')
-rw-r--r--Modules/_zstd/zdict.c286
1 files changed, 0 insertions, 286 deletions
diff --git a/Modules/_zstd/zdict.c b/Modules/_zstd/zdict.c
deleted file mode 100644
index 28ab964a6ca..00000000000
--- a/Modules/_zstd/zdict.c
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
-Low level interface to Meta's zstd library for use in the compression.zstd
-Python module.
-*/
-
-/* ZstdDict class definitions */
-
-/*[clinic input]
-module _zstd
-class _zstd.ZstdDict "ZstdDict *" "clinic_state()->ZstdDict_type"
-[clinic start generated code]*/
-/*[clinic end generated code: output=da39a3ee5e6b4b0d input=a5d1254c497e52ba]*/
-
-#ifndef Py_BUILD_CORE_BUILTIN
-# define Py_BUILD_CORE_MODULE 1
-#endif
-
-#include "_zstdmodule.h"
-
-#include <stddef.h> // offsetof()
-
-#define ZstdDict_CAST(op) ((ZstdDict *)op)
-
-static PyObject *
-_zstd_ZstdDict_new(PyTypeObject *type, PyObject *Py_UNUSED(args), PyObject *Py_UNUSED(kwargs))
-{
- ZstdDict *self;
- self = PyObject_GC_New(ZstdDict, type);
- if (self == NULL) {
- goto error;
- }
-
- self->dict_content = NULL;
- self->inited = 0;
- self->d_dict = NULL;
-
- /* ZSTD_CDict dict */
- self->c_dicts = PyDict_New();
- if (self->c_dicts == NULL) {
- goto error;
- }
-
- return (PyObject*)self;
-
-error:
- if (self != NULL) {
- PyObject_GC_Del(self);
- }
- return NULL;
-}
-
-static void
-ZstdDict_dealloc(PyObject *ob)
-{
- ZstdDict *self = ZstdDict_CAST(ob);
-
- PyObject_GC_UnTrack(self);
-
- /* Free ZSTD_DDict instance */
- ZSTD_freeDDict(self->d_dict);
-
- /* Release dict_content after Free ZSTD_CDict/ZSTD_DDict instances */
- Py_CLEAR(self->dict_content);
- Py_CLEAR(self->c_dicts);
-
- PyTypeObject *tp = Py_TYPE(self);
- PyObject_GC_Del(ob);
- Py_DECREF(tp);
-}
-
-/*[clinic input]
-_zstd.ZstdDict.__init__
-
- dict_content: object
- A bytes-like object, dictionary's content.
- is_raw: bool = False
- This parameter is for advanced user. True means dict_content
- argument is a "raw content" dictionary, free of any format
- restriction. False means dict_content argument is an ordinary
- zstd dictionary, was created by zstd functions, follow a
- specified format.
-
-Represents a zstd dictionary, which can be used for compression/decompression.
-
-It's thread-safe, and can be shared by multiple ZstdCompressor /
-ZstdDecompressor objects.
-[clinic start generated code]*/
-
-static int
-_zstd_ZstdDict___init___impl(ZstdDict *self, PyObject *dict_content,
- int is_raw)
-/*[clinic end generated code: output=c5f5a0d8377d037c input=e6750f62a513b3ee]*/
-{
- /* Only called once */
- if (self->inited) {
- PyErr_SetString(PyExc_RuntimeError, init_twice_msg);
- return -1;
- }
- self->inited = 1;
-
- /* Check dict_content's type */
- self->dict_content = PyBytes_FromObject(dict_content);
- if (self->dict_content == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "dict_content argument should be bytes-like object.");
- return -1;
- }
-
- /* Both ordinary dictionary and "raw content" dictionary should
- at least 8 bytes */
- if (Py_SIZE(self->dict_content) < 8) {
- PyErr_SetString(PyExc_ValueError,
- "Zstd dictionary content should at least 8 bytes.");
- return -1;
- }
-
- /* Get dict_id, 0 means "raw content" dictionary. */
- self->dict_id = ZSTD_getDictID_fromDict(PyBytes_AS_STRING(self->dict_content),
- Py_SIZE(self->dict_content));
-
- /* Check validity for ordinary dictionary */
- if (!is_raw && self->dict_id == 0) {
- char *msg = "The dict_content argument is not a valid zstd "
- "dictionary. The first 4 bytes of a valid zstd dictionary "
- "should be a magic number: b'\\x37\\xA4\\x30\\xEC'.\n"
- "If you are an advanced user, and can be sure that "
- "dict_content argument is a \"raw content\" zstd "
- "dictionary, set is_raw parameter to True.";
- PyErr_SetString(PyExc_ValueError, msg);
- return -1;
- }
-
- // Can only track self once self->dict_content is included
- PyObject_GC_Track(self);
- return 0;
-}
-
-#define clinic_state() (get_zstd_state(type))
-#include "clinic/zdict.c.h"
-#undef clinic_state
-
-PyDoc_STRVAR(ZstdDict_dictid_doc,
-"ID of zstd dictionary, a 32-bit unsigned int value.\n\n"
-"Non-zero means ordinary dictionary, was created by zstd functions, follow\n"
-"a specified format.\n\n"
-"0 means a \"raw content\" dictionary, free of any format restriction, used\n"
-"for advanced user.");
-
-PyDoc_STRVAR(ZstdDict_dictcontent_doc,
-"The content of zstd dictionary, a bytes object, it's the same as dict_content\n"
-"argument in ZstdDict.__init__() method. It can be used with other programs.");
-
-static PyObject *
-ZstdDict_str(PyObject *ob)
-{
- ZstdDict *dict = ZstdDict_CAST(ob);
- return PyUnicode_FromFormat("<ZstdDict dict_id=%u dict_size=%zd>",
- dict->dict_id, Py_SIZE(dict->dict_content));
-}
-
-static PyMemberDef ZstdDict_members[] = {
- {"dict_id", Py_T_UINT, offsetof(ZstdDict, dict_id), Py_READONLY, ZstdDict_dictid_doc},
- {"dict_content", Py_T_OBJECT_EX, offsetof(ZstdDict, dict_content), Py_READONLY, ZstdDict_dictcontent_doc},
- {0}
-};
-
-/*[clinic input]
-@critical_section
-@getter
-_zstd.ZstdDict.as_digested_dict
-
-Load as a digested dictionary to compressor.
-
-Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_digested_dict)
-1. Some advanced compression parameters of compressor may be overridden
- by parameters of digested dictionary.
-2. ZstdDict has a digested dictionaries cache for each compression level.
- It's faster when loading again a digested dictionary with the same
- compression level.
-3. No need to use this for decompression.
-[clinic start generated code]*/
-
-static PyObject *
-_zstd_ZstdDict_as_digested_dict_get_impl(ZstdDict *self)
-/*[clinic end generated code: output=09b086e7a7320dbb input=585448c79f31f74a]*/
-{
- return Py_BuildValue("Oi", self, DICT_TYPE_DIGESTED);
-}
-
-/*[clinic input]
-@critical_section
-@getter
-_zstd.ZstdDict.as_undigested_dict
-
-Load as an undigested dictionary to compressor.
-
-Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_undigested_dict)
-1. The advanced compression parameters of compressor will not be overridden.
-2. Loading an undigested dictionary is costly. If load an undigested dictionary
- multiple times, consider reusing a compressor object.
-3. No need to use this for decompression.
-[clinic start generated code]*/
-
-static PyObject *
-_zstd_ZstdDict_as_undigested_dict_get_impl(ZstdDict *self)
-/*[clinic end generated code: output=43c7a989e6d4253a input=022b0829ffb1c220]*/
-{
- return Py_BuildValue("Oi", self, DICT_TYPE_UNDIGESTED);
-}
-
-/*[clinic input]
-@critical_section
-@getter
-_zstd.ZstdDict.as_prefix
-
-Load as a prefix to compressor/decompressor.
-
-Pass this attribute as zstd_dict argument: compress(dat, zstd_dict=zd.as_prefix)
-1. Prefix is compatible with long distance matching, while dictionary is not.
-2. It only works for the first frame, then the compressor/decompressor will
- return to no prefix state.
-3. When decompressing, must use the same prefix as when compressing."
-[clinic start generated code]*/
-
-static PyObject *
-_zstd_ZstdDict_as_prefix_get_impl(ZstdDict *self)
-/*[clinic end generated code: output=6f7130c356595a16 input=09fb82a6a5407e87]*/
-{
- return Py_BuildValue("Oi", self, DICT_TYPE_PREFIX);
-}
-
-static PyGetSetDef ZstdDict_getset[] = {
- _ZSTD_ZSTDDICT_AS_DIGESTED_DICT_GETSETDEF
-
- _ZSTD_ZSTDDICT_AS_UNDIGESTED_DICT_GETSETDEF
-
- _ZSTD_ZSTDDICT_AS_PREFIX_GETSETDEF
-
- {0}
-};
-
-static Py_ssize_t
-ZstdDict_length(PyObject *ob)
-{
- ZstdDict *self = ZstdDict_CAST(ob);
- assert(PyBytes_Check(self->dict_content));
- return Py_SIZE(self->dict_content);
-}
-
-static int
-ZstdDict_traverse(PyObject *ob, visitproc visit, void *arg)
-{
- ZstdDict *self = ZstdDict_CAST(ob);
- Py_VISIT(self->c_dicts);
- Py_VISIT(self->dict_content);
- return 0;
-}
-
-static int
-ZstdDict_clear(PyObject *ob)
-{
- ZstdDict *self = ZstdDict_CAST(ob);
- Py_CLEAR(self->dict_content);
- return 0;
-}
-
-static PyType_Slot zstddict_slots[] = {
- {Py_tp_members, ZstdDict_members},
- {Py_tp_getset, ZstdDict_getset},
- {Py_tp_new, _zstd_ZstdDict_new},
- {Py_tp_dealloc, ZstdDict_dealloc},
- {Py_tp_init, _zstd_ZstdDict___init__},
- {Py_tp_str, ZstdDict_str},
- {Py_tp_doc, (char*)_zstd_ZstdDict___init____doc__},
- {Py_sq_length, ZstdDict_length},
- {Py_tp_traverse, ZstdDict_traverse},
- {Py_tp_clear, ZstdDict_clear},
- {0}
-};
-
-PyType_Spec zstddict_type_spec = {
- .name = "_zstd.ZstdDict",
- .basicsize = sizeof(ZstdDict),
- .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
- .slots = zstddict_slots,
-};