/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
/* The following code was generated by JFlex 1.2.2 on 1/27/04 6:41 PM */

/*nlsXXX*/  
package org.eclipse.wst.html.core.internal.contenttype;

import java.io.IOException;
import java.io.Reader;

import org.eclipse.wst.common.encoding.EncodingParserConstants;
import org.eclipse.wst.common.encoding.HeadParserToken;
import org.eclipse.wst.common.encoding.IntStack;
import org.eclipse.wst.xml.core.contenttype.XMLHeadTokenizerConstants;



/**
 * This class is a scanner generated by 
 * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
 * on 1/27/04 6:41 PM from the specification file
 * <tt>file:/D:/DevTimeSupport/HeadParsers/HTMLHeadTokenizer/HTMLHeadTokenizer.jflex</tt>
 */
public class HTMLHeadTokenizer {

	/** this character denotes the end of file */
	final public static int YYEOF = -1;

	/** lexical states */
	final public static int ST_META_TAG = 4;
	final public static int YYINITIAL = 0;
	final public static int UnDelimitedString = 12;
	final public static int DQ_STRING = 8;
	final public static int SQ_STRING = 10;
	final public static int ST_XMLDecl = 2;
	final public static int QuotedAttributeValue = 6;

	/**
	 * YY_LEXSTATE[l] is the state in the DFA for the lexical state l
	 * YY_LEXSTATE[l+1] is the state in the DFA for the lexical state l
	 *                  at the beginning of a line
	 * l is of the form l = 2*k, k a non negative integer
	 */
	private final static int YY_LEXSTATE[] = {0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7};

	/** 
	 * Translates characters to character classes
	 */
	final private static String yycmap_packed = "\11\0\1\6\1\7\2\0\1\11\22\0\1\22\1\0\1\40\2\0" + "\1\44\1\0\1\43\5\0\1\34\1\0\1\42\13\0\1\45\1\12" + "\1\10\1\31\1\13\1\0\1\21\1\0\1\24\1\26\1\17\1\0" + "\1\30\1\32\1\27\2\0\1\16\1\15\1\23\1\25\1\33\1\35" + "\2\0\1\20\1\36\1\37\1\0\1\14\1\41\7\0\1\21\1\0" + "\1\24\1\26\1\17\1\0\1\30\1\32\1\27\2\0\1\16\1\15" + "\1\23\1\25\1\33\1\35\2\0\1\20\1\36\1\37\1\0\1\14" + "\1\41\101\0\1\4\3\0\1\5\17\0\1\3\16\0\1\1\20\0" + "\1\3\16\0\1\1\1\2\170\0\1\2\ufe87\0";

	/** 
	 * Translates characters to character classes
	 */
	final private static char[] yycmap = yy_unpack_cmap(yycmap_packed);


	/* error codes */
	final private static int YY_UNKNOWN_ERROR = 0;
	final private static int YY_ILLEGAL_STATE = 1;
	final private static int YY_NO_MATCH = 2;
	final private static int YY_PUSHBACK_2BIG = 3;

	/* error messages for the codes above */
	final private static String YY_ERROR_MSG[] = {"Unkown internal scanner error", "Internal error: unknown state", "Error: could not match input", "Error: pushback value was too large"};

	/** the input device */
	private java.io.Reader yy_reader;

	/** the current state of the DFA */
	private int yy_state;

	/** the current lexical state */
	private int yy_lexical_state = YYINITIAL;

	/** this buffer contains the current text to be matched and is
	 the source of the yytext() string */
	private char yy_buffer[] = new char[16384];

	/** the textposition at the last accepting state */
	private int yy_markedPos;

	/** the textposition at the last state to be included in yytext */
	private int yy_pushbackPos;

	/** the current text position in the buffer */
	private int yy_currentPos;

	/** startRead marks the beginning of the yytext() string in the buffer */
	private int yy_startRead;

	/** endRead marks the last character in the buffer, that has been read
	 from input */
	private int yy_endRead;


