diff --git a/bytebeat_compiler.py b/bytebeat_compiler.py index 277067c..9045ef3 100644 --- a/bytebeat_compiler.py +++ b/bytebeat_compiler.py @@ -4,7 +4,7 @@ if __name__ == "__main__": print(":: C bytebeat generator: compiler unit") from argparse import ArgumentParser -from os import environ, makedirs, name as os_name, rename +from os import environ, makedirs, name as os_name from os.path import exists, join as path_join from shlex import join as command_line_join, split as command_line_split from shutil import which @@ -91,6 +91,24 @@ def run_command(*command: list[str]) -> None: if subprocess.run(command).returncode != EXIT_SUCCESS: raise SystemExit(EXIT_FAILURE) +def compile_substituted_file(input_file: str, output_file: str) -> None: + print("Compiling") + + run_command( + CC, + *command_line_split(CFLAGS), + input_file, + PATHS["fwrite_le"], + "-o", output_file, + "-I" + PATHS["include_directory"] + ) + run_command(output_file) + +def main_workflow(input_file: str, output_file: str, \ + substitute_contents: Dict[str, str]) -> None: + rewrite_file(input_file, substitute_contents) + compile_substituted_file(input_file, output_file) + preprocessor_bool = lambda value: "1" if value else "0" C_str_repr = lambda s: '"' + s.replace("\\", "\\\\").replace(r'"', r'\"') + '"' @@ -251,52 +269,42 @@ if __name__ == "__main__": "specify it by setting\nan environmental variable " "CC.") - with TemporaryDirectory() as tmpdirname: - temporary_path = lambda path: path_join(tmpdirname, path) + substitute_contents = substitute_vars({ + "bytebeat_contents": bytebeat_contents, + "output_file": C_str_repr(args.output), + "sample_rate": \ + value if (value := args.final_sample_rate) else args.sample_rate, + "original_sample_rate": original_sample_rate, + "final_sample_rate_code": final_sample_rate_code, + "bit_depth": args.bit_depth, + "is_signed": args.signed, + "precalculated_ratio": args.precalculate_ratio, + "faster_sample_ratio_math": args.precalculate_ratio, + "fp_return_type": args.floating_point, + "channels": args.channels, + "length": samples, + "wav_product": gen_length * (args.bit_depth // BITS_PER_BYTE), + "gen_length": gen_length, + "sequential_mode": args.mode == "sequential", + "block_size": args.block_size, + "silent_mode": args.silent, + "verbose_mode": args.verbose and not args.silent, + "fwrite_le": PATHS["fwrite_le_header"], + "ansi_escape_codes_supported": ansi_escape_codes_supported + }, read_file(PATHS["template"]), args.show_substituted_values) - substitute_temp = temporary_path(PATHS["substitute"]) - rewrite_file(substitute_temp, substitute_vars({ - "bytebeat_contents": bytebeat_contents, - "output_file": C_str_repr(args.output), - "sample_rate": \ - value if (value := args.final_sample_rate) else \ - args.sample_rate, - "original_sample_rate": original_sample_rate, - "final_sample_rate_code": final_sample_rate_code, - "bit_depth": args.bit_depth, - "is_signed": args.signed, - "precalculated_ratio": args.precalculate_ratio, - "faster_sample_ratio_math": args.precalculate_ratio, - "fp_return_type": args.floating_point, - "channels": args.channels, - "length": samples, - "wav_product": gen_length * (args.bit_depth // BITS_PER_BYTE), - "gen_length": gen_length, - "sequential_mode": args.mode == "sequential", - "block_size": args.block_size, - "silent_mode": args.silent, - "verbose_mode": args.verbose and not args.silent, - "fwrite_le": PATHS["fwrite_le_header"], - "ansi_escape_codes_supported": ansi_escape_codes_supported - }, read_file(PATHS["template"]), args.show_substituted_values)) + if args.keep_files: + makedirs(PATHS["bin_dir"], exist_ok=True) - # Compile - print("Compiling") + substitute_file = PATHS["substitute_kept"] + output_file = PATHS["output_kept"] - output_file_temp = temporary_path(PATHS["output"]) + main_workflow(substitute_file, output_file, substitute_contents) + else: + with TemporaryDirectory() as tmpdirname: + temporary_path = lambda path: path_join(tmpdirname, path) - run_command( - CC, - *command_line_split(CFLAGS), - substitute_temp, - PATHS["fwrite_le"], - "-o", output_file_temp, - "-I" + PATHS["include_directory"] - ) - run_command(output_file_temp) + substitute_temp = temporary_path(PATHS["substitute"]) + output_temp = temporary_path(PATHS["output"]) - if args.keep_files: - makedirs(PATHS["bin_dir"], exist_ok=True) - - rename(substitute_temp, PATHS["substitute_kept"]) - rename(output_file_temp, PATHS["output_kept"]) + main_workflow(substitute_temp, output_temp, substitute_contents)