aboutsummaryrefslogtreecommitdiff
path: root/parse-brlyt.py
diff options
context:
space:
mode:
authorcomex <comexk@gmail.com>2009-01-28 12:34:10 -0500
committercomex <comexk@gmail.com>2009-01-28 12:34:10 -0500
commit50d3baa2cdcdfb8ad20bd5cd59cbdcb07db731bc (patch)
tree007da64a2f08737aa9f1561f16b181d46d0ffd33 /parse-brlyt.py
parent2a0c75e9811b0d66282765a996b7ebebb1ce5c83 (diff)
refactoring
Diffstat (limited to 'parse-brlyt.py')
-rw-r--r--parse-brlyt.py101
1 files changed, 2 insertions, 99 deletions
diff --git a/parse-brlyt.py b/parse-brlyt.py
index 428f1e3..c737970 100644
--- a/parse-brlyt.py
+++ b/parse-brlyt.py
@@ -1,108 +1,10 @@
import sys, struct, re
+from ethyl import *
f = open(sys.argv[1], 'rb')
rlyt = f.read()
f.close()
-from ethyl import formats
-for (name, definition) in formats.items():
- definition = re.sub(re.compile('//.*$', re.M), '', definition)
- definition = definition.strip()
- definition = re.sub('\n[\n ]+', '\n', definition)
- df = [[j.strip() for j in i.strip().split()] for i in definition.split('\n')]
- formats[name] = df
-
-def pr_dict(data, start=''):
- for a in sorted(data.keys()):
- b = data[a]
- print '%s%s: %s' % (start, str(a), hex(b) if type(b) in (int, long) else repr(b))
-types = {
- 'u8': 'B',
- 'u16': 'H',
- 'u32': 'I',
- 'u64': 'Q',
- 's8': 'b',
- 's16': 'h',
- 's32': 'i',
- 's64': 'q',
- 'float': 'f',
- 'f32': 'f',
- 'double': 'd',
- 'f64': 'd',
- 'bool': 'c',
- 'char': 'c',
-}
-def parse_var(pos, typ, chunk):
- if not types.has_key(typ):
- raise Exception('What\'s a %s?' % typ)
- fmt = '>' + types[typ]
- size = struct.calcsize(fmt)
-
- return (pos + size), struct.unpack(fmt, chunk[pos:pos + size])[0]
-def nullterm(str_plus):
- z = str_plus.find('\0')
- if z != -1:
- return str_plus[:z]
- else:
- return str_plus
-def parse_data(chunk, definition, prefix=None, start=0):
- df = formats[definition][:]
- #print df, repr(definition)
- print df
- etc = df[-1][0][:3] == 'etc'
- etcn = etc and df.pop() == ['etc!']
-
- pos = start
- ret = {}
- for typ, name in df:
- m = re.match('^([^\[]+)\[([a-zA-Z0-9]+)\]$', name)
- if m:
- name = m.group(1)
- size = eval(m.group(2))
- if typ == 'char':
- var = chunk[pos:pos+size].rstrip(chr(0))
- pos += size
- else:
- var = []
- for n in xrange(size):
- pos, varn = parse_var(pos, typ, chunk)
- var.append(varn)
- else:
- pos, var = parse_var(pos, typ, chunk)
- if ret.has_key(name):
- try:
- ret[name].append(var)
- except AttributeError:
- ret[name] = [ret[name], var]
- else:
- ret[name] = var
- #print hex(pos)
- if pos > len(chunk):
- raise Exception('too much!')
- if pos < len(chunk):
- if etc and not etcn:
- ret['etc'] = repr(chunk[pos:])
- elif not etc:
- raise Exception('Incomplete handling...')
- if prefix is not None:
- ret2 = {}
- for (k, v) in ret.items():
- ret2[prefix + '.' + k] = v
- ret = ret2
- return (ret, pos) if etcn else ret
-
-def iff_to_chunks(z):
- pos = 0
- chunks = []
- while pos < len(z):
- cc = z[pos:pos+4]
- length, = struct.unpack('>I', z[pos+4:pos+8])
- #print cc
- #print hex(length)
- data = z[pos+8:pos+length]
- pos += length
- chunks.append((cc, data))
- return chunks
assert rlyt[0:8] == 'RLYT\xfe\xff\x00\x08'
offs, = struct.unpack('>h', rlyt[0xc:0xe])
ch = iff_to_chunks(rlyt[offs:])
@@ -112,6 +14,7 @@ for typ, chunk in ch:
vars = None
if typ in ('pic1', 'pan1', 'bnd1', 'wnd1', 'txt1'):
vars, pos = parse_data(chunk, 'pane')
+ assert chunk[:pos] == unparse_data(vars, 'pane') # for testing
if typ == 'txt1':
vars2, pos = parse_data(chunk[pos:], 'text', '~text')