package aQute.libg.qtokens;

import java.util.*;

import aQute.libg.generics.*;

public class QuotedTokenizer {
	String	string;
	int		index				= 0;
	String	separators;
	boolean	returnTokens;
	boolean	ignoreWhiteSpace	= true;
	String	peek;
	char	separator;

	public QuotedTokenizer(String string, String separators, boolean returnTokens) {
		if (string == null)
			throw new IllegalArgumentException("string argument must be not null");
		this.string = string;
		this.separators = separators;
		this.returnTokens = returnTokens;
	}

	public QuotedTokenizer(String string, String separators) {
		this(string, separators, false);
	}

	public String nextToken(String separators) {
		separator = 0;
		if (peek != null) {
			String tmp = peek;
			peek = null;
			return tmp;
		}

		if (index == string.length())
			return null;

		StringBuilder sb = new StringBuilder();

		while (index < string.length()) {
			char c = string.charAt(index++);

			if (Character.isWhitespace(c)) {
				if (index == string.length())
					break;
				sb.append(c);
				continue;
			}

			if (separators.indexOf(c) >= 0) {
				if (returnTokens)
					peek = Character.toString(c);
				else
					separator = c;
				break;
			}

			switch (c) {
				case '"' :
				case '\'' :
					quotedString(sb, c);
					break;

				default :
					sb.append(c);
			}
		}
		String result = sb.toString().trim();
		if (result.length() == 0 && index == string.length())
			return null;
		return result;
	}

	public String nextToken() {
		return nextToken(separators);
	}

	private void quotedString(StringBuilder sb, char c) {
		char quote = c;
		while (index < string.length()) {
			c = string.charAt(index++);
			if (c == quote)
				break;
			if (c == '\\' && index < string.length() && string.charAt(index) == quote)
				c = string.charAt(index++);
			sb.append(c);
		}
	}

	public String[] getTokens() {
		return getTokens(0);
	}

	private String[] getTokens(int cnt) {
		String token = nextToken();
		if (token == null)
			return new String[cnt];

		String result[] = getTokens(cnt + 1);
		result[cnt] = token;
		return result;
	}

	public char getSeparator() {
		return separator;
	}

	public List<String> getTokenSet() {
		List<String> list = Create.list();
		String token = nextToken();
		while (token != null) {
			list.add(token);
			token = nextToken();
		}
		return list;
	}
}
