#!/usr/bin/python import sys, re, os none0, some0 = 0,0 branchTaken0, branchNot0 = 0,0 BRANCH = False FUNC = False if sys.argv[1] == '-b': BRANCH = True del sys.argv[1] if sys.argv[1] == '-f': FUNC = True del sys.argv[1] def show(name, none, some): if some+none == 0: none = 1 print name, none, some, "%.02f"%(100*(float(some)/(some+none))) file_args = sys.argv[1:] files = [] for fn in file_args: if os.path.isdir(fn): files.extend(os.path.join(fn, f) for f in os.listdir(fn)) else: files.append(fn) for fn in files: none = some = branchTaken = branchNot = 0 inFunc = "" for line in open(fn, 'r'): m = re.match(r'^[^:]*:([^:]*):(.*)', line) if m: body = m.group(2).rstrip() lineno = m.group(1).strip() else: body = "" lineno = "?" m = re.match(r'^([A-Za-z_][A-Za-z0-9_]*)(?:, *)?\(', body) if m: inFunc = "%s:%s %s" %(fn,lineno,m.group(1)) elif body == "}": if FUNC and inFunc: show(inFunc, none, some) none = some = 0 inFunc = None if re.match(r'^ *###', line): none += 1 elif re.match(r'^ *\d', line): some += 1 else: m = re.match(r'^branch.*taken (\d+)%', line) if m: if int(m.group(1)) == 0: branchNot += 1 else: branchTaken += 1 none0 += none some0 += some branchTaken0 += branchTaken branchNot0 += branchNot if FUNC: pass elif BRANCH: if branchTaken or branchNot: show(fn, branchNot, branchTaken) else: if some or none: show(fn, none, some) if BRANCH: if branchTaken0 or branchNot0: show("TOTAL", branchNot0, branchTaken0) else: if some0 or none0: show("TOTAL", none0, some0)