#!/usr/bin/env python3 # # This script renames symbols in the specfied paths import argparse import os import pathlib import re import sys SDL_ROOT = pathlib.Path(__file__).resolve().parents[1] SDL_INCLUDE_DIR = SDL_ROOT / "include/SDL3" def main(): if args.all_symbols: if len(args.args) < 1: print("Usage: %s --all-symbols files_or_directories ..." % sys.argv[0]) exit(1) replacements = get_all_replacements() entries = args.args else: if len(args.args) < 3: print("Usage: %s oldname newname files_or_directories ..." % sys.argv[0]) exit(1) replacements = { args.args[0]: args.args[1] } entries = args.args[2:] if args.substring: regex = create_substring_regex_from_replacements(replacements) else: regex = create_regex_from_replacements(replacements) for entry in entries: path = pathlib.Path(entry) if not path.exists(): print("%s doesn't exist, skipping" % entry) continue replace_symbols_in_path(path, regex, replacements) def get_all_replacements(): replacements = {} file = (SDL_INCLUDE_DIR / "SDL_oldnames.h") mode = 0 for line in file.read_text().splitlines(): if line == "#ifdef SDL_ENABLE_OLD_NAMES": if mode == 0: mode = 1 else: raise Exception("get_all_replacements(): expected mode 0") elif line == "#elif !defined(SDL_DISABLE_OLD_NAMES)": if mode == 1: mode = 2 else: raise Exception("get_all_replacements(): expected mode 1") elif line == "#endif /* SDL_ENABLE_OLD_NAMES */": if mode == 2: mode = 3 else: raise Exception("add_symbol_to_oldnames(): expected mode 2") elif mode == 1 and line.startswith("#define "): words = line.split() replacements[words[1]] = words[2] # In case things are accidentally renamed to the "X_renamed_Y" symbol #replacements[words[1] + "_renamed_" + words[2]] = words[2] return replacements def create_regex_from_replacements(replacements): return re.compile(r"\b(%s)\b" % "|".join(map(re.escape, replacements.keys()))) def create_substring_regex_from_replacements(replacements): return re.compile(r"(%s)" % "|".join(map(re.escape, replacements.keys()))) def replace_symbols_in_file(file, regex, replacements): try: with file.open("r", encoding="UTF-8", newline="") as rfp: original = rfp.read() contents = regex.sub(lambda mo: replacements[mo.string[mo.start():mo.end()]], original) if contents != original: with file.open("w", encoding="UTF-8", newline="") as wfp: wfp.write(contents) except UnicodeDecodeError: print("%s is not text, skipping" % file) except Exception as err: print("%s" % err) def replace_symbols_in_dir(path, regex, replacements): for entry in path.glob("*"): if entry.is_dir(): replace_symbols_in_dir(entry, regex, replacements) else: print("Processing %s" % entry) replace_symbols_in_file(entry, regex, replacements) def replace_symbols_in_path(path, regex, replacements): if path.is_dir(): replace_symbols_in_dir(path, regex, replacements) else: replace_symbols_in_file(path, regex, replacements) if __name__ == "__main__": parser = argparse.ArgumentParser(fromfile_prefix_chars='@') parser.add_argument("--all-symbols", action="store_true") parser.add_argument("--substring", action="store_true") parser.add_argument("args", nargs="*") args = parser.parse_args() try: main() except Exception as e: print(e) exit(-1) exit(0)