Example #1
0
        /// <summary>
        /// Runs the provided Brainfuck code.
        /// </summary>
        /// <param name="code">
        /// The code to run.
        /// </param>
        /// <param name="stdin">
        /// Optional. The input stream. Console is used if not specified.
        /// </param>
        /// <param name="stdout">
        /// Optional. The ouput stream. Console is used if not specified.
        /// </param>
        public static void Run(string code, Stream stdin = null, Stream stdout = null)
        {
            Tape tape = new Tape();

            char[] program = code.ToCharArray();
            int brackets = 0;
            int codePointer = 0;

            if (stdin == null)
                stdin = Console.OpenStandardInput();
            if (stdout == null)
                stdout = Console.OpenStandardOutput();

            while (codePointer >= 0 && codePointer < program.Length)
            {
                switch (program[codePointer])
                {
                    case '+':
                        tape.Cell++;
                        codePointer++;
                        break;
                    case '-':
                        tape.Cell--;
                        codePointer++;
                        break;
                    case '>':
                        tape.MoveRight();
                        codePointer++;
                        break;
                    case '<':
                        tape.MoveLeft();
                        codePointer++;
                        break;
                    case '[':
                        if (tape.Cell == 0)
                        {
                            brackets++;
                            while (brackets != 0 && ++codePointer < program.Length)
                            {
                                if (program[codePointer] == '[')
                                    brackets++;
                                else if (program[codePointer] == ']')
                                    brackets--;
                            }
                            codePointer++;
                            break;
                        }
                        codePointer++;
                        break;
                    case ']':
                        brackets++;
                        while (brackets != 0 && --codePointer >= 0)
                        {
                            if (program[codePointer] == ']')
                                brackets++;
                            else if (program[codePointer] == '[')
                                brackets--;
                        }
                        break;
                    case '.':
                        stdout.WriteByte((byte)tape.Cell);
                        codePointer++;
                        break;
                    case ',':
                        tape.Cell = stdin.ReadByte();
                        codePointer++;
                        break;
                    default:
                        codePointer++;
                        break;
                }
            }
        }