/*******************************************************************************
 * Copyright (c) 2004, 2005 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.xml.core.internal.contenttype.EncodingParserConstants;
import org.eclipse.wst.xml.core.internal.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 = 8000;
	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);
			}
		}
	}


}
