bin2h.py: add support for --mode=gas-be32 and --mode=gas-le32.

This commit is contained in:
Markus F.X.J. Oberhumer
2008-04-04 16:35:58 +02:00
parent 23ce91eb55
commit 8283e4e6d6
+70 -36
View File
@@ -78,63 +78,86 @@ def w_header_c(w, ifile, ofile, n):
# // write data # // write data
# ************************************************************************/ # ************************************************************************/
def w_checksum_c(w, s, data): class DataWriter:
w("#define %s_SIZE %d\n" % (s, len(data))) def __init__(self, w):
w("#define %s_ADLER32 0x%08x\n" % (s, 0xffffffffL & zlib.adler32(data))) self.w = w
w("#define %s_CRC32 0x%08x\n" % (s, 0xffffffffL & zlib.crc32(data)))
w("\n") def w_eol(self, i):
if i >= 0:
self.w(" /* 0x%04x */\n" % (i))
def w_data_c(w, data): class DataWriter_c(DataWriter):
def w_eol(w, i): def w_eol(self, i):
if i > 0: if i >= 0:
w(" /* 0x%4x */" % (i - 16)) self.w(" /* 0x%4x */\n" % (i))
w("\n")
n = len(data) def w_data(self, data):
w, n = self.w, len(data)
for i in range(n): for i in range(n):
if i % 16 == 0: if i % 16 == 0:
w_eol(w, i) self.w_eol(i - 16)
w("%3d" % ord(data[i])) w("%3d" % ord(data[i]))
w(", " [i == n - 1]) w(", " [i == n - 1])
i = n i = n
while i % 16 != 0: while i % 16 != 0:
w(" ") w(" " * 4)
i += 1 i += 1
w_eol(w, i) self.w_eol(i - 16)
def w_data_gas(w, data): class DataWriter_gas(DataWriter):
def w_eol(w, i): def w_data(self, data):
if i > 0: w, n = self.w, len(data)
w(" /* 0x%04x */" % (i - 16))
w("\n")
n = len(data)
for i in range(n): for i in range(n):
if i % 16 == 0: if i % 16 == 0:
w_eol(w, i) self.w_eol(i - 16)
w(".byte ") w(".byte ")
else: else:
w(",") w(",")
w("%3d" % ord(data[i])) w("%3d" % ord(data[i]))
i = n i = n
while i % 16 != 0: while i % 16 != 0:
w(" ") w(" " * 4)
i += 1 i += 1
w_eol(w, i) self.w_eol(i - 16)
def w_data_nasm(w, data): class _DataWriter_gas_u32(DataWriter):
def w_eol(w, i): def w_data(self, data):
if i > 0: w, n = self.w, len(data)
w(" ; 0x%04x" % (i - 16)) assert n % 4 == 0, n
w("\n") for i in range(0, n, 4):
if i % 16 == 0:
self.w_eol(i - 16)
w(".int ")
else:
w(",")
v = struct.unpack(self.DECODE, data[i:i+4])
assert len(v) == 1, v
w("0x%08x" % (v[0] & 0xffffffffL))
i = n
while i % 16 != 0:
w(" " * 11)
i += 4
self.w_eol(i - 16)
n = len(data) class DataWriter_gas_be32(_DataWriter_gas_u32):
DECODE = ">i"
class DataWriter_gas_le32(_DataWriter_gas_u32):
DECODE = "<i"
class DataWriter_nasm(DataWriter):
def w_eol(self, i):
if i >= 0:
self.w(" ; 0x%04x\n" % (i))
def w_data(self, data):
w, n = self.w, len(data)
for i in range(n): for i in range(n):
if i % 16 == 0: if i % 16 == 0:
w_eol(w, i) self.w_eol(i - 16)
w("db ") w("db ")
else: else:
w(",") w(",")
@@ -143,13 +166,20 @@ def w_data_nasm(w, data):
while i % 16 != 0: while i % 16 != 0:
w(" ") w(" ")
i += 1 i += 1
w_eol(w, i) self.w_eol(i - 16)
# /*********************************************************************** # /***********************************************************************
# // write stub # // write stub
# ************************************************************************/ # ************************************************************************/
def w_checksum_c(w, s, data):
w("#define %s_SIZE %d\n" % (s, len(data)))
w("#define %s_ADLER32 0x%08x\n" % (s, 0xffffffffL & zlib.adler32(data)))
w("#define %s_CRC32 0x%08x\n" % (s, 0xffffffffL & zlib.crc32(data)))
w("\n")
def write_stub(w, odata, method_index, methods): def write_stub(w, odata, method_index, methods):
method = methods[method_index] method = methods[method_index]
if len(methods) > 1: if len(methods) > 1:
@@ -165,13 +195,17 @@ def write_stub(w, odata, method_index, methods):
w_checksum_c(w, opts.ident.upper(), odata) w_checksum_c(w, opts.ident.upper(), odata)
w("unsigned char %s[%d] = {\n" % (opts.ident, len(odata))) w("unsigned char %s[%d] = {\n" % (opts.ident, len(odata)))
if opts.mode == "c": if opts.mode == "c":
w_data_c(w, odata) DataWriter_c(w).w_data(odata)
elif opts.mode == "gas": elif opts.mode == "gas":
w_data_gas(w, odata) DataWriter_gas(w).w_data(odata)
elif opts.mode == "gas-be32":
DataWriter_gas_be32(w).w_data(odata)
elif opts.mode == "gas-le32":
DataWriter_gas_le32(w).w_data(odata)
elif opts.mode == "nasm": elif opts.mode == "nasm":
w_data_nasm(w, odata) DataWriter_nasm(w).w_data(odata)
else: else:
assert 0, opts.mode assert 0, ("invalid mode", opts.mode)
if opts.ident: if opts.ident:
if opts.mode == "c": if opts.mode == "c":
w("};\n") w("};\n")