/* A lexical scanner generated by flex */

/* Scanner skeleton version:
 * $Header$
 */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5

#include <stdio.h>


/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
#ifdef c_plusplus
#ifndef __cplusplus
#define __cplusplus
#endif
#endif


#ifdef __cplusplus

#include <stdlib.h>
#include <unistd.h>

/* Use prototypes in function declarations. */
#define YY_USE_PROTOS

/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST

#else	/* ! __cplusplus */

#if __STDC__

#define YY_USE_PROTOS
#define YY_USE_CONST

#endif	/* __STDC__ */
#endif	/* ! __cplusplus */

#ifdef __TURBOC__
 #pragma warn -rch
 #pragma warn -use
#include <io.h>
#include <stdlib.h>
#define YY_USE_CONST
#define YY_USE_PROTOS
#endif

#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif


#ifdef YY_USE_PROTOS
#define YY_PROTO(proto) proto
#else
#define YY_PROTO(proto) ()
#endif

/* Returned upon end-of-file. */
#define YY_NULL 0

/* Promotes a possibly negative, possibly signed char to an unsigned
 * integer for use as an array index.  If the signed char is negative,
 * we want to instead treat it as an 8-bit unsigned char, hence the
 * double cast.
 */
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)

/* Enter a start condition.  This macro really ought to take a parameter,
 * but we do it the disgusting crufty way forced on us by the ()-less
 * definition of BEGIN.
 */
#define BEGIN yy_start = 1 + 2 *

/* Translate the current start state into a value that can be later handed
 * to BEGIN to return to the state.  The YYSTATE alias is for lex
 * compatibility.
 */
#define YY_START ((yy_start - 1) / 2)
#define YYSTATE YY_START

/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)

/* Special action meaning "start processing a new file". */
#define YY_NEW_FILE yyrestart( yyin )

#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#define YY_BUF_SIZE 16384

typedef struct yy_buffer_state *YY_BUFFER_STATE;

extern int yyleng;
extern FILE *yyin, *yyout;

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2

/* The funky do-while in the following #define is used to turn the definition
 * int a single C statement (which needs a semi-colon terminator).  This
 * avoids problems with code like:
 *
 * 	if ( condition_holds )
 *		yyless( 5 );
 *	else
 *		do_something_else();
 *
 * Prior to using the do-while the compiler would get upset at the
 * "else" because it interpreted the "if" statement as being all
 * done when it reached the ';' after the yyless() call.
 */

/* Return all but the first 'n' matched characters back to the input stream. */

#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
		*yy_cp = yy_hold_char; \
		YY_RESTORE_YY_MORE_OFFSET \
		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
		} \
	while ( 0 )

#define unput(c) yyunput( c, yytext_ptr )

/* The following is because we cannot portably get our hands on size_t
 * (without autoconf's help, which isn't available because we want
 * flex-generated scanners to compile on their own).
 */
typedef unsigned int yy_size_t;


struct yy_buffer_state
	{
	FILE *yy_input_file;

	char *yy_ch_buf;		/* input buffer */
	char *yy_buf_pos;		/* current position in input buffer */

	/* Size of input buffer in bytes, not including room for EOB
	 * characters.
	 */
	yy_size_t yy_buf_size;

	/* Number of characters read into yy_ch_buf, not including EOB
	 * characters.
	 */
	int yy_n_chars;

	/* Whether we "own" the buffer - i.e., we know we created it,
	 * and can realloc() it to grow it, and should free() it to
	 * delete it.
	 */
	int yy_is_our_buffer;

	/* Whether this is an "interactive" input source; if so, and
	 * if we're using stdio for input, then we want to use getc()
	 * instead of fread(), to make sure we stop fetching input after
	 * each newline.
	 */
	int yy_is_interactive;

	/* Whether we're considered to be at the beginning of a line.
	 * If so, '^' rules will be active on the next match, otherwise
	 * not.
	 */
	int yy_at_bol;

	/* Whether to try to fill the input buffer when we reach the
	 * end of it.
	 */
	int yy_fill_buffer;

	int yy_buffer_status;
#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
	/* When an EOF's been seen but there's still some text to process
	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
	 * shouldn't try reading from the input source any more.  We might
	 * still have a bunch of tokens to match, though, because of
	 * possible backing-up.
	 *
	 * When we actually see the EOF, we change the status to "new"
	 * (via yyrestart()), so that the user can continue scanning by
	 * just pointing yyin at a new input file.
	 */
#define YY_BUFFER_EOF_PENDING 2
	};

static YY_BUFFER_STATE yy_current_buffer = 0;

/* We provide macros for accessing buffer states in case in the
 * future we want to put the buffer states in a more general
 * "scanner state".
 */
#define YY_CURRENT_BUFFER yy_current_buffer


/* yy_hold_char holds the character lost when yytext is formed. */
static char yy_hold_char;

static int yy_n_chars;		/* number of characters read into yy_ch_buf */


int yyleng;

/* Points to current character in buffer. */
static char *yy_c_buf_p = (char *) 0;
static int yy_init = 1;		/* whether we need to initialize */
static int yy_start = 0;	/* start state number */

/* Flag which is used to allow yywrap()'s to do buffer switches
 * instead of setting up a fresh yyin.  A bit of a hack ...
 */
static int yy_did_buffer_switch_on_eof;

void yyrestart YY_PROTO(( FILE *input_file ));

void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
void yy_load_buffer_state YY_PROTO(( void ));
YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )

YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));

static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
static void yy_flex_free YY_PROTO(( void * ));

#define yy_new_buffer yy_create_buffer

#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! yy_current_buffer ) \
		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
	yy_current_buffer->yy_is_interactive = is_interactive; \
	}

#define yy_set_bol(at_bol) \
	{ \
	if ( ! yy_current_buffer ) \
		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
	yy_current_buffer->yy_at_bol = at_bol; \
	}

#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)

typedef unsigned char YY_CHAR;
FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
typedef int yy_state_type;
extern char *yytext;
#define yytext_ptr yytext

static yy_state_type yy_get_previous_state YY_PROTO(( void ));
static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
static int yy_get_next_buffer YY_PROTO(( void ));
static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up yytext.
 */
#define YY_DO_BEFORE_ACTION \
	yytext_ptr = yy_bp; \
	yyleng = (int) (yy_cp - yy_bp); \
	yy_hold_char = *yy_cp; \
	*yy_cp = '\0'; \
	yy_c_buf_p = yy_cp;

#define YY_NUM_RULES 86
#define YY_END_OF_BUFFER 87
static yyconst short int yy_accept[470] =
    {   0,
        0,    0,   87,   85,   84,   83,   85,   78,   80,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,    2,    4,   84,
        0,   81,   78,   80,   79,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   81,    0,   82,   11,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,

       82,   82,   82,   82,   82,    3,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   76,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   41,   82,   82,
       82,   53,   42,   82,   82,   82,   82,   82,   82,   82,
       46,   82,   82,   82,   82,   82,   82,   71,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,

       82,   82,   82,    7,   82,   82,   82,   38,    1,   82,
       82,   82,   82,   82,   18,   82,   82,   25,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   70,
       82,   82,   39,   40,   82,   82,   82,   82,   82,   30,
       82,   82,   82,   82,   82,   82,   50,   82,   82,   82,
       82,   82,   34,   82,   82,    9,   82,   82,   19,   82,
       68,   82,   82,   82,   82,   82,   82,   12,    0,   82,
       82,   82,   82,   82,   82,   82,   13,   82,   14,   82,
       82,   82,   82,   65,   82,   82,   82,   52,   82,   72,
       82,   82,   82,   82,   82,   82,   47,   82,   82,   82,

       82,   82,   82,   82,   82,   82,   58,   82,   82,   36,
       82,   82,   82,   82,   82,   82,   82,   82,    0,   82,
        0,   77,   17,   82,   82,   51,   82,   10,   82,   82,
       82,   82,   16,   82,   82,   82,   82,   82,   82,   82,
       29,   82,   82,   82,   82,   82,   82,   82,   73,   82,
       31,   82,   82,   82,   82,   82,   82,   45,    6,   82,
       82,   82,   82,   77,   82,   23,   24,   82,   15,   82,
       27,   82,   82,   66,   82,   28,   54,   43,   82,   82,
       82,   48,   82,   69,    8,   82,   82,   82,   82,   82,
       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,

       64,   82,   82,   82,   82,   56,   82,   82,   82,   82,
       35,   49,   82,   82,   82,   82,   20,   82,   82,   82,
       82,   82,   82,   82,   82,   74,   82,   82,   82,   32,
       82,   82,   37,   82,   82,   82,   82,   82,   82,   75,
       82,   67,   61,   82,   82,   82,   33,   59,   60,    5,
       21,   82,   82,   82,   82,   55,   57,   82,   82,   82,
       26,   63,   82,   82,   82,   62,   22,   44,    0
    } ;

