papermario/tools/migrate_data_to_c.py

98 lines
2.8 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
import re
import os
import argparse
data_dir = os.path.dirname(os.path.realpath(__file__)) + "/../ver/current/asm/data/"
def find_dir(query):
for root, dirs, files in os.walk(data_dir):
for f in files:
if f == query:
return os.path.join(root, f)
return None
def data_to_c(file_path):
file = open(file_path)
s = file.read()
output = ""
pattern = re.compile(r"(dlabel (jtbl_.*|.+_.*)\n.(\w+) (.*))")
for (all, symbol, type, data) in re.findall(pattern, s):
if type == "word":
if symbol.startswith("jtbl_"):
output += "dlabel " + symbol + "\n" + ".word " + data.replace("L", ".L") + "\n\n"
else:
output += "s32 " + symbol + "[] = { " + data + " };\n\n"
elif type == "byte":
output += "s8 " + symbol + "[] = { " + data + " };\n\n"
else:
output += all + "\n\n"
file.close()
return output
def out_to_file(output, file_path):
output_dir = os.path.join(os.getcwd(), "data2c")
if not os.path.exists(output_dir):
os.mkdir(output_dir)
file_name = file_path[file_path.rfind("/"):-7]
file = open("data2c/" + file_name + ".c", "w+")
file.write(output)
file.close()
def get_all():
for root, dirs, files in os.walk(data_dir):
for f in files:
file_path = os.fspath(os.path.join(root, f))
out_to_file(data_to_c(file_path), file_path)
print("Files have been translated successfully and stored at " + os.getcwd() + "/data2c/")
def query(file, to_file):
for root, dirs, files in os.walk(data_dir):
for f in files:
if f == file:
file_path = os.fspath(os.path.join(root, f))
output = data_to_c(file_path)
if to_file is True:
out_to_file(output, file_path)
else:
print(output)
return
print("File not found: " + file)
parser = argparse.ArgumentParser(description="Tool to translate .data.s files to data arrays")
parser.add_argument("query", help="data file", nargs='?', default=None)
parser.add_argument("--all", help="translate all data files at once and output them into /data2c", action='store_true', required=False)
parser.add_argument("--to-file", help="redirect the output into a file. Can not be used in combination with --all", action='store_true', required=False)
args = parser.parse_args()
if args.query is None and args.all is False and args.to_file is False:
parser.print_help()
exit()
if args.query is not None and not args.query.endswith(".data.s"):
args.query = args.query + ".data.s"
if args.all is False:
if args.to_file is True:
query(args.query, True)
else:
query(args.query, False)
else:
get_all()