package name.panitz.fun4u.machine;

import java.util.Stack;

public class Kellermaschine {
	Stack<Integer> keller = new Stack<Integer>();
	Stack<Integer> cKeller = new Stack<Integer>();
	HeapNode[] heap = new HeapNode[1000];
	int nextFreeHeapNode = 0;
	int pc = 0;
	Instruction[] prog;

	int store(int n) {
		return store(new IntO(n));
	}

	int store(HeapNode n) {
		heap[nextFreeHeapNode] = n;
		nextFreeHeapNode++;
		return nextFreeHeapNode - 1;
	}

	public Kellermaschine(Instruction[] prog) {
		super();
		this.prog = prog;
		System.out.println("Start " + prog.length);
	}

	void step() {
		System.out.println(this);
		Instruction instr = prog[pc];
		instr.execute(this);
	}

	public void run() {
		while (!end()) {
			step();
		}
		System.out.println(((IntO) heap[keller.pop()]).n);
	}

	boolean end() {
		return prog[pc] instanceof End;
	}

	@Override
	public String toString() {
		String result="\n"+pc+" "+prog[pc]+"\n"+keller+"\nHeap:\n";
		for (int i=0;heap[i]!=null&&i<heap.length;i++){
			result=result+i+": "+heap[i]+"\n";
		}
		
		return result+"]";
	}
}
