package org.eclipse.osgi.internal.util;
import java.util.ArrayList;
import java.util.List;
public class Tokenizer {
protected char value[];
protected int max;
protected int cursor;
public Tokenizer(String value) {
this.value = value.toCharArray();
max = this.value.length;
cursor = 0;
}
private void skipWhiteSpace() {
char[] val = value;
int cur = cursor;
for (; cur < max; cur++) {
char c = val[cur];
if ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r')) {
continue;
}
break;
}
cursor = cur;
}
public String getToken(String terminals) {
skipWhiteSpace();
char[] val = value;
int cur = cursor;
int begin = cur;
for (; cur < max; cur++) {
char c = val[cur];
if ((terminals.indexOf(c) != -1)) {
break;
}
}
cursor = cur;
int count = cur - begin;
if (count > 0) {
skipWhiteSpace();
while (count > 0 && (val[begin + count - 1] == ' ' || val[begin + count - 1] == '\t'))
count--;
return (new String(val, begin, count));
}
return (null);
}
public String getEscapedToken(String terminals) {
char[] val = value;
int cur = cursor;
if (cur >= max)
return null;
StringBuilder sb = new StringBuilder();
char c;
for (; cur < max; cur++) {
c = val[cur];
if (c == '\\') {
cur++;
if (cur == max)
break;
c = val[cur];
} else if (terminals.indexOf(c) != -1) {
break;
}
sb.append(c);
}
cursor = cur;
return sb.toString();
}
public List<String> getEscapedTokens(String terminals) {
List<String> result = new ArrayList<>();
for (String token = getEscapedToken(terminals); token != null; token = getEscapedToken(terminals)) {
result.add(token);
getChar();
}
return result;
}
public String getString(String terminals, String preserveEscapes) {
skipWhiteSpace();
char[] val = value;
int cur = cursor;
if (cur < max) {
if (val[cur] == '\"')
{
StringBuilder sb = new StringBuilder();
cur++;
char c = '\0';
for (; cur < max; cur++) {
c = val[cur];
if (c == '\\') {
cur++;
if (cur == max)
break;
c = val[cur];
if (preserveEscapes != null && preserveEscapes.indexOf(c) != -1)
sb.append('\\');
} else if (c == '\"') {
break;
}
sb.append(c);
}
if (c == '\"') {
cur++;
}
cursor = cur;
skipWhiteSpace();
return sb.toString();
}
return getToken(terminals);
}
return (null);
}
public String getString(String terminals) {
return getString(terminals, null);
}
public char getChar() {
int cur = cursor;
if (cur < max) {
cursor = cur + 1;
return (value[cur]);
}
return ('\0');
}
public boolean hasMoreTokens() {
if (cursor < max) {
return true;
}
return false;
}
}