Home | History | Annotate | Download | only in scripts
      1 #! /usr/bin/env python
      2 
      3 """Transform gprof(1) output into useful HTML."""
      4 
      5 import re, os, sys, cgi, webbrowser
      6 
      7 header = """\
      8 <html>
      9 <head>
     10   <title>gprof output (%s)</title>
     11 </head>
     12 <body>
     13 <pre>
     14 """
     15 
     16 trailer = """\
     17 </pre>
     18 </body>
     19 </html>
     20 """
     21 
     22 def add_escapes(input):
     23     for line in input:
     24         yield cgi.escape(line)
     25 
     26 def main():
     27     filename = "gprof.out"
     28     if sys.argv[1:]:
     29         filename = sys.argv[1]
     30     outputfilename = filename + ".html"
     31     input = add_escapes(file(filename))
     32     output = file(outputfilename, "w")
     33     output.write(header % filename)
     34     for line in input:
     35         output.write(line)
     36         if line.startswith(" time"):
     37             break
     38     labels = {}
     39     for line in input:
     40         m = re.match(r"(.*  )(\w+)\n", line)
     41         if not m:
     42             output.write(line)
     43             break
     44         stuff, fname = m.group(1, 2)
     45         labels[fname] = fname
     46         output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' %
     47                      (stuff, fname, fname, fname))
     48     for line in input:
     49         output.write(line)
     50         if line.startswith("index % time"):
     51             break
     52     for line in input:
     53         m = re.match(r"(.*  )(\w+)(( &lt;cycle.*&gt;)? \[\d+\])\n", line)
     54         if not m:
     55             output.write(line)
     56             if line.startswith("Index by function name"):
     57                 break
     58             continue
     59         prefix, fname, suffix = m.group(1, 2, 3)
     60         if fname not in labels:
     61             output.write(line)
     62             continue
     63         if line.startswith("["):
     64             output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' %
     65                          (prefix, fname, fname, fname, suffix))
     66         else:
     67             output.write('%s<a href="#call:%s">%s</a>%s\n' %
     68                          (prefix, fname, fname, suffix))
     69     for line in input:
     70         for part in re.findall(r"(\w+(?:\.c)?|\W+)", line):
     71             if part in labels:
     72                 part = '<a href="#call:%s">%s</a>' % (part, part)
     73             output.write(part)
     74     output.write(trailer)
     75     output.close()
     76     webbrowser.open("file:" + os.path.abspath(outputfilename))
     77 
     78 if __name__ == '__main__':
     79     main()
     80