File: rename_symbols.py

package info (click to toggle)
sdl2-compat 2.32.54%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 52,892 kB
  • sloc: ansic: 93,277; python: 1,549; sh: 569; makefile: 45; javascript: 21; cpp: 11
file content (130 lines) | stat: -rwxr-xr-x 3,957 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env python3
#
# This script renames symbols in the specified 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 [--substring] 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)