aboutsummaryrefslogtreecommitdiff
path: root/src/liblzma/lzma/lzma_literal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/liblzma/lzma/lzma_literal.c')
-rw-r--r--src/liblzma/lzma/lzma_literal.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/liblzma/lzma/lzma_literal.c b/src/liblzma/lzma/lzma_literal.c
new file mode 100644
index 00000000..8f650fbf
--- /dev/null
+++ b/src/liblzma/lzma/lzma_literal.c
@@ -0,0 +1,74 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+/// \file lzma_literal.c
+/// \brief Literal Coder
+//
+// Copyright (C) 1999-2006 Igor Pavlov
+// Copyright (C) 2007 Lasse Collin
+//
+// 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.
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#include "lzma_literal.h"
+
+
+extern lzma_ret
+lzma_literal_init(lzma_literal_coder **coder, lzma_allocator *allocator,
+ uint32_t literal_context_bits, uint32_t literal_pos_bits)
+{
+ // Verify that arguments are sane.
+ if (literal_context_bits > LZMA_LITERAL_CONTEXT_BITS_MAX
+ || literal_pos_bits > LZMA_LITERAL_POS_BITS_MAX)
+ return LZMA_HEADER_ERROR;
+
+ // Calculate the number of states the literal coder must store.
+ const uint32_t states = literal_states(
+ literal_pos_bits, literal_context_bits);
+
+ // Allocate a new literal coder, if needed.
+ if (*coder == NULL || (**coder).literal_context_bits
+ != literal_context_bits
+ || (**coder).literal_pos_bits != literal_pos_bits) {
+ // Free the old coder, if any.
+ lzma_free(*coder, allocator);
+
+ // Allocate a new one.
+ *coder = lzma_alloc(sizeof(lzma_literal_coder)
+ + states * LIT_SIZE * sizeof(probability),
+ allocator);
+ if (*coder == NULL)
+ return LZMA_MEM_ERROR;
+
+ // Store the new settings.
+ (**coder).literal_context_bits = literal_context_bits;
+ (**coder).literal_pos_bits = literal_pos_bits;
+
+ // Calculate also the literal_pos_mask. It's not changed
+ // anywhere else than here.
+ (**coder).literal_pos_mask = (1 << literal_pos_bits) - 1;
+ }
+
+ // Reset the literal coder.
+ for (uint32_t i = 0; i < states; ++i)
+ for (uint32_t j = 0; j < LIT_SIZE; ++j)
+ bit_reset((**coder).coders[i][j]);
+
+ return LZMA_OK;
+}
+
+
+extern void
+lzma_literal_end(lzma_literal_coder **coder, lzma_allocator *allocator)
+{
+ lzma_free(*coder, allocator);
+ *coder = NULL;
+}