/* Bra.h -- Branch converters for executables
2013-01-18 : Igor Pavlov : Public domain */

#pragma once

#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
