/////////////////////////////////////////////////////////////////////////////// // /// \file filter_buffer_encoder.c /// \brief Single-call raw encoding // // Author: Lasse Collin // // This file has been put into the public domain. // You can do whatever you want with this file. // /////////////////////////////////////////////////////////////////////////////// #include "filter_encoder.h" extern LZMA_API(lzma_ret) lzma_raw_buffer_encode( const lzma_filter *filters, const lzma_allocator *allocator, const uint8_t *in, size_t in_size, uint8_t *out, size_t *out_pos, size_t out_size) { // Validate what isn't validated later in filter_common.c. if ((in == NULL && in_size != 0) || out == NULL || out_pos == NULL || *out_pos > out_size) return LZMA_PROG_ERROR; // Initialize the encoder lzma_next_coder next = LZMA_NEXT_CODER_INIT; return_if_error(lzma_raw_encoder_init(&next, allocator, filters)); // Store the output position so that we can restore it if // something goes wrong. const size_t out_start = *out_pos; // Do the actual encoding and free coder's memory. size_t in_pos = 0; lzma_ret ret = next.code(next.coder, allocator, in, &in_pos, in_size, out, out_pos, out_size, LZMA_FINISH); lzma_next_end(&next, allocator); if (ret == LZMA_STREAM_END) { ret = LZMA_OK; } else { if (ret == LZMA_OK) { // Output buffer was too small. assert(*out_pos == out_size); ret = LZMA_BUF_ERROR; } // Restore the output position. *out_pos = out_start; } return ret; }