FileDocCategorySizeDatePackage
StringScanner.javaAPI DocAzureus 3.0.3.46421Fri Mar 12 11:00:20 GMT 2004org.pf.text

StringScanner.java

// ===========================================================================
// 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