diff options
| author | itsme <itsme@xs4all.nl> | 2021-07-09 21:06:35 +0200 |
|---|---|---|
| committer | itsme <itsme@xs4all.nl> | 2021-07-09 21:06:35 +0200 |
| commit | d30a78c7ea4c702519b00243b43d507582b119c0 (patch) | |
| tree | e9070bc1adf5ab3e73983cd84cab6d5f6a2fc43a | |
| parent | e7b27cfba9c6cf7da8653a411d7bf2fc93c0b398 (diff) | |
crodump: improved strudump output and code
| -rw-r--r-- | crodump.py | 73 |
1 files changed, 37 insertions, 36 deletions
| @@ -198,32 +198,16 @@ class Datafile: | |||
| 198 | C = zlib.decompressobj(-15) | 198 | C = zlib.decompressobj(-15) |
| 199 | return C.decompress(data[8:-3]) | 199 | return C.decompress(data[8:-3]) |
| 200 | 200 | ||
| 201 | def destruct_bank_definition(args, data): | 201 | def dump_bank_definition(args, bankdict): |
| 202 | """ | 202 | """ |
| 203 | decode the 'bank' / database definition | 203 | decode the 'bank' / database definition |
| 204 | """ | 204 | """ |
| 205 | rd = ByteReader(data) | 205 | for k, v in bankdict.items(): |
| 206 | 206 | if re.search(b'[^\x0d\x0a\x09\x20-\x7e\xc0-\xff]', v): | |
| 207 | version = rd.readbyte() | 207 | print("%-20s - %s" % (k, toout(args, v))) |
| 208 | print("bank version: %02x" % version) | ||
| 209 | |||
| 210 | d = dict() | ||
| 211 | while not rd.eof(): | ||
| 212 | keyname = rd.readname() | ||
| 213 | if keyname in d: | ||
| 214 | print("WARN: duplicate key: %s" % keyname) | ||
| 215 | |||
| 216 | index_or_length = rd.readdword() | ||
| 217 | if index_or_length >> 31: | ||
| 218 | value = d[keyname] = rd.readbytes(index_or_length & 0x7FFFFFFF) | ||
| 219 | if re.search(b'[^\x0d\x0a\x09\x20-\x7e\xc0-\xff]', value): | ||
| 220 | print("%-20s - %s" % (keyname, toout(args, d[keyname]))) | ||
| 221 | else: | ||
| 222 | print("%-20s - \"%s\"" % (keyname, strescape(d[keyname]))) | ||
| 223 | else: | 208 | else: |
| 224 | d[keyname] = index_or_length | 209 | print("%-20s - \"%s\"" % (k, strescape(v))) |
| 225 | print("%-20s -> #%s" % (keyname, d[keyname])) | 210 | |
| 226 | return d | ||
| 227 | 211 | ||
| 228 | def decode_field(data): | 212 | def decode_field(data): |
| 229 | rd = ByteReader(data) | 213 | rd = ByteReader(data) |
| @@ -249,8 +233,6 @@ def destruct_base_definition(args, data): | |||
| 249 | """ | 233 | """ |
| 250 | rd = ByteReader(data) | 234 | rd = ByteReader(data) |
| 251 | 235 | ||
| 252 | version = rd.readbyte() | ||
| 253 | print("base version: %02x" % version) | ||
| 254 | unk123 = [rd.readword() for _ in range(3)] | 236 | unk123 = [rd.readword() for _ in range(3)] |
| 255 | unk45 = [rd.readdword() for _ in range(2)] | 237 | unk45 = [rd.readdword() for _ in range(2)] |
| 256 | tablename = rd.readname() | 238 | tablename = rd.readname() |
| @@ -343,20 +325,39 @@ class Database: | |||
| 343 | return | 325 | return |
| 344 | self.dumptabledefs(args) | 326 | self.dumptabledefs(args) |
| 345 | 327 | ||
| 328 | def decode_bank_definition(self, data): | ||
| 329 | """ | ||
| 330 | decode the 'bank' / database definition | ||
| 331 | """ | ||
| 332 | rd = ByteReader(data) | ||
| 333 | |||
| 334 | d = dict() | ||
| 335 | while not rd.eof(): | ||
| 336 | keyname = rd.readname() | ||
| 337 | if keyname in d: | ||
| 338 | print("WARN: duplicate key: %s" % keyname) | ||
| 339 | |||
| 340 | index_or_length = rd.readdword() | ||
| 341 | if index_or_length >> 31: | ||
| 342 | d[keyname] = rd.readbytes(index_or_length & 0x7FFFFFFF) | ||
| 343 | else: | ||
| 344 | refdata = self.stru.readrec(index_or_length) | ||
| 345 | if refdata[:1] != b"\x04": | ||
| 346 | print("WARN: expected refdata to start with 0x04") | ||
| 347 | d[keyname] = refdata[1:] | ||
| 348 | return d | ||
| 349 | |||
| 346 | def dumptabledefs(self, args): | 350 | def dumptabledefs(self, args): |
| 347 | dbinfo = self.stru.readrec(1) | 351 | dbinfo = self.stru.readrec(1) |
| 348 | dbdef = destruct_bank_definition(args, dbinfo) | 352 | if dbinfo[:1] != b"\x03": |
| 349 | 353 | print("WARN: expected dbinfo to start with 0x03") | |
| 350 | for i in range(100): | 354 | dbdef = self.decode_bank_definition(dbinfo[1:]) |
| 351 | idx = dbdef.get("Base%03d" % i) | 355 | dump_bank_definition(args, dbdef) |
| 352 | if idx: | 356 | |
| 353 | print("== Base%03d ==" % i) | 357 | for k, v in dbdef.items(): |
| 354 | if type(idx)==int: | 358 | if k.startswith("Base") and k[4:].isnumeric(): |
| 355 | tbinfo = self.stru.readrec(idx) | 359 | print("== %s ==" % k) |
| 356 | else: | 360 | tbdef = destruct_base_definition(args, v) |
| 357 | # the table def is in the value. | ||
| 358 | tbinfo = struct.pack("<B", 4) + idx | ||
| 359 | tbdef = destruct_base_definition(args, tbinfo) | ||
| 360 | 361 | ||
| 361 | def bankdump(self, args): | 362 | def bankdump(self, args): |
| 362 | if not self.bank: | 363 | if not self.bank: |
