blob: 47576a177dea960514eb425b7ac3c00f30611711 [file] [log] [blame]
#! /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)