Source code

Revision control

Copy as Markdown

Other Tools

/* 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