SDL
129 строк · 3.9 Кб
1#!/usr/bin/env python3
2#
3# This script renames symbols in the specified paths
4
5import argparse6import os7import pathlib8import re9import sys10
11
12SDL_ROOT = pathlib.Path(__file__).resolve().parents[1]13
14SDL_INCLUDE_DIR = SDL_ROOT / "include/SDL3"15
16
17def main():18if args.all_symbols:19if len(args.args) < 1:20print("Usage: %s --all-symbols files_or_directories ..." % sys.argv[0])21exit(1)22
23replacements = get_all_replacements()24entries = args.args25
26else:27if len(args.args) < 3:28print("Usage: %s [--substring] oldname newname files_or_directories ..." % sys.argv[0])29exit(1)30
31replacements = { args.args[0]: args.args[1] }32entries = args.args[2:]33
34if args.substring:35regex = create_substring_regex_from_replacements(replacements)36else:37regex = create_regex_from_replacements(replacements)38
39for entry in entries:40path = pathlib.Path(entry)41if not path.exists():42print("%s doesn't exist, skipping" % entry)43continue44
45replace_symbols_in_path(path, regex, replacements)46
47
48def get_all_replacements():49replacements = {}50file = (SDL_INCLUDE_DIR / "SDL_oldnames.h")51mode = 052for line in file.read_text().splitlines():53if line == "#ifdef SDL_ENABLE_OLD_NAMES":54if mode == 0:55mode = 156else:57raise Exception("get_all_replacements(): expected mode 0")58elif line == "#elif !defined(SDL_DISABLE_OLD_NAMES)":59if mode == 1:60mode = 261else:62raise Exception("get_all_replacements(): expected mode 1")63elif line == "#endif /* SDL_ENABLE_OLD_NAMES */":64if mode == 2:65mode = 366else:67raise Exception("add_symbol_to_oldnames(): expected mode 2")68elif mode == 1 and line.startswith("#define "):69words = line.split()70replacements[words[1]] = words[2]71# In case things are accidentally renamed to the "X_renamed_Y" symbol72#replacements[words[1] + "_renamed_" + words[2]] = words[2]73
74return replacements75
76
77def create_regex_from_replacements(replacements):78return re.compile(r"\b(%s)\b" % "|".join(map(re.escape, replacements.keys())))79
80
81def create_substring_regex_from_replacements(replacements):82return re.compile(r"(%s)" % "|".join(map(re.escape, replacements.keys())))83
84
85def replace_symbols_in_file(file, regex, replacements):86try:87with file.open("r", encoding="UTF-8", newline="") as rfp:88original = rfp.read()89contents = regex.sub(lambda mo: replacements[mo.string[mo.start():mo.end()]], original)90if contents != original:91with file.open("w", encoding="UTF-8", newline="") as wfp:92wfp.write(contents)93except UnicodeDecodeError:94print("%s is not text, skipping" % file)95except Exception as err:96print("%s" % err)97
98
99def replace_symbols_in_dir(path, regex, replacements):100for entry in path.glob("*"):101if entry.is_dir():102replace_symbols_in_dir(entry, regex, replacements)103else:104print("Processing %s" % entry)105replace_symbols_in_file(entry, regex, replacements)106
107
108def replace_symbols_in_path(path, regex, replacements):109if path.is_dir():110replace_symbols_in_dir(path, regex, replacements)111else:112replace_symbols_in_file(path, regex, replacements)113
114
115if __name__ == "__main__":116
117parser = argparse.ArgumentParser(fromfile_prefix_chars='@')118parser.add_argument("--all-symbols", action="store_true")119parser.add_argument("--substring", action="store_true")120parser.add_argument("args", nargs="*")121args = parser.parse_args()122
123try:124main()125except Exception as e:126print(e)127exit(-1)128
129exit(0)130
131