blob: ef91ff6692700596cf8999629157ef4ed1569316 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.util;
import java.io.IOException;
import java.io.Reader;
import org.apache.tools.ant.ProjectComponent;
/**
* Class to tokenize the input as areas separated
* by white space, or by a specified list of
* delim characters. Behaves like java.util.StringTokenizer.
* If the stream starts with delim characters, the first
* token will be an empty string (unless the treat delims
* as tokens flag is set).
* @since Ant 1.7
*/
public class StringTokenizer extends ProjectComponent implements Tokenizer {
private static final int NOT_A_CHAR = -2;
private String intraString = "";
private int pushed = NOT_A_CHAR;
private char[] delims = null;
private boolean delimsAreTokens = false;
private boolean suppressDelims = false;
private boolean includeDelims = false;
/**
* attribute delims - the delimiter characters
* @param delims a string containing the delimiter characters
*/
public void setDelims(String delims) {
this.delims = StringUtils.resolveBackSlash(delims).toCharArray();
}
/**
* attribute delimsaretokens - treat delimiters as
* separate tokens.
* @param delimsAreTokens true if delimiters are to be separate
*/
public void setDelimsAreTokens(boolean delimsAreTokens) {
this.delimsAreTokens = delimsAreTokens;
}
/**
* attribute suppressdelims - suppress delimiters.
* default - false
* @param suppressDelims if true do not report delimiters
*/
public void setSuppressDelims(boolean suppressDelims) {
this.suppressDelims = suppressDelims;
}
/**
* attribute includedelims - treat delimiters as part
* of the token.
* default - false
* @param includeDelims if true add delimiters to the token
*/
public void setIncludeDelims(boolean includeDelims) {
this.includeDelims = includeDelims;
}
/**
* find and return the next token
*
* @param in the input stream
* @return the token
* @exception IOException if an error occurs reading
*/
public String getToken(Reader in) throws IOException {
int ch = -1;
if (pushed != NOT_A_CHAR) {
ch = pushed;
pushed = NOT_A_CHAR;
} else {
ch = in.read();
}
if (ch == -1) {
return null;
}
boolean inToken = true;
intraString = "";
StringBuffer word = new StringBuffer();
StringBuffer padding = new StringBuffer();
while (ch != -1) {
char c = (char) ch;
boolean isDelim = isDelim(c);
if (inToken) {
if (isDelim) {
if (delimsAreTokens) {
if (word.length() == 0) {
word.append(c);
} else {
pushed = ch;
}
break;
}
padding.append(c);
inToken = false;
} else {
word.append(c);
}
} else {
if (isDelim) {
padding.append(c);
} else {
pushed = ch;
break;
}
}
ch = in.read();
}
intraString = padding.toString();
if (includeDelims) {
word.append(intraString);
}
return word.toString();
}
/**
* @return the intratoken string
*/
public String getPostToken() {
return suppressDelims || includeDelims ? "" : intraString;
}
private boolean isDelim(char ch) {
if (delims == null) {
return Character.isWhitespace(ch);
}
for (int i = 0; i < delims.length; ++i) {
if (delims[i] == ch) {
return true;
}
}
return false;
}
}