summaryrefslogtreecommitdiff
path: root/tools/src/minilzlib/lzmadec.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/src/minilzlib/lzmadec.h')
-rw-r--r--tools/src/minilzlib/lzmadec.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/tools/src/minilzlib/lzmadec.h b/tools/src/minilzlib/lzmadec.h
new file mode 100644
index 0000000..652165d
--- /dev/null
+++ b/tools/src/minilzlib/lzmadec.h
@@ -0,0 +1,114 @@
+/*++
+
+Copyright (c) Alex Ionescu. All rights reserved.
+
+Module Name:
+
+ lzmadec.h
+
+Abstract:
+
+ This header file contains C-style definitions, constants, and enumerations
+ that map back to the LZMA Standard, specifically the probability model that
+ is used for encoding probabilities.
+
+Author:
+
+ Alex Ionescu (@aionescu) 15-Apr-2020 - Initial version
+
+Environment:
+
+ Windows & Linux, user mode and kernel mode.
+
+--*/
+
+#pragma once
+
+//
+// Literals can be 0-255 and are encoded in 3 different types of slots based on
+// the previous literal decoded and the "match byte" used.
+//
+#define LZMA_LITERALS 256
+#define LZMA_LC_TYPES 3
+#define LZMA_LC_MODEL_SIZE (LZMA_LC_TYPES * LZMA_LITERALS)
+
+//
+// These are the hardcoded LZMA properties we support for position and coders
+//
+#define LZMA_LC 3
+#define LZMA_PB 2
+#define LZMA_LP 0
+#define LZMA_LITERAL_CODERS (1 << LZMA_LC)
+#define LZMA_POSITION_COUNT (1 << LZMA_PB)
+
+//
+// Lengths are described in three different ways using "low", "mid", and "high"
+// bit trees. The first two trees encode 3 bits, the last encodes 8. We never
+// encode a length less than 2 bytes, since that's wasteful.
+//
+#define LZMA_MAX_LOW_LENGTH (1 << 3)
+#define LZMA_MAX_MID_LENGTH (1 << 3)
+#define LZMA_MAX_HIGH_LENGTH (1 << 8)
+#define LZMA_MIN_LENGTH 2
+
+//
+// Distances can be encoded in different ways, based on the distance slot.
+// Lengths of 2, 3, 4 bytes are directly encoded with their own slot. Lengths
+// over 5 share a slot, which is then further subdivded into 3 different ways
+// of encoding them, which are described in the source.
+//
+#define LZMA_DISTANCE_SLOTS 64
+#define LZMA_FIRST_CONTEXT_DISTANCE_SLOT 4
+#define LZMA_FIRST_FIXED_DISTANCE_SLOT 14
+#define LZMA_DISTANCE_ALIGN_BITS 4
+#define LZMA_DISTANCE_ALIGN_SLOTS (1 << LZMA_DISTANCE_ALIGN_BITS)
+
+//
+// Total number of probabilities that we need to store
+//
+#define LZMA_BIT_MODEL_SLOTS (1174 + \
+ (LZMA_LITERAL_CODERS * \
+ LZMA_LC_MODEL_SIZE))
+
+//
+// The LZMA probability bit model is typically based on the last LZMA sequences
+// that were decoded. There are 11 such possibilities that are tracked.
+//
+typedef enum _LZMA_SEQUENCE_STATE
+{
+ //
+ // State where we last saw three literals
+ //
+ LzmaLitLitLitState,
+ //
+ // States where we last saw two literals preceeded by a non-literal
+ //
+ LzmaMatchLitLitState,
+ LzmaRepLitLitState,
+ LzmaLitShortrepLitLitState,
+ //
+ // States where we last saw one literal preceeded by a non-literal
+ //
+ LzmaMatchLitState,
+ LzmaRepLitState,
+ LzmaLitShortrepLitState,
+ //
+ // Separator between states where we last saw at least one literal
+ //
+ LzmaMaxLitState,
+ //
+ // States where we last saw a non-literal preceeded by a literal
+ //
+ LzmaLitMatchState = 7,
+ LzmaLitRepState,
+ LzmaLitShortrepState,
+ //
+ // States where we last saw two non-literals
+ //
+ LzmaNonlitMatchState,
+ LzmaNonlitRepState,
+ //
+ // Separator for number of total states
+ //
+ LzmaMaxState
+} LZMA_SEQUENCE_STATE, * PLZMA_SEQUENCE_STATE;