	/** the number of characters up to the start of the matched text */
	private int yychar;


	/** 
	 * yy_atBOL == true <=> the scanner is currently at the beginning of a line
	 */
	private boolean yy_atBOL;

	/** yy_atEOF == true <=> the scanner has returned a value for EOF */
	private boolean yy_atEOF;

	/** denotes if the user-EOF-code has already been executed */
	private boolean yy_eof_done;

	/* user code: */


	private boolean hasMore = true;
	private final static int MAX_TO_SCAN = 1000;
	StringBuffer string = new StringBuffer();
	// state stack for easier state handling
	private IntStack fStateStack = new IntStack();
	private String valueText = null;
	boolean foundContentTypeValue = false;



	public HTMLHeadTokenizer() {
		super();
	}

	public void reset(Reader in) {
		/* the input device */
		yy_reader = in;

		/* the current state of the DFA */
		yy_state = 0;

		/* the current lexical state */
		yy_lexical_state = YYINITIAL;

		/* this buffer contains the current text to be matched and is
		 the source of the yytext() string */
		java.util.Arrays.fill(yy_buffer, (char) 0);

		/* the textposition at the last accepting state */
		yy_markedPos = 0;

		/* the textposition at the last state to be included in yytext */
		yy_pushbackPos = 0;

		/* the current text position in the buffer */
		yy_currentPos = 0;

		/* startRead marks the beginning of the yytext() string in the buffer */
		yy_startRead = 0;

		/** 
		 * endRead marks the last character in the buffer, that has been read
		 * from input 
		 */
		yy_endRead = 0;


		/* the number of characters up to the start of the matched text */
		yychar = 0;


		/** 
		 * yy_atBOL == true <=> the scanner is currently at the beginning 
		 * of a line
		 */
		yy_atBOL = false;

		/* yy_atEOF == true <=> the scanner has returned a value for EOF */
		yy_atEOF = false;

		/* denotes if the user-EOF-code has already been executed */
		yy_eof_done = false;


		fStateStack.clear();

		hasMore = true;

		// its a little wasteful to "throw away" first char array generated
		// by class init (via auto generated code), but we really do want
		// a small buffer for our head parsers.
		if (yy_buffer.length != MAX_TO_SCAN) {
			yy_buffer = new char[MAX_TO_SCAN];
		}


	}


	public final HeadParserToken getNextToken() throws IOException {
		String context = null;
		context = primGetNextToken();
		HeadParserToken result = null;
		if (valueText != null) {
			result = createToken(context, yychar, valueText);
			valueText = null;
		}
		else {
			result = createToken(context, yychar, yytext());
		}
		return result;
	}

	public final boolean hasMoreTokens() {
		return hasMore && yychar < MAX_TO_SCAN;
	}

	private void pushCurrentState() {
		fStateStack.push(yystate());

	}

	private void popState() {
		yybegin(fStateStack.pop());
	}

	private HeadParserToken createToken(String context, int start, String text) {
		return new HeadParserToken(context, start, text);
	}



	/**
	 * Creates a new scanner
	 * There is also a java.io.InputStream version of this constructor.
	 *
	 * @param   in  the java.io.Reader to read input from.
	 */
	public HTMLHeadTokenizer(java.io.Reader in) {
		this.yy_reader = in;
	}

	/**
	 * Creates a new scanner.
	 * There is also java.io.Reader version of this constructor.
	 *
	 * @param   in  the java.io.Inputstream to read input from.
	 */
	public HTMLHeadTokenizer(java.io.InputStream in) {
		this(new java.io.InputStreamReader(in));
	}

	/** 
	 * Unpacks the compressed character translation table.
	 *
	 * @param packed   the packed character translation table
	 * @return         the unpacked character translation table
	 */
	private static char[] yy_unpack_cmap(String packed) {
		char[] map = new char[0x10000];
		int i = 0; /* index in packed string  */
		int j = 0; /* index in unpacked array */
		while (i < 174) {
			int count = packed.charAt(i++);
			char value = packed.charAt(i++);
			do
				map[j++] = value;
			while (--count > 0);
		}
		return map;
	}


