papermario/tools/coverage.py
2020-08-18 01:19:21 +01:00

50 lines
1.5 KiB
Python
Executable File

#!/usr/bin/env python3
from os import path
from os import remove
import re
from glob import glob
DIR = path.dirname(__file__)
C_FILES = glob(path.join(DIR, "../src/*.c"))
ASM_FILES = glob(path.join(DIR, "../asm/nonmatchings/**/*.s"))
def strip_c_comments(text):
def replacer(match):
s = match.group(0)
if s.startswith('/'):
return " "
else:
return s
pattern = re.compile(
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
re.DOTALL | re.MULTILINE
)
return re.sub(pattern, replacer, text)
c_func_pattern = re.compile(
r"^[^\s]+\s+([^\s(]+)\(([^\n)]*)\)\s+{",
re.MULTILINE
)
def funcs_in_c(text):
text = strip_c_comments(text)
return [match.group(1) for match in c_func_pattern.finditer(text)]
matched = []
for filename in C_FILES:
with open(filename, "r") as file:
matched += funcs_in_c(file.read())
non_matched = [path.splitext(path.basename(filename))[0] for filename in ASM_FILES]
total = len(matched) + len(non_matched)
print(f"{len(matched)}/{total} ({(len(matched) / total) * 100:.2f}%)")
matched_but_undeleted_asm = [f for f in matched if f in non_matched]
if len(matched_but_undeleted_asm) > 0:
print(f"The following functions have been matched but still exist in asm/nonmatchings/: {' '.join(matched_but_undeleted_asm)}")
if input("Delete them [y/N]? ").upper() == "Y":
for func in matched_but_undeleted_asm:
file = glob(path.join(DIR, f"../asm/nonmatchings/*/{func}.s"))[0]
remove(file)