static yyconst int yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
        1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    1,    5,    6,    1,    1,    1,    1,    1,
        1,    1,    1,    7,    1,    1,    1,    8,    8,    8,
        9,    8,    8,    8,    8,    8,    8,    1,    1,    1,
        1,    1,    1,    1,   10,   11,   12,   13,   14,   15,
       16,   17,   18,   19,   20,   21,   22,   23,   24,   25,
       19,   26,   27,   28,   29,   30,   19,   31,   32,   19,
        1,    1,    1,    1,    1,    1,   33,   33,   33,   33,

       33,   33,   19,   19,   19,   19,   19,   19,   19,   19,
       19,   19,   19,   19,   19,   19,   19,   19,   19,   33,
       19,   19,   34,    1,   35,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1
    } ;

static yyconst int yy_meta[36] =
    {   0,
        1,    2,    3,    2,    1,    4,    2,    5,    5,    5,
        5,    5,    5,    5,    5,    1,    1,    1,    1,    1,
        5,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    5,    1,    1
    } ;

static yyconst short int yy_base[476] =
    {   0,
        0,    0,  515,  516,   34,  516,  509,    0,  492,   25,
       26,   45,   25,   28,   24,  486,  497,   49,    0,   40,
       43,  486,   51,   66,   67,  482,   35,  516,  516,   81,
      503,   84,    0,  486,  516,    0,  494,  477,  492,  475,
       74,  474,  477,  475,   46,  489,   69,  484,  471,  481,
       55,  477,  481,  466,   67,  469,   83,   83,  467,  477,
      464,  478,  464,  459,  475,  470,   74,  453,   81,  457,
       86,   76,  468,  467,  465,  452,  452,  458,   95,  461,
      453,  447,  446,  106,  466,  456,    0,  451,  444,  449,
      448,  443,  452,  435,  436,  449,  433,  448,  430,  426,

      429,  430,  433,  441,  424,    0,  423,  436,  435,  420,
      415,  417,  427,  419,  420,  424,  412,  428,  423,  410,
      424,  405,  406,  407,  419,  409,    0,  402,  409,  416,
      414,  410,  408,  415,  393,  399,  412,  406,  392,  401,
      397,  391,  387,  388,  386,  392,  394,  103,  383,  387,
      399,  388,  389,  396,  385,  377,  379,  376,  373,  376,
      370,  374,  387,  368,  363,   98,  381,    0,  379,  367,
      363,    0,    0,  362,  363,  360,  358,  375,  361,  356,
      105,  373,  372,  351,  355,  355,  349,    0,  366,  352,
      347,  346,  352,  346,  343,  356,  346,  354,  356,  352,

      347,  344,  349,    0,  335,  344,  350,    0,    0,  334,
      115,  334,  345,  119,    0,  345,  331,    0,  328,  326,
      336,  325,  336,  328,  327,  320,  317,  313,  330,    0,
      330,  331,    0,    0,  327,  322,  329,  314,  314,    0,
      114,  305,  307,  318,  322,  318,    0,  321,  318,  107,
      318,  318,    0,  306,  316,    0,  316,  308,    0,  294,
        0,  298,  307,  294,  291,  304,  304,    0,  132,  137,
      293,  287,  290,  300,  288,  290,    0,  293,  295,  295,
      276,  292,  295,    0,  293,  278,  276,    0,  277,    0,
      270,  283,  267,  285,  270,  281,    0,  280,  279,  271,

      265,  277,  261,  257,  259,  257,    0,  274,  256,    0,
      255,  254,  258,  248,  269,  268,  265,  258,  270,  143,
      269,  149,    0,  259,  241,    0,  240,    0,  259,  238,
      258,  239,    0,  250,  237,  250,  236,  231,  247,  246,
        0,  249,  247,  247,  234,  227,  240,  225,    0,  222,
        0,  223,  222,  239,  224,  237,  218,  227,    0,  216,
      215,  222,  217,  235,  213,    0,    0,  209,    0,  226,
        0,  209,  203,    0,  216,    0,    0,    0,  212,  206,
      211,    0,  220,    0,    0,  215,  204,  199,  200,  199,
      213,  199,  199,  197,  206,  208,  207,  199,  188,  194,

      192,  188,  188,  190,  196,    0,  198,  182,  184,  182,
        0,    0,  184,  181,  188,  176,    0,  177,  171,  172,
      170,  183,  186,  181,  171,    0,  183,  171,  164,    0,
      167,  175,    0,  164,  160,  155,  157,  156,  159,    0,
      155,    0,    0,  160,  165,  156,    0,    0,    0,    0,
        0,  141,  150,  141,  139,    0,    0,  128,  122,  126,
        0,    0,  109,   91,   79,    0,    0,    0,  516,  156,
      161,   65,  166,  171,  176
    } ;

static yyconst short int yy_def[476] =
    {   0,
      469,    1,  469,  469,  469,  469,  470,  471,  472,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  469,  469,  469,
      470,  469,  471,  472,  469,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  469,  470,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,

      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,

      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  469,  474,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,

      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  475,  474,
      475,  474,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  475,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,

      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,  473,  473,
      473,  473,  473,  473,  473,  473,  473,  473,    0,  469,
      469,  469,  469,  469,  469
    } ;

static yyconst short int yy_nxt[552] =
    {   0,
        4,    5,    6,    5,    7,    8,    4,    9,    9,   10,
       11,   12,   13,   14,   15,   16,   17,   18,   19,   19,
       20,   21,   22,   19,   23,   24,   25,   19,   26,   27,
       19,   19,   19,   28,   29,   30,   37,   30,   50,   41,
       52,   55,   51,   42,   81,   38,   43,   56,   82,   63,
       53,   39,   83,   40,   44,   95,   67,   64,   54,   96,
       59,   45,   60,   65,  103,   46,   68,   66,   47,   34,
       61,   62,   48,   49,   70,   73,   71,   74,   76,   72,
       77,  104,   30,   78,   30,   84,   90,  108,   85,   91,
       98,   99,  111,   75,   79,  113,  123,  109,  126,  129,

      124,  131,  132,  114,  139,  468,  112,   84,  127,  130,
       85,  205,  225,  467,  206,  241,  269,  269,  242,  270,
      140,  226,  243,  295,  227,  228,  141,  229,  207,  273,
      304,  466,  274,  269,  269,  305,  319,  465,  321,  296,
      321,  322,   36,  321,  321,  464,  321,  322,   36,  321,
      321,  463,  321,  322,   36,  321,   31,   31,  462,   31,
       31,   33,   33,  461,   33,   33,   36,  460,  459,   36,
       36,  320,  320,  458,  320,  320,  321,  321,  457,  456,
      321,  455,  454,  453,  452,  451,  450,  449,  448,  447,
      446,  445,  444,  443,  442,  441,  440,  439,  438,  437,

      436,  435,  434,  433,  432,  431,  430,  429,  428,  427,
      426,  425,  424,  423,  422,  421,  420,  419,  418,  417,
      416,  415,  414,  413,  412,  411,  410,  409,  408,  407,
      406,  405,  404,  403,  402,  401,  400,  399,  398,  364,
      397,  396,  395,  394,  393,  392,  391,  390,  389,  388,
      387,  386,  385,  384,  383,  382,  381,  380,  379,  378,
      377,  376,  375,  374,  373,  372,  371,  370,  369,  368,
      367,  366,  365,  364,  364,  363,  362,  361,  360,  359,
      358,  357,  356,  355,  354,  353,  352,  351,  350,  349,
      348,  347,  346,  345,  344,  343,  342,  341,  340,  339,

      338,  337,  336,  335,  334,  333,  332,  331,  330,  329,
      328,  327,  326,  325,  324,  323,  318,  317,  316,  315,
      314,  313,  312,  311,  310,  309,  308,  307,  306,  303,
      302,  301,  300,  299,  298,  297,  294,  293,  292,  291,
      290,  289,  288,  287,  286,  285,  284,  283,  282,  281,
      280,  279,  278,  277,  276,  275,  272,  271,  268,  267,
      266,  265,  264,  263,  262,  261,  260,  259,  258,  257,
      256,  255,  254,  253,  252,  251,  250,  249,  248,  247,
      246,  245,  244,  240,  239,  238,  237,  236,  235,  234,
      233,  232,  231,  230,  224,  223,  222,  221,  220,  219,

      218,  217,  216,  215,  214,  213,  212,  211,  210,  209,
      208,  204,  203,  202,  201,  200,  199,  198,  197,  196,
      195,  194,  193,  192,  191,  190,  189,  188,  187,  186,
      185,  184,  183,  182,  181,  180,  179,  178,  177,  176,
      175,  174,  173,  172,  171,  170,  169,  168,  167,  166,
      165,  164,  163,  162,  161,  160,  159,  158,  157,  156,
      155,  154,  153,  152,  151,  150,  149,  148,  147,  146,
       32,  145,  144,  143,  142,  138,  137,  136,  135,  134,
      133,  128,  125,  122,  121,  120,  119,  118,  117,  116,
      115,  110,  107,  106,  105,  102,  101,  100,   97,   94,

       93,   92,   89,   88,   87,   86,   35,   32,   80,   69,
       58,   57,   35,   32,  469,    3,  469,  469,  469,  469,
      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
      469
    } ;

