#!/usr/bin/env python3 HELP = '''GreggyBits: (un)pack resources in the Macintosh System file (7.1) Algorithm by Greg Mariott Reimplemented by Maxim Poliakovski and Elliot Nunn Use the 'rfx' wrapper command to access resources inside a file''' def debug_round_trip(filename, packed): print(filename.split('/')[-1], end=' ') unpacked = unpack(packed) repacked = pack(unpacked) if packed == repacked: print('good', end=' ') elif packed[17] != repacked[17]: print('WRONGMODE', repacked[17], 'not', packed[17], end=' ') if pack_with_flags(unpacked, packed[17]) == packed: print('(correct when mode is forced)', end=' ') elif packed[:14] == repacked[:14] and packed[16:] == repacked[16:]: print('sloppy', hex(struct.unpack_from('>H', repacked, 14)[0]), 'not', hex(struct.unpack_from('>H', packed, 14)[0]), end=' ') else: print('other', end=' ') print() if __name__ == '__main__': # Some cheeky debug code for testing... rfx greggybits --debug System// from macresources.greggybits import pack, pack_with_flags, unpack import struct import sys import argparse parser = argparse.ArgumentParser( description=HELP, formatter_class=argparse.RawTextHelpFormatter, ) parser.prog = '[rfx] ' + parser.prog parser.add_argument('path', nargs='+', metavar='file', action='store', help='Resource data') parser.add_argument('-x', dest='do_compress', action='store_false', help='extract (default: compress)') parser.add_argument('--debug', action='store_true', help='attempt to round-trip resources') args = parser.parse_args() for el in args.path: from macresources.greggybits import pack, unpack with open(el, 'r+b') as f: already_compressed = (f.read(4) == b'\xA8\x9Fer') if already_compressed == args.do_compress: continue f.seek(0) data = f.read() try: if args.do_compress: data = pack(data) if args.debug: debug_round_trip(el, data) else: if args.debug: debug_round_trip(el, data) data = unpack(data) f.seek(0) f.write(data) f.truncate() except ValueError: raise print('some kind of error')