/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** ** $Id$ ** ** Class History ** ** Date Name Description ** ---------|------------|----------------------------------------------- ** 19Aug98 subtle start of recorded history ** */ package key; import java.io.*; import java.util.Stack; /** */ public class FileIC extends DumbIC { transient File from; transient LineNumberReader br; /** * The constructor must take a socket as its sole * argument * * @param s The socket that the connection is on */ public FileIC( File f ) { super(); from = f; try { br = new LineNumberReader( new FileReader( from ) ); } catch( IOException e ) { close(); return; } } public String getName() { return( "console" ); } public void setDisplay( boolean yn ) { if( yn ) setPrintStream( System.out ); else setPrintStream( null ); } public void stopBeingTemporary() { // do nothing, we always want to be temporary } public final String getSiteName() { return( "local console" ); } public final void discard() { } public synchronized void close() { super.close(); if( br != null ) { try { br.close(); } catch( Exception t ) { } finally { br = null; Registry.instance.delete( this ); } } } /** * return true if the socket is still open */ public boolean isConnected() { if( br != null ) return true; else return false; } transient Stack parent_files = null; public String input( String prompt ) { unIdle(); try { String s = br.readLine(); if( s != null ) { s = s.trim(); if( s.startsWith( "#" ) ) { if( s.startsWith( "#include " ) ) { s = s.substring( 9 ); File newFile = null; String pf = from.getParent(); if( pf != null ) { File parent = new File( from.getParent() ); newFile = new File( parent, s ); } else newFile = new File( s ); if( newFile.exists() ) { LineNumberReader nbr = null; try { nbr = new LineNumberReader( new FileReader( newFile ) ); } catch( IOException e ) { System.err.println( " error reading from " + newFile.getAbsolutePath() + ", skipping." ); return( input( prompt ) ); } System.err.println( " including " + newFile.getAbsolutePath() + "..." ); if( parent_files == null ) parent_files = new Stack(); parent_files.push( new RecursedFile( from, br ) ); from = newFile; br = nbr; return( input( prompt ) ); } else System.err.println( " include file not found '" + newFile.getName() + "', skipping." ); return( input( prompt ) ); } else if( s.startsWith( "#:" ) ) { // it's just a comment otherwise, display it but // don't send it. System.err.println( s.substring( 2 ) ); return( input( prompt ) ); } else { // everything else is a comment that isn't // printed return( input( prompt ) ); } } else return( s ); } else { if( parent_files == null || parent_files.empty() ) { br.close(); throw new IOException( "End Of File" ); } else { RecursedFile rf = (RecursedFile) parent_files.pop(); br.close(); from = rf.file; br = rf.br; return( input( prompt ) ); } } } catch( IOException e ) { throw new NetworkException( e.getMessage() ); } } public String hiddenInput( String prompt ) { return( input( prompt ) ); } class RecursedFile { File file; LineNumberReader br; public RecursedFile( File f, LineNumberReader b ) { file = f; br = b; } } }