mirror of
https://github.com/pmret/papermario.git
synced 2024-11-18 00:42:34 +01:00
ae66312d8c
* Add Python linter to github actions * wip * Add back splat_ext * Format files * C++ -> C * format 2 files * split workflow into separate file, line length 120, fix excludes * -l 120 in ci * update black locally and apply formatting changes * pyproject.toject --------- Co-authored-by: Ethan Roseman <ethteck@gmail.com>
108 lines
2.8 KiB
Python
Executable File
108 lines
2.8 KiB
Python
Executable File
#!/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()
|