aboutsummaryrefslogtreecommitdiff
path: root/ethyl.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ethyl.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/ethyl.py b/ethyl.py
index 0d283b4..ad128b1 100644
--- a/ethyl.py
+++ b/ethyl.py
@@ -122,9 +122,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:
@@ -135,16 +136,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)
@@ -158,8 +159,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',
@@ -176,6 +179,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)
@@ -189,15 +193,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)
@@ -244,10 +251,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 = ''
@@ -288,6 +297,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 = []
@@ -300,6 +310,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
@@ -307,12 +318,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
@@ -321,6 +334,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
@@ -356,5 +370,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