static yyconst short int yy_chk[552] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    5,   10,    5,   13,   11,
       14,   15,   13,   11,   27,   10,   11,   15,   27,   20,
       14,   10,   27,   10,   12,   45,   21,   20,   14,   45,
       18,   12,   18,   20,   51,   12,   21,   20,   12,  472,
       18,   18,   12,   12,   23,   24,   23,   24,   25,   23,
       25,   51,   30,   25,   30,   32,   41,   55,   32,   41,
       47,   47,   57,   24,   25,   58,   67,   55,   69,   71,

       67,   72,   72,   58,   79,  465,   57,   84,   69,   71,
       84,  148,  166,  464,  148,  181,  211,  211,  181,  211,
       79,  166,  181,  241,  166,  166,   79,  166,  148,  214,
      250,  463,  214,  269,  269,  250,  269,  460,  270,  241,
      270,  270,  270,  270,  320,  459,  320,  320,  320,  320,
      322,  458,  322,  322,  322,  322,  470,  470,  455,  470,
      470,  471,  471,  454,  471,  471,  473,  453,  452,  473,
      473,  474,  474,  446,  474,  474,  475,  475,  445,  444,
      475,  441,  439,  438,  437,  436,  435,  434,  432,  431,
      429,  428,  427,  425,  424,  423,  422,  421,  420,  419,

      418,  416,  415,  414,  413,  410,  409,  408,  407,  405,
      404,  403,  402,  401,  400,  399,  398,  397,  396,  395,
      394,  393,  392,  391,  390,  389,  388,  387,  386,  383,
      381,  380,  379,  375,  373,  372,  370,  368,  365,  364,
      363,  362,  361,  360,  358,  357,  356,  355,  354,  353,
      352,  350,  348,  347,  346,  345,  344,  343,  342,  340,
      339,  338,  337,  336,  335,  334,  332,  331,  330,  329,
      327,  325,  324,  321,  319,  318,  317,  316,  315,  314,
      313,  312,  311,  309,  308,  306,  305,  304,  303,  302,
      301,  300,  299,  298,  296,  295,  294,  293,  292,  291,

      289,  287,  286,  285,  283,  282,  281,  280,  279,  278,
      276,  275,  274,  273,  272,  271,  267,  266,  265,  264,
      263,  262,  260,  258,  257,  255,  254,  252,  251,  249,
      248,  246,  245,  244,  243,  242,  239,  238,  237,  236,
      235,  232,  231,  229,  228,  227,  226,  225,  224,  223,
      222,  221,  220,  219,  217,  216,  213,  212,  210,  207,
      206,  205,  203,  202,  201,  200,  199,  198,  197,  196,
      195,  194,  193,  192,  191,  190,  189,  187,  186,  185,
      184,  183,  182,  180,  179,  178,  177,  176,  175,  174,
      171,  170,  169,  167,  165,  164,  163,  162,  161,  160,

      159,  158,  157,  156,  155,  154,  153,  152,  151,  150,
      149,  147,  146,  145,  144,  143,  142,  141,  140,  139,
      138,  137,  136,  135,  134,  133,  132,  131,  130,  129,
      128,  126,  125,  124,  123,  122,  121,  120,  119,  118,
      117,  116,  115,  114,  113,  112,  111,  110,  109,  108,
      107,  105,  104,  103,  102,  101,  100,   99,   98,   97,
       96,   95,   94,   93,   92,   91,   90,   89,   88,   86,
       85,   83,   82,   81,   80,   78,   77,   76,   75,   74,
       73,   70,   68,   66,   65,   64,   63,   62,   61,   60,
       59,   56,   54,   53,   52,   50,   49,   48,   46,   44,

       43,   42,   40,   39,   38,   37,   34,   31,   26,   22,
       17,   16,    9,    7,    3,  469,  469,  469,  469,  469,
      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
      469,  469,  469,  469,  469,  469,  469,  469,  469,  469,
      469
    } ;

static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
char *yytext;
#line 1 "rclex.l"
#define INITIAL 0
#line 2 "rclex.l"
/* Copyright 1997, 1998, 1999 Free Software Foundation, Inc.
   Written by Ian Lance Taylor, Cygnus Support.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program 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 General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   02111-1307, USA.  */

/* This is a lex input file which generates a lexer used by the
   Windows rc file parser.  It basically just recognized a bunch of
   keywords.  */

#include "bfd.h"
#include "bucomm.h"
#include "libiberty.h"
#include "windres.h"
#include "rcparse.h"

#include <ctype.h>
#include <assert.h>

/* Whether we are in rcdata mode, in which we returns the lengths of
   strings.  */

static int rcdata_mode;

/* Whether we are supressing lines from cpp (including windows.h or
   headers from your C sources may bring in externs and typedefs).
   When active, we return IGNORED_TOKEN, which lets us ignore these
   outside of resource constructs.  Thus, it isn't required to protect
   all the non-preprocessor lines in your header files with #ifdef
   RC_INVOKED.  It also means your RC file can't include other RC
   files if they're named "*.h".  Sorry.  Name them *.rch or whatever.  */

static int suppress_cpp_data;

#define MAYBE_RETURN(x) return suppress_cpp_data ? IGNORED_TOKEN : (x)

/* The first filename we detect in the cpp output.  We use this to
   tell included files from the original file.  */

static char *initial_fn;

/* List of allocated strings.  */

struct alloc_string
{
  struct alloc_string *next;
  char *s;
};

static struct alloc_string *strings;

/* Local functions.  */

static void cpp_line PARAMS ((const char *));
static char *handle_quotes PARAMS ((const char *, unsigned long *));
static char *get_string PARAMS ((int));

#line 710 "lex.yy.c"

/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int yywrap YY_PROTO(( void ));
#else
extern int yywrap YY_PROTO(( void ));
#endif
#endif

#ifndef YY_NO_UNPUT
static void yyunput YY_PROTO(( int c, char *buf_ptr ));
#endif

#ifndef yytext_ptr
static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen YY_PROTO(( yyconst char * ));
#endif

#ifndef YY_NO_INPUT
#ifdef __cplusplus
static int yyinput YY_PROTO(( void ));
#else
static int input YY_PROTO(( void ));
#endif
#endif

#if YY_STACK_USED
static int yy_start_stack_ptr = 0;
static int yy_start_stack_depth = 0;
static int *yy_start_stack = 0;
#ifndef YY_NO_PUSH_STATE
static void yy_push_state YY_PROTO(( int new_state ));
#endif
#ifndef YY_NO_POP_STATE
static void yy_pop_state YY_PROTO(( void ));
#endif
#ifndef YY_NO_TOP_STATE
static int yy_top_state YY_PROTO(( void ));
#endif

#else
#define YY_NO_PUSH_STATE 1
#define YY_NO_POP_STATE 1
#define YY_NO_TOP_STATE 1
#endif

#ifdef YY_MALLOC_DECL
YY_MALLOC_DECL
#else
#if __STDC__
#ifndef __cplusplus
#include <stdlib.h>
#endif
#else
/* Just try to get by without declaring the routines.  This will fail
 * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
 * or sizeof(void*) != sizeof(int).
 */
#endif
#endif

/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#endif

/* Copy whatever the last rule matched to the standard output. */

#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
 * we now use fwrite().
 */
#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
#endif

