Mega Code Archive

 
Categories / Java / Data Type
 

Advanced navigation over the underlying 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 StringExaminer // AUTHOR   : Manfred Duchrow // VERSION  : 1.0 - 29/09/2002 // HISTORY  : //  29/09/2002  duma  CREATED // // Copyright (c) 2002, by Manfred Duchrow. All rights reserved. //package com.sshtools.daemon.util; // IMPORTS /**  * As a subclass of StringScanner this class allows more advanced navigation  * over the underlying string.    <br>  * That includes moving to positions of specific substrings etc.  *  * @author Manfred Duchrow  * @version $Id: StringExaminer.java,v 1.7 2003/09/11 15:37:07 martianx Exp $  */ public class StringExaminer extends StringScanner {     // CONSTANTS     // INSTANCE VARIABLES     private boolean ignoreCase = false;     // CLASS METHODS     // CONSTRUCTORS     /**  * Initialize the new instance with the string to examine.   <br>  * The string will be treated case-sensitive.  *  * @param stringToExamine The string that should be examined  */     public StringExaminer(String stringToExamine) {         this(stringToExamine, false);     }     // StringExaminer()     // -------------------------------------------------------------------------     /**  * Initialize the new instance with the string to examine.  *  * @param stringToExamine The string that should be examined  * @param ignoreCase Specified whether or not treating the string case  *        insensitive  */     public StringExaminer(String stringToExamine, boolean ignoreCase) {         super(stringToExamine);         this.ignoreCase(ignoreCase);     }     // StringExaminer()     /**  *  *  * @return  */     protected boolean ignoreCase() {         return ignoreCase;     }     /**  *  *  * @param newValue  */     protected void ignoreCase(boolean newValue) {         ignoreCase = newValue;     }     // -------------------------------------------------------------------------     // PUBLIC INSTANCE METHODS     /**  * Increments the position pointer up to the last character that matched  * the character sequence in the given matchString. Returns true, if the  * matchString was found, otherwise false.  *  * <p>  * If the matchString was found, the next invocation of method nextChar()  * returns the first character after that matchString.  * </p>  *  * @param matchString The string to look up  *  * @return  */     public boolean skipAfter(String matchString) {         char ch = '-';         char matchChar = ' ';         boolean found = false;         int index = 0;         if ((matchString == null) || (matchString.length() == 0)) {             return false;         }         ch = this.nextChar();         while ((endNotReached(ch)) && (!found)) {             matchChar = matchString.charAt(index);             if (this.charsAreEqual(ch, matchChar)) {                 index++;                 if (index >= matchString.length()) { // whole matchString checked ?                     found = true;                 } else {                     ch = this.nextChar();                 }             } else {                 if (index == 0) {                     ch = this.nextChar();                 } else {                     index = 0;                 }             }         }         return found;     }     // skipAfter()     // -------------------------------------------------------------------------     /**  * Increments the position pointer up to the first character before the  * character sequence in the given matchString. Returns true, if the  * matchString was found, otherwise false.  *  * <p>  * If the matchString was found, the next invocation of method nextChar()  * returns the first character of that matchString from the position where  * it was found inside the examined string.  * </p>  *  * @param matchString The string to look up  *  * @return  */     public boolean skipBefore(String matchString) {         boolean found;         found = this.skipAfter(matchString);         if (found) {             this.skip(0 - matchString.length());         }         return found;     }     // skipBefore()     // -------------------------------------------------------------------------     /**  * Returns the a string containing all characters from the current position  * up to the end of the examined string.   <br>  * The character position of the examiner is not changed by this method.  *  * @return  */     public String peekUpToEnd() {         return this.upToEnd(true);     }     // peekUpToEnd()     // -------------------------------------------------------------------------     /**  * Returns the a string containing all characters from the current position  * up to the end of the examined string.   <br>  * The character position is put to the end by this method. That means the  * next invocation of nextChar() returns END_REACHED.  *  * @return  */     public String upToEnd() {         return this.upToEnd(false);     }     // upToEnd()     /**  *  *  * @param char1  * @param char2  *  * @return  */     protected boolean charsAreEqual(char char1, char char2) {         return (this.ignoreCase())         ? (Character.toUpperCase(char1) == Character.toUpperCase(char2))         : (char1 == char2);     }     // charsAreEqual()     // -------------------------------------------------------------------------     /**  * Returns the a string containing all characters from the current position  * up to the end of the examined string.   <br>  * Depending on the peek flag the character position of the examiner  is  * unchanged (true) after calling this method or points behind the strings  * last character.  *  * @param peek  *  * @return  */     protected String upToEnd(boolean peek) {         char result = '-';         int lastPosition = 0;         StringBuffer buffer = new StringBuffer(100);         lastPosition = this.getPosition();         result = this.nextChar();         while (endNotReached(result)) {             buffer.append(result);             result = this.nextChar();         }         if (peek) {             this.setPosition(lastPosition);         }         return buffer.toString();     }     // upToEnd()     // ------------------------------------------------------------------------- } // class StringExaminer /*  *  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  */ 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