"""MCD proc-compare scorer. Usage: score.py ORIG_TXT OURS_TXT MOD PAIRS... PAIRS = OrigName:OursName. Masks absolute targets, proc refs, dep slots; leave-truncates bodies; reports SAME/PREFIX/DIFF per pair.""" import re, sys def procs(path, mod): txt = open(path, errors='replace').read() heads = [(m.group(1), int(m.group(2), 16)) for m in re.finditer(r'(?m)^;? ?' + mod + r'\.(\w+): ([0-9a-f]{4})$', txt)] ops = [] for line in txt.splitlines(): m = re.match(r'^\s*([0-9a-f]{4})\s+((?:[0-9a-f]{2}\s*)+?)(?:\s{2,}|\t+|$)(.*)$', line) if m: ops.append((int(m.group(1), 16), m.group(2).split(), m.group(3).strip())) out = {} addrs = sorted(set(a for _, a in heads)) for name, a in heads: if name in out: continue nxt = min([x for x in addrs if x > a] or [0x10000]) out[name] = [(o, b, m) for (o, b, m) in ops if a <= o < nxt and b != ['00'] and m] return out def norm(m): m = re.sub(r'\b0[0-9a-f]{3}\b', '@@@@', m) m = re.sub(r'call_with_frame proc\d+', 'call_with_frame proc##', m) m = re.sub(r'nested_call proc\d+', 'nested_call proc##', m) m = re.sub(r'(?