mirror of
https://github.com/encounter/dtk-template.git
synced 2025-12-17 17:05:38 +00:00
Add support for excluded globs and prelude macros to decompctx.py (#62)
* Add flag to exclude files matching a specific glob * Add flag to declare macros to place in a prelude * Add support to project.py for decompctx excludes and preludes * Minor cleanup & formatting --------- Co-authored-by: Luke Street <luke@street.dev>
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
###
|
||||
|
||||
import argparse
|
||||
import fnmatch
|
||||
import os
|
||||
import re
|
||||
from typing import List
|
||||
@@ -19,6 +20,7 @@ script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
root_dir = os.path.abspath(os.path.join(script_dir, ".."))
|
||||
src_dir = os.path.join(root_dir, "src")
|
||||
include_dirs: List[str] = [] # Set with -I flag
|
||||
exclude_globs: List[str] = [] # Set with -x flag
|
||||
|
||||
include_pattern = re.compile(r'^#\s*include\s*[<"](.+?)[>"]')
|
||||
guard_pattern = re.compile(r"^#\s*ifndef\s+(.*)$")
|
||||
@@ -28,6 +30,23 @@ defines = set()
|
||||
deps = []
|
||||
|
||||
|
||||
def generate_prelude(defines) -> str:
|
||||
if len(defines) == 0:
|
||||
return ""
|
||||
|
||||
out_text = "/* decompctx prelude */\n"
|
||||
for define in defines:
|
||||
parts = define.split("=", 1)
|
||||
if len(parts) == 2:
|
||||
macro_name, macro_val = parts
|
||||
out_text += f"#define {macro_name} {macro_val}\n"
|
||||
else:
|
||||
out_text += f"#define {parts[0]}\n"
|
||||
out_text += "/* end decompctx prelude */\n\n"
|
||||
|
||||
return out_text
|
||||
|
||||
|
||||
def import_h_file(in_file: str, r_path: str) -> str:
|
||||
rel_path = os.path.join(root_dir, r_path, in_file)
|
||||
if os.path.exists(rel_path):
|
||||
@@ -73,8 +92,17 @@ def process_file(in_file: str, lines: List[str]) -> str:
|
||||
print("Processing file", in_file)
|
||||
include_match = include_pattern.match(line.strip())
|
||||
if include_match and not include_match[1].endswith(".s"):
|
||||
excluded = False
|
||||
for glob in exclude_globs:
|
||||
if fnmatch.fnmatch(include_match[1], glob):
|
||||
excluded = True
|
||||
break
|
||||
|
||||
out_text += f'/* "{in_file}" line {idx} "{include_match[1]}" */\n'
|
||||
out_text += import_h_file(include_match[1], os.path.dirname(in_file))
|
||||
if excluded:
|
||||
out_text += "/* Skipped excluded file */\n"
|
||||
else:
|
||||
out_text += import_h_file(include_match[1], os.path.dirname(in_file))
|
||||
out_text += f'/* end "{include_match[1]}" */\n'
|
||||
else:
|
||||
out_text += line
|
||||
@@ -111,13 +139,29 @@ def main():
|
||||
help="""Include directory""",
|
||||
action="append",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-x",
|
||||
"--exclude",
|
||||
help="""Excluded file name glob""",
|
||||
action="append",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-D",
|
||||
"--define",
|
||||
help="""Macro definition""",
|
||||
action="append",
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.include is None:
|
||||
exit("No include directories specified")
|
||||
global include_dirs
|
||||
include_dirs = args.include
|
||||
output = import_c_file(args.c_file)
|
||||
global exclude_globs
|
||||
exclude_globs = args.exclude or []
|
||||
prelude_defines = args.define or []
|
||||
output = generate_prelude(prelude_defines)
|
||||
output += import_c_file(args.c_file)
|
||||
|
||||
with open(os.path.join(root_dir, args.output), "w", encoding="utf-8") as f:
|
||||
f.write(output)
|
||||
|
||||
Reference in New Issue
Block a user