// file: CharReader.java // author: Robert Keller // purpose: Provide character reader as defined immediately below. import java.io.*; /** * A simple reader for reading chars one at a time from a String. * Both peek() and read() methods are provided. Any whitespace is * is skipped. For debugging purposes, a trace of characters read * can be turned on or off (default is off). */ class CharReader extends java.io.StringReader { /** * Indicate whether tracing is on or off. */ boolean traceOn = false; /** * Character returned when end of input reached. */ static char nullchar = '\0'; /** * Integer returned by StringReader for end of input. */ static int eof = -1; /** * Construct a CharReader for a String. */ CharReader(String s) { super(s); } /** * Get the next non-whitespace "character", * returning nullchar if there are no more characters. */ public char get() { int character = readNonWhiteSpace(); if( character == eof ) { if( traceOn ) { System.out.println("geting at end of input, returning null character"); } return nullchar; } else { if( traceOn ) { System.out.println("geting: " + (char)character); } return (char)character; } } /** * Return the next non-whitespace character, but leave the * character in the input to be gotten again. If there are no more * characters, nullchar is returned. */ public char peek() { try { mark(1); int character = readNonWhiteSpace(); reset(); if( character == eof ) { if( traceOn ) { System.out.println("peeking at end of input, " + "returning null character"); } return nullchar; } else { if( traceOn ) { System.out.println("peeking at: " + (char)character); } return (char)character; } } catch( IOException e ) { return nullchar; } } /** * Return true if there are more characters to be get, false otherwise. */ public boolean hasMore() { return peek() != nullchar; } /** * Return the remaining input as a String. */ public String toString() { StringBuffer buffer = new StringBuffer(); int character; try { character = super.read(); // Keep reading until a non-whitespace character is encountered or eof. while( character != eof ) { buffer.append((char)character); character = super.read(); } } catch( IOException e ) { } return buffer.toString(); } /** * Get the next non-whitespace character, * returning nullchar if there are no more characters. */ private int readNonWhiteSpace() { int character; try { character = super.read(); // Keep reading until a non-whitespace character is encountered or eof. while( character != eof && Character.isWhitespace((char)character) ) { character = super.read(); } } catch( IOException e ) { return nullchar; } return character; } /** * Set the trace on or off. */ public void setTrace(boolean traceOn) { this.traceOn = traceOn; } }