	/**
	 * Gets the next input character.
	 *
	 * @return      the next character of the input stream, EOF if the
	 *              end of the stream is reached.
	 * @exception   IOException  if any I/O-Error occurs
	 */
	private int yy_advance() throws java.io.IOException {

		/* standard case */
		if (yy_currentPos < yy_endRead)
			return yy_buffer[yy_currentPos++];

		/* if the eof is reached, we don't need to work hard */
		if (yy_atEOF)
			return YYEOF;

		/* otherwise: need to refill the buffer */

		/* first: make room (if you can) */
		if (yy_startRead > 0) {
			System.arraycopy(yy_buffer, yy_startRead, yy_buffer, 0, yy_endRead - yy_startRead);

			/* translate stored positions */
			yy_endRead -= yy_startRead;
			yy_currentPos -= yy_startRead;
			yy_markedPos -= yy_startRead;
			yy_pushbackPos -= yy_startRead;
			yy_startRead = 0;
		}

		/* is the buffer big enough? */
		if (yy_currentPos >= yy_buffer.length) {
			/* if not: blow it up */
			char newBuffer[] = new char[yy_currentPos * 2];
			System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
			yy_buffer = newBuffer;
		}

		/* finally: fill the buffer with new input */
		int numRead = yy_reader.read(yy_buffer, yy_endRead, yy_buffer.length - yy_endRead);

		if (numRead == -1)
			return YYEOF;

		yy_endRead += numRead;

		return yy_buffer[yy_currentPos++];
	}


	/**
	 * Closes the input stream.
	 */
	final public void yyclose() throws java.io.IOException {
		yy_atEOF = true; /* indicate end of file */
		yy_endRead = yy_startRead; /* invalidate buffer    */
		yy_reader.close();
	}


	/**
	 * Returns the current lexical state.
	 */
	final public int yystate() {
		return yy_lexical_state;
	}

	/**
	 * Enters a new lexical state
	 *
	 * @param newState the new lexical state
	 */
	final public void yybegin(int newState) {
		yy_lexical_state = newState;
	}


	/**
	 * Returns the text matched by the current regular expression.
	 */
	final public String yytext() {
		return new String(yy_buffer, yy_startRead, yy_markedPos - yy_startRead);
	}

	/**
	 * Returns the length of the matched text region.
	 */
	final public int yylength() {
		return yy_markedPos - yy_startRead;
	}


	/**
	 * Reports an error that occured while scanning.
	 *
	 * @param   errorCode  the code of the errormessage to display
	 */
	private void yy_ScanError(int errorCode) {
		try {
			System.out.println(YY_ERROR_MSG[errorCode]);
		}
		catch (ArrayIndexOutOfBoundsException e) {
			System.out.println(YY_ERROR_MSG[YY_UNKNOWN_ERROR]);
		}

		System.exit(1);
	}


	/**
	 * Pushes the specified amount of characters back into the input stream.
	 *
	 * They will be read again by then next call of the scanning method
	 *
	 * @param number  the number of characters to be read again.
	 *                This number must not be greater than yylength()!
	 */
	private void yypushback(int number) {
		if (number > yylength())
			yy_ScanError(YY_PUSHBACK_2BIG);

		yy_markedPos -= number;
	}


	/**
	 * Contains user EOF-code, which will be executed exactly once,
	 * when the end of file is reached
	 */
	private void yy_do_eof() {
		if (!yy_eof_done) {
			yy_eof_done = true;
			hasMore = false;

		}
	}


