Update Java binding with cs_option
diff --git a/bindings/java/Test.java b/bindings/java/Test.java
index 18cf919..854450d 100644
--- a/bindings/java/Test.java
+++ b/bindings/java/Test.java
@@ -11,9 +11,18 @@
public static class platform {
public int arch;
public int mode;
+ public int syntax;
public byte[] code;
public String comment;
+ public platform(int a, int m, int syt, byte[] c, String s) {
+ arch = a;
+ mode = m;
+ code = c;
+ comment = s;
+ syntax = syt;
+ }
+
public platform(int a, int m, byte[] c, String s) {
arch = a;
mode = m;
@@ -37,12 +46,14 @@
new platform(
Capstone.CS_ARCH_X86,
Capstone.CS_MODE_16,
+ Capstone.CS_OPT_SYNTAX_INTEL,
new byte[] { (byte)0x8d, (byte)0x4c, (byte)0x32, (byte)0x08, (byte)0x01, (byte)0xd8, (byte)0x81, (byte)0xc6, (byte)0x34, (byte)0x12, 0x00, 0x00 },
"X86 16bit (Intel syntax)"
),
new platform(
Capstone.CS_ARCH_X86,
- Capstone.CS_MODE_32, // + Capstone.CS_MODE_SYNTAX_ATT,
+ Capstone.CS_MODE_32,
+ Capstone.CS_OPT_SYNTAX_ATT,
new byte[] { (byte)0x8d, 0x4c, 0x32, 0x08, 0x01, (byte)0xd8, (byte)0x81, (byte)0xc6, 0x34, 0x12, 0x00, 0x00 },
"X86 32bit (ATT syntax)"
),
@@ -69,7 +80,6 @@
Capstone.CS_MODE_THUMB,
new byte[] { 0x4f, (byte)0xf0, 0x00, 0x01, (byte)0xbd, (byte)0xe8, 0x00, (byte)0x88, (byte)0xd1, (byte)0xe8, 0x00, (byte)0xf0 },
"THUMB-2"
-
),
new platform(
Capstone.CS_ARCH_ARM,
@@ -110,6 +120,8 @@
System.out.println("Disasm:");
Capstone cs = new Capstone(platforms[j].arch, platforms[j].mode);
+ if (platforms[j].syntax != 0)
+ cs.setSyntax(platforms[j].syntax);
Capstone.cs_insn[] all_insn = cs.disasm(platforms[j].code, 0x1000);
diff --git a/bindings/java/TestX86.java b/bindings/java/TestX86.java
index 6035334..60c5061 100644
--- a/bindings/java/TestX86.java
+++ b/bindings/java/TestX86.java
@@ -117,7 +117,7 @@
final Test.platform[] all_tests = {
new Test.platform(Capstone.CS_ARCH_X86, Capstone.CS_MODE_16, hexString2Byte(X86_CODE16), "X86 16bit (Intel syntax)"),
- new Test.platform(Capstone.CS_ARCH_X86, Capstone.CS_MODE_32 /*+ Capstone.CS_MODE_SYNTAX_ATT */, hexString2Byte(X86_CODE32), "X86 32 (AT&T syntax)"),
+ new Test.platform(Capstone.CS_ARCH_X86, Capstone.CS_MODE_32, Capstone.CS_OPT_SYNTAX_ATT, hexString2Byte(X86_CODE32), "X86 32 (AT&T syntax)"),
new Test.platform(Capstone.CS_ARCH_X86, Capstone.CS_MODE_32, hexString2Byte(X86_CODE32), "X86 32 (Intel syntax)"),
new Test.platform(Capstone.CS_ARCH_X86, Capstone.CS_MODE_64, hexString2Byte(X86_CODE64), "X86 64 (Intel syntax)"),
};
@@ -130,6 +130,9 @@
System.out.println("Disasm:");
cs = new Capstone(test.arch, test.mode);
+ if (test.syntax != 0) {
+ cs.setSyntax(test.syntax);
+ }
Capstone.cs_insn[] all_ins = cs.disasm(test.code, 0x1000);
for (int j = 0; j < all_ins.length; j++) {
diff --git a/bindings/java/capstone/Capstone.java b/bindings/java/capstone/Capstone.java
index a0ffae4..334c1e0 100644
--- a/bindings/java/capstone/Capstone.java
+++ b/bindings/java/capstone/Capstone.java
@@ -22,6 +22,7 @@
public int arch;
public int mode;
+ private int syntax;
protected static abstract class OpInfo {}
protected static abstract class UnionOpInfo extends Structure {}
@@ -37,16 +38,18 @@
public int id;
public long address;
public short size;
- public byte[] mnemonic = new byte[32];
- public byte[] operands = new byte[96];
- public int[] regs_read = new int[32];
+ public byte[] bytes;
+ public byte[] mnemonic;
+ public byte[] operands;
+ public int[] regs_read;
public int regs_read_count;
- public int[] regs_write = new int[32];
+ public int[] regs_write;
public int regs_write_count;
- public int[] groups = new int[8];
+ public int[] groups;
public int groups_count;
public _cs_insn(Pointer p) {
+ bytes = new byte[16];
mnemonic = new byte[32];
operands = new byte[96];
regs_read = new int[32];
@@ -58,7 +61,7 @@
@Override
public List getFieldOrder() {
- return Arrays.asList("id", "address", "size", "mnemonic", "operands",
+ return Arrays.asList("id", "address", "size", "bytes", "mnemonic", "operands",
"regs_read", "regs_read_count",
"regs_write", "regs_write_count",
"groups", "groups_count");
@@ -189,6 +192,8 @@
long addr, NativeLong count, PointerByReference insn);
public void cs_free(Pointer p);
public int cs_close(NativeLong handle);
+ public int cs_option(NativeLong handle, int option, NativeLong optionValue);
+
public String cs_reg_name(NativeLong csh, int id);
public int cs_op_count(NativeLong csh, Pointer insn, int type);
public int cs_op_index(NativeLong csh, Pointer insn, int type, int index);
@@ -224,6 +229,13 @@
public static final int CS_ERR_CSH = 4; // Invalid csh argument
public static final int CS_ERR_MODE = 5; // Invalid/unsupported mode
+ // Capstone option type
+ public static final int CS_OPT_SYNTAX = 1; // Intel X86 asm syntax (CS_ARCH_X86 arch)
+
+ //Capstone option value
+ public static final int CS_OPT_SYNTAX_INTEL = 1; // Intel X86 asm syntax (CS_ARCH_X86 arch)
+ public static final int CS_OPT_SYNTAX_ATT = 2; // ATT asm syntax (CS_ARCH_X86 arch)
+
protected class NativeStruct {
private NativeLong csh;
private NativeLongByReference handleRef;
@@ -245,6 +257,14 @@
ns.csh = ns.handleRef.getValue();
}
+ public void setSyntax(int syntax) {
+ if (cs.cs_option(ns.csh, CS_OPT_SYNTAX, new NativeLong(syntax)) == CS_ERR_OK) {
+ this.syntax = syntax;
+ } else {
+ throw new RuntimeException("ERROR: Unknown syntax");
+ }
+ }
+
public String reg_name(int reg) {
return cs.cs_reg_name(ns.csh, reg);
}