/* 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,  517,  518,   34,  518,  511,    0,  494,   25,
       26,   45,   25,   28,   24,  488,  499,   49,    0,   40,
       43,  488,   51,   66,   67,  484,   35,  518,  518,   81,
      505,   84,    0,  488,  518,    0,  496,  479,  494,  477,
       75,  476,  479,  477,   46,  491,   70,  486,  473,  483,
       55,  479,  483,  468,   69,  471,   86,   84,  469,  479,
      466,  480,  466,  461,  477,  472,   75,  455,   81,  459,
       87,   77,  470,  469,  467,  454,  454,  460,   96,  463,
      455,  449,  448,  110,  468,  458,    0,  453,  446,  451,
      450,  445,  454,  437,  438,  451,  435,  450,  432,  428,

      431,  432,  435,  443,  426,    0,  425,  438,  437,  422,
      417,  419,  429,  421,  422,  426,  414,  430,  425,  412,
      426,  407,  408,  409,  421,  411,    0,  404,  411,  418,
      416,  412,  410,  417,  395,  401,  414,  408,  394,  403,
      399,  393,  389,  390,  388,  394,  396,  105,  385,  389,
      401,  390,  391,  398,  387,  379,  381,  378,  375,  378,
      372,  376,  389,  370,  365,  105,  383,    0,  381,  369,
      365,    0,    0,  364,  365,  362,  360,  377,  363,  358,
      105,  375,  374,  353,  357,  357,  351,    0,  368,  354,
      349,  348,  354,  348,  345,  358,  348,  356,  358,  354,

      349,  346,  351,    0,  337,  346,  352,    0,    0,  336,
      122,  336,  347,  107,    0,  347,  333,    0,  330,  328,
      338,  327,  338,  330,  329,  322,  319,  315,  332,    0,
      332,  333,    0,    0,  329,  324,  331,  316,  316,    0,
      116,  307,  309,  320,  324,  320,    0,  323,  320,  110,
      320,  320,    0,  308,  318,    0,  318,  310,    0,  296,
        0,  300,  309,  296,  293,  306,  306,    0,  135,  139,
      295,  289,  292,  302,  290,  292,    0,  295,  297,  297,
      278,  294,  297,    0,  295,  280,  278,    0,  279,    0,
      272,  285,  269,  287,  272,  283,    0,  282,  281,  273,

      267,  279,  263,  259,  261,  259,    0,  276,  258,    0,
      257,  256,  260,  250,  271,  270,  267,  260,  272,  145,
      271,  151,    0,  261,  243,    0,  242,    0,  261,  240,
      260,  241,    0,  252,  239,  252,  238,  233,  249,  248,
        0,  251,  249,  249,  236,  229,  242,  227,    0,  224,
        0,  225,  224,  241,  226,  239,  220,  229,    0,  218,
      217,  224,  219,  237,  215,    0,    0,  211,    0,  228,
        0,  211,  205,    0,  218,    0,    0,    0,  214,  208,
      213,    0,  222,    0,    0,  217,  206,  201,  202,  201,
      215,  201,  201,  199,  208,  210,  209,  201,  190,  196,

      194,  190,  190,  192,  198,    0,  200,  184,  186,  184,
        0,    0,  186,  183,  190,  178,    0,  179,  173,  174,
      172,  185,  188,  183,  173,    0,  185,  173,  166,    0,
      169,  177,    0,  166,  162,  157,  159,  158,  161,    0,
      157,    0,    0,  162,  167,  158,    0,    0,    0,    0,
        0,  143,  152,  143,  141,    0,    0,  130,  124,  124,
        0,    0,  107,   85,   80,    0,    0,    0,  518,  158,
      163,   65,  168,  173,  178
    } ;

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[554] =
    {   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,   84,   90,   85,  108,
       91,   98,   99,   75,   79,  111,  113,  123,  126,  109,

      129,  124,  131,  132,  114,  139,  468,  467,  127,  112,
      130,   84,   84,  205,   85,  241,  206,  273,  242,  225,
      274,  140,  243,  269,  269,  295,  270,  141,  226,  466,
      207,  227,  228,  304,  229,  465,  269,  269,  305,  319,
      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[554] =
    {   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,   32,   41,   32,   55,
       41,   47,   47,   24,   25,   57,   58,   67,   69,   55,

       71,   67,   72,   72,   58,   79,  465,  464,   69,   57,
       71,   84,   84,  148,   84,  181,  148,  214,  181,  166,
      214,   79,  181,  211,  211,  241,  211,   79,  166,  463,
      148,  166,  166,  250,  166,  460,  269,  269,  250,  269,
      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, 2001, 2002 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 "safe-ctype.h"
#include "windres.h"
#include "rcparse.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] != 518 );

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 (*s))
    ++s;
  
  line = strtol (s, &send, 0);
  if (*send != '\0' && ! ISSPACE (*send))
    return;

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

  s = send;
  while (ISSPACE (*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_B; /* Strange, but true...  */
	      ++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' + 10);
		  else if (*t >= 'A' && *t <= 'F')
		    ch = (ch << 4) | (*t - 'A' + 10);
		  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 (*t));
	  while (ISSPACE (*t))
	    {
	      if ((*t) == '\n')
		++rc_lineno;
	      ++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;

  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;
}