/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 * is returned in "result".
 */
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
	if ( yy_current_buffer->yy_is_interactive ) \
		{ \
		int c = '*', n; \
		for ( n = 0; n < max_size && \
			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
			buf[n] = (char) c; \
		if ( c == '\n' ) \
			buf[n++] = (char) c; \
		if ( c == EOF && ferror( yyin ) ) \
			YY_FATAL_ERROR( "input in flex scanner failed" ); \
		result = n; \
		} \
	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
		  && ferror( yyin ) ) \
		YY_FATAL_ERROR( "input in flex scanner failed" );
#endif

/* No semi-colon after return; correct usage is to write "yyterminate();" -
 * we don't want an extra ';' after the "return" because that will cause
 * some compilers to complain about unreachable statements.
 */
#ifndef yyterminate
#define yyterminate() return YY_NULL
#endif

/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif

/* Report a fatal error. */
#ifndef YY_FATAL_ERROR
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
#endif

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL int yylex YY_PROTO(( void ))
#endif

/* Code executed at the beginning of each rule, after yytext and yyleng
 * have been set up.
 */
#ifndef YY_USER_ACTION
#define YY_USER_ACTION
#endif

/* Code executed at the end of each rule. */
#ifndef YY_BREAK
#define YY_BREAK break;
#endif

#define YY_RULE_SETUP \
	YY_USER_ACTION

