import sys, re
def parse(path):
blocks = []
cur = None
for line in open(path):
m = re.match(r"PH (\S*)\s*(?:which=(\d+))?\s*nf=(\d+)", line)
if m:
cur = {"ph": m.group(1), "which": m.group(2), "frames": []}
blocks.append(cur)
elif cur is not None:
fm = re.match(r"\s+len=(\d+) rms=(\d+) ffreq=([\d,]+)", line)
if fm:
cur["frames"].append((int(fm.group(1)), int(fm.group(2)),
[int(x) for x in fm.group(3).split(",") if x != ""]))
return blocks
def fmt(b):
w = f" which={b['which']}" if b["which"] else ""
out = [f"PH {b['ph']}{w} nf={len(b['frames'])}"]
for (ln, rms, ff) in b["frames"]:
out.append(f" len={ln:<3} rms={rms:<3} F1-3={ff[1]:>4},{ff[2]:>4},{ff[3]:>4}")
return out
def main():
if len(sys.argv) != 3:
print("usage: compare_frames.py <c.txt> <rust.txt>"); sys.exit(2)
c, r = parse(sys.argv[1]), parse(sys.argv[2])
print(f"C reference: {len(c)} blocks Rust: {len(r)} blocks\n")
print(f"{'C (reference)':45s} | Rust")
print("-" * 90)
ci = ri = 0
while ci < len(c) or ri < len(r):
cl = fmt(c[ci]) if ci < len(c) else []
rl = fmt(r[ri]) if ri < len(r) else []
for k in range(max(len(cl), len(rl))):
left = cl[k] if k < len(cl) else ""
right = rl[k] if k < len(rl) else ""
print(f"{left:45s} | {right}")
print()
ci += 1; ri += 1
main()