Where Online Learning is simpler!
The C and C++ Include Header Files
/usr/include/lzma/filter.h
$ cat -n /usr/include/lzma/filter.h 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;
Welcome to MyWebUniversity on April 15, 2025.
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2025 MyWebUniversity.com ™