1import sys
2
3if len(sys.argv)!=2:
4    print "Usage:"
5    print "   First run 'dumpbin /exports your_file.dll/.lib > your_file_dumpbin.txt'"
6    print "   Then run '%s your_file_dumpbin.txt > your_file.sdb.txt'" % (sys.argv[0],)
7    print "   Note: this script will strip away function signatures, so overloaded C++ methods will all have the same name"
8    sys.exit(1)
9
10d = open(sys.argv[1]).read().split("\n")
11for l in d:
12    ls = l.split(None, 1)
13    if len(ls)!=2:
14        continue
15    ordinal = ls[0]
16    desc = ls[1]
17    desc = desc.split("(", 1)
18    if len(desc) <= 1:
19        sys.stderr.write("Warning, skipping line: " + l + "\n")
20        continue
21    rawname = desc[0].strip()
22    desc = desc[1].strip()
23    if desc[-1] != ')':
24        sys.stderr.write("Warning, skipping line: " + l + "\n")
25        continue
26    fulldesc = desc[:-1].strip()
27    desc = fulldesc
28    if desc.endswith('const'):
29        desc = desc[:-len('const')]
30    desc = desc.split('(', 1)
31    pre = desc[0].strip()
32    post = ""
33    if len(desc)>1:
34        desc = desc[1]
35        desc = desc.split(')')
36        if len(desc)>1:
37            post = desc[-1].strip()
38    if post != "":
39        sys.stderr.write("Warning, skipping line: " + l + "\n")
40        continue
41    desc = pre
42    i = len(desc) - 1
43    deep = 0
44    while i >= 0:
45        if desc[i] == ">":
46            deep += 1
47        if desc[i] == "<":
48            deep -= 1
49        if desc[i] != " ":
50            i -= 1
51            continue
52        if deep > 0:
53            i -= 1
54            continue
55        break
56    desc = desc[i+1:]
57    print ordinal+"="+desc
58