#! /usr/bin/env python3

from fontTools.ttLib import TTFont
import sys

if len(sys.argv) < 2:
    print("usage: subset-fpgm.py fontfile.ttf func-number...")
    sys.exit(1)
fontfile = sys.argv[1]
func_nums = [int(x) for x in sys.argv[2:]]

font = TTFont(fontfile)
fpgm = font["fpgm"]

# Parse fpgm
asm = fpgm.program.getAssembly()
funcs = {}
stack = []
tokens = iter(asm)
for token in tokens:
    if token.startswith("PUSH") or token.startswith("NPUSH"):
        for token in tokens:
            try:
                num = int(token)
                stack.append(num)
            except ValueError:
                break
    if token.startswith("FDEF"):
        num = stack.pop()
        body = []
        for token in tokens:
            if token.startswith("ENDF"):
                break
            body.append(token)
        funcs[num] = body
        continue
    assert 0, "Unexpected token in fpgm: %s" % token

# Subset!
funcs = {i: funcs[i] for i in func_nums}

# Put it back together:
asm = []
if funcs:
    asm.append("PUSH[ ]")
nums = sorted(funcs.keys())
asm.extend(str(i) for i in nums)
for i in nums:
    asm.append("FDEF[ ]")
    asm.extend(funcs[i])
    asm.append("ENDF[ ]")

import pprint

pprint.pprint(asm)

fpgm.program.fromAssembly(asm)
# Make sure it compiles
fpgm.program.getBytecode()
