]> pd.if.org Git - zpackage/blobdiff - lzma/common/filter_buffer_encoder.c
integrate lzma
[zpackage] / lzma / common / filter_buffer_encoder.c
diff --git a/lzma/common/filter_buffer_encoder.c b/lzma/common/filter_buffer_encoder.c
new file mode 100644 (file)
index 0000000..dda18e3
--- /dev/null
@@ -0,0 +1,55 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+/// \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;
+}