add CHD support.
[pcsx_rearmed.git] / deps / lzma-16.04 / C / Bcj2.h
CommitLineData
ce188d4d 1/* Bcj2.h -- BCJ2 Converter for x86 code\r
22014-11-10 : Igor Pavlov : Public domain */\r
3\r
4#ifndef __BCJ2_H\r
5#define __BCJ2_H\r
6\r
7#include "7zTypes.h"\r
8\r
9EXTERN_C_BEGIN\r
10\r
11#define BCJ2_NUM_STREAMS 4\r
12\r
13enum\r
14{\r
15 BCJ2_STREAM_MAIN,\r
16 BCJ2_STREAM_CALL,\r
17 BCJ2_STREAM_JUMP,\r
18 BCJ2_STREAM_RC\r
19};\r
20\r
21enum\r
22{\r
23 BCJ2_DEC_STATE_ORIG_0 = BCJ2_NUM_STREAMS,\r
24 BCJ2_DEC_STATE_ORIG_1,\r
25 BCJ2_DEC_STATE_ORIG_2,\r
26 BCJ2_DEC_STATE_ORIG_3,\r
27 \r
28 BCJ2_DEC_STATE_ORIG,\r
29 BCJ2_DEC_STATE_OK\r
30};\r
31\r
32enum\r
33{\r
34 BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS,\r
35 BCJ2_ENC_STATE_OK\r
36};\r
37\r
38\r
39#define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP)\r
40\r
41/*\r
42CBcj2Dec / CBcj2Enc\r
43bufs sizes:\r
44 BUF_SIZE(n) = lims[n] - bufs[n]\r
45bufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be mutliply of 4:\r
46 (BUF_SIZE(BCJ2_STREAM_CALL) & 3) == 0\r
47 (BUF_SIZE(BCJ2_STREAM_JUMP) & 3) == 0\r
48*/\r
49\r
50/*\r
51CBcj2Dec:\r
52dest is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions:\r
53 bufs[BCJ2_STREAM_MAIN] >= dest &&\r
54 bufs[BCJ2_STREAM_MAIN] - dest >= tempReserv +\r
55 BUF_SIZE(BCJ2_STREAM_CALL) +\r
56 BUF_SIZE(BCJ2_STREAM_JUMP)\r
57 tempReserv = 0 : for first call of Bcj2Dec_Decode\r
58 tempReserv = 4 : for any other calls of Bcj2Dec_Decode\r
59 overlap with offset = 1 is not allowed\r
60*/\r
61\r
62typedef struct\r
63{\r
64 const Byte *bufs[BCJ2_NUM_STREAMS];\r
65 const Byte *lims[BCJ2_NUM_STREAMS];\r
66 Byte *dest;\r
67 const Byte *destLim;\r
68\r
69 unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */\r
70\r
71 UInt32 ip;\r
72 Byte temp[4];\r
73 UInt32 range;\r
74 UInt32 code;\r
75 UInt16 probs[2 + 256];\r
76} CBcj2Dec;\r
77\r
78void Bcj2Dec_Init(CBcj2Dec *p);\r
79\r
80/* Returns: SZ_OK or SZ_ERROR_DATA */\r
81SRes Bcj2Dec_Decode(CBcj2Dec *p);\r
82\r
83#define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0)\r
84\r
85\r
86\r
87typedef enum\r
88{\r
89 BCJ2_ENC_FINISH_MODE_CONTINUE,\r
90 BCJ2_ENC_FINISH_MODE_END_BLOCK,\r
91 BCJ2_ENC_FINISH_MODE_END_STREAM\r
92} EBcj2Enc_FinishMode;\r
93\r
94typedef struct\r
95{\r
96 Byte *bufs[BCJ2_NUM_STREAMS];\r
97 const Byte *lims[BCJ2_NUM_STREAMS];\r
98 const Byte *src;\r
99 const Byte *srcLim;\r
100\r
101 unsigned state;\r
102 EBcj2Enc_FinishMode finishMode;\r
103\r
104 Byte prevByte;\r
105\r
106 Byte cache;\r
107 UInt32 range;\r
108 UInt64 low;\r
109 UInt64 cacheSize;\r
110\r
111 UInt32 ip;\r
112\r
113 /* 32-bit ralative offset in JUMP/CALL commands is\r
114 - (mod 4 GB) in 32-bit mode\r
115 - signed Int32 in 64-bit mode\r
116 We use (mod 4 GB) check for fileSize.\r
117 Use fileSize up to 2 GB, if you want to support 32-bit and 64-bit code conversion. */\r
118 UInt32 fileIp;\r
119 UInt32 fileSize; /* (fileSize <= ((UInt32)1 << 31)), 0 means no_limit */\r
120 UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)), 0 means desable_conversion */\r
121\r
122 UInt32 tempTarget;\r
123 unsigned tempPos;\r
124 Byte temp[4 * 2];\r
125\r
126 unsigned flushPos;\r
127 \r
128 UInt16 probs[2 + 256];\r
129} CBcj2Enc;\r
130\r
131void Bcj2Enc_Init(CBcj2Enc *p);\r
132void Bcj2Enc_Encode(CBcj2Enc *p);\r
133\r
134#define Bcj2Enc_Get_InputData_Size(p) ((SizeT)((p)->srcLim - (p)->src) + (p)->tempPos)\r
135#define Bcj2Enc_IsFinished(p) ((p)->flushPos == 5)\r
136\r
137\r
138#define BCJ2_RELAT_LIMIT_NUM_BITS 26\r
139#define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS)\r
140\r
141/* limit for CBcj2Enc::fileSize variable */\r
142#define BCJ2_FileSize_MAX ((UInt32)1 << 31)\r
143\r
144EXTERN_C_END\r
145\r
146#endif\r