diff options
Diffstat (limited to 'ethyl.py')
| -rw-r--r-- | ethyl.py | 23 |
1 files changed, 19 insertions, 4 deletions
@@ -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 |
