static int Compressor_init_alone(lzma_stream *lzs, uint32_t preset, PyObject *filterspecs) { lzma_ret lzret; if (filterspecs == Py_None) { lzma_options_lzma options; if (lzma_lzma_preset(&options, preset)) { PyErr_Format(Error, "Invalid compression preset: %d", preset); return -1; } lzret = lzma_alone_encoder(lzs, &options); } else { lzma_filter filters[LZMA_FILTERS_MAX + 1]; if (parse_filter_chain_spec(filters, filterspecs) == -1) return -1; if (filters[0].id == LZMA_FILTER_LZMA1 && filters[1].id == LZMA_VLI_UNKNOWN) { lzret = lzma_alone_encoder(lzs, filters[0].options); } else { PyErr_SetString(PyExc_ValueError, "Invalid filter chain for FORMAT_ALONE - " "must be a single LZMA1 filter"); lzret = LZMA_PROG_ERROR; } free_filter_chain(filters); } if (PyErr_Occurred() || catch_lzma_error(lzret)) return -1; else return 0; }
static int parse_filter_chain_spec(lzma_filter filters[], PyObject *filterspecs) { Py_ssize_t i, num_filters; num_filters = PySequence_Length(filterspecs); if (num_filters == -1) return -1; if (num_filters > LZMA_FILTERS_MAX) { PyErr_Format(PyExc_ValueError, "Too many filters - liblzma supports a maximum of %d", LZMA_FILTERS_MAX); return -1; } for (i = 0; i < num_filters; i++) { int ok = 1; PyObject *spec = PySequence_GetItem(filterspecs, i); if (spec == NULL || !lzma_filter_converter(spec, &filters[i])) ok = 0; Py_XDECREF(spec); if (!ok) { filters[i].id = LZMA_VLI_UNKNOWN; free_filter_chain(filters); return -1; } } filters[num_filters].id = LZMA_VLI_UNKNOWN; return 0; }
static int Decompressor_init_raw(lzma_stream *lzs, PyObject *filterspecs) { lzma_filter filters[LZMA_FILTERS_MAX + 1]; lzma_ret lzret; if (parse_filter_chain_spec(filters, filterspecs) == -1) return -1; lzret = lzma_raw_decoder(lzs, filters); free_filter_chain(filters); if (catch_lzma_error(lzret)) return -1; else return 0; }
static int Compressor_init_raw(lzma_stream *lzs, PyObject *filterspecs) { lzma_filter filters[LZMA_FILTERS_MAX + 1]; lzma_ret lzret; if (filterspecs == Py_None) { PyErr_SetString(PyExc_ValueError, "Must specify filters for FORMAT_RAW"); return -1; } if (parse_filter_chain_spec(filters, filterspecs) == -1) return -1; lzret = lzma_raw_encoder(lzs, filters); free_filter_chain(filters); if (catch_lzma_error(lzret)) return -1; else return 0; }
static int Compressor_init_xz(lzma_stream *lzs, int check, uint32_t preset, PyObject *filterspecs) { lzma_ret lzret; if (filterspecs == Py_None) { lzret = lzma_easy_encoder(lzs, preset, check); } else { lzma_filter filters[LZMA_FILTERS_MAX + 1]; if (parse_filter_chain_spec(filters, filterspecs) == -1) return -1; lzret = lzma_stream_encoder(lzs, filters, check); free_filter_chain(filters); } if (catch_lzma_error(lzret)) return -1; else return 0; }
void free_filter_options_data(filter_options_data_t *options_data) { if (options_data->chain) { free_filter_chain(options_data->chain); } free(options_data); }