#!/usr/bin/python
# Copyright Martin J. Bligh (mbligh@google.com)
# Released under the GPL, v2

import os, sys, re

results_per_sign = 10

def parse_lines(filename):
    results = []
    start_key = 1
    for line in open(filename).readlines():
        try:
            a = line.split()
            key = ' '.join(a[start_key:])
            count = int(a[0])
            results.append((key, count))
        except:         # presumably a header line
            if re.match(r'samples\s*%\s*app name\s*symbol name', line):
                start_key = 2
            elif re.match(r'samples\s*%\s*image name\s*app name\s*symbol name', line):
                start_key = 3
    return results


# Firstly, suck in both files.
orig = {}
new = {}
diff = {}

for (key, count) in parse_lines(sys.argv[1]):
    # Oprofile seems to be ... erm ... broken. Keys can appear > once ;-(
    if orig.has_key(key):
        orig[key] += count
    else:
        orig[key] = count
    if diff.has_key(key):
        diff[key] -= count
    else:
        diff[key] = -count

for (key, count) in parse_lines(sys.argv[2]):
    if new.has_key(key):
        new[key] += count
    else:
        new[key] = count
    if diff.has_key(key):
        diff[key] += count
    else:
        diff[key] = count

if len(orig) < 2* results_per_sign or len(new) < 2 * results_per_sign:
    sys.exit(1)             # one of the files was blank?

# Now sort and print the diffs.
def print_key(key):
    if orig.has_key(key) and orig[key] > 0:
        pct = (100 * diff[key]) / orig[key]
    else:
        pct = 0
    print "%10d  %6.1f%% %s" % (diff[key], pct, key)

keys = sorted(diff.keys(), key=lambda x : diff[x], reverse = True)

for key in keys[:results_per_sign]:
    print_key(key)

print "\n...\n"

for key in keys[len(keys)-results_per_sign:]:
    print_key(key)
