/** * Copyright (c) 2007-2011, JAGaToo Project Group all rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the 'Xith3D Project Group' nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) A * RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE */ package org.jagatoo.util.strings; /** * The {@link SimpleStringTokenizer} can be used, where speed matters. * It is reusable for new Strings and only searches for whitespaces. * * @author Marvin Froehlich (aka Qudus) */ public class SimpleStringTokenizer { private String string; private int pos = -1; private Boolean hasMore = null; private String lastToken = null; private boolean useQuotes = false; private final StringBuilder sb = new StringBuilder(); public void useQuotes( boolean keep ) { this.useQuotes = keep; } public final boolean useQuotes() { return ( useQuotes ); } public void reset() { this.pos = -1; this.hasMore = null; this.lastToken = null; } public void setString( String string, int skipChars ) { if ( string == null ) { throw new IllegalArgumentException( "string must not be null" ); } this.string = string; reset(); this.pos = skipChars - 1; } public void setString( String string ) { setString( string, 0 ); } public static final boolean isWhitespace( char ch ) { //return ( Character.isWhitespace( ch ) ); return ( ( ch == ' ' ) || ( ch == '\n' ) || ( ch == (char)13 ) || ( ch == '\t' ) || ( ch == '\f' ) ); } private final boolean searchForNextToken() { while ( ++pos < string.length() ) { char ch = string.charAt( pos ); if ( !isWhitespace( ch ) ) { return ( true ); } } return ( false ); } public final boolean hasMoreTokens() { if ( pos >= string.length() ) return ( false ); if ( hasMore == null ) { hasMore = Boolean.valueOf( searchForNextToken() ); } return ( hasMore.booleanValue() ); } public final String nextToken( boolean discard ) { if ( !hasMoreTokens() ) { return ( null ); } boolean quoteBegan = false; if ( !discard ) { sb.setLength( 0 ); char ch = string.charAt( pos ); if ( ( ch != '\"' ) || !useQuotes ) sb.append( ch ); else quoteBegan = true; } while ( ++pos < string.length() ) { char ch = string.charAt( pos ); if ( ( ch == '\"' ) && useQuotes ) { quoteBegan = !quoteBegan; continue; } if ( isWhitespace( ch ) && !quoteBegan ) { hasMore = null; if ( discard ) return ( null ); return ( sb.toString() ); } if ( !discard ) sb.append( ch ); } hasMore = null; if ( discard || ( sb.length() == 0 ) ) return ( null ); return ( sb.toString() ); } public final String nextToken() { lastToken = nextToken( false ); return ( lastToken ); } public final SimpleStringTokenizer skipToken() { nextToken( true ); return ( this ); } public final String getLastToken() { return ( lastToken ); } private final String getRest( boolean acceptQuotes ) { sb.setLength( 0 ); int numWhitespaces = 0; for ( int i = pos; i < string.length(); i++ ) { char ch = string.charAt( i ); boolean ws = isWhitespace( ch ); if ( ws ) { numWhitespaces++; } else { numWhitespaces = 0; } if ( acceptQuotes || ( ch != '\"' ) ) { if ( !ws || ( sb.length() > 0 ) ) { sb.append( ch ); } } } if ( numWhitespaces > 0 ) { sb.delete( sb.length() - numWhitespaces, sb.length() - 1 ); } return ( sb.toString() ); } public final String getRest() { return ( getRest( true ) ); } public final String getUnquotedRest() { return ( getRest( false ) ); } public SimpleStringTokenizer( String string ) { setString( string ); } }