	/**
	 * Resumes scanning until the next regular expression is matched,
	 * the end of input is encountered or an I/O-Error occurs.
	 *
	 * @return      the next token
	 * @exception   IOException  if any I/O-Error occurs
	 */
	public String primGetNextToken() throws java.io.IOException {
		int yy_input;
		int yy_action;


		while (true) {

			yychar += yylength();

			yy_atBOL = yy_markedPos <= 0 || yy_buffer[yy_markedPos - 1] == '\n';
			if (!yy_atBOL && yy_buffer[yy_markedPos - 1] == '\r') {
				yy_atBOL = yy_advance() != '\n';
				if (!yy_atEOF)
					yy_currentPos--;
			}

			yy_action = -1;

			yy_currentPos = yy_startRead = yy_markedPos;

			if (yy_atBOL)
				yy_state = YY_LEXSTATE[yy_lexical_state + 1];
			else
				yy_state = YY_LEXSTATE[yy_lexical_state];


			yy_forAction : {
				while (true) {

					yy_input = yy_advance();

					if (yy_input == YYEOF)
						break yy_forAction;

					yy_input = yycmap[yy_input];

					boolean yy_isFinal = false;
					boolean yy_noLookAhead = false;

					yy_forNext : {
						switch (yy_state) {
							case 0 :
								switch (yy_input) {
									case 1 :
										yy_isFinal = true;
										yy_state = 9;
										break yy_forNext;
									case 2 :
										yy_isFinal = true;
										yy_state = 10;
										break yy_forNext;
									case 3 :
										yy_isFinal = true;
										yy_state = 11;
										break yy_forNext;
									case 10 :
										yy_isFinal = true;
										yy_state = 12;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 8;
										break yy_forNext;
								}

							case 1 :
								switch (yy_input) {
									case 1 :
										yy_isFinal = true;
										yy_state = 9;
										break yy_forNext;
									case 2 :
										yy_isFinal = true;
										yy_state = 10;
										break yy_forNext;
									case 3 :
										yy_isFinal = true;
										yy_state = 11;
										break yy_forNext;
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 13;
										break yy_forNext;
									case 10 :
										yy_isFinal = true;
										yy_state = 14;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 8;
										break yy_forNext;
								}

							case 2 :
								switch (yy_input) {
									case 11 :
										yy_isFinal = true;
										yy_state = 15;
										break yy_forNext;
									case 15 :
										yy_isFinal = true;
										yy_state = 16;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 8;
										break yy_forNext;
								}

							case 3 :
								switch (yy_input) {
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 17;
										break yy_forNext;
									case 26 :
										yy_isFinal = true;
										yy_state = 18;
										break yy_forNext;
									case 34 :
										yy_isFinal = true;
										yy_state = 19;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 8;
										break yy_forNext;
								}

							case 4 :
								switch (yy_input) {
									case 6 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 21;
										break yy_forNext;
									case 7 :
										yy_isFinal = true;
										yy_state = 22;
										break yy_forNext;
									case 32 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 23;
										break yy_forNext;
									case 35 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 24;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 20;
										break yy_forNext;
								}

							case 5 :
								switch (yy_input) {
									case 7 :
									case 9 :
									case 10 :
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 26;
										break yy_forNext;
									case 11 :
									case 34 :
										yy_isFinal = true;
										yy_state = 27;
										break yy_forNext;
									case 32 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 28;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 25;
										break yy_forNext;
								}

							case 6 :
								switch (yy_input) {
									case 7 :
									case 9 :
									case 10 :
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 26;
										break yy_forNext;
									case 34 :
										yy_isFinal = true;
										yy_state = 27;
										break yy_forNext;
									case 35 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 28;
										break yy_forNext;
									case 36 :
										yy_isFinal = true;
										yy_state = 29;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 25;
										break yy_forNext;
								}

							case 7 :
								switch (yy_input) {
									case 10 :
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 26;
										break yy_forNext;
									case 34 :
										yy_isFinal = true;
										yy_state = 27;
										break yy_forNext;
									case 11 :
										yy_isFinal = true;
										yy_state = 29;
										break yy_forNext;
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 30;
										break yy_forNext;
									case 32 :
									case 35 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 31;
										break yy_forNext;
									case 37 :
										yy_isFinal = true;
										yy_state = 32;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 25;
										break yy_forNext;
								}

							case 9 :
								switch (yy_input) {
									case 2 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 33;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 10 :
								switch (yy_input) {
									case 1 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 34;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 11 :
								switch (yy_input) {
									case 4 :
										yy_state = 35;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 12 :
								switch (yy_input) {
									case 13 :
										yy_state = 36;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 13 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 37;
										break yy_forNext;
									case 10 :
										yy_state = 38;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 14 :
								switch (yy_input) {
									case 13 :
										yy_state = 36;
										break yy_forNext;
									case 11 :
										yy_state = 39;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 15 :
								switch (yy_input) {
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 40;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 16 :
								switch (yy_input) {
									case 19 :
										yy_state = 41;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 18 :
								switch (yy_input) {
									case 16 :
										yy_state = 42;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 19 :
								switch (yy_input) {
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 43;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 21 :
								switch (yy_input) {
									case 6 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 21;
										break yy_forNext;
									case 7 :
										yy_state = 44;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 20;
										break yy_forNext;
								}

							case 22 :
								switch (yy_input) {
									case 6 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 21;
										break yy_forNext;
									case 7 :
										yy_state = 44;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 20;
										break yy_forNext;
								}

							case 27 :
								switch (yy_input) {
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 45;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 29 :
								switch (yy_input) {
									case 25 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 46;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 32 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 32;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 35 :
								switch (yy_input) {
									case 5 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 47;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 36 :
								switch (yy_input) {
									case 15 :
										yy_state = 48;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 37 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 37;
										break yy_forNext;
									case 10 :
										yy_state = 38;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 38 :
								switch (yy_input) {
									case 11 :
										yy_state = 39;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 39 :
								switch (yy_input) {
									case 12 :
										yy_state = 49;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 41 :
								switch (yy_input) {
									case 20 :
										yy_state = 50;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 42 :
								switch (yy_input) {
									case 16 :
										yy_state = 51;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 44 :
								switch (yy_input) {
									case 6 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 21;
										break yy_forNext;
									case 7 :
										yy_state = 44;
										break yy_forNext;
									default :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 20;
										break yy_forNext;
								}

							case 48 :
								switch (yy_input) {
									case 16 :
										yy_state = 52;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 49 :
								switch (yy_input) {
									case 13 :
										yy_state = 53;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 50 :
								switch (yy_input) {
									case 21 :
										yy_state = 54;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 51 :
								switch (yy_input) {
									case 27 :
										yy_state = 55;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 52 :
								switch (yy_input) {
									case 17 :
										yy_state = 56;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 53 :
								switch (yy_input) {
									case 14 :
										yy_state = 57;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 54 :
								switch (yy_input) {
									case 22 :
										yy_state = 58;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 55 :
								switch (yy_input) {
									case 28 :
										yy_state = 59;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 56 :
								switch (yy_input) {
									case 18 :
										yy_isFinal = true;
										yy_noLookAhead = true;
										yy_state = 60;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 57 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 61;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 58 :
								switch (yy_input) {
									case 23 :
										yy_state = 62;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 59 :
								switch (yy_input) {
									case 15 :
										yy_state = 63;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 61 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 61;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 62 :
								switch (yy_input) {
									case 19 :
										yy_state = 64;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 63 :
								switch (yy_input) {
									case 29 :
										yy_state = 65;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 64 :
								switch (yy_input) {
									case 24 :
										yy_state = 66;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 65 :
								switch (yy_input) {
									case 30 :
										yy_state = 67;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 66 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 66;
										break yy_forNext;
									case 8 :
										yy_isFinal = true;
										yy_state = 68;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 67 :
								switch (yy_input) {
									case 23 :
										yy_state = 69;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 68 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 68;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 69 :
								switch (yy_input) {
									case 31 :
										yy_state = 70;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 70 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 70;
										break yy_forNext;
									case 8 :
										yy_state = 71;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 71 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 71;
										break yy_forNext;
									case 20 :
										yy_state = 72;
										break yy_forNext;
									case 32 :
										yy_state = 73;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 72 :
								switch (yy_input) {
									case 21 :
										yy_state = 74;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 73 :
								switch (yy_input) {
									case 20 :
										yy_state = 72;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 74 :
								switch (yy_input) {
									case 19 :
										yy_state = 75;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 75 :
								switch (yy_input) {
									case 16 :
										yy_state = 76;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 76 :
								switch (yy_input) {
									case 15 :
										yy_state = 77;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 77 :
								switch (yy_input) {
									case 19 :
										yy_state = 78;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 78 :
								switch (yy_input) {
									case 16 :
										yy_state = 79;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 79 :
								switch (yy_input) {
									case 28 :
										yy_state = 80;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 80 :
								switch (yy_input) {
									case 16 :
										yy_state = 81;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 81 :
								switch (yy_input) {
									case 33 :
										yy_state = 82;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 82 :
								switch (yy_input) {
									case 27 :
										yy_state = 83;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 83 :
								switch (yy_input) {
									case 15 :
										yy_state = 84;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 84 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 85;
										break yy_forNext;
									case 32 :
										yy_state = 86;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 85 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 85;
										break yy_forNext;
									case 20 :
										yy_state = 87;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 86 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 85;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 87 :
								switch (yy_input) {
									case 21 :
										yy_state = 88;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 88 :
								switch (yy_input) {
									case 19 :
										yy_state = 89;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 89 :
								switch (yy_input) {
									case 16 :
										yy_state = 90;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 90 :
								switch (yy_input) {
									case 15 :
										yy_state = 91;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 91 :
								switch (yy_input) {
									case 19 :
										yy_state = 92;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 92 :
								switch (yy_input) {
									case 16 :
										yy_state = 93;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 93 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_state = 93;
										break yy_forNext;
									case 8 :
										yy_isFinal = true;
										yy_state = 94;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							case 94 :
								switch (yy_input) {
									case 6 :
									case 7 :
									case 9 :
									case 18 :
										yy_isFinal = true;
										yy_state = 94;
										break yy_forNext;
									default :
										break yy_forAction;
								}

							default :
								yy_ScanError(YY_ILLEGAL_STATE);
								break;
						}
					}

					if (yy_isFinal) {
						yy_action = yy_state;
						yy_markedPos = yy_currentPos;
						if (yy_noLookAhead)
							break yy_forAction;
					}

				}
			}


			switch (yy_action) {

				case 26 :
					{
						yypushback(1);
						popState();
						valueText = string.toString();
						return EncodingParserConstants.InvalidTerminatedStringValue;
					}
				case 96 :
					break;
				case 20 :
				case 21 :
					{
						yypushback(1);
						yybegin(UnDelimitedString);
						string.setLength(0);
					}
				case 97 :
					break;
				case 17 :
					{
						yybegin(YYINITIAL);
						if (foundContentTypeValue)
							hasMore = false;
						return HTMLHeadTokenizerConstants.MetaTagEnd;
					}
				case 98 :
					break;
				case 31 :
					{
						yypushback(1);
						popState();
						valueText = string.toString();
						return EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue;
					}
				case 99 :
					break;
				case 43 :
					{
						yybegin(YYINITIAL);
						if (foundContentTypeValue)
							hasMore = false;
						return HTMLHeadTokenizerConstants.MetaTagEnd;
					}
				case 100 :
					break;
				case 45 :
					{
						yypushback(2);
						popState();
						valueText = string.toString();
						return EncodingParserConstants.InvalidTerminatedStringValue;
					}
				case 101 :
					break;
				case 46 :
					{
						yypushback(2);
						popState();
						valueText = string.toString();
						return EncodingParserConstants.InvalidTerminatedStringValue;
					}
				case 102 :
					break;
				case 61 :
					{
						if (yychar == 0) {
							yybegin(ST_XMLDecl);
							return XMLHeadTokenizerConstants.XMLDeclStart;
						}
					}
				case 103 :
					break;
				case 8 :
				case 9 :
				case 10 :
				case 11 :
				case 12 :
				case 13 :
				case 14 :
				case 15 :
				case 16 :
				case 18 :
				case 19 :
				case 22 :
					{
						if (yychar > MAX_TO_SCAN) {
							hasMore = false;
							return EncodingParserConstants.MAX_CHARS_REACHED;
						}
					}
				case 104 :
					break;
				case 60 :
					{
						yybegin(ST_META_TAG);
						return HTMLHeadTokenizerConstants.MetaTagStart;
					}
				case 105 :
					break;
				case 40 :
					{
						yybegin(YYINITIAL);
						return XMLHeadTokenizerConstants.XMLDeclEnd;
					}
				case 106 :
					break;
				case 94 :
					{
						pushCurrentState();
						yybegin(QuotedAttributeValue);
						foundContentTypeValue = true;
						return HTMLHeadTokenizerConstants.MetaTagContentType;
					}
				case 107 :
					break;
				case 68 :
					{
						pushCurrentState();
						yybegin(QuotedAttributeValue);
						return XMLHeadTokenizerConstants.XMLDelEncoding;
					}
				case 108 :
					break;
				case 33 :
					{
						hasMore = false;
						return EncodingParserConstants.UTF16BE;
					}
				case 109 :
					break;
				case 34 :
					{
						hasMore = false;
						return EncodingParserConstants.UTF16LE;
					}
				case 110 :
					break;
				case 47 :
					{
						hasMore = false;
						return EncodingParserConstants.UTF83ByteBOM;
					}
				case 111 :
					break;
				case 28 :
					{
						popState();
						valueText = string.toString();
						return EncodingParserConstants.StringValue;
					}
				case 112 :
					break;
				case 25 :
				case 27 :
				case 29 :
				case 32 :
					{
						string.append(yytext());
					}
				case 113 :
					break;
				case 24 :
					{
						yybegin(SQ_STRING);
						string.setLength(0);
					}
				case 114 :
					break;
				case 23 :
					{
						yybegin(DQ_STRING);
						string.setLength(0);
					}
				case 115 :
					break;
				case 30 :
					{
						yypushback(1);
						popState();
						valueText = string.toString();
						return EncodingParserConstants.UnDelimitedStringValue;
					}
				case 116 :
					break;
				default :
					if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
						yy_atEOF = true;
						yy_do_eof();
						{
							hasMore = false;
							return EncodingParserConstants.EOF;
						}
					}
					else {
						yy_ScanError(YY_NO_MATCH);
					}
			}
		}
	}

	/**
	 * Runs the scanner on input files.
	 *
	 * This main method is the debugging routine for the scanner.
	 * It prints each returned token to System.out until the end of
	 * file is reached, or an error occured.
	 *
	 * @param argv   the command line, contains the filenames to run
	 *               the scanner on.
	 */
	public static void main(String argv[]) {
		for (int i = 0; i < argv.length; i++) {
			HTMLHeadTokenizer scanner = null;
			try {
				scanner = new HTMLHeadTokenizer(new java.io.FileReader(argv[i]));
			}
			catch (java.io.FileNotFoundException e) {
				System.out.println("File not found : \"" + argv[i] + "\"");
				System.exit(1);
			}
			catch (ArrayIndexOutOfBoundsException e) {
				System.out.println("Usage : java HTMLHeadTokenizer <inputfile>");
				System.exit(1);
			}

			try {
				do {
					System.out.println(scanner.primGetNextToken());
				}
				while (!scanner.yy_atEOF);

			}
			catch (java.io.IOException e) {
				System.out.println("An I/O error occured while scanning :");
				System.out.println(e);
				System.exit(1);
			}
			catch (Exception e) {
				e.printStackTrace();
				System.exit(1);
			}
		}
	}


}