summaryrefslogtreecommitdiff
path: root/Build/source/utils/lzma-utils/src/liblzmadec/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/lzma-utils/src/liblzmadec/buffer.c')
-rw-r--r--Build/source/utils/lzma-utils/src/liblzmadec/buffer.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/Build/source/utils/lzma-utils/src/liblzmadec/buffer.c b/Build/source/utils/lzma-utils/src/liblzmadec/buffer.c
new file mode 100644
index 00000000000..0b268bcd1ea
--- /dev/null
+++ b/Build/source/utils/lzma-utils/src/liblzmadec/buffer.c
@@ -0,0 +1,83 @@
+/******************************************************************************
+
+ Decode the whole source buffer at once
+
+ Copyright (C) 2005 Lasse Collin <lasse.collin@tukaani.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+******************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include "lzmadec.h"
+#include "private.h"
+
+extern int_fast8_t
+lzmadec_buffer (uint8_t *dest, size_t *dest_len,
+ uint8_t *source, const size_t source_len)
+{
+ lzmadec_stream strm;
+ int8_t ret;
+
+ /* Initialize the decoder */
+ strm.next_in = source;
+ strm.avail_in = source_len;
+ strm.next_out = dest;
+ strm.avail_out = *dest_len;
+ strm.lzma_alloc = NULL;
+ strm.lzma_free = NULL;
+ strm.opaque = NULL;
+ ret = lzmadec_init (&strm);
+ if (ret != LZMADEC_OK)
+ return ret;
+
+ /* Check that the destination buffer is big enough. With streamed
+ LZMA data we can only hope it is big enough before starting
+ the decoding process; if it is too small, we will return
+ LZMADEC_BUF_ERROR after decoding dest_len bytes. */
+ if (strm.avail_out
+ < ((lzmadec_state*)(strm.state))->uncompressed_size)
+ return LZMADEC_BUF_ERROR; /* Too small destination buffer */
+
+ /* Call the decoder. One pass is enough if everything is OK. */
+ ret = lzmadec_decode (&strm, 1);
+
+ /* Set *dest_len to amount of bytes actually decoded. */
+ assert (*dest_len >= strm.avail_out);
+ *dest_len -= strm.avail_out;
+
+ /* Free the allocated memory no matter did the decoding
+ go well or not. */
+ lzmadec_end (&strm);
+
+ /* Check the return value of lzmadec_decode() and return appropriate
+ return value */
+ switch (ret) {
+ case LZMADEC_STREAM_END:
+ /* Everything has been decoded and put to
+ the destination buffer. */
+ return LZMADEC_OK;
+ case LZMADEC_OK:
+ /* Decoding went fine so far but not all of the
+ uncompressed data did fit to the destination
+ buffer. This should happen only with streamed LZMA
+ data (otherwise liblzmadec might have a bug). */
+ assert (((lzmadec_state*)(strm.state))->streamed == 1);
+ return LZMADEC_BUF_ERROR;
+ default:
+ assert (ret == LZMADEC_DATA_ERROR);
+ return LZMADEC_DATA_ERROR;
+ }
+}