/*******************************************************************************
 * Copyright (c) 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.osgi.framework.util;

/**
 * Simple tokenizer class. Used to parse data.
 */
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 getString(String terminals) {
		skipWhiteSpace();
		char[] val = value;
		int cur = cursor;

		if (cur < max) {
			if (val[cur] == '\"') /* if a quoted string */
			{
				cur++; /* skip quote */
				char c = '\0';
				int begin = cur;
				for (; cur < max; cur++) {
					c = val[cur];
					if (c == '\"') {
						break;
					}
				}
				int count = cur - begin;
				if (c == '\"') {
					cur++;
				}
				cursor = cur;
				if (count > 0) {
					skipWhiteSpace();
					return (new String(val, begin, count));
				}
			} else /* not a quoted string; same as token */
			{
				int begin = cur;
				for (; cur < max; cur++) {
					char c = val[cur];
					if (c == '\"') {
						// but there could be a quoted string in the middle of the string
						cur = cur + skipQuotedString(val, cur);
					} else 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);
	}

	private int skipQuotedString(char[] val, int cur) {
		cur++; /* skip quote */
		char c = '\0';
		int begin = cur;
		for (; cur < max; cur++) {
			c = val[cur];
			if (c == '\"') {
				break;
			}
		}
		int count = cur - begin;
		if (c == '\"') {
			cur++;
		}
		cursor = cur;
		if (count > 0) {
			skipWhiteSpace();
		}
		return count;
	}

	public char getChar() {
		int cur = cursor;
		if (cur < max) {
			cursor = cur + 1;
			return (value[cur]);
		}
		return ('\0'); /* end of value */
	}

	public boolean hasMoreTokens() {
		if (cursor < max) {
			return true;
		}
		return false;
	}
}