#!python

import os
import argparse

import bfi

def main():
    parser = argparse.ArgumentParser(description="Brainfuck interpreter")

    parser.add_argument('file', type=str, nargs='?',
        help="Brainfuck source file to interpret")
    parser.add_argument('-v', '--version', action='store_true', dest='version',
        help="Print version information")
    parser.add_argument('-i', '--intermediate', dest='intermediate',
        action='store_true', help="Print intermediate opcode represenation "
        "instead of interpreting")
    parser.add_argument('-t', '--tape-size', dest='size', type=int,
        help="Tape size for brainfuck program", default=30000)
    parser.add_argument('-s', '--input-string', dest='input_string',
        help="Instead of reading input from stdin, read each subsequent byte from this string", default=None)


    args = parser.parse_args()

    if args.version:
        print('bfi %s' % bfi.__version__)
        return

    if not args.file:
        print('Please specify a brainfuck source file')
        return

    with open(args.file, 'r') as fh:
        prog = fh.read()

    if args.intermediate:
        for opcode in bfi.parse(prog):
            print(opcode)
    else:
        try:
            bfi.interpret(prog, input_data=args.input_string, tape_size=args.size)
        except bfi.BrainfuckSyntaxError as e:
            print('Brainfuck syntax error: %s' % e)

if __name__ == "__main__":
    main()
