#!/bin/python3 import argparse from os import system,popen from glob import glob def run_input_cases(program, verbose, output=False): input_files = glob("./*.in") if len(input_files) < 1: return system(program) for input_file in input_files: print(f"Running {input_file}") end_command = f"{program} < {input_file}" if verbose: print("Input:") system(f"cat {input_file}") print("") try: if (out := glob(input_file.replace(".in", ".out"))[0]): if verbose: print("Expected output:") system(f"cat {out}") print("") if output: end_command += f" | diff {out} -" except IndexError: pass print(popen(end_command).read()) print("-----------") return def python_compile(file_name, verbose=False): run_input_cases("python3 " + file_name, verbose) return def java_compile(file_name, maven=False, verbose=False): if maven: system("mvn clean verify") system("java -jar target/*.jar") return system("javac " + file_name) run_input_cases("java " + file_name[:file_name.rfind(".")], verbose) return def c_compile(file_name, verbose=False, output=False): # Style the code in Meijster's way system("astyle -A2s2cxgk3W3xbj " + file_name) system("gcc -Wall -pedantic --std=c99 -g -o program -lm -Wno-unused-result " + file_name) run_input_cases("./program", verbose, output) return def main(): SUPPORTED_LANGS = [".c", ".py"] parser = argparse.ArgumentParser( prog='UCompiler', description='Compiles based on language', epilog='LOL') parser.add_argument("filename", metavar="N", type=str) parser.add_argument("-v", "--verbose", action="store_true", default=False) parser.add_argument("-a", "--alternative", action="store_true", default=False) parser.add_argument("-o", "--output", action="store_true", default=False) args = parser.parse_args() file_name = args.filename file_ext = file_name[file_name.rfind("."):] if file_ext not in SUPPORTED_LANGS: print("Unsupported language") return if file_ext == ".c": c_compile(file_name, args.verbose, args.output) elif file_ext == ".py": python_compile(file_name, args.verbose) elif file_ext == ".java": java_compile(file_name, args.verbose, maven=args.alternative) return if __name__ == "__main__": main()