YY_DECL
	{
	register yy_state_type yy_current_state;
	register char *yy_cp, *yy_bp;
	register int yy_act;

#line 75 "rclex.l"


#line 864 "lex.yy.c"

	if ( yy_init )
		{
		yy_init = 0;

#ifdef YY_USER_INIT
		YY_USER_INIT;
#endif

		if ( ! yy_start )
			yy_start = 1;	/* first start state */

		if ( ! yyin )
			yyin = stdin;

		if ( ! yyout )
			yyout = stdout;

		if ( ! yy_current_buffer )
			yy_current_buffer =
				yy_create_buffer( yyin, YY_BUF_SIZE );

		yy_load_buffer_state();
		}

	while ( 1 )		/* loops until end-of-file is reached */
		{
		yy_cp = yy_c_buf_p;

		/* Support of yytext. */
		*yy_cp = yy_hold_char;

		/* yy_bp points to the position in yy_ch_buf of the start of
		 * the current run.
		 */
		yy_bp = yy_cp;

		yy_current_state = yy_start;
yy_match:
		do
			{
			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
			if ( yy_accept[yy_current_state] )
				{
				yy_last_accepting_state = yy_current_state;
				yy_last_accepting_cpos = yy_cp;
				}
			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
				{
				yy_current_state = (int) yy_def[yy_current_state];
				if ( yy_current_state >= 470 )
					yy_c = yy_meta[(unsigned int) yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
			++yy_cp;
			}
		while ( yy_base[yy_current_state] != 516 );

yy_find_action:
		yy_act = yy_accept[yy_current_state];
		if ( yy_act == 0 )
			{ /* have to back up */
			yy_cp = yy_last_accepting_cpos;
			yy_current_state = yy_last_accepting_state;
			yy_act = yy_accept[yy_current_state];
			}

		YY_DO_BEFORE_ACTION;


do_action:	/* This label is used only to access EOF actions. */


		switch ( yy_act )
	{ /* beginning of action switch */
			case 0: /* must back up */
			/* undo the effects of YY_DO_BEFORE_ACTION */
			*yy_cp = yy_hold_char;
			yy_cp = yy_last_accepting_cpos;
			yy_current_state = yy_last_accepting_state;
			goto yy_find_action;

case 1:
YY_RULE_SETUP
#line 77 "rclex.l"
{ MAYBE_RETURN (BEG); }
	YY_BREAK
case 2:
YY_RULE_SETUP
#line 78 "rclex.l"
{ MAYBE_RETURN (BEG); }
	YY_BREAK
case 3:
YY_RULE_SETUP
#line 79 "rclex.l"
{ MAYBE_RETURN (END); }
	YY_BREAK
case 4:
YY_RULE_SETUP
#line 80 "rclex.l"
{ MAYBE_RETURN (END); }
	YY_BREAK
case 5:
YY_RULE_SETUP
#line 81 "rclex.l"
{ MAYBE_RETURN (ACCELERATORS); }
	YY_BREAK
case 6:
YY_RULE_SETUP
#line 82 "rclex.l"
{ MAYBE_RETURN (VIRTKEY); }
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 83 "rclex.l"
{ MAYBE_RETURN (ASCII); }
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 84 "rclex.l"
{ MAYBE_RETURN (NOINVERT); }
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 85 "rclex.l"
{ MAYBE_RETURN (SHIFT); }
	YY_BREAK
case 10:
YY_RULE_SETUP
#line 86 "rclex.l"
{ MAYBE_RETURN (CONTROL); }
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 87 "rclex.l"
{ MAYBE_RETURN (ALT); }
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 88 "rclex.l"
{ MAYBE_RETURN (BITMAP); }
	YY_BREAK
case 13:
YY_RULE_SETUP
#line 89 "rclex.l"
{ MAYBE_RETURN (CURSOR); }
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 90 "rclex.l"
{ MAYBE_RETURN (DIALOG); }
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 91 "rclex.l"
{ MAYBE_RETURN (DIALOGEX); }
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 92 "rclex.l"
{ MAYBE_RETURN (EXSTYLE); }
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 93 "rclex.l"
{ MAYBE_RETURN (CAPTION); }
	YY_BREAK
case 18:
YY_RULE_SETUP
#line 94 "rclex.l"
{ MAYBE_RETURN (CLASS); }
	YY_BREAK
case 19:
YY_RULE_SETUP
#line 95 "rclex.l"
{ MAYBE_RETURN (STYLE); }
	YY_BREAK
case 20:
YY_RULE_SETUP
#line 96 "rclex.l"
{ MAYBE_RETURN (AUTO3STATE); }
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 97 "rclex.l"
{ MAYBE_RETURN (AUTOCHECKBOX); }
	YY_BREAK
case 22:
YY_RULE_SETUP
#line 98 "rclex.l"
{ MAYBE_RETURN (AUTORADIOBUTTON); }
	YY_BREAK
case 23:
YY_RULE_SETUP
#line 99 "rclex.l"
{ MAYBE_RETURN (CHECKBOX); }
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 100 "rclex.l"
{ MAYBE_RETURN (COMBOBOX); }
	YY_BREAK
case 25:
YY_RULE_SETUP
#line 101 "rclex.l"
{ MAYBE_RETURN (CTEXT); }
	YY_BREAK
case 26:
YY_RULE_SETUP
#line 102 "rclex.l"
{ MAYBE_RETURN (DEFPUSHBUTTON); }
	YY_BREAK
case 27:
YY_RULE_SETUP
#line 103 "rclex.l"
{ MAYBE_RETURN (EDITTEXT); }
	YY_BREAK
case 28:
YY_RULE_SETUP
#line 104 "rclex.l"
{ MAYBE_RETURN (GROUPBOX); }
	YY_BREAK
case 29:
YY_RULE_SETUP
#line 105 "rclex.l"
{ MAYBE_RETURN (LISTBOX); }
	YY_BREAK
case 30:
YY_RULE_SETUP
#line 106 "rclex.l"
{ MAYBE_RETURN (LTEXT); }
	YY_BREAK
case 31:
YY_RULE_SETUP
#line 107 "rclex.l"
{ MAYBE_RETURN (PUSHBOX); }
	YY_BREAK
case 32:
YY_RULE_SETUP
#line 108 "rclex.l"
{ MAYBE_RETURN (PUSHBUTTON); }
	YY_BREAK
case 33:
YY_RULE_SETUP
#line 109 "rclex.l"
{ MAYBE_RETURN (RADIOBUTTON); }
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 110 "rclex.l"
{ MAYBE_RETURN (RTEXT); }
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 111 "rclex.l"
{ MAYBE_RETURN (SCROLLBAR); }
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 112 "rclex.l"
{ MAYBE_RETURN (STATE3); }
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 113 "rclex.l"
{ MAYBE_RETURN (USERBUTTON); }
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 114 "rclex.l"
{ MAYBE_RETURN (BEDIT); }
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 115 "rclex.l"
{ MAYBE_RETURN (HEDIT); }
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 116 "rclex.l"
{ MAYBE_RETURN (IEDIT); }
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 117 "rclex.l"
{ MAYBE_RETURN (FONT); }
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 118 "rclex.l"
{ MAYBE_RETURN (ICON); }
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 119 "rclex.l"
{ MAYBE_RETURN (LANGUAGE); }
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 120 "rclex.l"
{ MAYBE_RETURN (CHARACTERISTICS); }
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 121 "rclex.l"
{ MAYBE_RETURN (VERSIONK); }
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 122 "rclex.l"
{ MAYBE_RETURN (MENU); }
	YY_BREAK
case 47:
YY_RULE_SETUP
#line 123 "rclex.l"
{ MAYBE_RETURN (MENUEX); }
	YY_BREAK
case 48:
YY_RULE_SETUP
#line 124 "rclex.l"
{ MAYBE_RETURN (MENUITEM); }
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 125 "rclex.l"
{ MAYBE_RETURN (SEPARATOR); }
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 126 "rclex.l"
{ MAYBE_RETURN (POPUP); }
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 127 "rclex.l"
{ MAYBE_RETURN (CHECKED); }
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 128 "rclex.l"
{ MAYBE_RETURN (GRAYED); }
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 129 "rclex.l"
{ MAYBE_RETURN (HELP); }
	YY_BREAK
case 54:
YY_RULE_SETUP
#line 130 "rclex.l"
{ MAYBE_RETURN (INACTIVE); }
	YY_BREAK
case 55:
YY_RULE_SETUP
#line 131 "rclex.l"
{ MAYBE_RETURN (MENUBARBREAK); }
	YY_BREAK
case 56:
YY_RULE_SETUP
#line 132 "rclex.l"
{ MAYBE_RETURN (MENUBREAK); }
	YY_BREAK
case 57:
YY_RULE_SETUP
#line 133 "rclex.l"
{ MAYBE_RETURN (MESSAGETABLE); }
	YY_BREAK
case 58:
YY_RULE_SETUP
#line 134 "rclex.l"
{ MAYBE_RETURN (RCDATA); }
	YY_BREAK
case 59:
YY_RULE_SETUP
#line 135 "rclex.l"
{ MAYBE_RETURN (STRINGTABLE); }
	YY_BREAK
case 60:
YY_RULE_SETUP
#line 136 "rclex.l"
{ MAYBE_RETURN (VERSIONINFO); }
	YY_BREAK
case 61:
YY_RULE_SETUP
#line 137 "rclex.l"
{ MAYBE_RETURN (FILEVERSION); }
	YY_BREAK
case 62:
YY_RULE_SETUP
#line 138 "rclex.l"
{ MAYBE_RETURN (PRODUCTVERSION); }
	YY_BREAK
case 63:
YY_RULE_SETUP
#line 139 "rclex.l"
{ MAYBE_RETURN (FILEFLAGSMASK); }
	YY_BREAK
case 64:
YY_RULE_SETUP
#line 140 "rclex.l"
{ MAYBE_RETURN (FILEFLAGS); }
	YY_BREAK
case 65:
YY_RULE_SETUP
#line 141 "rclex.l"
{ MAYBE_RETURN (FILEOS); }
	YY_BREAK
case 66:
YY_RULE_SETUP
#line 142 "rclex.l"
{ MAYBE_RETURN (FILETYPE); }
	YY_BREAK
case 67:
YY_RULE_SETUP
#line 143 "rclex.l"
{ MAYBE_RETURN (FILESUBTYPE); }
	YY_BREAK
case 68:
YY_RULE_SETUP
#line 144 "rclex.l"
{ MAYBE_RETURN (VALUE); }
	YY_BREAK
case 69:
YY_RULE_SETUP
#line 145 "rclex.l"
{ MAYBE_RETURN (MOVEABLE); }
	YY_BREAK
case 70:
YY_RULE_SETUP
#line 146 "rclex.l"
{ MAYBE_RETURN (FIXED); }
	YY_BREAK
case 71:
YY_RULE_SETUP
#line 147 "rclex.l"
{ MAYBE_RETURN (PURE); }
	YY_BREAK
case 72:
YY_RULE_SETUP
#line 148 "rclex.l"
{ MAYBE_RETURN (IMPURE); }
	YY_BREAK
case 73:
YY_RULE_SETUP
#line 149 "rclex.l"
{ MAYBE_RETURN (PRELOAD); }
	YY_BREAK
case 74:
YY_RULE_SETUP
#line 150 "rclex.l"
{ MAYBE_RETURN (LOADONCALL); }
	YY_BREAK
case 75:
YY_RULE_SETUP
#line 151 "rclex.l"
{ MAYBE_RETURN (DISCARDABLE); }
	YY_BREAK
case 76:
YY_RULE_SETUP
#line 152 "rclex.l"
{ MAYBE_RETURN (NOT); }
	YY_BREAK
case 77:
YY_RULE_SETUP
#line 154 "rclex.l"
{
			  char *s, *send;

			  /* This is a hack to let us parse version
                             information easily.  */

			  s = strchr (yytext, '"');
			  ++s;
			  send = strchr (s, '"');
			  if (strncmp (s, "StringFileInfo",
				       sizeof "StringFileInfo" - 1) == 0
			      && s + sizeof "StringFileInfo" - 1 == send)
			    MAYBE_RETURN (BLOCKSTRINGFILEINFO);
			  else if (strncmp (s, "VarFileInfo",
					    sizeof "VarFileInfo" - 1) == 0
				   && s + sizeof "VarFileInfo" - 1 == send)
			    MAYBE_RETURN (BLOCKVARFILEINFO);
			  else
			    {
			      char *r;

			      r = get_string (send - s + 1);
			      strncpy (r, s, send - s);
			      r[send - s] = '\0';
			      yylval.s = r;
			      MAYBE_RETURN (BLOCK);
			    }
			}
	YY_BREAK
case 78:
YY_RULE_SETUP
#line 183 "rclex.l"
{
			  cpp_line (yytext);
			}
	YY_BREAK
case 79:
YY_RULE_SETUP
#line 187 "rclex.l"
{
			  yylval.i.val = strtoul (yytext, 0, 0);
			  yylval.i.dword = 1;
			  MAYBE_RETURN (NUMBER);
			}
	YY_BREAK
case 80:
YY_RULE_SETUP
#line 193 "rclex.l"
{
			  yylval.i.val = strtoul (yytext, 0, 0);
			  yylval.i.dword = 0;
			  MAYBE_RETURN (NUMBER);
			}
	YY_BREAK
case 81:
YY_RULE_SETUP
#line 199 "rclex.l"
{
			  char *s;
			  unsigned long length;

			  s = handle_quotes (yytext, &length);
			  if (! rcdata_mode)
			    {
			      yylval.s = s;
			      MAYBE_RETURN (QUOTEDSTRING);
			    }
			  else
			    {
			      yylval.ss.length = length;
			      yylval.ss.s = s;
			      MAYBE_RETURN (SIZEDSTRING);
			    }
			}
	YY_BREAK
case 82:
YY_RULE_SETUP
#line 217 "rclex.l"
{
			  char *s;

			  /* I rejected comma in a string in order to
			     handle VIRTKEY, CONTROL in an accelerator
			     resource.  This means that an unquoted
			     file name can not contain a comma.  I
			     don't know what rc permits.  */

			  s = get_string (strlen (yytext) + 1);
			  strcpy (s, yytext);
			  yylval.s = s;
			  MAYBE_RETURN (STRING);
			}
	YY_BREAK
case 83:
YY_RULE_SETUP
#line 232 "rclex.l"
{ ++rc_lineno; }
	YY_BREAK
case 84:
YY_RULE_SETUP
#line 233 "rclex.l"
{ /* ignore whitespace */ }
	YY_BREAK
case 85:
YY_RULE_SETUP
#line 234 "rclex.l"
{ MAYBE_RETURN (*yytext); }
	YY_BREAK
case 86:
YY_RULE_SETUP
#line 236 "rclex.l"
ECHO;
	YY_BREAK
#line 1443 "lex.yy.c"
case YY_STATE_EOF(INITIAL):
	yyterminate();

	case YY_END_OF_BUFFER:
		{
		/* Amount of text matched not including the EOB char. */
		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;

		/* Undo the effects of YY_DO_BEFORE_ACTION. */
		*yy_cp = yy_hold_char;
		YY_RESTORE_YY_MORE_OFFSET

		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
			{
			/* We're scanning a new file or input source.  It's
			 * possible that this happened because the user
			 * just pointed yyin at a new source and called
			 * yylex().  If so, then we have to assure
			 * consistency between yy_current_buffer and our
			 * globals.  Here is the right place to do so, because
			 * this is the first action (other than possibly a
			 * back-up) that will match for the new input source.
			 */
			yy_n_chars = yy_current_buffer->yy_n_chars;
			yy_current_buffer->yy_input_file = yyin;
			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
			}

		/* Note that here we test for yy_c_buf_p "<=" to the position
		 * of the first EOB in the buffer, since yy_c_buf_p will
		 * already have been incremented past the NUL character
		 * (since all states make transitions on EOB to the
		 * end-of-buffer state).  Contrast this with the test
		 * in input().
		 */
		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
			{ /* This was really a NUL. */
			yy_state_type yy_next_state;

			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;

			yy_current_state = yy_get_previous_state();

			/* Okay, we're now positioned to make the NUL
			 * transition.  We couldn't have
			 * yy_get_previous_state() go ahead and do it
			 * for us because it doesn't know how to deal
			 * with the possibility of jamming (and we don't
			 * want to build jamming into it because then it
			 * will run more slowly).
			 */

			yy_next_state = yy_try_NUL_trans( yy_current_state );

			yy_bp = yytext_ptr + YY_MORE_ADJ;

			if ( yy_next_state )
				{
				/* Consume the NUL. */
				yy_cp = ++yy_c_buf_p;
				yy_current_state = yy_next_state;
				goto yy_match;
				}

			else
				{
				yy_cp = yy_c_buf_p;
				goto yy_find_action;
				}
			}

		else switch ( yy_get_next_buffer() )
			{
			case EOB_ACT_END_OF_FILE:
				{
				yy_did_buffer_switch_on_eof = 0;

				if ( yywrap() )
					{
					/* Note: because we've taken care in
					 * yy_get_next_buffer() to have set up
					 * yytext, we can now set up
					 * yy_c_buf_p so that if some total
					 * hoser (like flex itself) wants to
					 * call the scanner after we return the
					 * YY_NULL, it'll still work - another
					 * YY_NULL will get returned.
					 */
					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;

					yy_act = YY_STATE_EOF(YY_START);
					goto do_action;
					}

				else
					{
					if ( ! yy_did_buffer_switch_on_eof )
						YY_NEW_FILE;
					}
				break;
				}

			case EOB_ACT_CONTINUE_SCAN:
				yy_c_buf_p =
					yytext_ptr + yy_amount_of_matched_text;

				yy_current_state = yy_get_previous_state();

				yy_cp = yy_c_buf_p;
				yy_bp = yytext_ptr + YY_MORE_ADJ;
				goto yy_match;

			case EOB_ACT_LAST_MATCH:
				yy_c_buf_p =
				&yy_current_buffer->yy_ch_buf[yy_n_chars];

				yy_current_state = yy_get_previous_state();

				yy_cp = yy_c_buf_p;
				yy_bp = yytext_ptr + YY_MORE_ADJ;
				goto yy_find_action;
			}
		break;
		}

	default:
		YY_FATAL_ERROR(
			"fatal flex scanner internal error--no action found" );
	} /* end of action switch */
		} /* end of scanning one token */
	} /* end of yylex */


/* yy_get_next_buffer - try to read in a new buffer
 *
 * Returns a code representing an action:
 *	EOB_ACT_LAST_MATCH -
 *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
 *	EOB_ACT_END_OF_FILE - end of file
 */

static int yy_get_next_buffer()
	{
	register char *dest = yy_current_buffer->yy_ch_buf;
	register char *source = yytext_ptr;
	register int number_to_move, i;
	int ret_val;

	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
		YY_FATAL_ERROR(
		"fatal flex scanner internal error--end of buffer missed" );

	if ( yy_current_buffer->yy_fill_buffer == 0 )
		{ /* Don't try to fill the buffer, so this is an EOF. */
		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
			{
			/* We matched a single character, the EOB, so
			 * treat this as a final EOF.
			 */
			return EOB_ACT_END_OF_FILE;
			}

		else
			{
			/* We matched some text prior to the EOB, first
			 * process it.
			 */
			return EOB_ACT_LAST_MATCH;
			}
		}

	/* Try to read more data. */

	/* First move last chars to start of buffer. */
	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;

	for ( i = 0; i < number_to_move; ++i )
		*(dest++) = *(source++);

	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
		/* don't do the read, it's not guaranteed to return an EOF,
		 * just force an EOF
		 */
		yy_current_buffer->yy_n_chars = yy_n_chars = 0;

	else
		{
		int num_to_read =
			yy_current_buffer->yy_buf_size - number_to_move - 1;

		while ( num_to_read <= 0 )
			{ /* Not enough room in the buffer - grow it. */
#ifdef YY_USES_REJECT
			YY_FATAL_ERROR(
"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
#else

			/* just a shorter name for the current buffer */
			YY_BUFFER_STATE b = yy_current_buffer;

			int yy_c_buf_p_offset =
				(int) (yy_c_buf_p - b->yy_ch_buf);

			if ( b->yy_is_our_buffer )
				{
				int new_size = b->yy_buf_size * 2;

				if ( new_size <= 0 )
					b->yy_buf_size += b->yy_buf_size / 8;
				else
					b->yy_buf_size *= 2;

				b->yy_ch_buf = (char *)
					/* Include room in for 2 EOB chars. */
					yy_flex_realloc( (void *) b->yy_ch_buf,
							 b->yy_buf_size + 2 );
				}
			else
				/* Can't grow it, we don't own it. */
				b->yy_ch_buf = 0;

			if ( ! b->yy_ch_buf )
				YY_FATAL_ERROR(
				"fatal error - scanner input buffer overflow" );

			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];

			num_to_read = yy_current_buffer->yy_buf_size -
						number_to_move - 1;
#endif
			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

		/* Read in more data. */
		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
			yy_n_chars, num_to_read );

		yy_current_buffer->yy_n_chars = yy_n_chars;
		}

	if ( yy_n_chars == 0 )
		{
		if ( number_to_move == YY_MORE_ADJ )
			{
			ret_val = EOB_ACT_END_OF_FILE;
			yyrestart( yyin );
			}

		else
			{
			ret_val = EOB_ACT_LAST_MATCH;
			yy_current_buffer->yy_buffer_status =
				YY_BUFFER_EOF_PENDING;
			}
		}

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

	yy_n_chars += number_to_move;
	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;

	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];

	return ret_val;
	}


/* yy_get_previous_state - get the state just before the EOB char was reached */

static yy_state_type yy_get_previous_state()
	{
	register yy_state_type yy_current_state;
	register char *yy_cp;

	yy_current_state = yy_start;

	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
		{
		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
		if ( yy_accept[yy_current_state] )
			{
			yy_last_accepting_state = yy_current_state;
			yy_last_accepting_cpos = yy_cp;
			}
		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
			{
			yy_current_state = (int) yy_def[yy_current_state];
			if ( yy_current_state >= 470 )
				yy_c = yy_meta[(unsigned int) yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
		}

	return yy_current_state;
	}


/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *	next_state = yy_try_NUL_trans( current_state );
 */

#ifdef YY_USE_PROTOS
static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
#else
static yy_state_type yy_try_NUL_trans( yy_current_state )
yy_state_type yy_current_state;
#endif
	{
	register int yy_is_jam;
	register char *yy_cp = yy_c_buf_p;

	register YY_CHAR yy_c = 1;
	if ( yy_accept[yy_current_state] )
		{
		yy_last_accepting_state = yy_current_state;
		yy_last_accepting_cpos = yy_cp;
		}
	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
		{
		yy_current_state = (int) yy_def[yy_current_state];
		if ( yy_current_state >= 470 )
			yy_c = yy_meta[(unsigned int) yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
	yy_is_jam = (yy_current_state == 469);

	return yy_is_jam ? 0 : yy_current_state;
	}


#ifndef YY_NO_UNPUT
#ifdef YY_USE_PROTOS
static void yyunput( int c, register char *yy_bp )
#else
static void yyunput( c, yy_bp )
int c;
register char *yy_bp;
#endif
	{
	register char *yy_cp = yy_c_buf_p;

	/* undo effects of setting up yytext */
	*yy_cp = yy_hold_char;

	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
		{ /* need to shift things up to make room */
		/* +2 for EOB chars. */
		register int number_to_move = yy_n_chars + 2;
		register char *dest = &yy_current_buffer->yy_ch_buf[
					yy_current_buffer->yy_buf_size + 2];
		register char *source =
				&yy_current_buffer->yy_ch_buf[number_to_move];

		while ( source > yy_current_buffer->yy_ch_buf )
			*--dest = *--source;

		yy_cp += (int) (dest - source);
		yy_bp += (int) (dest - source);
		yy_current_buffer->yy_n_chars =
			yy_n_chars = yy_current_buffer->yy_buf_size;

		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
			YY_FATAL_ERROR( "flex scanner push-back overflow" );
		}

	*--yy_cp = (char) c;


	yytext_ptr = yy_bp;
	yy_hold_char = *yy_cp;
	yy_c_buf_p = yy_cp;
	}
#endif	/* ifndef YY_NO_UNPUT */


#ifdef __cplusplus
static int yyinput()
#else
static int input()
#endif
	{
	int c;

	*yy_c_buf_p = yy_hold_char;

	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
		{
		/* yy_c_buf_p now points to the character we want to return.
		 * If this occurs *before* the EOB characters, then it's a
		 * valid NUL; if not, then we've hit the end of the buffer.
		 */
		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
			/* This was really a NUL. */
			*yy_c_buf_p = '\0';

		else
			{ /* need more input */
			int offset = yy_c_buf_p - yytext_ptr;
			++yy_c_buf_p;

			switch ( yy_get_next_buffer() )
				{
				case EOB_ACT_LAST_MATCH:
					/* This happens because yy_g_n_b()
					 * sees that we've accumulated a
					 * token and flags that we need to
					 * try matching the token before
					 * proceeding.  But for input(),
					 * there's no matching to consider.
					 * So convert the EOB_ACT_LAST_MATCH
					 * to EOB_ACT_END_OF_FILE.
					 */

					/* Reset buffer status. */
					yyrestart( yyin );

					/* fall through */

				case EOB_ACT_END_OF_FILE:
					{
					if ( yywrap() )
						return EOF;

					if ( ! yy_did_buffer_switch_on_eof )
						YY_NEW_FILE;
#ifdef __cplusplus
					return yyinput();
#else
					return input();
#endif
					}

				case EOB_ACT_CONTINUE_SCAN:
					yy_c_buf_p = yytext_ptr + offset;
					break;
				}
			}
		}

	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
	*yy_c_buf_p = '\0';	/* preserve yytext */
	yy_hold_char = *++yy_c_buf_p;


	return c;
	}


#ifdef YY_USE_PROTOS
void yyrestart( FILE *input_file )
#else
void yyrestart( input_file )
FILE *input_file;
#endif
	{
	if ( ! yy_current_buffer )
		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );

	yy_init_buffer( yy_current_buffer, input_file );
	yy_load_buffer_state();
	}


#ifdef YY_USE_PROTOS
void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
#else
void yy_switch_to_buffer( new_buffer )
YY_BUFFER_STATE new_buffer;
#endif
	{
	if ( yy_current_buffer == new_buffer )
		return;

	if ( yy_current_buffer )
		{
		/* Flush out information for old buffer. */
		*yy_c_buf_p = yy_hold_char;
		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
		yy_current_buffer->yy_n_chars = yy_n_chars;
		}

	yy_current_buffer = new_buffer;
	yy_load_buffer_state();

	/* We don't actually know whether we did this switch during
	 * EOF (yywrap()) processing, but the only time this flag
	 * is looked at is after yywrap() is called, so it's safe
	 * to go ahead and always set it.
	 */
	yy_did_buffer_switch_on_eof = 1;
	}


#ifdef YY_USE_PROTOS
void yy_load_buffer_state( void )
#else
void yy_load_buffer_state()
#endif
	{
	yy_n_chars = yy_current_buffer->yy_n_chars;
	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
	yyin = yy_current_buffer->yy_input_file;
	yy_hold_char = *yy_c_buf_p;
	}


#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
#else
YY_BUFFER_STATE yy_create_buffer( file, size )
FILE *file;
int size;
#endif
	{
	YY_BUFFER_STATE b;

	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

	b->yy_buf_size = size;

	/* yy_ch_buf has to be 2 characters longer than the size given because
	 * we need to put in 2 end-of-buffer characters.
	 */
	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
	if ( ! b->yy_ch_buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );

	b->yy_is_our_buffer = 1;

	yy_init_buffer( b, file );

	return b;
	}


#ifdef YY_USE_PROTOS
void yy_delete_buffer( YY_BUFFER_STATE b )
#else
void yy_delete_buffer( b )
YY_BUFFER_STATE b;
#endif
	{
	if ( ! b )
		return;

	if ( b == yy_current_buffer )
		yy_current_buffer = (YY_BUFFER_STATE) 0;

	if ( b->yy_is_our_buffer )
		yy_flex_free( (void *) b->yy_ch_buf );

	yy_flex_free( (void *) b );
	}


#ifndef YY_ALWAYS_INTERACTIVE
#ifndef YY_NEVER_INTERACTIVE
extern int isatty YY_PROTO(( int ));
#endif
#endif

#ifdef YY_USE_PROTOS
void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
#else
void yy_init_buffer( b, file )
YY_BUFFER_STATE b;
FILE *file;
#endif


	{
	yy_flush_buffer( b );

	b->yy_input_file = file;
	b->yy_fill_buffer = 1;

#if YY_ALWAYS_INTERACTIVE
	b->yy_is_interactive = 1;
#else
#if YY_NEVER_INTERACTIVE
	b->yy_is_interactive = 0;
#else
	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
#endif
#endif
	}


#ifdef YY_USE_PROTOS
void yy_flush_buffer( YY_BUFFER_STATE b )
#else
void yy_flush_buffer( b )
YY_BUFFER_STATE b;
#endif

	{
	if ( ! b )
		return;

	b->yy_n_chars = 0;

	/* We always need two end-of-buffer characters.  The first causes
	 * a transition to the end-of-buffer state.  The second causes
	 * a jam in that state.
	 */
	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;

	b->yy_buf_pos = &b->yy_ch_buf[0];

	b->yy_at_bol = 1;
	b->yy_buffer_status = YY_BUFFER_NEW;

	if ( b == yy_current_buffer )
		yy_load_buffer_state();
	}


#ifndef YY_NO_SCAN_BUFFER
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
#else
YY_BUFFER_STATE yy_scan_buffer( base, size )
char *base;
yy_size_t size;
#endif
	{
	YY_BUFFER_STATE b;

	if ( size < 2 ||
	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
	     base[size-1] != YY_END_OF_BUFFER_CHAR )
		/* They forgot to leave room for the EOB's. */
		return 0;

	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
	if ( ! b )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );

	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
	b->yy_buf_pos = b->yy_ch_buf = base;
	b->yy_is_our_buffer = 0;
	b->yy_input_file = 0;
	b->yy_n_chars = b->yy_buf_size;
	b->yy_is_interactive = 0;
	b->yy_at_bol = 1;
	b->yy_fill_buffer = 0;
	b->yy_buffer_status = YY_BUFFER_NEW;

	yy_switch_to_buffer( b );

	return b;
	}
#endif


#ifndef YY_NO_SCAN_STRING
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
#else
YY_BUFFER_STATE yy_scan_string( yy_str )
yyconst char *yy_str;
#endif
	{
	int len;
	for ( len = 0; yy_str[len]; ++len )
		;

	return yy_scan_bytes( yy_str, len );
	}
#endif


#ifndef YY_NO_SCAN_BYTES
#ifdef YY_USE_PROTOS
YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
#else
YY_BUFFER_STATE yy_scan_bytes( bytes, len )
yyconst char *bytes;
int len;
#endif
	{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	int i;

	/* Get memory for full buffer, including space for trailing EOB's. */
	n = len + 2;
	buf = (char *) yy_flex_alloc( n );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );

	for ( i = 0; i < len; ++i )
		buf[i] = bytes[i];

	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;

	b = yy_scan_buffer( buf, n );
	if ( ! b )
		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );

	/* It's okay to grow etc. this buffer, and we should throw it
	 * away when we're done.
	 */
	b->yy_is_our_buffer = 1;

	return b;
	}
#endif


#ifndef YY_NO_PUSH_STATE
#ifdef YY_USE_PROTOS
static void yy_push_state( int new_state )
#else
static void yy_push_state( new_state )
int new_state;
#endif
	{
	if ( yy_start_stack_ptr >= yy_start_stack_depth )
		{
		yy_size_t new_size;

		yy_start_stack_depth += YY_START_STACK_INCR;
		new_size = yy_start_stack_depth * sizeof( int );

		if ( ! yy_start_stack )
			yy_start_stack = (int *) yy_flex_alloc( new_size );

		else
			yy_start_stack = (int *) yy_flex_realloc(
					(void *) yy_start_stack, new_size );

		if ( ! yy_start_stack )
			YY_FATAL_ERROR(
			"out of memory expanding start-condition stack" );
		}

	yy_start_stack[yy_start_stack_ptr++] = YY_START;

	BEGIN(new_state);
	}
#endif


#ifndef YY_NO_POP_STATE
static void yy_pop_state()
	{
	if ( --yy_start_stack_ptr < 0 )
		YY_FATAL_ERROR( "start-condition stack underflow" );

	BEGIN(yy_start_stack[yy_start_stack_ptr]);
	}
#endif


#ifndef YY_NO_TOP_STATE
static int yy_top_state()
	{
	return yy_start_stack[yy_start_stack_ptr - 1];
	}
#endif

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

#ifdef YY_USE_PROTOS
static void yy_fatal_error( yyconst char msg[] )
#else
static void yy_fatal_error( msg )
char msg[];
#endif
	{
	(void) fprintf( stderr, "%s\n", msg );
	exit( YY_EXIT_FAILURE );
	}



/* Redefine yyless() so it works in section 3 code. */

#undef yyless
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
		yytext[yyleng] = yy_hold_char; \
		yy_c_buf_p = yytext + n; \
		yy_hold_char = *yy_c_buf_p; \
		*yy_c_buf_p = '\0'; \
		yyleng = n; \
		} \
	while ( 0 )


