From 208ea072375937c7258b4841a23185e82fb563b1 Mon Sep 17 00:00:00 2001 From: Rangi Date: Sun, 18 Sep 2022 23:25:22 -0400 Subject: Update and add more tool scripts --- tools/unnamed.py | 211 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 109 insertions(+), 102 deletions(-) (limited to 'tools/unnamed.py') diff --git a/tools/unnamed.py b/tools/unnamed.py index c5544437..265f1452 100755 --- a/tools/unnamed.py +++ b/tools/unnamed.py @@ -1,130 +1,137 @@ #!/usr/bin/env python3 +# -*- coding: utf-8 -*- -from sys import stderr, exit -from subprocess import Popen, PIPE -from struct import unpack, calcsize -from enum import Enum +""" +Usage: unnamed.py [-h] [-r rootdir] [-l count] pokered.sym -class symtype(Enum): - LOCAL = 0 - IMPORT = 1 - EXPORT = 2 +Parse the symfile to find unnamed symbols. +""" -def unpack_file(fmt, file): - size = calcsize(fmt) - return unpack(fmt, file.read(size)) +import sys +import argparse +import subprocess +import struct +import enum +import signal -def read_string(file): - buf = bytearray() - while True: - b = file.read(1) - if b is None or b == b'\0': - return buf.decode() - else: - buf += b +class symtype(enum.Enum): + LOCAL = 0 + IMPORT = 1 + EXPORT = 2 +def unpack_from(fmt, file): + size = struct.calcsize(fmt) + return struct.unpack(fmt, file.read(size)) -# Fix broken pipe when using `head` -from signal import signal, SIGPIPE, SIG_DFL -signal(SIGPIPE,SIG_DFL) +def read_string(file): + buf = bytearray() + while True: + b = file.read(1) + if b is None or b == b'\0': + return buf.decode() + buf += b -import argparse -parser = argparse.ArgumentParser(description="Parse the symfile to find unnamed symbols") -parser.add_argument('symfile', type=argparse.FileType('r'), help="the list of symbols") -parser.add_argument('-r', '--rootdir', type=str, help="scan the output files to obtain a list of files with unnamed symbols (NOTE: will rebuild objects as necessary)") -parser.add_argument('-l', '--list', type=int, default=0, help="output this many of each file's unnamed symbols (NOTE: requires -r)") +# Fix broken pipe when using `head` +signal.signal(signal.SIGPIPE, signal.SIG_DFL) + +parser = argparse.ArgumentParser(description='Parse the symfile to find unnamed symbols') +parser.add_argument('symfile', type=argparse.FileType('r'), + help='the list of symbols') +parser.add_argument('-r', '--rootdir', type=str, + help='scan the output files to obtain a list of files with unnamed symbols (note: will rebuild objects as necessary)') +parser.add_argument('-l', '--list', type=int, default=0, + help="output this many of each file's unnamed symbols (note: requires -r)") args = parser.parse_args() # Get list of object files objects = None if args.rootdir: - for line in Popen(["make", "-C", args.rootdir, "-s", "-p", "DEBUG=1"], - stdout=PIPE).stdout.read().decode().split("\n"): - if line.startswith("pokered_obj := "): - objects = line[15:].strip().split() - break - else: - print("Error: Object files not found!", file=stderr) - exit(1) + for line in subprocess.Popen(['make', '-C', args.rootdir, '-s', '-p', 'DEBUG=1'], + stdout=subprocess.PIPE).stdout.read().decode().split('\n'): + if line.startswith('pokered_obj := '): + objects = line[19:].strip().split() + break + else: + print('Error: Object files not found!', file=sys.stderr) + sys.exit(1) # Scan all unnamed symbols from the symfile symbols_total = 0 symbols = set() for line in args.symfile: - line = line.split(";")[0].strip() - split = line.split(" ") - if len(split) < 2: - continue + line = line.split(';')[0].strip() + split = line.split(' ') + if len(split) < 2: + continue - symbols_total += 1 + symbols_total += 1 - symbol = " ".join(split[1:]).strip() - if symbol[-3:].lower() == split[0][-3:].lower(): - symbols.add(symbol) + symbol = ' '.join(split[1:]).strip() + if symbol[-3:].lower() == split[0][-3:].lower(): + symbols.add(symbol) # If no object files were provided, just print what we know and exit -print("Unnamed pokered symbols: %d (%.2f%% complete)" % (len(symbols), - (symbols_total - len(symbols)) / symbols_total * 100)) +unnamed_percent = 100 * (symbols_total - len(symbols)) / symbols_total +print(f'Unnamed pokered symbols: {len(symbols)} ({unnamed_percent:.2f}% complete)') if not objects: - for sym in symbols: - print(sym) - exit() + for sym in symbols: + print(sym) + sys.exit() # Count the amount of symbols in each file -files = {} +file_symbols = {} for objfile in objects: - f = open(objfile, "rb") - obj_ver = None - - magic = unpack_file("4s", f)[0] - if magic == b'RGB6': - obj_ver = 6 - elif magic == b'RGB9': - obj_ver = 10 + unpack_file("