Mega Code Archive

 
Categories / Java / Data Type
 

Simple scanner that allows to navigate over the characters of a string

/*  *  SSHTools - Java SSH2 API  *  *  Copyright (C) 2002-2003 Lee David Painter and Contributors.  *  *  Contributions made by:  *  *  Brett Smith  *  Richard Pernavas  *  Erwin Bolwidt  *  *  This program is free software; you can redistribute it and/or  *  modify it under the terms of the GNU General Public License  *  as published by the Free Software Foundation; either version 2  *  of the License, or (at your option) any later version.  *  *  This program is distributed in the hope that it will be useful,  *  but WITHOUT ANY WARRANTY; without even the implied warranty of  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  *  GNU General Public License for more details.  *  *  You should have received a copy of the GNU General Public License  *  along with this program; if not, write to the Free Software  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.  */ //  // 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 com.sshtools.daemon.util; // 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;     // -------------------------------------------------------------------------     // CONSTRUCTORS     /**  * Initialize the new instance with the string that should be scanned.  *  * @param stringToScan  */     public StringScanner(String stringToScan) {         super();         length = stringToScan.length();         buffer = new char[length];         stringToScan.getChars(0, length, buffer, 0);     }     // StringScanner()     // PUBLIC CLASS METHODS     /**  * Returns true, if the given character indicates that the end of the  * scanned string is reached.  *  * @param character  *  * @return  */     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.  *  * @param character  *  * @return  */     public boolean endNotReached(char character) {         return (!endReached(character));     }     // endNotReached()     // PUBLIC INSTANCE METHODS     /**  * Returns the string the scanner was initialized with  *  * @return  */     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 !  *  * @param count  */     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.  *  * @return  */     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.  *  * @return  */     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.  *  * @return  */     public boolean atEnd() {         return (endReached(this.peek()));     }     // atEnd()     // -------------------------------------------------------------------------     /**  * Returns true, if the scanner has not yet reached the end.  *  * @return  */     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.  *  * @return  */     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  *  * @return  */     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()     /**  *  *  * @return  */     protected int length() {         return length;     }     // length()     // -------------------------------------------------------------------------     protected void setPosition(int pos) {         if ((pos >= 0) && (pos <= this.length())) {             position = pos;         }     }     // setPosition()     // ------------------------------------------------------------------------- } // class StringScanner