/* Internal utility routines. */

#ifndef yytext_ptr
#ifdef YY_USE_PROTOS
static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
#else
static void yy_flex_strncpy( s1, s2, n )
char *s1;
yyconst char *s2;
int n;
#endif
	{
	register int i;
	for ( i = 0; i < n; ++i )
		s1[i] = s2[i];
	}
#endif

#ifdef YY_NEED_STRLEN
#ifdef YY_USE_PROTOS
static int yy_flex_strlen( yyconst char *s )
#else
static int yy_flex_strlen( s )
yyconst char *s;
#endif
	{
	register int n;
	for ( n = 0; s[n]; ++n )
		;

	return n;
	}
#endif


#ifdef YY_USE_PROTOS
static void *yy_flex_alloc( yy_size_t size )
#else
static void *yy_flex_alloc( size )
yy_size_t size;
#endif
	{
	return (void *) malloc( size );
	}

#ifdef YY_USE_PROTOS
static void *yy_flex_realloc( void *ptr, yy_size_t size )
#else
static void *yy_flex_realloc( ptr, size )
void *ptr;
yy_size_t size;
#endif
	{
	/* The cast to (char *) in the following accommodates both
	 * implementations that use char* generic pointers, and those
	 * that use void* generic pointers.  It works with the latter
	 * because both ANSI C and C++ allow castless assignment from
	 * any pointer type to void*, and deal with argument conversions
	 * as though doing an assignment.
	 */
	return (void *) realloc( (char *) ptr, size );
	}

