// Capstone Java binding
// By Nguyen Anh Quynh & Dang Hoang Vu,  2013

package capstone;

import com.sun.jna.Structure;
import com.sun.jna.Union;

import java.util.List;
import java.util.Arrays;

import static capstone.Arm_const.*;

public class Arm {

  public static class MemType extends Structure {
    public int base;
    public int index;
    public int scale;
    public int disp;
    public int lshift;

    @Override
    public List getFieldOrder() {
      return Arrays.asList("base", "index", "scale", "disp", "lshift");
    }
  }

  public static class OpValue extends Union {
    public int reg;
    public int imm;
    public double fp;
    public MemType mem;
    public int setend;

    @Override
    public List getFieldOrder() {
      return Arrays.asList("reg", "imm", "fp", "mem", "setend");
    }
  }

  public static class OpShift extends Structure {
    public int type;
    public int value;

    @Override
    public List getFieldOrder() {
      return Arrays.asList("type","value");
    }
  }

  public static class Operand extends Structure {
    public int vector_index;
    public OpShift shift;
    public int type;
    public OpValue value;
    public boolean subtracted;
    public int access;
    public int neon_lane;

    public void read() {
      readField("vector_index");
      readField("type");
      if (type == ARM_OP_MEM)
        value.setType(MemType.class);
      if (type == ARM_OP_FP)
        value.setType(Double.TYPE);
      if (type == ARM_OP_PIMM || type == ARM_OP_IMM || type == ARM_OP_CIMM)
        value.setType(Integer.TYPE);
      if (type == ARM_OP_REG)
        value.setType(Integer.TYPE);
      if (type == ARM_OP_INVALID)
        return;
      readField("value");
      readField("shift");
      readField("subtracted");
      readField("access");
      readField("neon_lane");
    }

    @Override
    public List getFieldOrder() {
      return Arrays.asList("vector_index", "shift", "type", "value", "subtracted", "access", "neon_lane");
    }
  }

  public static class UnionOpInfo extends Capstone.UnionOpInfo {
    public boolean usermode;
    public int vector_size;
    public int vector_data;
    public int cps_mode;
    public int cps_flag;
    public int cc;
    public byte update_flags;
    public byte writeback;
    public byte mem_barrier;
    public byte op_count;

    public Operand [] op;

    public UnionOpInfo() {
      op = new Operand[36];
    }

    public void read() {
      readField("usermode");
      readField("vector_size");
      readField("vector_data");
      readField("cps_mode");
      readField("cps_flag");
      readField("cc");
      readField("update_flags");
      readField("writeback");
      readField("mem_barrier");
      readField("op_count");
      op = new Operand[op_count];
      if (op_count != 0)
        readField("op");
    }

    @Override
    public List getFieldOrder() {
      return Arrays.asList("usermode", "vector_size", "vector_data",
          "cps_mode", "cps_flag", "cc", "update_flags", "writeback", "mem_barrier", "op_count", "op");
    }
  }

  public static class OpInfo extends Capstone.OpInfo {
    public boolean usermode;
    public int vectorSize;
    public int vectorData;
    public int cpsMode;
    public int cpsFlag;
    public int cc;
    public boolean updateFlags;
    public boolean writeback;
    public int memBarrier;
    public Operand [] op = null;

    public OpInfo(UnionOpInfo op_info) {
      usermode = op_info.usermode;
      vectorSize = op_info.vector_size;
      vectorData = op_info.vector_data;
      cpsMode = op_info.cps_mode;
      cpsFlag = op_info.cps_flag;
      cc = op_info.cc;
      updateFlags = (op_info.update_flags > 0);
      writeback = (op_info.writeback > 0);
      memBarrier = op_info.mem_barrier;
      op = op_info.op;
    }
  }
}
