Make the raw value of the Check field available to applications

via lzma_block structure.

This changes ABI but not doesn't break API.
This commit is contained in:
Lasse Collin 2009-05-26 14:48:48 +03:00
parent b4f5c81409
commit 083c23c680
4 changed files with 40 additions and 29 deletions

View File

@ -207,6 +207,23 @@ typedef struct {
*/ */
lzma_filter *filters; lzma_filter *filters;
/**
* \brief Raw value stored in the Check field
*
* After successful coding, the first lzma_check_size(check) bytes
* of this array contain the raw value stored in the Check field.
*
* Note that CRC32 and CRC64 are stored in little endian byte order.
* Take it into account if you display the Check values to the user.
*
* Written by:
* - lzma_block_encoder()
* - lzma_block_decoder()
* - lzma_block_buffer_encode()
* - lzma_block_buffer_decode()
*/
uint8_t raw_check[64];
/* /*
* Reserved space to allow possible future extensions without * Reserved space to allow possible future extensions without
* breaking the ABI. You should not touch these, because the names * breaking the ABI. You should not touch these, because the names

View File

@ -290,6 +290,7 @@ lzma_block_buffer_encode(lzma_block *block, lzma_allocator *allocator,
lzma_check_update(&check, block->check, in, in_size); lzma_check_update(&check, block->check, in, in_size);
lzma_check_finish(&check, block->check); lzma_check_finish(&check, block->check);
memcpy(block->raw_check, check.buffer.u8, check_size);
memcpy(out + *out_pos, check.buffer.u8, check_size); memcpy(out + *out_pos, check.buffer.u8, check_size);
*out_pos += check_size; *out_pos += check_size;
} }

View File

@ -146,26 +146,22 @@ block_decode(lzma_coder *coder, lzma_allocator *allocator,
// Fall through // Fall through
case SEQ_CHECK: { case SEQ_CHECK: {
const bool chksup = lzma_check_is_supported( const size_t check_size = lzma_check_size(coder->block->check);
coder->block->check); lzma_bufcpy(in, in_pos, in_size, coder->block->raw_check,
&coder->check_pos, check_size);
if (coder->check_pos < check_size)
return LZMA_OK;
while (*in_pos < in_size) { // Validate the Check only if we support it.
// coder->check.buffer[] may be uninitialized when // coder->check.buffer may be uninitialized
// the Check ID is not supported. // when the Check ID is not supported.
if (chksup && coder->check.buffer.u8[coder->check_pos] if (lzma_check_is_supported(coder->block->check)
!= in[*in_pos]) { && memcmp(coder->block->raw_check,
++*in_pos; coder->check.buffer.u8,
return LZMA_DATA_ERROR; check_size) != 0)
} return LZMA_DATA_ERROR;
++*in_pos; return LZMA_STREAM_END;
if (++coder->check_pos == lzma_check_size(
coder->block->check))
return LZMA_STREAM_END;
}
return LZMA_OK;
} }
} }

View File

@ -117,18 +117,15 @@ block_encode(lzma_coder *coder, lzma_allocator *allocator,
// Fall through // Fall through
case SEQ_CHECK: { case SEQ_CHECK: {
const uint32_t check_size const size_t check_size = lzma_check_size(coder->block->check);
= lzma_check_size(coder->block->check); lzma_bufcpy(coder->check.buffer.u8, &coder->pos, check_size,
out, out_pos, out_size);
if (coder->pos < check_size)
return LZMA_OK;
while (*out_pos < out_size) { memcpy(coder->block->raw_check, coder->check.buffer.u8,
out[*out_pos] = coder->check.buffer.u8[coder->pos]; check_size);
++*out_pos; return LZMA_STREAM_END;
if (++coder->pos == check_size)
return LZMA_STREAM_END;
}
return LZMA_OK;
} }
} }