import re import subprocess import sys def clang_format(file_path): command = ["clang-format", "--dry-run", file_path] try: output = subprocess.check_output(command, stderr=subprocess.STDOUT, text=True) except subprocess.CalledProcessError as e: output = e.output except FileNotFoundError as e: print(f"Commande non trouvé : {e.filename}", file=sys.stderr) print( "clang est requis pour utilisé ce programme, installé-le via " f"votre gestionnaire de paquet : {e.filename}", file=sys.stderr, ) exit(1) return output def parse_clang_format_output(output): error_pattern = ( r"(?P.+):(?P\d+):(?P\d+):" + r" warning: code should be clang-formatted \[(?P.+)\]" ) error_matches = re.finditer(error_pattern, output) if error_matches: errors = [] for error_match in error_matches: filename = error_match.group("filename") line_number = int(error_match.group("line_number")) column_number = int(error_match.group("column_number")) warning_message = error_match.group("warning_message") errors.append( { "filename": filename, "line_number": line_number, "column_number": column_number, "warning_message": warning_message[1:], } ) return errors return None if __name__ == "__main__": clang_format_output = clang_format("tests/1.c") parsed_output = parse_clang_format_output(clang_format_output) if parsed_output: for error in parsed_output: print( f"Warning dans {error['filename']} à la ligne {error['line_number']}," + f" caractère {error['column_number']} : {error['warning_message']}" ) else: print("No warnings found.")