1 ///////////////////////////////////////////////////////////////////////////////
3 /// \file filter_buffer_encoder.c
4 /// \brief Single-call raw encoding
6 // Author: Lasse Collin
8 // This file has been put into the public domain.
9 // You can do whatever you want with this file.
11 ///////////////////////////////////////////////////////////////////////////////
13 #include "filter_encoder.h"
16 extern LZMA_API(lzma_ret
)
17 lzma_raw_buffer_encode(const lzma_filter
*filters
, lzma_allocator
*allocator
,
18 const uint8_t *in
, size_t in_size
, uint8_t *out
,
19 size_t *out_pos
, size_t out_size
)
21 // Validate what isn't validated later in filter_common.c.
22 if ((in
== NULL
&& in_size
!= 0) || out
== NULL
23 || out_pos
== NULL
|| *out_pos
> out_size
)
24 return LZMA_PROG_ERROR
;
26 // Initialize the encoder
27 lzma_next_coder next
= LZMA_NEXT_CODER_INIT
;
28 return_if_error(lzma_raw_encoder_init(&next
, allocator
, filters
));
30 // Store the output position so that we can restore it if
31 // something goes wrong.
32 const size_t out_start
= *out_pos
;
34 // Do the actual encoding and free coder's memory.
36 lzma_ret ret
= next
.code(next
.coder
, allocator
, in
, &in_pos
, in_size
,
37 out
, out_pos
, out_size
, LZMA_FINISH
);
38 lzma_next_end(&next
, allocator
);
40 if (ret
== LZMA_STREAM_END
) {
44 // Output buffer was too small.
45 assert(*out_pos
== out_size
);
49 // Restore the output position.