| #! /usr/bin/env python32.3 | 
 |  | 
 | """Transform gprof(1) output into useful HTML.""" | 
 |  | 
 | import re, os, sys, cgi, webbrowser | 
 |  | 
 | header = """\ | 
 | <html> | 
 | <head> | 
 |   <title>gprof output (%s)</title> | 
 | </head> | 
 | <body> | 
 | <pre> | 
 | """ | 
 |  | 
 | trailer = """\ | 
 | </pre> | 
 | </body> | 
 | </html> | 
 | """ | 
 |  | 
 | def add_escapes(input): | 
 |     for line in input: | 
 |         yield cgi.escape(line) | 
 |  | 
 | def main(): | 
 |     filename = "gprof.out" | 
 |     if sys.argv[1:]: | 
 |         filename = sys.argv[1] | 
 |     outputfilename = filename + ".html" | 
 |     input = add_escapes(file(filename)) | 
 |     output = file(outputfilename, "w") | 
 |     output.write(header % filename) | 
 |     for line in input: | 
 |         output.write(line) | 
 |         if line.startswith(" time"): | 
 |             break | 
 |     labels = {} | 
 |     for line in input: | 
 |         m = re.match(r"(.*  )(\w+)\n", line) | 
 |         if not m: | 
 |             output.write(line) | 
 |             break | 
 |         stuff, fname = m.group(1, 2) | 
 |         labels[fname] = fname | 
 |         output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' % | 
 |                      (stuff, fname, fname, fname)) | 
 |     for line in input: | 
 |         output.write(line) | 
 |         if line.startswith("index % time"): | 
 |             break | 
 |     for line in input: | 
 |         m = re.match(r"(.*  )(\w+)(( <cycle.*>)? \[\d+\])\n", line) | 
 |         if not m: | 
 |             output.write(line) | 
 |             if line.startswith("Index by function name"): | 
 |                 break | 
 |             continue | 
 |         prefix, fname, suffix = m.group(1, 2, 3) | 
 |         if fname not in labels: | 
 |             output.write(line) | 
 |             continue | 
 |         if line.startswith("["): | 
 |             output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' % | 
 |                          (prefix, fname, fname, fname, suffix)) | 
 |         else: | 
 |             output.write('%s<a href="#call:%s">%s</a>%s\n' % | 
 |                          (prefix, fname, fname, suffix)) | 
 |     for line in input: | 
 |         for part in re.findall(r"(\w+(?:\.c)?|\W+)", line): | 
 |             if part in labels: | 
 |                 part = '<a href="#call:%s">%s</a>' % (part, part) | 
 |             output.write(part) | 
 |     output.write(trailer) | 
 |     output.close() | 
 |     webbrowser.open("file:" + os.path.abspath(outputfilename)) | 
 |  | 
 | if __name__ == '__main__': | 
 |     main() |