' This script is an example of MY-BASIC
' Copyright (c) 2011 - 2016 Wang Renxin. All rights reserved.
' For more information, see https://github.com/paladin-t/my_basic/

def reserve(m, n)
	for j = len(m) to n + 2
		push(m, 0)
	next
enddef

def forward(cmd, i)
	l = len(cmd)
	k = 0
	while i < l
		h = mid(cmd, i, 1)
		if h = "[" then
			k = k + 1
		elseif h = "]" then
			k = k - 1
		endif
		if h = "]" and k = 0 then
			return i
		endif
		i = i + 1
	wend

	return i
enddef

def backward(cmd, i)
	k = 0
	while i > 0
		h = mid(cmd, i, 1)
		if h = "]" then
			k = k + 1
		elseif h = "[" then
			k = k - 1
		endif
		if h = "[" and k = 0 then
			return i
		endif
		i = i - 1
	wend

	return i
enddef

def brainfuck(cmd)
	m = list()

	i = 0
	cursor = 0

	l = len(cmd)
	while i < l
		c = mid(cmd, i, 1)
		if c = ">" then
			cursor = cursor + 1
		elseif c = "<" then
			cursor = cursor - 1
		elseif c = "+" then
			reserve(m, cursor)
			b = m(cursor)
			m(cursor) = b + 1
		elseif c = "-" then
			reserve(m, cursor)
			b = m(cursor)
			m(cursor) = b - 1
		elseif c = "." then
			reserve(m, cursor)
			print chr(m(cursor))
		elseif c = "," then
			reserve(m, cursor)
			input ch$
			m(cursor) = asc(ch$)
		elseif c = "[" then
			reserve(m, cursor)
			b = m(cursor)
			if b = 0 then
				i = forward(cmd, i)
			endif
		elseif c = "]" then
			reserve(m, cursor)
			b = m(cursor)
			if b <> 0 then
				i = backward(cmd, i)
			endif
		endif
		i = i + 1
	wend
enddef

' This is a brainfuck interpreter written with MY-BASIC
input "Input: ", cmd$
' Use a sample code?
if cmd$ = "hello" then
	cmd$ = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."
endif

brainfuck(cmd$)
