import java.util.*;
import java.io.*;
import StackMachine;
import MachineSignal;
import TextFileLoader;

public class Testm{

  public static void stampaCS( Machine m ){
	System.out.println( m.getCodeSegment().toString() );
  }

  public static void stampaDS( Machine m ){
	System.out.println( m.getDataSegment().toString() );
  }

  public static void stampaSS( StackMachine m ){
	System.out.println( m.getStackSegment().stringView() );
  }

  public static void stampa_menu( boolean viewStack ){
	System.out.println("\n 1 /Caricare");
	System.out.println(" 3 /ATTIVARE");
	System.out.println(" 4 /Rapporto");  
	System.out.println(" 5 /Visualizzare StackSegment"); 
	System.out.println(" 6 /Visualizzare CodeSegment"); 
	System.out.println(" 7 /Visualizzare DataSegment"); 
	if (viewStack)
 	    System.out.println(" 8 /Disinserire monitoraggio stack a runtime"); 
	else
	    System.out.println(" 8 /Inserire monitoraggio stack a runtime");
	System.out.println(" 9 /Rivisualizzare Menu"); 
	System.out.println(" 0 /Uscire"); 
  }

  public static String leggiFileName(){
	System.out.println( "Comunciare nome del file di input: ");
	int i=0;
	String temp="";
	showPrompt();
	try{
		i= System.in.read();
		while ( i != 13 ){
			temp = temp + (char)i;
			i= System.in.read();
		}
		System.in.skip(1);
	}catch( IOException e ){
	   System.out.println( "RE(A)D ALERT !! Read failure -- leggiFileName");
	}
	return temp;
  }

  protected static void showPrompt(){ System.out.print( ">- " );}
 
  public static void dojob() {
	int i = 1;
	boolean viewStack= false;
	boolean loaded = false;
	String newFileName = leggiFileName();
	TextFileLoader tfl= new TextFileLoader( newFileName );
	tfl.reLoad();
	StackMachine m1 = new StackMachine("m1",tfl.getLoadedContents());

	stampa_menu( viewStack );
	System.out.println( "\t\t\tViewStack: " + viewStack + "\n");
        while (i != 0 ){
	   showPrompt();
           try{
                i = System.in.read();
                System.in.skip(2);	//salta CR LF
           }catch( IOException e ){
                System.out.println( "RE(A)D ALERT !! Read failure -- dojob" );  
           }
           i=i-'0';	//codici ascii: toglie 48
           switch( i ){
                case 0  : System.out.println("addio..."); break;
		case 1  : newFileName = leggiFileName();
			  tfl.changeFile(newFileName);
			  tfl.reLoad();
			  m1.loadNewProgram(tfl.getLoadedContents());
			  break;
		case 3  : m1.init();
			  run( m1, viewStack );
	  		  System.out.println("9 Stampa Menu, 0 quit");
			  break;
		case 4  : System.out.println( m1.rapportoDOS() );
			  System.out.println("9 Stampa Menu, 0 quit");
			  break;
		case 5  : stampaSS( m1 );
			  System.out.println("9 Stampa Menu, 0 quit");
			  break;
		case 6  : stampaCS( m1 );
			  System.out.println("9 Stampa Menu, 0 quit");
			  break;
		case 7  : stampaDS( m1 );
			  System.out.println("9 Stampa Menu, 0 quit");
			  break;
		case 8  : viewStack = !viewStack;
			  System.out.println( "\t\t\tViewStack: " +viewStack);
			  break;
                case 9  : stampa_menu( viewStack );
			  System.out.println( "\t\t\tViewStack: " +viewStack);
			  break;
                default : System.out.println("");
           }
        }
  }//dojob1


  public static void run( StackMachine m1, boolean viewStack ){
	try{
		m1.go(viewStack);
	}
	catch( HaltMessage hm ){
		System.out.println( "La " + m1.getClass().getName() +" "
		  + m1.machineName() +" ha terminato l'esecuzione senza errori.");
	}
	catch( MachineException me ){
		System.out.println( me.getClass().getName() +" rilevata nella "
		  + m1.getClass().getName() +" " +m1.machineName() );
	}
	catch( MachineSignal ms ) {}
	System.out.println( m1.rapportoDOS());
  }

  public static void main(String argv[]){
	dojob();
  }

}






/* NOTE VARIE:

   -	 Vector v= new Vector(5);    //crea un vett.comunque di size=0

*/




