| #! /usr/bin/python2 | |
| import os.path | |
| import sys | |
| import shlex | |
| import re | |
| from headerutils import * | |
| def pretty_name (name): | |
| return name.replace(".","_").replace("-","_").replace("/","_").replace("+","_"); | |
| include_files = list() | |
| edges = 0 | |
| one_c = False | |
| clink = list() | |
| noterm = False | |
| def build_inclist (output, filen): | |
| global edges | |
| global one_c | |
| global clink | |
| global noterm | |
| inc = build_include_list (filen) | |
| if one_c and filen[-2:] == ".c": | |
| pn = "all_c" | |
| else: | |
| pn = pretty_name(filen) | |
| for nm in inc: | |
| if pn == "all_c": | |
| if nm not in clink: | |
| if len(build_include_list(nm)) != 0 or not noterm: | |
| output.write (pretty_name(nm) + " -> " + pn + ";\n") | |
| edges = edges + 1 | |
| if nm not in include_files: | |
| include_files.append(nm) | |
| clink.append (nm) | |
| else: | |
| output.write (pretty_name(nm) + " -> " + pn + ";\n") | |
| edges = edges + 1 | |
| if nm not in include_files: | |
| include_files.append(nm) | |
| return len(inc) == 0 | |
| dotname = "graph.dot" | |
| graphname = "graph.png" | |
| def build_dot_file (file_list): | |
| global one_c | |
| output = open(dotname, "w") | |
| output.write ("digraph incweb {\n"); | |
| if one_c: | |
| output.write ("all_c [shape=box];\n"); | |
| for x in file_list: | |
| if x[-2:] == ".h": | |
| include_files.append (x) | |
| elif os.path.exists (x): | |
| build_inclist (output, x) | |
| if not one_c: | |
| output.write (pretty_name (x) + "[shape=box];\n") | |
| for x in include_files: | |
| term = build_inclist (output, x) | |
| if term: | |
| output.write (pretty_name(x) + " [style=filled];\n") | |
| output.write ("}\n"); | |
| files = list() | |
| dohelp = False | |
| edge_thresh = 0 | |
| for arg in sys.argv[1:]: | |
| if arg[0:2] == "-o": | |
| dotname = arg[2:]+".dot" | |
| graphname = arg[2:]+".png" | |
| elif arg[0:2] == "-h": | |
| dohelp = True | |
| elif arg[0:2] == "-a": | |
| one_c = True | |
| if arg[0:3] == "-at": | |
| noterm = True | |
| elif arg[0:2] == "-f": | |
| if not os.path.exists (arg[2:]): | |
| print "Option " + arg +" doesn't specify a proper file" | |
| dohelp = True | |
| else: | |
| sfile = open (arg[2:], "r") | |
| srcdata = sfile.readlines() | |
| sfile.close() | |
| for x in srcdata: | |
| files.append(x.rstrip()) | |
| elif arg[0:2] == "-n": | |
| edge_thresh = int (arg[2:]) | |
| elif arg[0:1] == "-": | |
| print "Unrecognized option " + arg | |
| dohelp = True | |
| else: | |
| files.append (arg) | |
| if len(sys.argv) == 1: | |
| dohelp = True | |
| if dohelp: | |
| print "Generates a graph of the include web for specified files." | |
| print "Usage: [-finput_file] [-h] [-ooutput] [file1 ... [filen]]" | |
| print " -finput_file : Input file containing a list of files to process." | |
| print " -ooutput : Specifies output to output.dot and output.png." | |
| print " defaults to graph.dot and graph.png." | |
| print " -nnum : Specifies the # of edges beyond which sfdp is invoked. def=0." | |
| print " -a : Aggregate all .c files to 1 file. Shows only include web." | |
| print " -at : Aggregate, but don't include terminal.h to .c links." | |
| print " -h : Print this help." | |
| else: | |
| print files | |
| build_dot_file (files) | |
| if edges > edge_thresh: | |
| os.system ("sfdp -Tpng " + dotname + " -o" + graphname) | |
| else: | |
| os.system ("dot -Tpng " + dotname + " -o" + graphname) | |