''' BrainFuck interpreter Copyright (C) 2008, 2009 Giuseppe Scrivano This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ''' import sys code_pointer = 0 data_pointer = 0 data = [0] * 30000 code = "" stack = [] def push (val): global stack stack.append (val) def pop (): global stack if len (stack) == 0: return 0 return stack.pop () def read_byte (): b = sys.stdin.read (1) print b def get_op (): global code, code_pointer if code_pointer >= 0 and code_pointer < len (code): return code[code_pointer] else: return 0 def read_data (): global data, data_pointer if data_pointer >= 0 and data_pointer < len (data): return data[data_pointer] else: return 0 def inc (): global data, data_pointer if data_pointer >= 0 and data_pointer < len (data): data[data_pointer] = data[data_pointer] + 1 def dec (): global data, data_pointer if data_pointer >= 0 and data_pointer < len (data): data[data_pointer] = data[data_pointer] - 1 def output (): global data, data_pointer if data_pointer >= 0 and data_pointer < len (data): print chr (data[data_pointer]), def input (): global data, data_pointer if data_pointer >= 0 and data_pointer < len (data): data[data_pointer] = sys.stdin.read (1) def run (): global code_pointer, data_pointer while True: op = get_op () if op == '>': data_pointer = data_pointer + 1 code_pointer = code_pointer + 1 elif op == '<': data_pointer = data_pointer - 1 code_pointer = code_pointer + 1 elif op == '+': inc () code_pointer = code_pointer + 1 elif op == '-': dec () code_pointer = code_pointer + 1 elif op == '.': output () code_pointer = code_pointer + 1 elif op == '-': input () code_pointer = code_pointer + 1 elif op == '[': if data[data_pointer] != 0: push (code_pointer) code_pointer = code_pointer + 1 else: while code[code_pointer] != ']': code_pointer = code_pointer + 1 code_pointer = code_pointer + 1 elif op == ']': code_pointer = pop () elif op == 0: break else: code_pointer = code_pointer + 1 if __name__ == "__main__": code = sys.argv[1] run ()