blob: 9e6075954afe51d7ca2e81c772e56a9109e55a96 [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 Storchaka5dee6552016-06-09 16:16:06 +030028 if (!PyArg_Parse(arg, "y*:compress", &data)) {
Larry Hastingsf256c222014-01-25 21:30:37 -080029 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030030 }
Larry Hastingsf256c222014-01-25 21:30:37 -080031 return_value = _lzma_LZMACompressor_compress_impl(self, &data);
32
33exit:
34 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030035 if (data.obj) {
Larry Hastingsf256c222014-01-25 21:30:37 -080036 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +030037 }
Larry Hastingsf256c222014-01-25 21:30:37 -080038
39 return return_value;
Nadeem Vawda37970652013-10-28 21:35:23 +010040}
41
Larry Hastingsf256c222014-01-25 21:30:37 -080042PyDoc_STRVAR(_lzma_LZMACompressor_flush__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -080043"flush($self, /)\n"
44"--\n"
45"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -080046"Finish the compression process.\n"
47"\n"
48"Returns the compressed data left in internal buffers.\n"
49"\n"
50"The compressor object may not be used after this method is called.");
51
52#define _LZMA_LZMACOMPRESSOR_FLUSH_METHODDEF \
53 {"flush", (PyCFunction)_lzma_LZMACompressor_flush, METH_NOARGS, _lzma_LZMACompressor_flush__doc__},
54
55static PyObject *
56_lzma_LZMACompressor_flush_impl(Compressor *self);
57
58static PyObject *
59_lzma_LZMACompressor_flush(Compressor *self, PyObject *Py_UNUSED(ignored))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020060{
Larry Hastingsf256c222014-01-25 21:30:37 -080061 return _lzma_LZMACompressor_flush_impl(self);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020062}
63
Larry Hastingsf256c222014-01-25 21:30:37 -080064PyDoc_STRVAR(_lzma_LZMADecompressor_decompress__doc__,
Antoine Pitrou26795ba2015-01-17 16:22:18 +010065"decompress($self, /, data, max_length=-1)\n"
Larry Hastings2623c8c2014-02-08 22:15:29 -080066"--\n"
67"\n"
Serhiy Storchaka79d8f3f2015-02-20 12:46:11 +020068"Decompress *data*, returning uncompressed data as bytes.\n"
Larry Hastingsf256c222014-01-25 21:30:37 -080069"\n"
Antoine Pitrou26795ba2015-01-17 16:22:18 +010070"If *max_length* is nonnegative, returns at most *max_length* bytes of\n"
71"decompressed data. If this limit is reached and further output can be\n"
72"produced, *self.needs_input* will be set to ``False``. In this case, the next\n"
73"call to *decompress()* may provide *data* as b\'\' to obtain more of the output.\n"
Larry Hastingsf256c222014-01-25 21:30:37 -080074"\n"
Antoine Pitrou26795ba2015-01-17 16:22:18 +010075"If all of the input data was decompressed and returned (either because this\n"
76"was less than *max_length* bytes, or because *max_length* was negative),\n"
77"*self.needs_input* will be set to True.\n"
78"\n"
79"Attempting to decompress data after the end of stream is reached raises an\n"
80"EOFError. Any data found after the end of the stream is ignored and saved in\n"
81"the unused_data attribute.");
Larry Hastingsf256c222014-01-25 21:30:37 -080082
83#define _LZMA_LZMADECOMPRESSOR_DECOMPRESS_METHODDEF \
Victor Stinner37e4ef72016-09-09 20:00:13 -070084 {"decompress", (PyCFunction)_lzma_LZMADecompressor_decompress, METH_FASTCALL, _lzma_LZMADecompressor_decompress__doc__},
Larry Hastingsf256c222014-01-25 21:30:37 -080085
86static PyObject *
Larry Hastings89964c42015-04-14 18:07:59 -040087_lzma_LZMADecompressor_decompress_impl(Decompressor *self, Py_buffer *data,
88 Py_ssize_t max_length);
Larry Hastingsf256c222014-01-25 21:30:37 -080089
90static PyObject *
Victor Stinner37e4ef72016-09-09 20:00:13 -070091_lzma_LZMADecompressor_decompress(Decompressor *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020092{
Larry Hastingsf256c222014-01-25 21:30:37 -080093 PyObject *return_value = NULL;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +030094 static const char * const _keywords[] = {"data", "max_length", NULL};
95 static _PyArg_Parser _parser = {"y*|n:decompress", _keywords, 0};
Larry Hastingsf256c222014-01-25 21:30:37 -080096 Py_buffer data = {NULL, NULL};
Antoine Pitrou26795ba2015-01-17 16:22:18 +010097 Py_ssize_t max_length = -1;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +020098
Victor Stinner37e4ef72016-09-09 20:00:13 -070099 if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300100 &data, &max_length)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800101 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300102 }
Antoine Pitrou26795ba2015-01-17 16:22:18 +0100103 return_value = _lzma_LZMADecompressor_decompress_impl(self, &data, max_length);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200104
Larry Hastingsf256c222014-01-25 21:30:37 -0800105exit:
106 /* Cleanup for data */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300107 if (data.obj) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800108 PyBuffer_Release(&data);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300109 }
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200110
Larry Hastingsf256c222014-01-25 21:30:37 -0800111 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200112}
113
Larry Hastingsf256c222014-01-25 21:30:37 -0800114PyDoc_STRVAR(_lzma_LZMADecompressor___init____doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800115"LZMADecompressor(format=FORMAT_AUTO, memlimit=None, filters=None)\n"
116"--\n"
117"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800118"Create a decompressor object for decompressing data incrementally.\n"
119"\n"
120" format\n"
121" Specifies the container format of the input stream. If this is\n"
122" FORMAT_AUTO (the default), the decompressor will automatically detect\n"
123" whether the input is FORMAT_XZ or FORMAT_ALONE. Streams created with\n"
124" FORMAT_RAW cannot be autodetected.\n"
125" memlimit\n"
126" Limit the amount of memory used by the decompressor. This will cause\n"
127" decompression to fail if the input cannot be decompressed within the\n"
128" given limit.\n"
129" filters\n"
130" A custom filter chain. This argument is required for FORMAT_RAW, and\n"
131" not accepted with any other format. When provided, this should be a\n"
132" sequence of dicts, each indicating the ID and options for a single\n"
133" filter.\n"
134"\n"
135"For one-shot decompression, use the decompress() function instead.");
136
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200137static int
Larry Hastings89964c42015-04-14 18:07:59 -0400138_lzma_LZMADecompressor___init___impl(Decompressor *self, int format,
139 PyObject *memlimit, PyObject *filters);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200140
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200141static int
Larry Hastingsf256c222014-01-25 21:30:37 -0800142_lzma_LZMADecompressor___init__(PyObject *self, PyObject *args, PyObject *kwargs)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200143{
Larry Hastingsf256c222014-01-25 21:30:37 -0800144 int return_value = -1;
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300145 static const char * const _keywords[] = {"format", "memlimit", "filters", NULL};
146 static _PyArg_Parser _parser = {"|iOO:LZMADecompressor", _keywords, 0};
Larry Hastingsf256c222014-01-25 21:30:37 -0800147 int format = FORMAT_AUTO;
148 PyObject *memlimit = Py_None;
149 PyObject *filters = Py_None;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200150
Serhiy Storchaka9171a8b2016-08-14 10:52:18 +0300151 if (!_PyArg_ParseTupleAndKeywordsFast(args, kwargs, &_parser,
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300152 &format, &memlimit, &filters)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800153 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300154 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800155 return_value = _lzma_LZMADecompressor___init___impl((Decompressor *)self, format, memlimit, filters);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200156
Larry Hastingsf256c222014-01-25 21:30:37 -0800157exit:
158 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200159}
160
Larry Hastingsf256c222014-01-25 21:30:37 -0800161PyDoc_STRVAR(_lzma_is_check_supported__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800162"is_check_supported($module, check_id, /)\n"
163"--\n"
164"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800165"Test whether the given integrity check is supported.\n"
166"\n"
167"Always returns True for CHECK_NONE and CHECK_CRC32.");
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200168
Larry Hastingsf256c222014-01-25 21:30:37 -0800169#define _LZMA_IS_CHECK_SUPPORTED_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300170 {"is_check_supported", (PyCFunction)_lzma_is_check_supported, METH_O, _lzma_is_check_supported__doc__},
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200171
172static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300173_lzma_is_check_supported_impl(PyObject *module, int check_id);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200174
175static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300176_lzma_is_check_supported(PyObject *module, PyObject *arg)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200177{
Larry Hastingsf256c222014-01-25 21:30:37 -0800178 PyObject *return_value = NULL;
179 int check_id;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200180
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300181 if (!PyArg_Parse(arg, "i:is_check_supported", &check_id)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800182 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300183 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800184 return_value = _lzma_is_check_supported_impl(module, check_id);
185
186exit:
187 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200188}
189
Larry Hastingsf256c222014-01-25 21:30:37 -0800190PyDoc_STRVAR(_lzma__encode_filter_properties__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800191"_encode_filter_properties($module, filter, /)\n"
192"--\n"
193"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800194"Return a bytes object encoding the options (properties) of the filter specified by *filter* (a dict).\n"
195"\n"
196"The result does not include the filter ID itself, only the options.");
197
198#define _LZMA__ENCODE_FILTER_PROPERTIES_METHODDEF \
Serhiy Storchaka92e8af62015-04-04 00:12:11 +0300199 {"_encode_filter_properties", (PyCFunction)_lzma__encode_filter_properties, METH_O, _lzma__encode_filter_properties__doc__},
Larry Hastingsf256c222014-01-25 21:30:37 -0800200
Nadeem Vawda37970652013-10-28 21:35:23 +0100201static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300202_lzma__encode_filter_properties_impl(PyObject *module, lzma_filter filter);
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200203
204static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300205_lzma__encode_filter_properties(PyObject *module, PyObject *arg)
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200206{
Larry Hastingsf256c222014-01-25 21:30:37 -0800207 PyObject *return_value = NULL;
208 lzma_filter filter = {LZMA_VLI_UNKNOWN, NULL};
209
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300210 if (!PyArg_Parse(arg, "O&:_encode_filter_properties", lzma_filter_converter, &filter)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800211 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300212 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800213 return_value = _lzma__encode_filter_properties_impl(module, filter);
214
215exit:
216 /* Cleanup for filter */
217 if (filter.id != LZMA_VLI_UNKNOWN)
218 PyMem_Free(filter.options);
219
220 return return_value;
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200221}
222
Larry Hastingsf256c222014-01-25 21:30:37 -0800223PyDoc_STRVAR(_lzma__decode_filter_properties__doc__,
Larry Hastings2623c8c2014-02-08 22:15:29 -0800224"_decode_filter_properties($module, filter_id, encoded_props, /)\n"
225"--\n"
226"\n"
Larry Hastingsf256c222014-01-25 21:30:37 -0800227"Return a bytes object encoding the options (properties) of the filter specified by *filter* (a dict).\n"
228"\n"
229"The result does not include the filter ID itself, only the options.");
Nadeem Vawda3ff069e2011-11-30 00:25:06 +0200230
Larry Hastingsf256c222014-01-25 21:30:37 -0800231#define _LZMA__DECODE_FILTER_PROPERTIES_METHODDEF \
232 {"_decode_filter_properties", (PyCFunction)_lzma__decode_filter_properties, METH_VARARGS, _lzma__decode_filter_properties__doc__},
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200233
234static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300235_lzma__decode_filter_properties_impl(PyObject *module, lzma_vli filter_id,
Larry Hastings89964c42015-04-14 18:07:59 -0400236 Py_buffer *encoded_props);
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200237
238static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300239_lzma__decode_filter_properties(PyObject *module, PyObject *args)
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200240{
Larry Hastingsf256c222014-01-25 21:30:37 -0800241 PyObject *return_value = NULL;
242 lzma_vli filter_id;
243 Py_buffer encoded_props = {NULL, NULL};
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200244
Serhiy Storchaka247789c2015-04-24 00:40:51 +0300245 if (!PyArg_ParseTuple(args, "O&y*:_decode_filter_properties",
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300246 lzma_vli_converter, &filter_id, &encoded_props)) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800247 goto exit;
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300248 }
Larry Hastingsf256c222014-01-25 21:30:37 -0800249 return_value = _lzma__decode_filter_properties_impl(module, filter_id, &encoded_props);
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200250
Larry Hastingsf256c222014-01-25 21:30:37 -0800251exit:
252 /* Cleanup for encoded_props */
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300253 if (encoded_props.obj) {
Larry Hastingsf256c222014-01-25 21:30:37 -0800254 PyBuffer_Release(&encoded_props);
Serhiy Storchaka5dee6552016-06-09 16:16:06 +0300255 }
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200256
Larry Hastingsf256c222014-01-25 21:30:37 -0800257 return return_value;
Nadeem Vawdaf55b3292012-05-06 23:01:27 +0200258}
Victor Stinner37e4ef72016-09-09 20:00:13 -0700259/*[clinic end generated code: output=f27abae460122706 input=a9049054013a1b77]*/