update libchdr
[pcsx_rearmed.git] / deps / libchdr / deps / lzma-22.01 / include / Bcj2.h
1 /* Bcj2.h -- BCJ2 Converter for x86 code\r
2 2014-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
9 EXTERN_C_BEGIN\r
10 \r
11 #define BCJ2_NUM_STREAMS 4\r
12 \r
13 enum\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
21 enum\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
32 enum\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
42 CBcj2Dec / CBcj2Enc\r
43 bufs sizes:\r
44   BUF_SIZE(n) = lims[n] - bufs[n]\r
45 bufs 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
51 CBcj2Dec:\r
52 dest 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
62 typedef 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
78 void Bcj2Dec_Init(CBcj2Dec *p);\r
79 \r
80 /* Returns: SZ_OK or SZ_ERROR_DATA */\r
81 SRes Bcj2Dec_Decode(CBcj2Dec *p);\r
82 \r
83 #define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0)\r
84 \r
85 \r
86 \r
87 typedef 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
94 typedef 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
131 void Bcj2Enc_Init(CBcj2Enc *p);\r
132 void 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
144 EXTERN_C_END\r
145 \r
146 #endif\r