#ifdef YY_USE_PROTOS
static void yy_flex_free( void *ptr )
#else
static void yy_flex_free( ptr )
void *ptr;
#endif
	{
	free( ptr );
	}

#if YY_MAIN
int main()
	{
	yylex();
	return 0;
	}
#endif
#line 236 "rclex.l"

#ifndef yywrap
/* This is needed for some versions of lex.  */
int yywrap ()
{
  return 1;
}
#endif

/* Handle a C preprocessor line.  */

static void
cpp_line (s)
     const char *s;
{
  int line;
  char *send, *fn;

  ++s;
  while (isspace ((unsigned char) *s))
    ++s;
  
  line = strtol (s, &send, 0);
  if (*send != '\0' && ! isspace ((unsigned char) *send))
    return;

  /* Subtract 1 because we are about to count the newline.  */
  rc_lineno = line - 1;

  s = send;
  while (isspace ((unsigned char) *s))
    ++s;

  if (*s != '"')
    return;

  ++s;
  send = strchr (s, '"');
  if (send == NULL)
    return;

  fn = (char *) xmalloc (send - s + 1);
  strncpy (fn, s, send - s);
  fn[send - s] = '\0';

  free (rc_filename);
  rc_filename = fn;

  if (!initial_fn)
    {
      initial_fn = xmalloc (strlen (fn) + 1);
      strcpy(initial_fn, fn);
    }

  /* Allow the initial file, regardless of name.  Suppress all other
     files if they end in ".h" (this allows included "*.rc") */
  if (strcmp (initial_fn, fn) == 0
      || strcmp (fn + strlen (fn) - 2, ".h") != 0)
    suppress_cpp_data = 0;
  else
    suppress_cpp_data = 1;
}

