From 6187243466115a71985ccc02cd5408f43c5110e0 Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Wed, 24 Oct 2018 11:27:45 +0800 Subject: [PATCH] Allow arbitrary resource alignment --- bin/SimpleRez | 21 ++++++++++++++++++++- macresources/main.py | 5 ++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/bin/SimpleRez b/bin/SimpleRez index ab3b544..a8a9652 100755 --- a/bin/SimpleRez +++ b/bin/SimpleRez @@ -3,6 +3,24 @@ import argparse import macresources +def parse_align(x): + msg = "%r is not 'word', 'longword' or whole number" % x + + if x.lower() == 'word': + return 2 + elif x.lower() == 'longword': + return 4 + + try: + y = int(x) + except ValueError: + raise argparse.ArgumentTypeError(msg) + + if y < 1: + raise argparse.ArgumentTypeError(msg) + + return y + parser = argparse.ArgumentParser(description=''' Compile legacy Mac resources from a subset of the Rez language. Only data blocks and $"" lines are supported. No attempt is made to @@ -13,6 +31,7 @@ parser = argparse.ArgumentParser(description=''' parser.add_argument('rezFile', nargs='+', help='resource description files') parser.add_argument('-o', metavar='outputFile', default='Rez.out', help='default: Rez.out') +parser.add_argument('-align', metavar='word | longword | n', action='store', type=parse_align, default=1) parser.add_argument('-useDF', action='store_true', help='ignored: data fork is always used') args = parser.parse_args() @@ -23,4 +42,4 @@ for in_path in args.rezFile: resources.extend(macresources.parse_rez_code(f.read())) with open(args.o, 'wb') as f: - f.write(macresources.make_file(resources)) + f.write(macresources.make_file(resources, align=args.align)) diff --git a/macresources/main.py b/macresources/main.py index 79e26d9..fd05a92 100644 --- a/macresources/main.py +++ b/macresources/main.py @@ -228,7 +228,7 @@ def parse_rez_code(from_rezcode): pass -def make_file(from_iter): +def make_file(from_iter, align=1): """Pack an iterator of Resource objects into a binary resource file.""" class wrap: @@ -242,6 +242,9 @@ def make_file(from_iter): for r in from_iter: wrapped = wrap(r) + while len(accum) % align: + accum.extend(b'\x00') + wrapped.data_offset = len(accum) accum.extend(struct.pack('>L', len(r.data))) accum.extend(r.data)