mirror of https://github.com/pmret/papermario.git
				
				
				
			
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/python3
 | 
						|
 | 
						|
import os
 | 
						|
from tqdm import tqdm
 | 
						|
 | 
						|
import ahocorasick_rs
 | 
						|
from ahocorasick_rs import *
 | 
						|
 | 
						|
script_dir = os.path.dirname(os.path.realpath(__file__))
 | 
						|
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")
 | 
						|
 | 
						|
renames = {}
 | 
						|
patterns = []
 | 
						|
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])
 | 
						|
 | 
						|
    # find all matches in one pass with aho-corasick algorithm
 | 
						|
    f_text = f_text_orig
 | 
						|
    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)
 | 
						|
 | 
						|
# Read input file
 | 
						|
# One valid whitespace-separated find-replace pair is given per line
 | 
						|
with open(os.path.join(script_dir, "to_rename.txt")) as f:
 | 
						|
    renames_text = f.readlines()
 | 
						|
 | 
						|
# Create dict of old -> new names
 | 
						|
for line in renames_text:
 | 
						|
    split = line.split()
 | 
						|
    if len(split) == 2:
 | 
						|
        if split[0] and split[1]:
 | 
						|
            renames[split[0]] = split[1]
 | 
						|
            patterns.append(split[0])
 | 
						|
    elif len(split) != 0:
 | 
						|
        raise Exception("input contains invalid rename pattern: \n\"" + line.strip() + "\"")
 | 
						|
 | 
						|
ac = ahocorasick_rs.AhoCorasick(patterns, matchkind=MATCHKIND_LEFTMOST_LONGEST)
 | 
						|
 | 
						|
# Walk through asm files and rename stuff
 | 
						|
print("Walking through asm files")
 | 
						|
asm_files = []
 | 
						|
for root, dirs, files in os.walk(asm_dir):
 | 
						|
    for f_name in files:
 | 
						|
        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)
 | 
						|
 | 
						|
# Walk through src files and rename stuff
 | 
						|
print("Walking through src files")
 | 
						|
c_files = []
 | 
						|
for root, dirs, files in os.walk(src_dir):
 | 
						|
    for f_name in files:
 | 
						|
        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)
 | 
						|
 | 
						|
# Walk through include files and rename stuff
 | 
						|
print("Walking through include files")
 | 
						|
for root, dirs, files in os.walk(include_dir):
 | 
						|
    for f_name in files:
 | 
						|
        f_path = os.path.join(root, f_name)
 | 
						|
 | 
						|
        handle_file(f_path)
 | 
						|
 | 
						|
# 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]))
 | 
						|
 | 
						|
# Rename stuff in symbol_addrs.txt
 | 
						|
handle_file(os.path.join(root_dir, "ver", "current", "symbol_addrs.txt"))
 | 
						|
 | 
						|
# 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"))
 |