/* braindrain.d a brainfuck interpreter compile with dmd braindrain.d usage: only with the brainfuck program as parameter example: $ braindrain ",[..,]" it should print your entered key's twice, till you kill the process testet with dmd 1.014 on Windows XP future improvements: add fileusage instead of parameter's */ import std.stdio; import std.cstream; class Stack(T) { private T[] data; private T lastone; public void push(T element) { data.length = data.length + 1; data[data.length - 1] = element; } public T pop() { if (data.length > 0) { lastone = this.last; data.length = data.length - 1; return lastone; } else assert(0); } public T last() { return data[data.length - 1]; } } int main(char[][] args) { char[300_000] speicher; for(int i = 0; i < 300_000; i++) { speicher[i] += 1; } int position, kommandoindex = 0; Stack!(char) klammernstack = new Stack!(char); char[] kommandos; try { kommandos = args[1]; } catch { writefln("No Args? Try this out:"); writefln("braindrain \"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.\""); writefln("It should print 'Hello'"); } while (kommandoindex < kommandos.length) { switch (kommandos[kommandoindex]) { case '>': position += 1; break; case '<': position -= 1; break; case '+': speicher[position] += 1; break; case '-': speicher[position] -= 1; break; case '.': writef(speicher[position]); break; case ',': dout.flush; speicher[position] = getch; break; case '[': klammernstack.push(kommandoindex); break; case ']': if (speicher[position] != 0) { kommandoindex = klammernstack.last; } else { klammernstack.pop; } break; default: break; } kommandoindex += 1; } return 0; }