liblzma (XZ Utils) 5.4.5
Data Structures | Macros | Functions
block.h File Reference

.xz Block handling More...

Data Structures

struct  lzma_block
 Options for the Block and Block Header encoders and decoders. More...
 

Macros

#define LZMA_BLOCK_HEADER_SIZE_MIN   8
 
#define LZMA_BLOCK_HEADER_SIZE_MAX   1024
 
#define lzma_block_header_size_decode(b)   (((uint32_t)(b) + 1) * 4)
 Decode the Block Header Size field.
 

Functions

lzma_ret lzma_block_header_size (lzma_block *block) lzma_nothrow lzma_attr_warn_unused_result
 Calculate Block Header Size.
 
lzma_ret lzma_block_header_encode (const lzma_block *block, uint8_t *out) lzma_nothrow lzma_attr_warn_unused_result
 Encode Block Header.
 
lzma_ret lzma_block_header_decode (lzma_block *block, const lzma_allocator *allocator, const uint8_t *in) lzma_nothrow lzma_attr_warn_unused_result
 Decode Block Header.
 
lzma_ret lzma_block_compressed_size (lzma_block *block, lzma_vli unpadded_size) lzma_nothrow lzma_attr_warn_unused_result
 Validate and set Compressed Size according to Unpadded Size.
 
lzma_vli lzma_block_unpadded_size (const lzma_block *block) lzma_nothrow lzma_attr_pure
 Calculate Unpadded Size.
 
lzma_vli lzma_block_total_size (const lzma_block *block) lzma_nothrow lzma_attr_pure
 Calculate the total encoded size of a Block.
 
lzma_ret lzma_block_encoder (lzma_stream *strm, lzma_block *block) lzma_nothrow lzma_attr_warn_unused_result
 Initialize .xz Block encoder.
 
lzma_ret lzma_block_decoder (lzma_stream *strm, lzma_block *block) lzma_nothrow lzma_attr_warn_unused_result
 Initialize .xz Block decoder.
 
size_t lzma_block_buffer_bound (size_t uncompressed_size) lzma_nothrow
 Calculate maximum output size for single-call Block encoding.
 
