
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_javax_swing_text_html_css_CSSScanner__
#define __gnu_javax_swing_text_html_css_CSSScanner__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace swing
      {
        namespace text
        {
          namespace html
          {
            namespace css
            {
                class CSSScanner;
            }
          }
        }
      }
    }
  }
}

class gnu::javax::swing::text::html::css::CSSScanner : public ::java::lang::Object
{

public: // actually package-private
  CSSScanner(::java::io::Reader *);
  virtual jint nextToken();
  virtual ::java::lang::String * currentTokenString();
private:
  jint read();
  void readIdent();
  void readEscape();
  void readName();
  void readString();
  void readWhitespace();
  void readURI();
  void readComment();
  void readNum();
public:
  static void main(JArray< ::java::lang::String * > *);
public: // actually package-private
  static const jint IDENT = 1;
  static const jint ATKEYWORD = 2;
  static const jint STRING = 3;
  static const jint INVALID = 4;
  static const jint HASH = 5;
  static const jint NUMBER = 6;
  static const jint PERCENTAGE = 7;
  static const jint DIMENSION = 8;
  static const jint URI = 9;
  static const jint UNICODE_RANGE = 10;
  static const jint CDO = 11;
  static const jint CDC = 12;
  static const jint SEMICOLON = 13;
  static const jint CURLY_LEFT = 14;
  static const jint CURLY_RIGHT = 15;
  static const jint PAREN_LEFT = 16;
  static const jint PAREN_RIGHT = 17;
  static const jint BRACE_LEFT = 16;
  static const jint BRACE_RIGHT = 17;
  static const jint S = 18;
  static const jint COMMENT = 19;
  static const jint FUNCTION = 20;
  static const jint INCLUDES = 21;
  static const jint DASHMATCH = 22;
  static const jint DELIM = 23;
  static const jint EOF = -1;
private:
  ::java::io::Reader * __attribute__((aligned(__alignof__( ::java::lang::Object)))) in;
public: // actually package-private
  JArray< jchar > * parseBuffer;
  jint tokenEnd;
private:
  JArray< jint > * lookahead;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_swing_text_html_css_CSSScanner__
