Merge pull request #819 from akirschbaum/next-java-add-binding

Java: Support cs_strerror() and cs_regs_access()
diff --git a/ChangeLog b/ChangeLog
index 1cb3e25..1094cff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,10 @@
 - Fix a bug where Arm.OpInfo.memBarrier and Arm.OpInfo.op is wrongly
   calculated
 
+[ Bindings ]
+
+- Java; add Capstone.strerror() and CsInsn.regsAccess().
+
 ---------------------------------
 Version 3.0.2: March 11th, 2015
 
diff --git a/bindings/java/capstone/Capstone.java b/bindings/java/capstone/Capstone.java
index 6da99ab..2d49f91 100644
--- a/bindings/java/capstone/Capstone.java
+++ b/bindings/java/capstone/Capstone.java
@@ -4,8 +4,10 @@
 package capstone;
 
 import com.sun.jna.Library;
+import com.sun.jna.Memory;
 import com.sun.jna.Native;
 import com.sun.jna.NativeLong;
+import com.sun.jna.ptr.ByteByReference;
 import com.sun.jna.ptr.NativeLongByReference;
 import com.sun.jna.Structure;
 import com.sun.jna.Union;
@@ -238,6 +240,38 @@
       return cs.cs_insn_group(csh, raw.getPointer(), gid) != 0;
     }
 
+    public CsRegsAccess regsAccess() {
+      Memory regsReadMemory = new Memory(64*2);
+      ByteByReference regsReadCountRef = new ByteByReference();
+      Memory regsWriteMemory = new Memory(64*2);
+      ByteByReference regsWriteCountRef = new ByteByReference();
+
+      int c = cs.cs_regs_access(csh, raw.getPointer(), regsReadMemory, regsReadCountRef, regsWriteMemory, regsWriteCountRef);
+      if (c != CS_ERR_OK) {
+        return null;
+      }
+
+      byte regsReadCount = regsReadCountRef.getValue();
+      byte regsWriteCount = regsWriteCountRef.getValue();
+
+      short[] regsRead = new short[regsReadCount];
+      regsReadMemory.read(0, regsRead, 0, regsReadCount);
+
+      short[] regsWrite = new short[regsWriteCount];
+      regsWriteMemory.read(0, regsWrite, 0, regsWriteCount);
+
+      return new CsRegsAccess(regsRead, regsWrite);
+    }
+  }
+
+  public static class CsRegsAccess {
+    public short[] regsRead;
+    public short[] regsWrite;
+
+    public CsRegsAccess(short[] regsRead, short[] regsWrite) {
+      this.regsRead = regsRead;
+      this.regsWrite = regsWrite;
+    }
   }
 
   private CsInsn[] fromArrayRaw(_cs_insn[] arr_raw) {
@@ -270,6 +304,8 @@
     public int cs_errno(NativeLong csh);
     public int cs_version(IntByReference major, IntByReference minor);
     public boolean cs_support(int query);
+    public String cs_strerror(int code);
+    public int cs_regs_access(NativeLong handle, Pointer insn, Pointer regs_read, ByteByReference regs_read_count, Pointer regs_write, ByteByReference regs_write_count);
   }
 
   // Capstone API version
@@ -478,4 +514,8 @@
 
     return allInsn;
   }
+
+  public String strerror(int code) {
+    return cs.cs_strerror(code);
+  }
 }