diff options
| author | robojumper <robojumper@gmail.com> | 2024-10-17 23:58:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-17 17:58:38 -0400 |
| commit | b96e6ee19f4f8538e3162b16177a4d066eacdae5 (patch) | |
| tree | e47be5e74d6dce873a74417a1a8583c858030899 /tools | |
| parent | 22a5cadd578840f592b41a6d341e8cf7afb7ebbe (diff) | |
Meter madness (#64)
* Meter Madness Part 1
* progress
* maybe
* ::build meters too
* vtables labeling, small order problems
* Moar symbols
* Renames
* some dLytNote_c
* Fixes
* Checkpoint
* ::remove funcs
* Fix includes
* Move code around
* rm dead code
* rm dead include
* Draw functions
* Update include/s/s_State.hpp
* Update include/toBeSorted/scgame.h
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/custom/apply_state_mgr_fns.py | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/tools/custom/apply_state_mgr_fns.py b/tools/custom/apply_state_mgr_fns.py new file mode 100644 index 00000000..5436f6f8 --- /dev/null +++ b/tools/custom/apply_state_mgr_fns.py @@ -0,0 +1,155 @@ +""" +Appropriately names state manager weak functions, given a .s file with +correctly named vtables. + +Call with: + python ./tools/custom/apply_state_mgr_fns.py PATH_TO_S_FILE PATH_TO_SYMBOLS_FILE +""" + +from dataclasses import dataclass +import pathlib +import re +import sys +from typing import Callable, List + +@dataclass +class Vtable: + # A vtable pattern with a match named class_name + vtable_pat: re.Pattern + # A factory for function names + functions: Callable[[str], List[str | None]] + +def L(items): + """Join items and add a length prefix""" + s = None + if isinstance(items, list): + s = "".join(items) + else: + s = items + + return str(len(s)) + s + +sFStateMgr_c = Vtable( + re.compile("__vt__[0-9]+sFStateMgr_c<[0-9]+(?P<class_name>[A-Za-z0-9_]+),20sStateMethodUsr_FI_c>"), + lambda name: [ + None, + None, + "__dt__" + L(["sFStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c>"]) + "Fv", + "initializeState__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "Fv", + "executeState__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "Fv", + "finalizeState__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "Fv", + "changeState__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "FRC12sStateIDIf_c", + "refreshState__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "Fv", + "getState__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "CFv", + "getNewStateID__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "CFv", + "getStateID__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "CFv", + "getOldStateID__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "CFv", + ] +) + +sStateMgr_c = Vtable( + re.compile("__vt__[0-9]+sStateMgr_c<[0-9]+(?P<class_name>[A-Za-z0-9_]+),20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"), + lambda name: [ + None, + None, + "__dt__" + L(["sStateMgr_c<", L(name), ",20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>"]) + "Fv", + # the rest are dupes + ] +) + + +sFStateFct_c = Vtable( + re.compile("__vt__[0-9]+sFStateFct_c<[0-9]+(?P<class_name>[A-Za-z0-9_]+)>"), + lambda name: [ + None, + None, + "__dt__" + L(["sFStateFct_c<", L(name), ">"]) + "Fv", + "build__" + L(["sFStateFct_c<", L(name), ">"]) + "FRC12sStateIDIf_c", + "dispose__" + L(["sFStateFct_c<", L(name), ">"]) + "FRP10sStateIf_c", + ] +) + +sFState_c = Vtable( + re.compile("__vt__[0-9]+sFState_c<[0-9]+(?P<class_name>[A-Za-z0-9_]+)>"), + lambda name: [ + None, + None, + "__dt__" + L(["sFState_c<", L(name), ">"]) + "Fv", + "initialize__" + L(["sFState_c<", L(name), ">"]) + "Fv", + "execute__" + L(["sFState_c<", L(name), ">"]) + "Fv", + "finalize__" + L(["sFState_c<", L(name), ">"]) + "Fv", + ] +) + +sFStateID_c = Vtable( + re.compile("__vt__[0-9]+sFStateID_c<[0-9]+(?P<class_name>[A-Za-z0-9_]+)>"), + lambda name: [ + None, + None, + "__dt__" + L(["sFStateID_c<", L(name), ">"]) + "Fv", + None, + None, + None, + None, + "isSameName__" + L(["sFStateID_c<", L(name), ">"]) + "CFPCc", + None, + None, + "initializeState__" + L(["sFStateID_c<", L(name), ">"]) + "CFR" + L(name), + "executeState__" + L(["sFStateID_c<", L(name), ">"]) + "CFR" + L(name), + "finalizeState__" + L(["sFStateID_c<", L(name), ">"]) + "CFR" + L(name), + ] +) + +vtables = [ + sFStateMgr_c, + sStateMgr_c, + sFStateFct_c, + sFState_c, + sFStateID_c, +] + + +def parse_data(file): + renames = [] + lines: List[str] = file.splitlines() + i = 0 + while i < len(lines): + if lines[i].startswith(".obj"): + obj_name = lines[i].rsplit(",", maxsplit=1)[0][5:] + if obj_name.startswith('"') and obj_name.endswith('"'): + obj_name = obj_name[1:-1] + + for tab in vtables: + if (match := tab.vtable_pat.match(obj_name)): + class_name = match.group("class_name") + fns = tab.functions(class_name) + + for new_name in fns: + i += 1 + if new_name is not None: + old_name = lines[i].split(" ")[-1] + if old_name.startswith('"') and old_name.endswith('"'): + old_name = old_name[1:-1] + renames.append((old_name, new_name)) + break + i += 1 + + return renames + +def main(): + s_file = sys.argv[1] + sym_file = sys.argv[2] + s_text = pathlib.Path(s_file).read_text() + renames = parse_data(s_text) + + sym_text = pathlib.Path(sym_file).read_text() + for (old, new) in renames: + if old != new: + sym_text = sym_text.replace(old + " = .text", new + " = .text") + + pathlib.Path(sym_file).write_text(sym_text) + + + +if __name__ == "__main__": + main() |
