"""
fdtool.py - simple FD file processing tool.

This is an alternative to fd2pragma, written in Python.
It was written to understand the FD format and its relationship
with programming languages and to take advantage of the strengths
of a scripting language.
"""
import re
import collections

# the format of a function definition
REGEX = re.compile('^([^()]+)\(([^()]*)\)\(([^()]*)\).*$')


class FDState:
    """represents the parser state"""
    def __init__(self, base, public, offset):
        self.base = base
        self.public = public
        self.offset = offset


def process_command(command, state):
    """process a FD command line"""
    if command.startswith('base'):
        state.base = command.split()[1]
    elif command.startswith('bias'):
        state.offset = int(command.split()[1])
    elif command.startswith('private'):
        state.public = False
    elif command.startswith('public'):
        state.public = True
    elif command.startswith('end'):
        pass
    else:
        print("unsupported command: ", command)


def process_fundef(line, state):
    """process a FD function definition"""
    match = REGEX.match(line)
    if match:
        name, params, regs = match.group(1, 2, 3)
        if state.public:
            if len(params) > 0:
                print("-%d -> %s(%s), [%s]" % (state.offset, name, params, regs))
            else:
                print("-%d -> %s()" % (state.offset, name))
        state.offset += 6


def process(input_file):
    """process the specified input file"""
    state = FDState('', False, 0)
    with open(input_file) as infile:
        for line in infile:
            if line.startswith('*'):
                pass
            elif line.startswith('##'):
                process_command(line[2:], state)
            else:
                process_fundef(line.strip(), state)
    print("Done.")

