#!/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)
