summaryrefslogtreecommitdiffstats
path: root/BeOS/ar-1.1/docs/dumpo.py
diff options
context:
space:
mode:
Diffstat (limited to 'BeOS/ar-1.1/docs/dumpo.py')
-rw-r--r--BeOS/ar-1.1/docs/dumpo.py126
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()