lib3ddevil1/bindings/py3devil1pld.py

60 lines
1.8 KiB
Python
Raw Normal View History

2018-05-16 01:12:16 +05:30
#!/usr/bin/python3
import ctypes
from .__init__ import libc
2018-05-16 01:12:16 +05:30
#--------------------------------------+
# Basic Struct
#--------------------------------------+
2018-05-17 08:48:37 +05:30
class _PldHeader_(ctypes.Structure):
2018-05-16 01:12:16 +05:30
_pack_ = 1
_fields_ = [
("numOffset", ctypes.c_int),
("offsets", ctypes.POINTER(ctypes.c_int))
]
class Devil1PLD_FN(ctypes.Structure):
_fields_ = [
("getheader" , ctypes.CFUNCTYPE(
ctypes.c_bool,
2018-05-17 08:48:37 +05:30
ctypes.POINTER(_PldHeader_),
2018-05-16 01:12:16 +05:30
ctypes.c_char_p)),
("sizeofsector", ctypes.CFUNCTYPE(
ctypes.c_int,
2018-05-17 08:48:37 +05:30
ctypes.POINTER(_PldHeader_),
2018-05-16 01:12:16 +05:30
ctypes.c_int)),
("printheader" , ctypes.CFUNCTYPE(None,
2018-05-17 08:48:37 +05:30
ctypes.POINTER(_PldHeader_)))
2018-05-16 01:12:16 +05:30
]
devil1pld = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD")
del libc
2018-05-16 01:12:16 +05:30
#--------------------------------------+
# Pythonic Object
#--------------------------------------+
2018-05-17 08:48:37 +05:30
class PldHeader:
2018-05-16 01:12:16 +05:30
def __init__(self, filedata = None):
# Store C Struct in order to call C functions
2018-05-17 08:48:37 +05:30
self.cstruct = _PldHeader_()
2018-05-16 01:12:16 +05:30
if filedata:
devil1pld.getheader(ctypes.byref(self.cstruct), filedata)
self.eof = len(filedata)
def show(self):
devil1pld.printheader(ctypes.byref(self.cstruct))
return
def getnumoffsets(self):
return self.cstruct.numOffsets
# return pythonic list of offsets
def getoffsets(self):
return self.cstruct.offsets[:self.cstruct.numOffset]
def sizeofsector(self, i):
ptr = ctypes.byref(self.cstruct)
return devil1pld.sizeofsector(ptr, i, self.eof)