/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.tools.template;
import java.util.NoSuchElementException;
class QuotedStringTokenizer {
private String str;
private int curPos;
private int maxPos;
public static final String delim = " \t\n\r\f";
public QuotedStringTokenizer(String str) {
curPos = 0;
this.str = str;
maxPos = str.length();
}
private void skipDelimiters() {
while (curPos < maxPos && delim.indexOf(str.charAt(curPos)) >= 0)
curPos++;
}
public boolean hasMoreTokens() {
skipDelimiters();
return curPos < maxPos;
}
public String nextToken() {
skipDelimiters();
if (curPos >= maxPos)
throw new NoSuchElementException();
int start = curPos;
if (str.charAt(curPos) == '\"') {
start++;
curPos++;
boolean quoted = false;
while (quoted || str.charAt(curPos) != '\"') {
quoted = !quoted && str.charAt(curPos) == '\\';
curPos++;
if (curPos >= maxPos)
throw new UnterminatedStringException();
}
StringBuffer sb = new StringBuffer();
String s = str.substring(start, curPos++);
int st = 0;
for (;;) {
int bs = s.indexOf('\\', st);
if (bs == -1) break;
sb.append(s.substring(st, bs));
sb.append(s.substring(bs+1, bs+2));
st = bs + 2;
}
sb.append(s.substring(st));
return sb.toString();
}
while (curPos < maxPos && delim.indexOf(str.charAt(curPos)) < 0)
curPos++;
return str.substring(start, curPos);
}
public int countTokens() {
int count = 0;
int pos = curPos;
while (pos < maxPos) {
// skip delimiters
while (pos < maxPos && delim.indexOf(str.charAt(pos)) >= 0)
pos++;
if (pos >= maxPos) break;
if (str.charAt(pos) == '\"') {
pos++;
boolean quoted = false;
while (quoted || str.charAt(pos) != '\"') {
quoted = !quoted && str.charAt(pos) == '\\';
pos++;
if (pos >= maxPos)
throw new UnterminatedStringException();
}
pos++;
} else {
while (pos < maxPos && delim.indexOf(str.charAt(pos)) < 0)
pos++;
}
count++;
}
return count;
}
}