lzma_ret lzma_block_buffer_encode (lzma_block *block, const lzma_allocator *allocator, const uint8_t *in, size_t in_size, uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow lzma_attr_warn_unused_result
 Single-call .xz Block encoder.
 
lzma_ret lzma_block_uncomp_encode (lzma_block *block, const uint8_t *in, size_t in_size, uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow lzma_attr_warn_unused_result
 Single-call uncompressed .xz Block encoder.
 
lzma_ret lzma_block_buffer_decode (lzma_block *block, const lzma_allocator *allocator, const uint8_t *in, size_t *in_pos, size_t in_size, uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow
 Single-call .xz Block decoder.
 

Detailed Description

.xz Block handling

Note
Never include this file directly. Use <lzma.h> instead.

Macro Definition Documentation

◆ lzma_block_header_size_decode

#define lzma_block_header_size_decode (   b)    (((uint32_t)(b) + 1) * 4)

Decode the Block Header Size field.

To decode Block Header using lzma_block_header_decode(), the size of the Block Header has to be known and stored into lzma_block.header_size. The size can be calculated from the first byte of a Block using this macro. Note that if the first byte is 0x00, it indicates beginning of Index; use this macro only when the byte is not 0x00.

There is no encoding macro because lzma_block_header_size() and lzma_block_header_encode() should be used.

Function Documentation

◆ lzma_block_header_size()

lzma_ret lzma_block_header_size ( lzma_block block)

Calculate Block Header Size.

Calculate the minimum size needed for the Block Header field using the settings specified in the lzma_block structure. Note that it is OK to increase the calculated header_size value as long as it is a multiple of four and doesn't exceed LZMA_BLOCK_HEADER_SIZE_MAX. Increasing header_size just means that lzma_block_header_encode() will add Header Padding.

Note
This doesn't check that all the options are valid i.e. this may return LZMA_OK even if lzma_block_header_encode() or lzma_block_encoder() would fail. If you want to validate the filter chain, consider using lzma_memlimit_encoder() which as a side-effect validates the filter chain.
Parameters
blockBlock options
Returns
Possible lzma_ret values:
  • LZMA_OK: Size calculated successfully and stored to block->header_size.
  • LZMA_OPTIONS_ERROR: Unsupported version, filters or filter options.
  • LZMA_PROG_ERROR: Invalid values like compressed_size == 0.

◆ lzma_block_header_encode()

lzma_ret lzma_block_header_encode ( const lzma_block block,
uint8_t *  out 
)

Encode Block Header.

The caller must have calculated the size of the Block Header already with lzma_block_header_size(). If a value larger than the one calculated by lzma_block_header_size() is used, the Block Header will be padded to the specified size.

Parameters
blockBlock options to be encoded.
[out]outBeginning of the output buffer. This must be at least block->header_size bytes.
Returns
Possible lzma_ret values:
  • LZMA_OK: Encoding was successful. block->header_size bytes were written to output buffer.
  • LZMA_OPTIONS_ERROR: Invalid or unsupported options.
  • LZMA_PROG_ERROR: Invalid arguments, for example block->header_size is invalid or block->filters is NULL.

◆ lzma_block_header_decode()

lzma_ret lzma_block_header_decode ( lzma_block block,
const lzma_allocator allocator,
const uint8_t *  in 
)

Decode Block Header.

block->version should (usually) be set to the highest value supported by the application. If the application sets block->version to a value higher than supported by the current liblzma version, this function will downgrade block->version to the highest value supported by it. Thus one should check the value of block->version after calling this function if block->version was set to a non-zero value and the application doesn't otherwise know that the liblzma version being used is new enough to support the specified block->version.

The size of the Block Header must have already been decoded with lzma_block_header_size_decode() macro and stored to block->header_size.

The integrity check type from Stream Header must have been stored to block->check.

block->filters must have been allocated, but they don't need to be initialized (possible existing filter options are not freed).

Parameters
[out]blockDestination for Block options
allocatorlzma_allocator for custom allocator functions. Set to NULL to use malloc() (and also free() if an error occurs).
inBeginning of the input buffer. This must be at least block->header_size bytes.
Returns
Possible lzma_ret values:
  • LZMA_OK: Decoding was successful. block->header_size bytes were read from the input buffer.
  • LZMA_OPTIONS_ERROR: The Block Header specifies some unsupported options such as unsupported filters. This can happen also if block->version was set to a too low value compared to what would be required to properly represent the information stored in the Block Header.
  • LZMA_DATA_ERROR: Block Header is corrupt, for example, the CRC32 doesn't match.
  • LZMA_PROG_ERROR: Invalid arguments, for example block->header_size is invalid or block->filters is NULL.

◆ lzma_block_compressed_size()

lzma_ret lzma_block_compressed_size ( lzma_block block,
lzma_vli  unpadded_size 
)

Validate and set Compressed Size according to Unpadded Size.

Block Header stores Compressed Size, but Index has Unpadded Size. If the application has already parsed the Index and is now decoding Blocks, it can calculate Compressed Size from Unpadded Size. This function does exactly that with error checking:

  • Compressed Size calculated from Unpadded Size must be positive integer, that is, Unpadded Size must be big enough that after Block Header and Check fields there's still at least one byte for Compressed Size.
  • If Compressed Size was present in Block Header, the new value calculated from Unpadded Size is compared against the value from Block Header.
Note
This function must be called _after_ decoding the Block Header field so that it can properly validate Compressed Size if it was present in Block Header.
Parameters
blockBlock options: block->header_size must already be set with lzma_block_header_size().
unpadded_sizeUnpadded Size from the Index field in bytes
Returns
Possible lzma_ret values:
  • LZMA_OK: block->compressed_size was set successfully.
  • LZMA_DATA_ERROR: unpadded_size is too small compared to block->header_size and lzma_check_size(block->check).
  • LZMA_PROG_ERROR: Some values are invalid. For example, block->header_size must be a multiple of four and between 8 and 1024 inclusive.

◆ lzma_block_unpadded_size()

lzma_vli lzma_block_unpadded_size ( const lzma_block block)

Calculate Unpadded Size.

The Index field stores Unpadded Size and Uncompressed Size. The latter can be taken directly from the lzma_block structure after coding a Block, but Unpadded Size needs to be calculated from Block Header Size, Compressed Size, and size of the Check field. This is where this function is needed.

Parameters
blockBlock options: block->header_size must already be set with lzma_block_header_size().
Returns
Unpadded Size on success, or zero on error.

◆ lzma_block_total_size()

lzma_vli lzma_block_total_size ( const lzma_block block)

Calculate the total encoded size of a Block.

This is equivalent to lzma_block_unpadded_size() except that the returned value includes the size of the Block Padding field.

Parameters
blockBlock options: block->header_size must already be set with lzma_block_header_size().
Returns
On success, total encoded size of the Block. On error, zero is returned.

◆ lzma_block_encoder()

lzma_ret lzma_block_encoder ( lzma_stream strm,
lzma_block block 
)

Initialize .xz Block encoder.

Valid actions for lzma_code() are LZMA_RUN, LZMA_SYNC_FLUSH (only if the filter chain supports it), and LZMA_FINISH.

The Block encoder encodes the Block Data, Block Padding, and Check value. It does NOT encode the Block Header which can be encoded with lzma_block_header_encode().

Parameters
strmPointer to lzma_stream that is at least initialized with LZMA_STREAM_INIT.
blockBlock options: block->version, block->check, and block->filters must have been initialized.
Returns
Possible lzma_ret values:
  • LZMA_OK: All good, continue with lzma_code().
  • LZMA_MEM_ERROR
  • LZMA_OPTIONS_ERROR
  • LZMA_UNSUPPORTED_CHECK: block->check specifies a Check ID that is not supported by this build of liblzma. Initializing the encoder failed.
  • LZMA_PROG_ERROR

◆ lzma_block_decoder()

lzma_ret lzma_block_decoder ( lzma_stream strm,
lzma_block block 
)

Initialize .xz Block decoder.

Valid actions for lzma_code() are LZMA_RUN and LZMA_FINISH. Using LZMA_FINISH is not required. It is supported only for convenience.

The Block decoder decodes the Block Data, Block Padding, and Check value. It does NOT decode the Block Header which can be decoded with lzma_block_header_decode().

Parameters
strmPointer to lzma_stream that is at least initialized with LZMA_STREAM_INIT.
blockBlock options
Returns
Possible lzma_ret values:
  • LZMA_OK: All good, continue with lzma_code().
  • LZMA_PROG_ERROR
  • LZMA_MEM_ERROR

◆ lzma_block_buffer_bound()

size_t lzma_block_buffer_bound ( size_t  uncompressed_size)

Calculate maximum output size for single-call Block encoding.

This is equivalent to lzma_stream_buffer_bound() but for .xz Blocks. See the documentation of lzma_stream_buffer_bound().

Parameters
uncompressed_sizeSize of the data to be encoded with the single-call Block encoder.
Returns
Maximum output size in bytes for single-call Block encoding.

◆ lzma_block_buffer_encode()

lzma_ret lzma_block_buffer_encode ( lzma_block block,
const lzma_allocator allocator,
const uint8_t *  in,
size_t  in_size,
uint8_t *  out,
size_t *  out_pos,
size_t  out_size 
)

Single-call .xz Block encoder.

In contrast to the multi-call encoder initialized with lzma_block_encoder(), this function encodes also the Block Header. This is required to make it possible to write appropriate Block Header also in case the data isn't compressible, and different filter chain has to be used to encode the data in uncompressed form using uncompressed chunks of the LZMA2 filter.

When the data isn't compressible, header_size, compressed_size, and uncompressed_size are set just like when the data was compressible, but it is possible that header_size is too small to hold the filter chain specified in block->filters, because that isn't necessarily the filter chain that was actually used to encode the data. lzma_block_unpadded_size() still works normally, because it doesn't read the filters array.

Parameters
blockBlock options: block->version, block->check, and block->filters must have been initialized.
allocatorlzma_allocator for custom allocator functions. Set to NULL to use malloc() and free().
inBeginning of the input buffer
in_sizeSize of the input buffer
[out]outBeginning of the output buffer
[out]out_posThe next byte will be written to out[*out_pos]. *out_pos is updated only if encoding succeeds.
out_sizeSize of the out buffer; the first byte into which no data is written to is out[out_size].
Returns
Possible lzma_ret values:
  • LZMA_OK: Encoding was successful.
  • LZMA_BUF_ERROR: Not enough output buffer space.
  • LZMA_UNSUPPORTED_CHECK
  • LZMA_OPTIONS_ERROR
  • LZMA_MEM_ERROR
  • LZMA_DATA_ERROR
  • LZMA_PROG_ERROR

◆ lzma_block_uncomp_encode()

lzma_ret lzma_block_uncomp_encode ( lzma_block block,
const uint8_t *  in,
size_t  in_size,
uint8_t *  out,
size_t *  out_pos,
size_t  out_size 
)

Single-call uncompressed .xz Block encoder.

This is like lzma_block_buffer_encode() except this doesn't try to compress the data and instead encodes the data using LZMA2 uncompressed chunks. The required output buffer size can be determined with lzma_block_buffer_bound().

Since the data won't be compressed, this function ignores block->filters. This function doesn't take lzma_allocator because this function doesn't allocate any memory from the heap.

Parameters
blockBlock options: block->version, block->check, and block->filters must have been initialized.
inBeginning of the input buffer
in_sizeSize of the input buffer
[out]outBeginning of the output buffer
[out]out_posThe next byte will be written to out[*out_pos]. *out_pos is updated only if encoding succeeds.
out_sizeSize of the out buffer; the first byte into which no data is written to is out[out_size].
Returns
Possible lzma_ret values:
  • LZMA_OK: Encoding was successful.
  • LZMA_BUF_ERROR: Not enough output buffer space.
  • LZMA_UNSUPPORTED_CHECK
  • LZMA_OPTIONS_ERROR
  • LZMA_MEM_ERROR
  • LZMA_DATA_ERROR
  • LZMA_PROG_ERROR

◆ lzma_block_buffer_decode()

lzma_ret lzma_block_buffer_decode ( lzma_block block,
const lzma_allocator allocator,
const uint8_t *  in,
size_t *  in_pos,
size_t  in_size,
uint8_t *  out,
size_t *  out_pos,
size_t  out_size 
)

Single-call .xz Block decoder.

This is single-call equivalent of lzma_block_decoder(), and requires that the caller has already decoded Block Header and checked its memory usage.

Parameters
blockBlock options
allocatorlzma_allocator for custom allocator functions. Set to NULL to use malloc() and free().
inBeginning of the input buffer
in_posThe next byte will be read from in[*in_pos]. *in_pos is updated only if decoding succeeds.
in_sizeSize of the input buffer; the first byte that won't be read is in[in_size].
[out]outBeginning of the output buffer
[out]out_posThe next byte will be written to out[*out_pos]. *out_pos is updated only if encoding succeeds.
out_sizeSize of the out buffer; the first byte into which no data is written to is out[out_size].
Returns
Possible lzma_ret values:
  • LZMA_OK: Decoding was successful.
  • LZMA_OPTIONS_ERROR
  • LZMA_DATA_ERROR
  • LZMA_MEM_ERROR
  • LZMA_BUF_ERROR: Output buffer was too small.
  • LZMA_PROG_ERROR