| /* Bra.h -- Branch converters for executables | |
| 2013-01-18 : Igor Pavlov : Public domain */ | |
| #ifndef __BRA_H | |
| #define __BRA_H | |
| #include "7zTypes.h" | |
| EXTERN_C_BEGIN | |
| /* | |
| These functions convert relative addresses to absolute addresses | |
| in CALL instructions to increase the compression ratio. | |
| In: | |
| data - data buffer | |
| size - size of data | |
| ip - current virtual Instruction Pinter (IP) value | |
| state - state variable for x86 converter | |
| encoding - 0 (for decoding), 1 (for encoding) | |
| Out: | |
| state - state variable for x86 converter | |
| Returns: | |
| The number of processed bytes. If you call these functions with multiple calls, | |
| you must start next call with first byte after block of processed bytes. | |
| Type Endian Alignment LookAhead | |
| x86 little 1 4 | |
| ARMT little 2 2 | |
| ARM little 4 0 | |
| PPC big 4 0 | |
| SPARC big 4 0 | |
| IA64 little 16 0 | |
| size must be >= Alignment + LookAhead, if it's not last block. | |
| If (size < Alignment + LookAhead), converter returns 0. | |
| Example: | |
| UInt32 ip = 0; | |
| for () | |
| { | |
| ; size must be >= Alignment + LookAhead, if it's not last block | |
| SizeT processed = Convert(data, size, ip, 1); | |
| data += processed; | |
| size -= processed; | |
| ip += processed; | |
| } | |
| */ | |
| #define x86_Convert_Init(state) { state = 0; } | |
| SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding); | |
| SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); | |
| SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); | |
| SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); | |
| SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); | |
| SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); | |
| EXTERN_C_END | |
| #endif |