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