print <<END;
/*
 * Copyright (C) 2003 Lars Knoll (knoll\@kde.org)
 *
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

/* This file is mostly data generated by flex. Unfortunately flex
   can't handle 16bit strings directly, so we just copy the part of
   the code we need and modify it to our needs.

   Most of the defines below are to make sure we can easily use the
   flex generated code, using as little editing as possible.

   The flex syntax to generate the lexer are more or less directly
   copied from the CSS2.1 specs, with some fixes for comments and
   the important symbol.

   To regenerate, run flex on tokenizer.flex. After this, copy the
   data tables and the YY_DECL method over to this file. Remove the
   init code from YY_DECL and change the YY_END_OF_BUFFER to only call
   yyterminate().

*/

// --------- begin generated code -------------------

END

{
print<<END

#include "CSSGrammar.h"

#define INITIAL 0
#define mediaquery 1
#define forkeyword 2

/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */

#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#endif /* ! C99 */
END
}

# Skip over the flex output prologue: the above typedefs, forward declarations, etc.
# Stop when we get to the declarations of tables.
while (<>) {
    last if /YY_NUM_RULES/;
}

# Dump the generated tables.  /yy_last_accepting/ matches the first declaration after the tables.
print;
while (<>) {
    last if /yy_last_accepting/;
    print;
}

# Skip down the the declaration of yytext; the body of the flex output begins after it.
while (<>) {
  last if /yytext/;
}
# Dump the definitions of states (INITIAL, media query, tokenizer state support).
while (<>) {
  last if not (/define/ || /line/) ;
  print;
}

# Skip to main scanner function.
while (<>) {
    last if /^YY_DECL/;
}

# Dump main scanner declarations, substituting in our 16-bit character type.
# Declarations end with the declaration matching /yy_act/.
print;
while (<>) {
    s/char/UChar/;
    print;
    last if /yy_act/;
}

# Skip past initialization code, down to main loop.
while (<>) {
    last if /while \( 1 \)/;
}

# Dump the main loop, skipping over labels we don't use.
# Stop before dumping the end-of-buffer handling, because we output our own custom end-of-buffer handling.
print;
while (<>) {
    next if /^yy_match:/;
    next if /^do_action:/;
    last if /YY_END_OF_BUFFER/;
    if (/^case YY_STATE_EOF\(INITIAL\):/) {
        print "case YY_END_OF_BUFFER:\n";
        # flex outputs a ton of logic related to end-of-buffer handling; we just want to fall through to
        # the yyterminate() found in other EOF states.  But we need to be careful to back up to behind
        # the terminating double-NUL so that subsequent calls to flex will have the pointers in order,
        # so this logic is a reduction of the normal flex-generated YY_END_OF_BUFFER code.
        print "\tyy_c_buf_p = yy_cp - 1;\n";
        print "\tyy_cp = yy_c_buf_p;\n";
    }
    print;
}

# Skip over the end-of-buffer handling; dump the rest of the function.
while (<>) {
    last if /default:/;
}
print;
while (<>) {
    print;
    last if /end of yylex/;
}

# We don't want the remainder of flex's output.
# However, flex may choke with "flex: error writing output file <stdout>"
# if its stdout is unexpectedly closed on it.
# Consume the remaining output.
while (<>) {
}
