Merge pull request #511 from negativeExponent/updates
[pcsx_rearmed.git] / deps / lzma-16.04 / C / Ppmd7.h
CommitLineData
ce188d4d 1/* Ppmd7.h -- PPMdH compression codec\r
22016-05-21 : Igor Pavlov : Public domain\r
3This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */\r
4\r
5/* This code supports virtual RangeDecoder and includes the implementation\r
6of RangeCoder from 7z, instead of RangeCoder from original PPMd var.H.\r
7If you need the compatibility with original PPMd var.H, you can use external RangeDecoder */\r
8\r
9#ifndef __PPMD7_H\r
10#define __PPMD7_H\r
11\r
12#include "Ppmd.h"\r
13\r
14EXTERN_C_BEGIN\r
15\r
16#define PPMD7_MIN_ORDER 2\r
17#define PPMD7_MAX_ORDER 64\r
18\r
19#define PPMD7_MIN_MEM_SIZE (1 << 11)\r
20#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3)\r
21\r
22struct CPpmd7_Context_;\r
23\r
24typedef\r
25 #ifdef PPMD_32BIT\r
26 struct CPpmd7_Context_ *\r
27 #else\r
28 UInt32\r
29 #endif\r
30 CPpmd7_Context_Ref;\r
31\r
32typedef struct CPpmd7_Context_\r
33{\r
34 UInt16 NumStats;\r
35 UInt16 SummFreq;\r
36 CPpmd_State_Ref Stats;\r
37 CPpmd7_Context_Ref Suffix;\r
38} CPpmd7_Context;\r
39\r
40#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->SummFreq)\r
41\r
42typedef struct\r
43{\r
44 CPpmd7_Context *MinContext, *MaxContext;\r
45 CPpmd_State *FoundState;\r
46 unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag;\r
47 Int32 RunLength, InitRL; /* must be 32-bit at least */\r
48\r
49 UInt32 Size;\r
50 UInt32 GlueCount;\r
51 Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart;\r
52 UInt32 AlignOffset;\r
53\r
54 Byte Indx2Units[PPMD_NUM_INDEXES];\r
55 Byte Units2Indx[128];\r
56 CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES];\r
57 Byte NS2Indx[256], NS2BSIndx[256], HB2Flag[256];\r
58 CPpmd_See DummySee, See[25][16];\r
59 UInt16 BinSumm[128][64];\r
60} CPpmd7;\r
61\r
62void Ppmd7_Construct(CPpmd7 *p);\r
63Bool Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAlloc *alloc);\r
64void Ppmd7_Free(CPpmd7 *p, ISzAlloc *alloc);\r
65void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder);\r
66#define Ppmd7_WasAllocated(p) ((p)->Base != NULL)\r
67\r
68\r
69/* ---------- Internal Functions ---------- */\r
70\r
71extern const Byte PPMD7_kExpEscape[16];\r
72\r
73#ifdef PPMD_32BIT\r
74 #define Ppmd7_GetPtr(p, ptr) (ptr)\r
75 #define Ppmd7_GetContext(p, ptr) (ptr)\r
76 #define Ppmd7_GetStats(p, ctx) ((ctx)->Stats)\r
77#else\r
78 #define Ppmd7_GetPtr(p, offs) ((void *)((p)->Base + (offs)))\r
79 #define Ppmd7_GetContext(p, offs) ((CPpmd7_Context *)Ppmd7_GetPtr((p), (offs)))\r
80 #define Ppmd7_GetStats(p, ctx) ((CPpmd_State *)Ppmd7_GetPtr((p), ((ctx)->Stats)))\r
81#endif\r
82\r
83void Ppmd7_Update1(CPpmd7 *p);\r
84void Ppmd7_Update1_0(CPpmd7 *p);\r
85void Ppmd7_Update2(CPpmd7 *p);\r
86void Ppmd7_UpdateBin(CPpmd7 *p);\r
87\r
88#define Ppmd7_GetBinSumm(p) \\r
89 &p->BinSumm[(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1][p->PrevSuccess + \\r
90 p->NS2BSIndx[Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] + \\r
91 (p->HiBitsFlag = p->HB2Flag[p->FoundState->Symbol]) + \\r
92 2 * p->HB2Flag[(unsigned)Ppmd7Context_OneState(p->MinContext)->Symbol] + \\r
93 ((p->RunLength >> 26) & 0x20)]\r
94\r
95CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale);\r
96\r
97\r
98/* ---------- Decode ---------- */\r
99\r
100typedef struct\r
101{\r
102 UInt32 (*GetThreshold)(void *p, UInt32 total);\r
103 void (*Decode)(void *p, UInt32 start, UInt32 size);\r
104 UInt32 (*DecodeBit)(void *p, UInt32 size0);\r
105} IPpmd7_RangeDec;\r
106\r
107typedef struct\r
108{\r
109 IPpmd7_RangeDec p;\r
110 UInt32 Range;\r
111 UInt32 Code;\r
112 IByteIn *Stream;\r
113} CPpmd7z_RangeDec;\r
114\r
115void Ppmd7z_RangeDec_CreateVTable(CPpmd7z_RangeDec *p);\r
116Bool Ppmd7z_RangeDec_Init(CPpmd7z_RangeDec *p);\r
117#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0)\r
118\r
119int Ppmd7_DecodeSymbol(CPpmd7 *p, IPpmd7_RangeDec *rc);\r
120\r
121\r
122/* ---------- Encode ---------- */\r
123\r
124typedef struct\r
125{\r
126 UInt64 Low;\r
127 UInt32 Range;\r
128 Byte Cache;\r
129 UInt64 CacheSize;\r
130 IByteOut *Stream;\r
131} CPpmd7z_RangeEnc;\r
132\r
133void Ppmd7z_RangeEnc_Init(CPpmd7z_RangeEnc *p);\r
134void Ppmd7z_RangeEnc_FlushData(CPpmd7z_RangeEnc *p);\r
135\r
136void Ppmd7_EncodeSymbol(CPpmd7 *p, CPpmd7z_RangeEnc *rc, int symbol);\r
137\r
138EXTERN_C_END\r
139 \r
140#endif\r