blob: 46d2988ad3e135fa9b3e29d35f393d847a18240f [file] [log] [blame]
Serhiy Storchaka98c779e2014-01-25 14:02:29 +02001/*[clinic input]
Larry Hastingsf256c222014-01-25 21:30:37 -08002preserve
Serhiy Storchaka98c779e2014-01-25 14:02:29 +02003[clinic start generated code]*/
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02004
Larry Hastingsf256c222014-01-25 21:30:37 -08005PyDoc_STRVAR(_lzma_LZMACompressor_compress__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -08006"compress($self, data, /)\n"
7"--\n"
8"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -08009"Provide data to the compressor object.\n"
10"\n"
11"Returns a chunk of compressed data if possible, or b\'\' otherwise.\n"
12"\n"
13"When you have finished providing data to the compressor, call the\n"
14"flush() method to finish the compression process.");
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020015
Larry Hastingsf256c222014-01-25 21:30:37 -080016#define _LZMA_LZMACOMPRESSOR_COMPRESS_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +030017 {"compress", (PyCFunction)_lzma_LZMACompressor_compress, METH_O, _lzma_LZMACompressor_compress__doc__},
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020018
19static PyObject *
Larry Hastingsf256c222014-01-25 21:30:37 -080020_lzma_LZMACompressor_compress_impl(Compressor *self, Py_buffer *data);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020021
Nadeem Vawda37970652013-10-28 21:35:23 +010022static PyObject *
Serhiy Storchaka92e8af62015-04-04 00:12:11 +030023_lzma_LZMACompressor_compress(Compressor *self, PyObject *arg)
Nadeem Vawda37970652013-10-28 21:35:23 +010024{
Larry Hastingsf256c222014-01-25 21:30:37 -080025 PyObject *return_value = NULL;
26 Py_buffer data = {NULL, NULL};
27
Serhiy Storchaka32d96a22018-12-25 13:23:47 +020028 if (PyObject_GetBuffer(arg, &data, PyBUF_SIMPLE) != 0) {
29 goto exit;
30 }
31 if (!PyBuffer_IsContiguous(&data, 'C')) {
32 _PyArg_BadArgument("compress", "contiguous buffer", arg);
Larry Hastingsf256c222014-01-25 21:30:37 -080033 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030034 }
Larry Hastingsf256c222014-01-25 21:30:37 -080035 return_value = _lzma_LZMACompressor_compress_impl(self, &data);
36
37exit:
38 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030039 if (data.obj) {
Larry Hastingsf256c222014-01-25 21:30:37 -080040 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030041 }
Larry Hastingsf256c222014-01-25 21:30:37 -080042
43 return return_value;
Nadeem Vawda37970652013-10-28 21:35:23 +010044}
45
Larry Hastingsf256c222014-01-25 21:30:37 -080046PyDoc_STRVAR(_lzma_LZMACompressor_flush__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -080047"flush($self, /)\n"
48"--\n"
49"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -080050"Finish the compression process.\n"
51"\n"
52"Returns the compressed data left in internal buffers.\n"
53"\n"
54"The compressor object may not be used after this method is called.");
55
56#define _LZMA_LZMACOMPRESSOR_FLUSH_METHODDEF \
57 {"flush", (PyCFunction)_lzma_LZMACompressor_flush, METH_NOARGS, _lzma_LZMACompressor_flush__doc__},
58
59static PyObject *
60_lzma_LZMACompressor_flush_impl(Compressor *self);
61
62static PyObject *
63_lzma_LZMACompressor_flush(Compressor *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020064{
Larry Hastingsf256c222014-01-25 21:30:37 -080065 return _lzma_LZMACompressor_flush_impl(self);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020066}
67
Larry Hastingsf256c222014-01-25 21:30:37 -080068PyDoc_STRVAR(_lzma_LZMADecompressor_decompress__doc__,
Antoine Pitrou26795ba2015-01-17 16:22:18 +010069"decompress($self, /, data, max_length=-1)\n"
Larry Hastings2623c8c2014-02-08 22:15:29 -080070"--\n"
71"\n"
Serhiy Storchaka79d8f3f2015-02-20 12:46:11 +020072"Decompress *data*, returning uncompressed data as bytes.\n"
Larry Hastingsf256c222014-01-25 21:30:37 -080073"\n"
Antoine Pitrou26795ba2015-01-17 16:22:18 +010074"If *max_length* is nonnegative, returns at most *max_length* bytes of\n"
75"decompressed data. If this limit is reached and further output can be\n"
76"produced, *self.needs_input* will be set to ``False``. In this case, the next\n"
77"call to *decompress()* may provide *data* as b\'\' to obtain more of the output.\n"
Larry Hastingsf256c222014-01-25 21:30:37 -080078"\n"
Antoine Pitrou26795ba2015-01-17 16:22:18 +010079"If all of the input data was decompressed and returned (either because this\n"
80"was less than *max_length* bytes, or because *max_length* was negative),\n"
81"*self.needs_input* will be set to True.\n"
82"\n"
83"Attempting to decompress data after the end of stream is reached raises an\n"
84"EOFError. Any data found after the end of the stream is ignored and saved in\n"
85"the unused_data attribute.");
Larry Hastingsf256c222014-01-25 21:30:37 -080086
87#define _LZMA_LZMADECOMPRESSOR_DECOMPRESS_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +020088 {"decompress", (PyCFunction)(void(*)(void))_lzma_LZMADecompressor_decompress, METH_FASTCALL|METH_KEYWORDS, _lzma_LZMADecompressor_decompress__doc__},
Larry Hastingsf256c222014-01-25 21:30:37 -080089
90static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -040091_lzma_LZMADecompressor_decompress_impl(Decompressor *self, Py_buffer *data,
92 Py_ssize_t max_length);
Larry Hastingsf256c222014-01-25 21:30:37 -080093
94static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +020095_lzma_LZMADecompressor_decompress(Decompressor *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020096{
Larry Hastingsf256c222014-01-25 21:30:37 -080097 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +030098 static const char * const _keywords[] = {"data", "max_length", NULL};
99 static _PyArg_Parser _parser = {"y*|n:decompress", _keywords, 0};
Larry Hastingsf256c222014-01-25 21:30:37 -0800100 Py_buffer data = {NULL, NULL};
Antoine Pitrou26795ba2015-01-17 16:22:18 +0100101 Py_ssize_t max_length = -1;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200102
Victor Stinner3e1fad62017-01-17 01:29:01 +0100103 if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300104 &data, &max_length)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800105 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300106 }
Antoine Pitrou26795ba2015-01-17 16:22:18 +0100107 return_value = _lzma_LZMADecompressor_decompress_impl(self, &data, max_length);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200108
Larry Hastingsf256c222014-01-25 21:30:37 -0800109exit:
110 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300111 if (data.obj) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800112 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300113 }
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200114
Larry Hastingsf256c222014-01-25 21:30:37 -0800115 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200116}
117
Larry Hastingsf256c222014-01-25 21:30:37 -0800118PyDoc_STRVAR(_lzma_LZMADecompressor___init____doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800119"LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)\n"
120"--\n"
121"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800122"Create a decompressor object for decompressing data incrementally.\n"
123"\n"
124" format\n"
125" Specifies the container format of the input stream. If this is\n"
126" FORMAT_AUTO (the default), the decompressor will automatically detect\n"
127" whether the input is FORMAT_XZ or FORMAT_ALONE. Streams created with\n"
128" FORMAT_RAW cannot be autodetected.\n"
129" memlimit\n"
130" Limit the amount of memory used by the decompressor. This will cause\n"
131" decompression to fail if the input cannot be decompressed within the\n"
132" given limit.\n"
133" filters\n"
134" A custom filter chain. This argument is required for FORMAT_RAW, and\n"
135" not accepted with any other format. When provided, this should be a\n"
136" sequence of dicts, each indicating the ID and options for a single\n"
137" filter.\n"
138"\n"
139"For one-shot decompression, use the decompress() function instead.");
140
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200141static int
Larry Hastings89964c42015-04-14 18:07:59 -0400142_lzma_LZMADecompressor___init___impl(Decompressor *self, int format,
143 PyObject *memlimit, PyObject *filters);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200144
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200145static int
Larry Hastingsf256c222014-01-25 21:30:37 -0800146_lzma_LZMADecompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200147{
Larry Hastingsf256c222014-01-25 21:30:37 -0800148 int return_value = -1;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300149 static const char * const _keywords[] = {"format", "memlimit", "filters", NULL};
150 static _PyArg_Parser _parser = {"|iOO:LZMADecompressor", _keywords, 0};
Larry Hastingsf256c222014-01-25 21:30:37 -0800151 int format = FORMAT_AUTO;
152 PyObject *memlimit = Py_None;
153 PyObject *filters = Py_None;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200154
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300155 if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300156 &format, &memlimit, &filters)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800157 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300158 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800159 return_value = _lzma_LZMADecompressor___init___impl((Decompressor *)self, format, memlimit, filters);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200160
Larry Hastingsf256c222014-01-25 21:30:37 -0800161exit:
162 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200163}
164
Larry Hastingsf256c222014-01-25 21:30:37 -0800165PyDoc_STRVAR(_lzma_is_check_supported__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800166"is_check_supported($module, check_id, /)\n"
167"--\n"
168"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800169"Test whether the given integrity check is supported.\n"
170"\n"
171"Always returns True for CHECK_NONE and CHECK_CRC32.");
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200172
Larry Hastingsf256c222014-01-25 21:30:37 -0800173#define _LZMA_IS_CHECK_SUPPORTED_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300174 {"is_check_supported", (PyCFunction)_lzma_is_check_supported, METH_O, _lzma_is_check_supported__doc__},
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200175
176static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300177_lzma_is_check_supported_impl(PyObject *module, int check_id);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200178
179static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300180_lzma_is_check_supported(PyObject *module, PyObject *arg)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200181{
Larry Hastingsf256c222014-01-25 21:30:37 -0800182 PyObject *return_value = NULL;
183 int check_id;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200184
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200185 if (PyFloat_Check(arg)) {
186 PyErr_SetString(PyExc_TypeError,
187 "integer argument expected, got float" );
188 goto exit;
189 }
190 check_id = _PyLong_AsInt(arg);
191 if (check_id == -1 && PyErr_Occurred()) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800192 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300193 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800194 return_value = _lzma_is_check_supported_impl(module, check_id);
195
196exit:
197 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200198}
199
Larry Hastingsf256c222014-01-25 21:30:37 -0800200PyDoc_STRVAR(_lzma__encode_filter_properties__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800201"_encode_filter_properties($module, filter, /)\n"
202"--\n"
203"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800204"Return a bytes object encoding the options (properties) of the filter specified by *filter* (a dict).\n"
205"\n"
206"The result does not include the filter ID itself, only the options.");
207
208#define _LZMA__ENCODE_FILTER_PROPERTIES_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300209 {"_encode_filter_properties", (PyCFunction)_lzma__encode_filter_properties, METH_O, _lzma__encode_filter_properties__doc__},
Larry Hastingsf256c222014-01-25 21:30:37 -0800210
Nadeem Vawda37970652013-10-28 21:35:23 +0100211static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300212_lzma__encode_filter_properties_impl(PyObject *module, lzma_filter filter);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200213
214static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300215_lzma__encode_filter_properties(PyObject *module, PyObject *arg)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200216{
Larry Hastingsf256c222014-01-25 21:30:37 -0800217 PyObject *return_value = NULL;
218 lzma_filter filter = {LZMA_VLI_UNKNOWN, NULL};
219
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200220 if (!lzma_filter_converter(arg, &filter)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800221 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300222 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800223 return_value = _lzma__encode_filter_properties_impl(module, filter);
224
225exit:
226 /* Cleanup for filter */
227 if (filter.id != LZMA_VLI_UNKNOWN)
228 PyMem_Free(filter.options);
229
230 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200231}
232
Larry Hastingsf256c222014-01-25 21:30:37 -0800233PyDoc_STRVAR(_lzma__decode_filter_properties__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800234"_decode_filter_properties($module, filter_id, encoded_props, /)\n"
235"--\n"
236"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800237"Return a bytes object encoding the options (properties) of the filter specified by *filter* (a dict).\n"
238"\n"
239"The result does not include the filter ID itself, only the options.");
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200240
Larry Hastingsf256c222014-01-25 21:30:37 -0800241#define _LZMA__DECODE_FILTER_PROPERTIES_METHODDEF \
Serhiy Storchaka4a934d42018-11-27 11:27:36 +0200242 {"_decode_filter_properties", (PyCFunction)(void(*)(void))_lzma__decode_filter_properties, METH_FASTCALL, _lzma__decode_filter_properties__doc__},
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200243
244static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300245_lzma__decode_filter_properties_impl(PyObject *module, lzma_vli filter_id,
Larry Hastings89964c42015-04-14 18:07:59 -0400246 Py_buffer *encoded_props);
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200247
248static PyObject *
Serhiy Storchakaa5552f02017-12-15 13:11:11 +0200249_lzma__decode_filter_properties(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200250{
Larry Hastingsf256c222014-01-25 21:30:37 -0800251 PyObject *return_value = NULL;
252 lzma_vli filter_id;
253 Py_buffer encoded_props = {NULL, NULL};
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200254
Sylvain74453812017-06-10 06:51:48 +0200255 if (!_PyArg_ParseStack(args, nargs, "O&y*:_decode_filter_properties",
256 lzma_vli_converter, &filter_id, &encoded_props)) {
Victor Stinner259f0e42017-01-17 01:35:17 +0100257 goto exit;
258 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800259 return_value = _lzma__decode_filter_properties_impl(module, filter_id, &encoded_props);
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200260
Larry Hastingsf256c222014-01-25 21:30:37 -0800261exit:
262 /* Cleanup for encoded_props */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300263 if (encoded_props.obj) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800264 PyBuffer_Release(&encoded_props);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300265 }
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200266
Larry Hastingsf256c222014-01-25 21:30:37 -0800267 return return_value;
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200268}
Serhiy Storchaka32d96a22018-12-25 13:23:47 +0200269/*[clinic end generated code: output=df061bfc2067a90a input=a9049054013a1b77]*/