rename_symbols.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env python3
  2. #
  3. # This script renames symbols in the specfied paths
  4. import argparse
  5. import os
  6. import pathlib
  7. import re
  8. import sys
  9. SDL_ROOT = pathlib.Path(__file__).resolve().parents[1]
  10. SDL_INCLUDE_DIR = SDL_ROOT / "include/SDL3"
  11. def main():
  12. if args.all_symbols:
  13. if len(args.args) < 1:
  14. print("Usage: %s --all-symbols files_or_directories ...")
  15. exit(1)
  16. replacements = get_all_replacements()
  17. entries = args.args
  18. else:
  19. if len(args.args) < 3:
  20. print("Usage: %s oldname newname files_or_directories ...")
  21. exit(1)
  22. replacements = { args.args[0]: args.args[1] }
  23. entries = args.args[2:]
  24. regex = create_regex_from_replacements(replacements)
  25. for entry in entries:
  26. path = pathlib.Path(entry)
  27. if not path.exists():
  28. print("%s doesn't exist, skipping" % entry)
  29. continue
  30. replace_symbols_in_path(path, regex, replacements)
  31. def get_all_replacements():
  32. replacements = {}
  33. file = (SDL_INCLUDE_DIR / "SDL_oldnames.h")
  34. mode = 0
  35. for line in file.read_text().splitlines():
  36. if line == "#ifdef SDL_ENABLE_OLD_NAMES":
  37. if mode == 0:
  38. mode = 1
  39. else:
  40. raise Exception("get_all_replacements(): expected mode 0")
  41. elif line == "#else /* !SDL_ENABLE_OLD_NAMES */":
  42. if mode == 1:
  43. mode = 2
  44. else:
  45. raise Exception("get_all_replacements(): expected mode 1")
  46. elif mode == 1 and line.startswith("#define "):
  47. words = line.split()
  48. replacements[words[1]] = words[2]
  49. return replacements
  50. def create_regex_from_replacements(replacements):
  51. return re.compile(r"\b(%s)\b" % "|".join(map(re.escape, replacements.keys())))
  52. def replace_symbols_in_file(file, regex, replacements):
  53. try:
  54. with file.open('r', encoding='UTF-8', newline='') as rfp:
  55. contents = regex.sub(lambda mo: replacements[mo.string[mo.start():mo.end()]], rfp.read())
  56. with file.open('w', encoding='UTF-8', newline='') as wfp:
  57. wfp.write(contents)
  58. except UnicodeDecodeError:
  59. print("%s is not text, skipping" % file)
  60. def replace_symbols_in_dir(path, regex, replacements):
  61. for entry in path.glob("*"):
  62. if entry.is_dir():
  63. replace_symbols_in_dir(entry, regex, replacements)
  64. else:
  65. print("Processing %s" % entry)
  66. replace_symbols_in_file(entry, regex, replacements)
  67. def replace_symbols_in_path(path, regex, replacements):
  68. if path.is_dir():
  69. replace_symbols_in_dir(path, regex, replacements)
  70. else:
  71. replace_symbols_in_file(path, regex, replacements)
  72. if __name__ == '__main__':
  73. parser = argparse.ArgumentParser()
  74. parser.add_argument('--all-symbols', action='store_true')
  75. parser.add_argument('args', nargs='*')
  76. args = parser.parse_args()
  77. try:
  78. main()
  79. except Exception as e:
  80. print(e)
  81. exit(-1)
  82. exit(0)