aboutsummaryrefslogtreecommitdiff
path: root/ethyl.py
diff options
context:
space:
mode:
Diffstat (limited to 'ethyl.py')
-rw-r--r--ethyl.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/ethyl.py b/ethyl.py
index 0114aee..c57bb8a 100644
--- a/ethyl.py
+++ b/ethyl.py
@@ -142,9 +142,10 @@ for (dname, definition) in formats.items():
else:
df.append((typ, name, default))
formats[dname] = df, etc, etcn
-
+
# Dumb pretty printer
def my_repr(b, start=''):
+ '''scrap this shit and implement new one eventually'''
special = lambda x: type(x) not in (int, str, unicode)
if type(b) == dict:
if len(filter(special, b.values())) == 0:
@@ -155,16 +156,16 @@ def my_repr(b, start=''):
rep += ', '
else:
f = True
- rep += '%s: %s' % (str(a), my_repr(b[a]))
+ rep += '"%s": %s' % (str(a), my_repr(b[a]))
rep += ' }'
else:
rep = '{\n'
for a in sorted(b.keys()):
c = b[a]
if type(c) in (dict, list):
- rep += '%s:\n%s\n' % (str(a), my_repr(c, ' '))
+ rep += '"%s":\n%s,\n' % (str(a), my_repr(c, ' '))
else:
- rep += '%s: %s\n' % ( str(a), my_repr(c))
+ rep += '"%s": %s,\n' % ( str(a), my_repr(c))
rep += '}'
elif type(b) in (int, long):
rep = hex(b)
@@ -178,8 +179,10 @@ def my_repr(b, start=''):
else:
rep = repr(b)
return re.sub(re.compile('^', re.M), start, rep)
+
def pr_dict(*args):
print my_repr(*args)
+
types = {
'u8': 'B',
'u16': 'H',
@@ -196,6 +199,7 @@ types = {
'bool': 'c',
'char': 'c',
}
+
def parse_var(pos, typ, chunk):
if not types.has_key(typ):
raise Exception('What\'s a %s?' % typ)
@@ -209,15 +213,18 @@ def nullterm(str_plus):
return str_plus[:z]
else:
return str_plus
+
def unnullterm(var, size):
if len(var) > size:
raise Exception('unnullterm: "%s" too long' % var)
return var.ljust(size, '\0')
+
def untv(name):
#assert '\0' not in name
lex = len(name) + 16
lex -= lex % 16
return name.ljust(lex, '\0')
+
def parse_data(chunk, definition, prefix=None, start=0):
df, etc, etcn = formats[definition]
#print df, repr(definition)
@@ -264,10 +271,12 @@ def parse_data(chunk, definition, prefix=None, start=0):
ret = ret['_']
return (ret, pos) if etcn else ret
+
def unparse_var(typ, var):
if not types.has_key(typ):
raise Exception('What\'s a %s?' % typ)
return struct.pack('>' + types[typ], var)
+
def unparse_data(vars, definition, prefix=None):
df, etc, etcn = formats[definition]
ret = ''
@@ -308,6 +317,7 @@ def unparse_data(vars, definition, prefix=None):
for v in var:
ret += unparse_var(typ, v)
return ret
+
def iff_to_chunks(z):
pos = 0
chunks = []
@@ -320,6 +330,7 @@ def iff_to_chunks(z):
pos += length
chunks.append((cc, data))
return chunks
+
def bit_extract(num, start, end=None):
if end is None:
end = start
@@ -327,12 +338,14 @@ def bit_extract(num, start, end=None):
ret = (num & mask) >> (31 - end)
return ret
+
def bit_place(num, start, end=None):
# Just for sanity
if end is None:
end = start
assert num <= 2**(end - start)
return num << (31 - end)
+
def get_array(chunk, startpos, array_size, item_size, item_type=None):
ar = []
pos = startpos
@@ -341,6 +354,7 @@ def get_array(chunk, startpos, array_size, item_size, item_type=None):
ar.append(get_opt(chunk, pos, True, item_size, item_type)[0])
pos += item_size
return ar, pos
+
def get_opt(chunk, startpos, enabled, size, item_type=None):
if not enabled:
return None, startpos
@@ -376,5 +390,6 @@ def put_opt(var, flags, bit, size, item_type=None):
else:
raise Exception('unhandled')
return ret, flags
+
def i2f(int):
return struct.unpack('>f', struct.pack('>I', int))[0] \ No newline at end of file