2020-11-29 16:52:16 +00:00
|
|
|
#!/usr/bin/python3
|
|
|
|
|
|
|
|
import os
|
2022-01-24 16:58:33 +00:00
|
|
|
from tqdm import tqdm
|
2020-11-29 16:52:16 +00:00
|
|
|
|
2022-09-19 16:07:31 +00:00
|
|
|
import ahocorasick_rs
|
|
|
|
from ahocorasick_rs import *
|
|
|
|
|
2020-11-29 16:52:16 +00:00
|
|
|
script_dir = os.path.dirname(os.path.realpath(__file__))
|
2022-01-24 16:58:33 +00:00
|
|
|
root_dir = os.path.join(script_dir, "..")
|
|
|
|
src_dir = os.path.join(root_dir, "src")
|
|
|
|
include_dir = os.path.join(root_dir, "include")
|
|
|
|
asm_dir = os.path.join(root_dir, "ver", "us", "asm")
|
2020-11-29 16:52:16 +00:00
|
|
|
|
2021-06-30 02:27:12 +00:00
|
|
|
renames = {}
|
2022-09-19 16:07:31 +00:00
|
|
|
patterns = []
|
2021-06-30 02:27:12 +00:00
|
|
|
deletes = []
|
|
|
|
|
|
|
|
def handle_file(f_path, try_rename_file=False):
|
|
|
|
with open(f_path) as f:
|
|
|
|
f_text_orig = f.read()
|
|
|
|
|
|
|
|
if try_rename_file:
|
|
|
|
extless = f_path.split("/")[-1][:-2]
|
|
|
|
if extless in renames:
|
|
|
|
deletes.append(f_path)
|
|
|
|
f_path = f_path.replace(extless, renames[extless])
|
|
|
|
|
2022-09-19 16:07:31 +00:00
|
|
|
# find all matches in one pass with aho-corasick algorithm
|
2021-06-30 02:27:12 +00:00
|
|
|
f_text = f_text_orig
|
2022-09-19 16:07:31 +00:00
|
|
|
matches = ac.find_matches_as_indexes(f_text)
|
|
|
|
if matches:
|
|
|
|
to_join = []
|
|
|
|
pos = 0
|
|
|
|
# replace all matches
|
|
|
|
for match in matches:
|
|
|
|
# head part
|
|
|
|
to_join.append(f_text[pos:match[1]])
|
|
|
|
to_replace = patterns[match[0]]
|
|
|
|
to_join.append(renames[to_replace])
|
|
|
|
pos = match[2]
|
|
|
|
# tail part
|
|
|
|
to_join.append(f_text[pos:])
|
|
|
|
f_text = ''.join(to_join);
|
|
|
|
# save changes
|
|
|
|
with open(f_path, "w", newline="\n") as f:
|
|
|
|
f.write(f_text)
|
2021-06-30 02:27:12 +00:00
|
|
|
|
2022-09-19 16:07:31 +00:00
|
|
|
# Read input file
|
|
|
|
# One valid whitespace-separated find-replace pair is given per line
|
2021-06-30 02:27:12 +00:00
|
|
|
with open(os.path.join(script_dir, "to_rename.txt")) as f:
|
2020-11-29 16:52:16 +00:00
|
|
|
renames_text = f.readlines()
|
|
|
|
|
2021-06-30 02:27:12 +00:00
|
|
|
# Create dict of old -> new names
|
|
|
|
for line in renames_text:
|
|
|
|
split = line.split()
|
2022-09-19 16:07:31 +00:00
|
|
|
if len(split) == 2:
|
2022-09-24 09:04:13 +00:00
|
|
|
if split[0] and split[1]:
|
|
|
|
renames[split[0]] = split[1]
|
|
|
|
patterns.append(split[0])
|
2022-09-19 16:07:31 +00:00
|
|
|
elif len(split) != 0:
|
|
|
|
raise Exception("input contains invalid rename pattern: \n\"" + line.strip() + "\"")
|
|
|
|
|
|
|
|
ac = ahocorasick_rs.AhoCorasick(patterns, matchkind=MATCHKIND_LEFTMOST_LONGEST)
|
2021-06-30 02:27:12 +00:00
|
|
|
|
|
|
|
# Walk through asm files and rename stuff
|
|
|
|
print("Walking through asm files")
|
2022-01-24 16:58:33 +00:00
|
|
|
asm_files = []
|
2020-11-29 16:52:16 +00:00
|
|
|
for root, dirs, files in os.walk(asm_dir):
|
|
|
|
for f_name in files:
|
2022-01-24 16:58:33 +00:00
|
|
|
asm_files.append(os.path.join(root, f_name))
|
|
|
|
for f_path in tqdm(asm_files):
|
|
|
|
if f_path.endswith(".s"):
|
|
|
|
handle_file(f_path, True)
|
2021-06-30 02:27:12 +00:00
|
|
|
|
|
|
|
# Walk through src files and rename stuff
|
|
|
|
print("Walking through src files")
|
2022-01-24 16:58:33 +00:00
|
|
|
c_files = []
|
2021-06-30 02:27:12 +00:00
|
|
|
for root, dirs, files in os.walk(src_dir):
|
|
|
|
for f_name in files:
|
2022-01-24 16:58:33 +00:00
|
|
|
c_files.append(os.path.join(root, f_name))
|
|
|
|
for f_path in tqdm(c_files):
|
|
|
|
if f_name.endswith(".c") or f_name.endswith(".h"):
|
|
|
|
handle_file(f_path, True)
|
2021-06-30 02:27:12 +00:00
|
|
|
|
|
|
|
# Walk through include files and rename stuff
|
|
|
|
print("Walking through include files")
|
2022-01-24 16:58:33 +00:00
|
|
|
for root, dirs, files in os.walk(include_dir):
|
2021-06-30 02:27:12 +00:00
|
|
|
for f_name in files:
|
|
|
|
f_path = os.path.join(root, f_name)
|
|
|
|
|
|
|
|
handle_file(f_path)
|
|
|
|
|
2022-01-24 16:58:33 +00:00
|
|
|
# Delete old versions of newly saved files
|
|
|
|
print("Deleting old files")
|
|
|
|
for d in deletes:
|
|
|
|
os.remove(d)
|
|
|
|
|
|
|
|
# Walk through asm dirs and rename stuff
|
|
|
|
print("Walking through asm dirs")
|
|
|
|
for root, dirs, files in os.walk(asm_dir):
|
|
|
|
for dir_name in dirs:
|
|
|
|
for rename in renames:
|
|
|
|
if rename == dir_name:
|
|
|
|
os.rename(os.path.join(root, dir_name), os.path.join(root, renames[rename]))
|
|
|
|
|
2021-06-30 02:27:12 +00:00
|
|
|
# Rename stuff in symbol_addrs.txt
|
|
|
|
handle_file(os.path.join(root_dir, "ver", "current", "symbol_addrs.txt"))
|
|
|
|
|
2022-01-24 16:58:33 +00:00
|
|
|
# splat.yaml
|
|
|
|
handle_file(os.path.join(root_dir, "ver", "current", "splat.yaml"))
|
|
|
|
|
|
|
|
# effects.yaml
|
|
|
|
handle_file(os.path.join(root_dir, "ver", "current", "effects.yaml"))
|