12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import ctypes
- import os, sys
- # This is the folder containing the whole library.
- sys.path.append(
- os.path.abspath(
- os.path.join(
- os.path.dirname(__file__), "../../")))
- from lib3ddevil1.bindings import libc
- del os, sys
- #--------------------------------------+
- # Basic Struct
- #--------------------------------------+
- class PldHeader(ctypes.Structure):
- _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,
- ctypes.POINTER(PldHeader),
- ctypes.c_char_p)),
- ("sizeofsector", ctypes.CFUNCTYPE(
- ctypes.c_int,
- ctypes.POINTER(PldHeader),
- ctypes.c_int)),
- ("printheader" , ctypes.CFUNCTYPE(None,
- ctypes.POINTER(PldHeader)))
- ]
- devil1pld = Devil1PLD_FN.in_dll(libc, "DEVIL1PLD")
- del libc
- #--------------------------------------+
- # Pythonic Object
- #--------------------------------------+
- class pyPldHeader:
- def __init__(self, filedata = None):
- # Store C Struct in order to call C functions
- self.cstruct = PldHeader()
- if filedata:
- if not devil1pld.getheader(ctypes.byref(self.cstruct), filedata):
- raise RuntimeError("failed to get .pld header")
- 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)
|