#!/usr/bin/env python3 import subprocess import sys from typing import Tuple ALLOWLIST: Tuple[str, ...] = ( # system headers "pthread.h", "stdarg.h", "stdbool.h", "stddef.h", "stdint.h", "time.h", # time_t used in Messenger.h TODO(iphydf): maybe don't? # toxav stuff, maybe not worth abstracting away "opus.h", "vpx/vp8cx.h", "vpx/vp8dx.h", "vpx/vpx_decoder.h", "vpx/vpx_encoder.h", "vpx/vpx_image.h", ) out = (subprocess.run( [ "grep", "-R", "^#include <.*>", "other", "toxav", "toxcore", "toxencryptsave" ], check=True, capture_output=True, ).stdout.decode("utf-8").rstrip()) errors = 0 for line in out.split("\n"): # other/fun and mallocfail can do what they want. if "/fun/" in line or "/mallocfail/" in line: continue filename, include = line.split(":", 1) # We only check headers. if not filename.endswith(".h"): continue # ccompat.h can include some things we don't really want elsewhere. allowlist = ALLOWLIST if filename == "toxcore/ccompat.h": allowlist += ("assert.h", "alloca.h", "malloc.h", "stdlib.h") header = include[include.index("<") + 1:include.index(">")] if header not in allowlist: source = filename[:-2] + ".c" print( f"{filename}: includes system header <{header}>, which is not allowed in .h files" ) print( " " * len(filename) + f" consider including it in {source} and exporting an abstraction, instead" ) errors += 1 if errors: sys.exit(1)