xref: /freebsd/contrib/xz/src/liblzma/api/lzma/filter.h (revision 2f9cd13d)
1 /**
2  * \file        lzma/filter.h
3  * \brief       Common filter related types and functions
4  * \note        Never include this file directly. Use <lzma.h> instead.
5  */
6 
7 /*
8  * Author: Lasse Collin
9  *
10  * This file has been put into the public domain.
11  * You can do whatever you want with this file.
12  */
13 
14 #ifndef LZMA_H_INTERNAL
15 #	error Never include this file directly. Use <lzma.h> instead.
16 #endif
17 
18 
19 /**
20  * \brief       Maximum number of filters in a chain
21  *
22  * A filter chain can have 1-4 filters, of which three are allowed to change
23  * the size of the data. Usually only one or two filters are needed.
24  */
25 #define LZMA_FILTERS_MAX 4
26 
27 
28 /**
29  * \brief       Filter options
30  *
31  * This structure is used to pass a Filter ID and a pointer to the filter's
32  * options to liblzma. A few functions work with a single lzma_filter
33  * structure, while most functions expect a filter chain.
34  *
35  * A filter chain is indicated with an array of lzma_filter structures.
36  * The array is terminated with .id = LZMA_VLI_UNKNOWN. Thus, the filter
37  * array must have LZMA_FILTERS_MAX + 1 elements (that is, five) to
38  * be able to hold any arbitrary filter chain. This is important when
39  * using lzma_block_header_decode() from block.h, because a filter array
40  * that is too small would make liblzma write past the end of the array.
41  */
42 typedef struct {
43 	/**
44 	 * \brief       Filter ID
45 	 *
46 	 * Use constants whose name begin with `LZMA_FILTER_' to specify
47 	 * different filters. In an array of lzma_filter structures, use
48 	 * LZMA_VLI_UNKNOWN to indicate end of filters.
49 	 *
50 	 * \note        This is not an enum, because on some systems enums
51 	 *              cannot be 64-bit.
52 	 */
53 	lzma_vli id;
54 
55 	/**
56 	 * \brief       Pointer to filter-specific options structure
57 	 *
58 	 * If the filter doesn't need options, set this to NULL. If id is
59 	 * set to LZMA_VLI_UNKNOWN, options is ignored, and thus
60 	 * doesn't need be initialized.
61 	 */
62 	void *options;
63 
64 } lzma_filter;
65 
66 
67 /**
68  * \brief       Test if the given Filter ID is supported for encoding
69  *
70  * \param       id      Filter ID
71  *
72  * \return      lzma_bool:
73  *              - true if the Filter ID is supported for encoding by this
74  *                liblzma build.
75   *             - false otherwise.
76  */
77 extern LZMA_API(lzma_bool) lzma_filter_encoder_is_supported(lzma_vli id)
78 		lzma_nothrow lzma_attr_const;
79 
80 
81 /**
82  * \brief       Test if the given Filter ID is supported for decoding
83  *
84  * \param       id      Filter ID
85  *
86  * \return      lzma_bool:
87  *              - true if the Filter ID is supported for decoding by this
88  *                liblzma build.
89  *              - false otherwise.
90  */
91 extern LZMA_API(lzma_bool) lzma_filter_decoder_is_supported(lzma_vli id)
92 		lzma_nothrow lzma_attr_const;
93 
94 
95 /**
96  * \brief       Copy the filters array
97  *
98  * Copy the Filter IDs and filter-specific options from src to dest.
99  * Up to LZMA_FILTERS_MAX filters are copied, plus the terminating
100  * .id == LZMA_VLI_UNKNOWN. Thus, dest should have at least
101  * LZMA_FILTERS_MAX + 1 elements space unless the caller knows that
102  * src is smaller than that.
103  *
104  * Unless the filter-specific options is NULL, the Filter ID has to be
105  * supported by liblzma, because liblzma needs to know the size of every
106  * filter-specific options structure. The filter-specific options are not
107  * validated. If options is NULL, any unsupported Filter IDs are copied
108  * without returning an error.
109  *
110  * Old filter-specific options in dest are not freed, so dest doesn't
111  * need to be initialized by the caller in any way.
112  *
113  * If an error occurs, memory possibly already allocated by this function
114  * is always freed. liblzma versions older than 5.2.7 may modify the dest
115  * array and leave its contents in an undefined state if an error occurs.
116  * liblzma 5.2.7 and newer only modify the dest array when returning LZMA_OK.
117  *
118  * \param       src         Array of filters terminated with
119  *                          .id == LZMA_VLI_UNKNOWN.
120  * \param[out]  dest        Destination filter array
121  * \param       allocator   lzma_allocator for custom allocator functions.
122  *                          Set to NULL to use malloc() and free().
123  *
124  * \return      Possible lzma_ret values:
125  *              - LZMA_OK
126  *              - LZMA_MEM_ERROR
127  *              - LZMA_OPTIONS_ERROR: Unsupported Filter ID and its options
128  *                is not NULL.
129  *              - LZMA_PROG_ERROR: src or dest is NULL.
130  */
131 extern LZMA_API(lzma_ret) lzma_filters_copy(
132 		const lzma_filter *src, lzma_filter *dest,
133 		const lzma_allocator *allocator)
134 		lzma_nothrow lzma_attr_warn_unused_result;
135 
136 
137 /**
138  * \brief       Free the options in the array of lzma_filter structures
139  *
140  * This frees the filter chain options. The filters array itself is not freed.
141  *
142  * The filters array must have at most LZMA_FILTERS_MAX + 1 elements
143  * including the terminating element which must have .id = LZMA_VLI_UNKNOWN.
144  * For all elements before the terminating element:
145  *   - options will be freed using the given lzma_allocator or,
146  *     if allocator is NULL, using free().
147  *   - options will be set to NULL.
148  *   - id will be set to LZMA_VLI_UNKNOWN.
149  *
150  * If filters is NULL, this does nothing. Again, this never frees the
151  * filters array itself.
152  *
153  * \param       filters     Array of filters terminated with
154  *                          .id == LZMA_VLI_UNKNOWN.
155  * \param       allocator   lzma_allocator for custom allocator functions.
156  *                          Set to NULL to use malloc() and free().
157  */
158 extern LZMA_API(void) lzma_filters_free(
159 		lzma_filter *filters, const lzma_allocator *allocator)
160 		lzma_nothrow;
161 
162 
163 /**
164  * \brief       Calculate approximate memory requirements for raw encoder
165  *
166  * This function can be used to calculate the memory requirements for
167  * Block and Stream encoders too because Block and Stream encoders don't
168  * need significantly more memory than raw encoder.
169  *
170  * \param       filters     Array of filters terminated with
171  *                          .id == LZMA_VLI_UNKNOWN.
172  *
173  * \return      Number of bytes of memory required for the given
174  *              filter chain when encoding or UINT64_MAX on error.
175  */
176 extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters)
177 		lzma_nothrow lzma_attr_pure;
178 
179 
180 /**
181  * \brief       Calculate approximate memory requirements for raw decoder
182  *
183  * This function can be used to calculate the memory requirements for
184  * Block and Stream decoders too because Block and Stream decoders don't
185  * need significantly more memory than raw decoder.
186  *
187  * \param       filters     Array of filters terminated with
188  *                          .id == LZMA_VLI_UNKNOWN.
189  *
190  * \return      Number of bytes of memory required for the given
191  *              filter chain when decoding or UINT64_MAX on error.
192  */
193 extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters)
194 		lzma_nothrow lzma_attr_pure;
195 
196 
197 /**
198  * \brief       Initialize raw encoder
199  *
200  * This function may be useful when implementing custom file formats.
201  *
202  * The `action' with lzma_code() can be LZMA_RUN, LZMA_SYNC_FLUSH (if the
203  * filter chain supports it), or LZMA_FINISH.
204  *
205  * \param       strm      Pointer to lzma_stream that is at least
206  *                        initialized with LZMA_STREAM_INIT.
207  * \param       filters   Array of filters terminated with
208  *                        .id == LZMA_VLI_UNKNOWN.
209  *
210  * \return      Possible lzma_ret values:
211  *              - LZMA_OK
212  *              - LZMA_MEM_ERROR
213  *              - LZMA_OPTIONS_ERROR
214  *              - LZMA_PROG_ERROR
215  */
216 extern LZMA_API(lzma_ret) lzma_raw_encoder(
217 		lzma_stream *strm, const lzma_filter *filters)
218 		lzma_nothrow lzma_attr_warn_unused_result;
219 
220 
221 /**
222  * \brief       Initialize raw decoder
223  *
224  * The initialization of raw decoder goes similarly to raw encoder.
225  *
226  * The `action' with lzma_code() can be LZMA_RUN or LZMA_FINISH. Using
227  * LZMA_FINISH is not required, it is supported just for convenience.
228  *
229  * \param       strm      Pointer to lzma_stream that is at least
230  *                        initialized with LZMA_STREAM_INIT.
231  * \param       filters   Array of filters terminated with
232  *                        .id == LZMA_VLI_UNKNOWN.
233  *
234  * \return      Possible lzma_ret values:
235  *              - LZMA_OK
236  *              - LZMA_MEM_ERROR
237  *              - LZMA_OPTIONS_ERROR
238  *              - LZMA_PROG_ERROR
239  */
240 extern LZMA_API(lzma_ret) lzma_raw_decoder(
241 		lzma_stream *strm, const lzma_filter *filters)
242 		lzma_nothrow lzma_attr_warn_unused_result;
243 
244 
245 /**
246  * \brief       Update the filter chain in the encoder
247  *
248  * This function may be called after lzma_code() has returned LZMA_STREAM_END
249  * when LZMA_FULL_BARRIER, LZMA_FULL_FLUSH, or LZMA_SYNC_FLUSH was used:
250  *
251  *  - After LZMA_FULL_BARRIER or LZMA_FULL_FLUSH: Single-threaded .xz Stream
252  *    encoder (lzma_stream_encoder()) and (since liblzma 5.4.0) multi-threaded
253  *    Stream encoder (lzma_stream_encoder_mt()) allow setting a new filter
254  *    chain to be used for the next Block(s).
255  *
256  *  - After LZMA_SYNC_FLUSH: Raw encoder (lzma_raw_encoder()),
257  *    Block encoder (lzma_block_encoder()), and single-threaded .xz Stream
258  *    encoder (lzma_stream_encoder()) allow changing certain filter-specific
259  *    options in the middle of encoding. The actual filters in the chain
260  *    (Filter IDs) must not be changed! Currently only the lc, lp, and pb
261  *    options of LZMA2 (not LZMA1) can be changed this way.
262  *
263  *  - In the future some filters might allow changing some of their options
264  *    without any barrier or flushing but currently such filters don't exist.
265  *
266  * This function may also be called when no data has been compressed yet
267  * although this is rarely useful. In that case, this function will behave
268  * as if LZMA_FULL_FLUSH (Stream encoders) or LZMA_SYNC_FLUSH (Raw or Block
269  * encoder) had been used right before calling this function.
270  *
271  * \param       strm      Pointer to lzma_stream that is at least
272  *                        initialized with LZMA_STREAM_INIT.
273  * \param       filters   Array of filters terminated with
274  *                        .id == LZMA_VLI_UNKNOWN.
275  *
276  * \return      Possible lzma_ret values:
277  *              - LZMA_OK
278  *              - LZMA_MEM_ERROR
279  *              - LZMA_MEMLIMIT_ERROR
280  *              - LZMA_OPTIONS_ERROR
281  *              - LZMA_PROG_ERROR
282  */
283 extern LZMA_API(lzma_ret) lzma_filters_update(
284 		lzma_stream *strm, const lzma_filter *filters) lzma_nothrow;
285 
286 
287 /**
288  * \brief       Single-call raw encoder
289  *
290  * \note        There is no function to calculate how big output buffer
291  *              would surely be big enough. (lzma_stream_buffer_bound()
292  *              works only for lzma_stream_buffer_encode(); raw encoder
293  *              won't necessarily meet that bound.)
294  *
295  * \param       filters     Array of filters terminated with
296  *                          .id == LZMA_VLI_UNKNOWN.
297  * \param       allocator   lzma_allocator for custom allocator functions.
298  *                          Set to NULL to use malloc() and free().
299  * \param       in          Beginning of the input buffer
300  * \param       in_size     Size of the input buffer
301  * \param[out]  out         Beginning of the output buffer
302  * \param[out]  out_pos     The next byte will be written to out[*out_pos].
303  *                          *out_pos is updated only if encoding succeeds.
304  * \param       out_size    Size of the out buffer; the first byte into
305  *                          which no data is written to is out[out_size].
306  *
307  * \return      Possible lzma_ret values:
308  *              - LZMA_OK: Encoding was successful.
309  *              - LZMA_BUF_ERROR: Not enough output buffer space.
310  *              - LZMA_OPTIONS_ERROR
311  *              - LZMA_MEM_ERROR
312  *              - LZMA_DATA_ERROR
313  *              - LZMA_PROG_ERROR
314  */
315 extern LZMA_API(lzma_ret) lzma_raw_buffer_encode(
316 		const lzma_filter *filters, const lzma_allocator *allocator,
317 		const uint8_t *in, size_t in_size, uint8_t *out,
318 		size_t *out_pos, size_t out_size) lzma_nothrow;
319 
320 
321 /**
322  * \brief       Single-call raw decoder
323  *
324  * \param       filters     Array of filters terminated with
325  *                          .id == LZMA_VLI_UNKNOWN.
326  * \param       allocator   lzma_allocator for custom allocator functions.
327  *                          Set to NULL to use malloc() and free().
328  * \param       in          Beginning of the input buffer
329  * \param       in_pos      The next byte will be read from in[*in_pos].
330  *                          *in_pos is updated only if decoding succeeds.
331  * \param       in_size     Size of the input buffer; the first byte that
332  *                          won't be read is in[in_size].
333  * \param[out]  out         Beginning of the output buffer
334  * \param[out]  out_pos     The next byte will be written to out[*out_pos].
335  *                          *out_pos is updated only if encoding succeeds.
336  * \param       out_size    Size of the out buffer; the first byte into
337  *                          which no data is written to is out[out_size].
338  *
339  * \return      Possible lzma_ret values:
340  *              - LZMA_OK: Decoding was successful.
341  *              - LZMA_BUF_ERROR: Not enough output buffer space.
342  *              - LZMA_OPTIONS_ERROR
343  *              - LZMA_MEM_ERROR
344  *              - LZMA_DATA_ERROR
345  *              - LZMA_PROG_ERROR
346  */
347 extern LZMA_API(lzma_ret) lzma_raw_buffer_decode(
348 		const lzma_filter *filters, const lzma_allocator *allocator,
349 		const uint8_t *in, size_t *in_pos, size_t in_size,
350 		uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow;
351 
352 
353 /**
354  * \brief       Get the size of the Filter Properties field
355  *
356  * This function may be useful when implementing custom file formats
357  * using the raw encoder and decoder.
358  *
359  * \note        This function validates the Filter ID, but does not
360  *              necessarily validate the options. Thus, it is possible
361  *              that this returns LZMA_OK while the following call to
362  *              lzma_properties_encode() returns LZMA_OPTIONS_ERROR.
363  *
364  * \param[out]  size    Pointer to uint32_t to hold the size of the properties
365  * \param       filter  Filter ID and options (the size of the properties may
366  *                      vary depending on the options)
367  *
368  * \return      Possible lzma_ret values:
369  *              - LZMA_OK
370  *              - LZMA_OPTIONS_ERROR
371  *              - LZMA_PROG_ERROR
372  */
373 extern LZMA_API(lzma_ret) lzma_properties_size(
374 		uint32_t *size, const lzma_filter *filter) lzma_nothrow;
375 
376 
377 /**
378  * \brief       Encode the Filter Properties field
379  *
380  * \note        Even this function won't validate more options than actually
381  *              necessary. Thus, it is possible that encoding the properties
382  *              succeeds but using the same options to initialize the encoder
383  *              will fail.
384  *
385  * \note        If lzma_properties_size() indicated that the size
386  *              of the Filter Properties field is zero, calling
387  *              lzma_properties_encode() is not required, but it
388  *              won't do any harm either.
389  *
390  * \param       filter  Filter ID and options
391  * \param[out]  props   Buffer to hold the encoded options. The size of
392  *                      the buffer must have been already determined with
393  *                      lzma_properties_size().
394  *
395  * \return      Possible lzma_ret values:
396  *              - LZMA_OK
397  *              - LZMA_PROG_ERROR
398  */
399 extern LZMA_API(lzma_ret) lzma_properties_encode(
400 		const lzma_filter *filter, uint8_t *props) lzma_nothrow;
401 
402 
403 /**
404  * \brief       Decode the Filter Properties field
405  *
406  * \param       filter      filter->id must have been set to the correct
407  *                          Filter ID. filter->options doesn't need to be
408  *                          initialized (it's not freed by this function). The
409  *                          decoded options will be stored in filter->options;
410  *                          it's application's responsibility to free it when
411  *                          appropriate. filter->options is set to NULL if
412  *                          there are no properties or if an error occurs.
413  * \param       allocator   lzma_allocator for custom allocator functions.
414  *                          Set to NULL to use malloc() and free().
415  *                          and in case of an error, also free().
416  * \param       props       Input buffer containing the properties.
417  * \param       props_size  Size of the properties. This must be the exact
418  *                          size; giving too much or too little input will
419  *                          return LZMA_OPTIONS_ERROR.
420  *
421  * \return      Possible lzma_ret values:
422  *              - LZMA_OK
423  *              - LZMA_OPTIONS_ERROR
424  *              - LZMA_MEM_ERROR
425  */
426 extern LZMA_API(lzma_ret) lzma_properties_decode(
427 		lzma_filter *filter, const lzma_allocator *allocator,
428 		const uint8_t *props, size_t props_size) lzma_nothrow;
429 
430 
431 /**
432  * \brief       Calculate encoded size of a Filter Flags field
433  *
434  * Knowing the size of Filter Flags is useful to know when allocating
435  * memory to hold the encoded Filter Flags.
436  *
437  * \note        If you need to calculate size of List of Filter Flags,
438  *              you need to loop over every lzma_filter entry.
439  *
440  * \param[out]  size    Pointer to integer to hold the calculated size
441  * \param       filter  Filter ID and associated options whose encoded
442  *                      size is to be calculated
443  *
444  * \return      Possible lzma_ret values:
445  *              - LZMA_OK: *size set successfully. Note that this doesn't
446  *                guarantee that filter->options is valid, thus
447  *                lzma_filter_flags_encode() may still fail.
448  *              - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options.
449  *              - LZMA_PROG_ERROR: Invalid options
450  */
451 extern LZMA_API(lzma_ret) lzma_filter_flags_size(
452 		uint32_t *size, const lzma_filter *filter)
453 		lzma_nothrow lzma_attr_warn_unused_result;
454 
455 
456 /**
457  * \brief       Encode Filter Flags into given buffer
458  *
459  * In contrast to some functions, this doesn't allocate the needed buffer.
460  * This is due to how this function is used internally by liblzma.
461  *
462  * \param       filter      Filter ID and options to be encoded
463  * \param[out]  out         Beginning of the output buffer
464  * \param[out]  out_pos     out[*out_pos] is the next write position. This
465  *                          is updated by the encoder.
466  * \param       out_size    out[out_size] is the first byte to not write.
467  *
468  * \return      Possible lzma_ret values:
469  *              - LZMA_OK: Encoding was successful.
470  *              - LZMA_OPTIONS_ERROR: Invalid or unsupported options.
471  *              - LZMA_PROG_ERROR: Invalid options or not enough output
472  *                buffer space (you should have checked it with
473  *                lzma_filter_flags_size()).
474  */
475 extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filter,
476 		uint8_t *out, size_t *out_pos, size_t out_size)
477 		lzma_nothrow lzma_attr_warn_unused_result;
478 
479 
480 /**
481  * \brief       Decode Filter Flags from given buffer
482  *
483  * The decoded result is stored into *filter. The old value of
484  * filter->options is not free()d. If anything other than LZMA_OK
485  * is returned, filter->options is set to NULL.
486  *
487  * \param[out]  filter      Destination filter. The decoded Filter ID will
488  *                          be stored in filter->id. If options are needed
489  *                          they will be allocated and the pointer will be
490  *                          stored in filter->options.
491  * \param       allocator   lzma_allocator for custom allocator functions.
492  *                          Set to NULL to use malloc() and free().
493  * \param       in          Beginning of the input buffer
494  * \param[out]  in_pos      The next byte will be read from in[*in_pos].
495  *                          *in_pos is updated only if decoding succeeds.
496  * \param       in_size     Size of the input buffer; the first byte that
497  *                          won't be read is in[in_size].
498  *
499  * \return      Possible lzma_ret values:
500  *              - LZMA_OK
501  *              - LZMA_OPTIONS_ERROR
502  *              - LZMA_MEM_ERROR
503  *              - LZMA_DATA_ERROR
504  *              - LZMA_PROG_ERROR
505  */
506 extern LZMA_API(lzma_ret) lzma_filter_flags_decode(
507 		lzma_filter *filter, const lzma_allocator *allocator,
508 		const uint8_t *in, size_t *in_pos, size_t in_size)
509 		lzma_nothrow lzma_attr_warn_unused_result;
510 
511 
512 /***********
513  * Strings *
514  ***********/
515 
516 /**
517  * \brief       Allow or show all filters
518  *
519  * By default only the filters supported in the .xz format are accept by
520  * lzma_str_to_filters() or shown by lzma_str_list_filters().
521  */
522 #define LZMA_STR_ALL_FILTERS    UINT32_C(0x01)
523 
524 
525 /**
526  * \brief       Do not validate the filter chain in lzma_str_to_filters()
527  *
528  * By default lzma_str_to_filters() can return an error if the filter chain
529  * as a whole isn't usable in the .xz format or in the raw encoder or decoder.
530  * With this flag, this validation is skipped. This flag doesn't affect the
531  * handling of the individual filter options. To allow non-.xz filters also
532  * LZMA_STR_ALL_FILTERS is needed.
533  */
534 #define LZMA_STR_NO_VALIDATION  UINT32_C(0x02)
535 
536 
537 /**
538  * \brief       Stringify encoder options
539  *
540  * Show the filter-specific options that the encoder will use.
541  * This may be useful for verbose diagnostic messages.
542  *
543  * Note that if options were decoded from .xz headers then the encoder options
544  * may be undefined. This flag shouldn't be used in such a situation.
545  */
546 #define LZMA_STR_ENCODER        UINT32_C(0x10)
547 
548 
549 /**
550  * \brief       Stringify decoder options
551  *
552  * Show the filter-specific options that the decoder will use.
553  * This may be useful for showing what filter options were decoded
554  * from file headers.
555  */
556 #define LZMA_STR_DECODER        UINT32_C(0x20)
557 
558 
559 /**
560  * \brief       Produce xz-compatible getopt_long() syntax
561  *
562  * That is, "delta:dist=2 lzma2:dict=4MiB,pb=1,lp=1" becomes
563  * "--delta=dist=2 --lzma2=dict=4MiB,pb=1,lp=1".
564  *
565  * This syntax is compatible with xz 5.0.0 as long as the filters and
566  * their options are supported too.
567  */
568 #define LZMA_STR_GETOPT_LONG    UINT32_C(0x40)
569 
570 
571 /**
572  * \brief       Use two dashes "--" instead of a space to separate filters
573  *
574  * That is, "delta:dist=2 lzma2:pb=1,lp=1" becomes
575  * "delta:dist=2--lzma2:pb=1,lp=1". This looks slightly odd but this
576  * kind of strings should be usable on the command line without quoting.
577  * However, it is possible that future versions with new filter options
578  * might produce strings that require shell quoting anyway as the exact
579  * set of possible characters isn't frozen for now.
580  *
581  * It is guaranteed that the single quote (') will never be used in
582  * filter chain strings (even if LZMA_STR_NO_SPACES isn't used).
583  */
584 #define LZMA_STR_NO_SPACES      UINT32_C(0x80)
585 
586 
587 /**
588  * \brief       Convert a string to a filter chain
589  *
590  * This tries to make it easier to write applications that allow users
591  * to set custom compression options. This only handles the filter
592  * configuration (including presets) but not the number of threads,
593  * block size, check type, or memory limits.
594  *
595  * The input string can be either a preset or a filter chain. Presets
596  * begin with a digit 0-9 and may be followed by zero or more flags
597  * which are lower-case letters. Currently only "e" is supported, matching
598  * LZMA_PRESET_EXTREME. For partial xz command line syntax compatibility,
599  * a preset string may start with a single dash "-".
600  *
601  * A filter chain consists of one or more "filtername:opt1=value1,opt2=value2"
602  * strings separated by one or more spaces. Leading and trailing spaces are
603  * ignored. All names and values must be lower-case. Extra commas in the
604  * option list are ignored. The order of filters is significant: when
605  * encoding, the uncompressed input data goes to the leftmost filter first.
606  * Normally "lzma2" is the last filter in the chain.
607  *
608  * If one wishes to avoid spaces, for example, to avoid shell quoting,
609  * it is possible to use two dashes "--" instead of spaces to separate
610  * the filters.
611  *
612  * For xz command line compatibility, each filter may be prefixed with
613  * two dashes "--" and the colon ":" separating the filter name from
614  * the options may be replaced with an equals sign "=".
615  *
616  * By default, only filters that can be used in the .xz format are accepted.
617  * To allow all filters (LZMA1) use the flag LZMA_STR_ALL_FILTERS.
618  *
619  * By default, very basic validation is done for the filter chain as a whole,
620  * for example, that LZMA2 is only used as the last filter in the chain.
621  * The validation isn't perfect though and it's possible that this function
622  * succeeds but using the filter chain for encoding or decoding will still
623  * result in LZMA_OPTIONS_ERROR. To disable this validation, use the flag
624  * LZMA_STR_NO_VALIDATION.
625  *
626  * The available filter names and their options are available via
627  * lzma_str_list_filters(). See the xz man page for the description
628  * of filter names and options.
629  *
630  * For command line applications, below is an example how an error message
631  * can be displayed. Note the use of an empty string for the field width.
632  * If "^" was used there it would create an off-by-one error except at
633  * the very beginning of the line.
634  *
635  * \code{.c}
636  * const char *str = ...; // From user
637  * lzma_filter filters[LZMA_FILTERS_MAX + 1];
638  * int pos;
639  * const char *msg = lzma_str_to_filters(str, &pos, filters, 0, NULL);
640  * if (msg != NULL) {
641  *     printf("%s: Error in XZ compression options:\n", argv[0]);
642  *     printf("%s: %s\n", argv[0], str);
643  *     printf("%s: %*s^\n", argv[0], errpos, "");
644  *     printf("%s: %s\n", argv[0], msg);
645  * }
646  * \endcode
647  *
648  * \param       str         User-supplied string describing a preset or
649  *                          a filter chain. If a default value is needed and
650  *                          you don't know what would be good, use "6" since
651  *                          that is the default preset in xz too.
652  * \param[out]  error_pos   If this isn't NULL, this value will be set on
653  *                          both success and on all errors. This tells the
654  *                          location of the error in the string. This is
655  *                          an int to make it straightforward to use this
656  *                          as printf() field width. The value is guaranteed
657  *                          to be in the range [0, INT_MAX] even if strlen(str)
658  *                          somehow was greater than INT_MAX.
659  * \param[out]  filters     An array of lzma_filter structures. There must
660  *                          be LZMA_FILTERS_MAX + 1 (that is, five) elements
661  *                          in the array. The old contents are ignored so it
662  *                          doesn't need to be initialized. This array is
663  *                          modified only if this function returns NULL.
664  *                          Once the allocated filter options are no longer
665  *                          needed, lzma_filters_free() can be used to free the
666  *                          options (it doesn't free the filters array itself).
667  * \param       flags       Bitwise-or of zero or more of the flags
668  *                          LZMA_STR_ALL_FILTERS and LZMA_STR_NO_VALIDATION.
669  * \param       allocator   lzma_allocator for custom allocator functions.
670  *                          Set to NULL to use malloc() and free().
671  *
672  * \return      On success, NULL is returned. On error, a statically-allocated
673  *              error message is returned which together with the error_pos
674  *              should give some idea what is wrong.
675  */
676 extern LZMA_API(const char *) lzma_str_to_filters(
677 		const char *str, int *error_pos, lzma_filter *filters,
678 		uint32_t flags, const lzma_allocator *allocator)
679 		lzma_nothrow lzma_attr_warn_unused_result;
680 
681 
682 /**
683  * \brief       Convert a filter chain to a string
684  *
685  * Use cases:
686  *
687  *   - Verbose output showing the full encoder options to the user
688  *     (use LZMA_STR_ENCODER in flags)
689  *
690  *   - Showing the filters and options that are required to decode a file
691  *     (use LZMA_STR_DECODER in flags)
692  *
693  *   - Showing the filter names without any options in informational messages
694  *     where the technical details aren't important (no flags). In this case
695  *     the .options in the filters array are ignored and may be NULL even if
696  *     a filter has a mandatory options structure.
697  *
698  * Note that even if the filter chain was specified using a preset,
699  * the resulting filter chain isn't reversed to a preset. So if you
700  * specify "6" to lzma_str_to_filters() then lzma_str_from_filters()
701  * will produce a string containing "lzma2".
702  *
703  * \param[out]  str         On success *str will be set to point to an
704  *                          allocated string describing the given filter
705  *                          chain. Old value is ignored. On error *str is
706  *                          always set to NULL.
707  * \param       filters     Array of filters terminated with
708  *                          .id == LZMA_VLI_UNKNOWN.
709  * \param       flags       Bitwise-or of zero or more of the flags
710  *                          LZMA_STR_ENCODER, LZMA_STR_DECODER,
711  *                          LZMA_STR_GETOPT_LONG, and LZMA_STR_NO_SPACES.
712  * \param       allocator   lzma_allocator for custom allocator functions.
713  *                          Set to NULL to use malloc() and free().
714  *
715  * \return      Possible lzma_ret values:
716  *              - LZMA_OK
717  *              - LZMA_OPTIONS_ERROR: Empty filter chain
718  *                (filters[0].id == LZMA_VLI_UNKNOWN) or the filter chain
719  *                includes a Filter ID that is not supported by this function.
720  *              - LZMA_MEM_ERROR
721  *              - LZMA_PROG_ERROR
722  */
723 extern LZMA_API(lzma_ret) lzma_str_from_filters(
724 		char **str, const lzma_filter *filters, uint32_t flags,
725 		const lzma_allocator *allocator)
726 		lzma_nothrow lzma_attr_warn_unused_result;
727 
728 
729 /**
730  * \brief       List available filters and/or their options (for help message)
731  *
732  * If a filter_id is given then only one line is created which contains the
733  * filter name. If LZMA_STR_ENCODER or LZMA_STR_DECODER is used then the
734  * options read by the encoder or decoder are printed on the same line.
735  *
736  * If filter_id is LZMA_VLI_UNKNOWN then all supported .xz-compatible filters
737  * are listed:
738  *
739  *   - If neither LZMA_STR_ENCODER nor LZMA_STR_DECODER is used then
740  *     the supported filter names are listed on a single line separated
741  *     by spaces.
742  *
743  *   - If LZMA_STR_ENCODER or LZMA_STR_DECODER is used then filters and
744  *     the supported options are listed one filter per line. There won't
745  *     be a newline after the last filter.
746  *
747  *   - If LZMA_STR_ALL_FILTERS is used then the list will include also
748  *     those filters that cannot be used in the .xz format (LZMA1).
749  *
750  * \param       str         On success *str will be set to point to an
751  *                          allocated string listing the filters and options.
752  *                          Old value is ignored. On error *str is always set
753  *                          to NULL.
754  * \param       filter_id   Filter ID or LZMA_VLI_UNKNOWN.
755  * \param       flags       Bitwise-or of zero or more of the flags
756  *                          LZMA_STR_ALL_FILTERS, LZMA_STR_ENCODER,
757  *                          LZMA_STR_DECODER, and LZMA_STR_GETOPT_LONG.
758  * \param       allocator   lzma_allocator for custom allocator functions.
759  *                          Set to NULL to use malloc() and free().
760  *
761  * \return      Possible lzma_ret values:
762  *              - LZMA_OK
763  *              - LZMA_OPTIONS_ERROR: Unsupported filter_id or flags
764  *              - LZMA_MEM_ERROR
765  *              - LZMA_PROG_ERROR
766  */
767 extern LZMA_API(lzma_ret) lzma_str_list_filters(
768 		char **str, lzma_vli filter_id, uint32_t flags,
769 		const lzma_allocator *allocator)
770 		lzma_nothrow lzma_attr_warn_unused_result;
771