#!/usr/bin/python import sys import re import os # Record any headers already seen to avoid circularity and infinite recursion already_seen = [] def pretty_print(header_name, depth, seen): SEEN = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' for i in range(depth): print(" ", end=" ") file_name = "%s/%s" % ("/usr/include", header_name) if not os.path.isfile(file_name): print(FAIL + header_name + ENDC) return if not seen: print(header_name) else: print(SEEN + header_name + ENDC) def parse_headers(header_name, depth): file_name = "%s/%s" % ("/usr/include", header_name) try: fd = open(file_name,"r") except IOError: #pretty_print(header_name, depth, False) return lines = fd.readlines() fd.close # Parse the file for header_regex = re.compile("\s*#\s*include\s*<([\w/]+\.h)>") duplicate = [] for line in lines: match = header_regex.match(line) if(match): header_name = match.group(1) # We don't ant to print out the same header more than # once at this level if header_name in duplicate: continue duplicate.append(header_name) if header_name in already_seen: pretty_print(header_name, depth, True) continue already_seen.append(header_name) pretty_print(header_name, depth, False) parse_headers(header_name, depth + 1) return def main(): cmd_line = sys.argv if(len(cmd_line) != 2): sys.stderr.write("Usage: %s
\n" % cmd_line[0]) sys.exit(1) header_file = cmd_line[1] already_seen.append(header_file) pretty_print(header_file, 0, False) parse_headers(header_file, 1) if __name__ == '__main__': ret = main() sys.exit(ret)