1 /* Bcj2.h -- BCJ2 Converter for x86 code
\r
2 2014-11-10 : Igor Pavlov : Public domain */
\r
11 #define BCJ2_NUM_STREAMS 4
\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
28 BCJ2_DEC_STATE_ORIG,
\r
34 BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS,
\r
39 #define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP)
\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
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
64 const Byte *bufs[BCJ2_NUM_STREAMS];
\r
65 const Byte *lims[BCJ2_NUM_STREAMS];
\r
67 const Byte *destLim;
\r
69 unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */
\r
75 UInt16 probs[2 + 256];
\r
78 void Bcj2Dec_Init(CBcj2Dec *p);
\r
80 /* Returns: SZ_OK or SZ_ERROR_DATA */
\r
81 SRes Bcj2Dec_Decode(CBcj2Dec *p);
\r
83 #define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0)
\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
96 Byte *bufs[BCJ2_NUM_STREAMS];
\r
97 const Byte *lims[BCJ2_NUM_STREAMS];
\r
102 EBcj2Enc_FinishMode finishMode;
\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
119 UInt32 fileSize; /* (fileSize <= ((UInt32)1 << 31)), 0 means no_limit */
\r
120 UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)), 0 means desable_conversion */
\r
128 UInt16 probs[2 + 256];
\r
131 void Bcj2Enc_Init(CBcj2Enc *p);
\r
132 void Bcj2Enc_Encode(CBcj2Enc *p);
\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
138 #define BCJ2_RELAT_LIMIT_NUM_BITS 26
\r
139 #define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS)
\r
141 /* limit for CBcj2Enc::fileSize variable */
\r
142 #define BCJ2_FileSize_MAX ((UInt32)1 << 31)
\r