diff options
Diffstat (limited to 'BeOS/ar-1.1/docs/dumpo.py')
-rw-r--r-- | BeOS/ar-1.1/docs/dumpo.py | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/BeOS/ar-1.1/docs/dumpo.py b/BeOS/ar-1.1/docs/dumpo.py new file mode 100644 index 0000000..91bd8db --- /dev/null +++ b/BeOS/ar-1.1/docs/dumpo.py @@ -0,0 +1,126 @@ +#! /bin/env python +""" Dump data about a Metrowerks object file. + +Based on reverse-engineering the library file format, since the docs are +wrong. + +Copyright (C) 1997 Chris Herborth (chrish@qnx.com) +""" + +# ---------------------------------------------------------------------- +# Standard modules +import sys, getopt, string, time + +# ---------------------------------------------------------------------- +# Extra goodies +from dumpar import mk_long, str2hex, print_offset, get_string + +# ---------------------------------------------------------------------- +def mk_short( str ): + """ convert a 2-byte string into a number + + Assumes big-endian! + """ + if len( str ) < 2: + raise ValueError, "str must be 2 bytes long" + + num = ord( str[1] ) + num = num + ord( str[0] ) * 0x100 + + return num + +# ---------------------------------------------------------------------- +def usage(): + """ Display a usage message and exit. + """ + print "dumpo [-v] object1 [object2 ... objectn]" + print + print "Attempt to display some useful information about the contents" + print "of the given Metrowerks object file(s)." + print + print "-v Be verbose (displays offsets along with the data)" + raise SystemExit + +# ---------------------------------------------------------------------- +def dump_o( file, verbose ): + """ dump information about a Metrowerks object file + + Note that there is more info there, 6 more quads before the file name. + """ + offset = 0 + + print "Dumping object:", file + + # Attempt to read the data. + try: + data = open( file ).read() + except IOError, retval: + print "*** Unable to open file %s: %s" % ( file, retval[1] ) + return + + # Check the magic number. + if verbose: + print_offset( offset ) + print "Magic:", + magic = data[offset:offset + 8] + print "'%s'" % ( magic ) + if magic != "MWOBPPC ": + print "*** Invalid magic number!" + return + + offset = offset + 8 + + # version + if verbose: + print_offset( offset ) + print "version:", mk_long( data[offset:offset + 4] ) + offset = offset + 4 + + # flags + if verbose: + print_offset( offset ) + print "flags:", str2hex( data[offset:offset + 4] ) + offset = offset + 4 + + # code size + if verbose: + print_offset( offset ) + print "code size:", mk_long( data[offset:offset + 4] ) + offset = offset + 4 + + # data size + if verbose: + print_offset( offset ) + print "data size:", mk_long( data[offset:offset + 4] ) + offset = offset + 4 + +# ---------------------------------------------------------------------- +def main(): + """ mainline + """ + + # Set up some defaults + be_verbose = 0 + + # First, check the command-line arguments + try: + opt, args = getopt.getopt( sys.argv[1:], "vh?" ) + except getopt.error: + print "*** Error parsing command-line options!" + usage() + + for o in opt: + if o[0] == "-h" or o[0] == "-?": + usage() + elif o[0] == "-v": + be_verbose = 1 + else: + print "*** Unknown command-line option!" + usage() + + # Now we can attempt to dump info about the arguments. + for obj in args: + dump_o( obj, be_verbose ) + +if __name__ == "__main__": + main() |