/BrainFuckOS/BrainFuckOS-TestConsole/BrainFuckInterpreterTEST.cs
C# | 157 lines | 142 code | 6 blank | 9 comment | 29 complexity | 07df83dba2629ed3f29f28e6fcb111b2 MD5 | raw file
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace BrainFuckOS
- {
- class BrainFuckInterpreter
- {
- string script;
- int program_counter;
- uint pointer;
- uint[] data;
-
- public BrainFuckInterpreter()
- {
- script = "";
- }
-
- public string ProgramCode
- {
- set
- {
- script = value;
- }
- }
-
- public void Run()
- {
- //Console.WriteLine("Starting BFI...");
- if (script != null)
- {
- //Console.WriteLine("Valid Program...");
- data = new uint[6656u];
- program_counter = 0;
- pointer = 0;
- while (program_counter != script.Length)
- {
- System.Windows.Forms.Application.DoEvents();
- char c = script[program_counter];
- //Console.WriteLine("Command: {0}", c);
- Console.Title = "'" + c + "' / " + program_counter.ToString();
- switch (c)
- {
- case '+':
- data[pointer]++;
- break;
- case '-':
- data[pointer]--;
- break;
- case '>':
- pointer++;
- break;
- case '<':
- pointer--;
- break;
- case '.':
- //Console.WriteLine("[{0}] >{1}<",pointer.ToString("X2"),data[pointer].ToString("X2"));
- PortForwarder.Write(data[0], data[pointer], this);
- break;
- case ',':
- data[pointer] = PortForwarder.Read(data[0], this);
- break;
- case '[':
- if (data[pointer] == 0)
- {
- program_counter = FindNextBracket();
- //Console.WriteLine("Found ']' at {0}", program_counter);
- if (program_counter == -1)
- {
- //Cosmos.System.Global.Dbg.SendMessage(this.ToString(), "Kein passendes ']'.");
- return;
- }
- }
- break;
- case ']':
- if (data[pointer] != 0)
- {
- program_counter = FindLastBracket();
- //Console.WriteLine("Found '[' at {0}", program_counter);
- if (program_counter == -1)
- {
- //Cosmos.System.Global.Dbg.SendMessage(this.ToString(), "Kein passendes '['.");
- return;
- }
- }
- break;
- }
- program_counter++;
- }
- }
- }
-
- int FindNextBracket()
- {
- int i = program_counter + 1;
- int j = 0;
- char c = script[i];
- while (i < script.Length)
- {
- switch (c)
- {
- case '[':
- j++;
- break;
- case ']':
- j--;
- break;
- }
- if (j == -1 && c == ']')
- {
- break;
- }
- i++;
- if (i < script.Length)
- {
- c = script[i];
- }
- }
- if (i == script.Length)
- {
- i = -1;
- }
- return i;
- }
-
- int FindLastBracket()
- {
- int i = program_counter - 1;
- int j = 0;
- char c = script[i];
- while (i >= 0)
- {
- //Console.WriteLine("{0} - {1}",c,j);
- switch (c)
- {
- case '[':
- j--;
- break;
- case ']':
- j++;
- break;
- }
- if (j == -1 && c == '[')
- {
- break;
- }
- i--;
- if (i >= 0)
- {
- c = script[i];
- }
- }
- return i;
- }
- }
- }