// ===========================================================================
// CONTENT : CLASS StringScanner
// AUTHOR : Manfred Duchrow
// VERSION : 1.1 - 29/09/2002
// HISTORY :
// 11/07/2001 duma CREATED
// 29/09/2002 duma added -> endReached(), endNotReached()
//
// Copyright (c) 2001-2002, by Manfred Duchrow. All rights reserved.
// ===========================================================================
package org.pf.text;
// ===========================================================================
// IMPORTS
// ===========================================================================
/**
* Simple scanner that allows to navigate over the characters of a string.
*
* @author Manfred Duchrow
* @version 1.1
*/
public class StringScanner
{
// =========================================================================
// CONSTANTS
// =========================================================================
public static final char END_REACHED = (char)-1 ;
// =========================================================================
// INSTANCE VARIABLES
// =========================================================================
protected int length = 0 ;
protected int position = 0 ;
protected int pos_marker = 0 ;
protected char[] buffer = null ;
// =========================================================================
// PUBLIC CLASS METHODS
// =========================================================================
/**
* Returns true, if the given character indicates that the end of the
* scanned string is reached.
*/
public boolean endReached( char character )
{
return ( character == END_REACHED ) ;
} // endReached()
// -------------------------------------------------------------------------
/**
* Returns true, if the given character does <b>not</b> indicate that the
* end of the scanned string si reached.
*/
public boolean endNotReached( char character )
{
return ( ! endReached( character ) ) ;
} // endNotReached()
// -------------------------------------------------------------------------
// =========================================================================
// CONSTRUCTORS
// =========================================================================
/**
* Initialize the new instance with the string that should be scanned.
*/
public StringScanner( String stringToScan )
{
super() ;
length = stringToScan.length() ;
buffer = new char[length] ;
stringToScan.getChars( 0, length, buffer, 0 ) ;
} // StringScanner()
// =========================================================================
// PUBLIC INSTANCE METHODS
// =========================================================================
/**
* Returns the string the scanner was initialized with
*/
public String toString()
{
return new String( buffer ) ;
} // toString()
// -------------------------------------------------------------------------
/**
* Moves the position pointer count characters.
* positive values move forwards, negative backwards.
* The position never becomes negative !
*/
public void skip( int count )
{
position += count ;
if ( position < 0 )
position = 0 ;
} // skip()
// -------------------------------------------------------------------------
/**
* Returns the character at the current position without changing
* the position, that is subsequent calls to this method return always
* the same character.
*/
public char peek()
{
return ( position < length() ? buffer[position] : END_REACHED ) ;
} // skip()
// -------------------------------------------------------------------------
/**
* Returns the character at the current position and increments
* the position afterwards by 1.
*/
public char nextChar()
{
char next = this.peek() ;
if ( endNotReached( next ) )
this.skip(1);
return next ;
} // nextChar()
// -------------------------------------------------------------------------
/**
* Returns true, if the scanner has reached the end and a further invocation
* of nextChar() would return the END_REACHED character.
*/
public boolean atEnd()
{
return ( endReached( this.peek() ) ) ;
} // atEnd()
// -------------------------------------------------------------------------
/**
* Returns true, if the scanner has not yet reached the end.
*/
public boolean hasNext()
{
return ! this.atEnd() ;
} // hasNext()
// -------------------------------------------------------------------------
/**
* Returns the next character that is no whitespace and leaves the
* position pointer one character after the returned one.
*/
public char nextNoneWhitespaceChar()
{
char next = this.nextChar() ;
while ( ( endNotReached( next ) ) && ( Character.isWhitespace(next) ) )
{
next = this.nextChar() ;
}
return next ;
} // nextNoneWhitespaceChar()
// -------------------------------------------------------------------------
/**
* Returns the current position in the string
*/
public int getPosition()
{
return position ;
} // getPosition()
// -------------------------------------------------------------------------
/**
* Remembers the current position for later use with restorePosition()
*/
public void markPosition()
{
pos_marker = position ;
} // markPosition()
// -------------------------------------------------------------------------
/**
* Restores the position to the value of the latest markPosition() call
*/
public void restorePosition()
{
this.setPosition( pos_marker ) ;
} // restorePosition()
// -------------------------------------------------------------------------
// =========================================================================
// PROTECTED INSTANCE METHODS
// =========================================================================
protected int length()
{
return length ;
} // length()
// -------------------------------------------------------------------------
protected void setPosition( int pos )
{
if ( ( pos >= 0 ) && ( pos <= this.length() ) )
position = pos ;
} // setPosition()
// -------------------------------------------------------------------------
} // class StringScanner