python: rename skipdata_opt to skipdata_setup & handle callback properly
diff --git a/bindings/python/capstone/__init__.py b/bindings/python/capstone/__init__.py
index 1e1dbe3..b69633e 100644
--- a/bindings/python/capstone/__init__.py
+++ b/bindings/python/capstone/__init__.py
@@ -1 +1 @@
-from capstone import Cs, CsError, cs_disasm_quick, cs_disasm_lite, cs_version, cs_support, version_bind, debug, CS_API_MAJOR, CS_API_MINOR, CS_ARCH_ARM, CS_ARCH_ARM64, CS_ARCH_MIPS, CS_ARCH_X86, CS_ARCH_PPC, CS_ARCH_SPARC, CS_ARCH_SYSZ, CS_ARCH_ALL, CS_MODE_LITTLE_ENDIAN, CS_MODE_ARM, CS_MODE_THUMB, CS_OPT_SYNTAX, CS_OPT_SYNTAX_DEFAULT, CS_OPT_SYNTAX_INTEL, CS_OPT_SYNTAX_ATT, CS_OPT_SYNTAX_NOREGNAME, CS_OPT_DETAIL, CS_OPT_ON, CS_OPT_OFF, CS_MODE_16, CS_MODE_32, CS_MODE_64, CS_MODE_BIG_ENDIAN, CS_MODE_MICRO, CS_MODE_N64, CS_MODE_V9, CS_SUPPORT_DIET, CS_SUPPORT_X86_REDUCE
+from capstone import Cs, CsError, cs_disasm_quick, cs_disasm_lite, cs_version, cs_support, version_bind, debug, CS_API_MAJOR, CS_API_MINOR, CS_ARCH_ARM, CS_ARCH_ARM64, CS_ARCH_MIPS, CS_ARCH_X86, CS_ARCH_PPC, CS_ARCH_SPARC, CS_ARCH_SYSZ, CS_ARCH_ALL, CS_MODE_LITTLE_ENDIAN, CS_MODE_ARM, CS_MODE_THUMB, CS_OPT_SYNTAX, CS_OPT_SYNTAX_DEFAULT, CS_OPT_SYNTAX_INTEL, CS_OPT_SYNTAX_ATT, CS_OPT_SYNTAX_NOREGNAME, CS_OPT_DETAIL, CS_OPT_ON, CS_OPT_OFF, CS_MODE_16, CS_MODE_32, CS_MODE_64, CS_MODE_BIG_ENDIAN, CS_MODE_MICRO, CS_MODE_N64, CS_MODE_V9, CS_SUPPORT_DIET, CS_SUPPORT_X86_REDUCE, CS_SKIPDATA_CALLBACK
diff --git a/bindings/python/capstone/capstone.py b/bindings/python/capstone/capstone.py
index 0af589b..973e0e1 100644
--- a/bindings/python/capstone/capstone.py
+++ b/bindings/python/capstone/capstone.py
@@ -60,6 +60,8 @@
'CS_SUPPORT_DIET',
'CS_SUPPORT_X86_REDUCE',
+
+ 'CS_SKIPDATA_CALLBACK'
]
# Capstone C interface
@@ -210,12 +212,12 @@
)
# callback for SKIPDATA option
-SKIPDATA_CB = ctypes.CFUNCTYPE(ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p)
+CS_SKIPDATA_CALLBACK = ctypes.CFUNCTYPE(ctypes.c_size_t, ctypes.c_size_t, ctypes.c_void_p)
class _cs_opt_skipdata(ctypes.Structure):
_fields_ = (
('mnemonic', ctypes.c_char_p),
- ('callback', SKIPDATA_CB),
+ ('callback', CS_SKIPDATA_CALLBACK),
('user_data', ctypes.c_void_p),
)
@@ -661,18 +663,16 @@
# setter: modify "data" instruction's mnemonic for SKIPDATA
@syntax.setter
- def skipdata_opt(self, opt):
+ def skipdata_setup(self, opt):
_skipdata_opt = _cs_opt_skipdata()
_mnem, _cb, _ud = opt
_skipdata_opt.mnemonic = _mnem
- _skipdata_opt.callback = ctypes.cast(_cb, SKIPDATA_CB)
- #_skipdata_opt.callback = _cb
- _skipdata_opt.user_data = _ud
+ _skipdata_opt.callback = ctypes.cast(_cb, CS_SKIPDATA_CALLBACK)
+ _skipdata_opt.user_data = ctypes.cast(_ud, ctypes.c_void_p)
status = _cs.cs_option(self.csh, CS_OPT_SKIPDATA_SETUP, ctypes.cast(ctypes.byref(_skipdata_opt), ctypes.c_void_p))
if status != CS_ERR_OK:
raise CsError(status)
- # save the "data" instruction mnem
self._skipdata_opt = _skipdata_opt
diff --git a/bindings/python/test_skipdata.py b/bindings/python/test_skipdata.py
index 6d7fcd0..f8e9f3f 100755
--- a/bindings/python/test_skipdata.py
+++ b/bindings/python/test_skipdata.py
@@ -30,6 +30,12 @@
print
+# Sample callback for SKIPDATA option
+def testcb(offset, userdata):
+ # always skip 2 bytes of data
+ return 2
+
+
### Test class Cs
def test_class():
for (arch, mode, code, comment, syntax) in all_tests:
@@ -47,7 +53,10 @@
md.skipdata = True
# To rename "data" instruction's mnemonic to "db", uncomment the line below
# This example ignores SKIPDATA's callback (first None) & user_data (second None)
- # md.skipdata_opt = ("db", None, None)
+ # md.skipdata_setup = ("db", None, None)
+
+ # To customize the callback, uncomment the line below.
+ # md.skipdata_setup = (".db", CS_SKIPDATA_CALLBACK(testcb), None)
for insn in md.disasm(code, 0x1000):
#bytes = binascii.hexlify(insn.bytes)