/* Handle a quoted string.  The quotes are stripped.  A pair of quotes
   in a string are turned into a single quote.  Adjacent strings are
   merged separated by whitespace are merged, as in C.  */

static char *
handle_quotes (input, len)
     const char *input;
     unsigned long *len;
{
  char *ret, *s;
  const char *t;
  int ch;

  ret = get_string (strlen (input) + 1);

  s = ret;
  t = input;
  if (*t == '"')
    ++t;
  while (*t != '\0')
    {
      if (*t == '\\')
	{
	  ++t;
	  switch (*t)
	    {
	    case '\0':
	      rcparse_warning ("backslash at end of string");
	      break;

	    case '\"':
	      rcparse_warning ("use \"\" to put \" in a string");
	      break;

	    case 'a':
	      *s++ = ESCAPE_A;
	      ++t;
	      break;

	    case 'b':
	      *s++ = ESCAPE_B;
	      ++t;
	      break;

	    case 'f':
	      *s++ = ESCAPE_F;
	      ++t;
	      break;

	    case 'n':
	      *s++ = ESCAPE_N;
	      ++t;
	      break;

	    case 'r':
	      *s++ = ESCAPE_R;
	      ++t;
	      break;

	    case 't':
	      *s++ = ESCAPE_T;
	      ++t;
	      break;

	    case 'v':
	      *s++ = ESCAPE_V;
	      ++t;
	      break;

	    case '\\':
	      *s++ = *t++;
	      break;

	    case '0': case '1': case '2': case '3':
	    case '4': case '5': case '6': case '7':
	      ch = *t - '0';
	      ++t;
	      if (*t >= '0' && *t <= '7')
		{
		  ch = (ch << 3) | (*t - '0');
		  ++t;
		  if (*t >= '0' && *t <= '7')
		    {
		      ch = (ch << 3) | (*t - '0');
		      ++t;
		    }
		}
	      *s++ = ch;
	      break;

	    case 'x':
	      ++t;
	      ch = 0;
	      while (1)
		{
		  if (*t >= '0' && *t <= '9')
		    ch = (ch << 4) | (*t - '0');
		  else if (*t >= 'a' && *t <= 'f')
		    ch = (ch << 4) | (*t - 'a');
		  else if (*t >= 'A' && *t <= 'F')
		    ch = (ch << 4) | (*t - 'A');
		  else
		    break;
		  ++t;
		}
	      *s++ = ch;
	      break;

	    default:
	      rcparse_warning ("unrecognized escape sequence");
	      *s++ = '\\';
	      *s++ = *t++;
	      break;
	    }
	}
      else if (*t != '"')
	*s++ = *t++;
      else if (t[1] == '\0')
	break;
      else if (t[1] == '"')
	{
	  *s++ = '"';
	  t += 2;
	}
      else
	{
	  ++t;
	  assert (isspace ((unsigned char) *t));
	  while (isspace ((unsigned char) *t))
	    ++t;
	  if (*t == '\0')
	    break;
	  assert (*t == '"');
	  ++t;
	}
    }

  *s = '\0';

  *len = s - ret;

  return ret;
}

/* Allocate a string of a given length.  */

static char *
get_string (len)
     int len;
{
  struct alloc_string *as;

  as = (struct alloc_string *) xmalloc (sizeof *as);
  as->s = xmalloc (len);

  as->next = strings;
  strings = as->next;

  return as->s;
}

/* Discard all the strings we have allocated.  The parser calls this
   when it no longer needs them.  */

void
rcparse_discard_strings ()
{
  struct alloc_string *as;

  as = strings;
  while (as != NULL)
    {
      struct alloc_string *n;

      free (as->s);
      n = as->next;
      free (as);
      as = n;
    }

  strings = NULL;
}

/* Enter rcdata mode.  */

void
rcparse_rcdata ()
{
  rcdata_mode = 1;
}

/* Go back to normal mode from rcdata mode.  */

void
rcparse_normal ()
{
  rcdata_mode = 0;
}
