#!/usr/bin/env python

import subprocess
import sys

def script_symbols(script):
    symbols = []
    in_symbols = False
    with open(script, 'r') as f:
        for line in f.readlines():
            if in_symbols:
                if line.lstrip() == '};\n':
                    break
                line = line.lstrip()
                line = line.rstrip('\n')
                line = line.rstrip(';')
                symbols.append(line.strip('"'))
            elif line.lstrip() == 'extern "C++" {\n':
                in_symbols = True
    return symbols

if len(sys.argv) < 3:
    print("Usage: %s script lib" % sys.argv[0])
    sys.exit(1)


symbols = script_symbols(sys.argv[1])
p = subprocess.Popen(['objdump', '-t', '-C', sys.argv[2]], stdout=subprocess.PIPE)
data = p.communicate()[0]

symbols = []
for symbol in script_symbols(sys.argv[1]):
    if symbol not in data:
        symbols.append(symbol)

if symbols:
    print('The following symbols are in version script %s and not in library %s' % (sys.argv[1], sys.argv[2]))
    print('\n'.join(sorted(symbols)))
    sys.exit(1)

sys.exit(0)
