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