#line 1 "ppl.yy.c"
#include "config.h"
#include "wine/port.h"

#line 5 "ppl.yy.c"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define yy_create_buffer ppy__create_buffer
#define yy_delete_buffer ppy__delete_buffer
#define yy_scan_buffer ppy__scan_buffer
#define yy_scan_string ppy__scan_string
#define yy_scan_bytes ppy__scan_bytes
#define yy_init_buffer ppy__init_buffer
#define yy_flush_buffer ppy__flush_buffer
#define yy_load_buffer_state ppy__load_buffer_state
#define yy_switch_to_buffer ppy__switch_to_buffer
#define yypush_buffer_state ppy_push_buffer_state
#define yypop_buffer_state ppy_pop_buffer_state
#define yyensure_buffer_stack ppy_ensure_buffer_stack
#define yy_flex_debug ppy__flex_debug
#define yyin ppy_in
#define yyleng ppy_leng
#define yylex ppy_lex
#define yylineno ppy_lineno
#define yyout ppy_out
#define yyrestart ppy_restart
#define yytext ppy_text
#define yywrap ppy_wrap
#define yyalloc ppy_alloc
#define yyrealloc ppy_realloc
#define yyfree ppy_free

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 6
#define YY_FLEX_SUBMINOR_VERSION 4
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

#ifdef yy_create_buffer
#define ppy__create_buffer_ALREADY_DEFINED
#else
#define yy_create_buffer ppy__create_buffer
#endif

#ifdef yy_delete_buffer
#define ppy__delete_buffer_ALREADY_DEFINED
#else
#define yy_delete_buffer ppy__delete_buffer
#endif

#ifdef yy_scan_buffer
#define ppy__scan_buffer_ALREADY_DEFINED
#else
#define yy_scan_buffer ppy__scan_buffer
#endif

#ifdef yy_scan_string
#define ppy__scan_string_ALREADY_DEFINED
#else
#define yy_scan_string ppy__scan_string
#endif

#ifdef yy_scan_bytes
#define ppy__scan_bytes_ALREADY_DEFINED
#else
#define yy_scan_bytes ppy__scan_bytes
#endif

#ifdef yy_init_buffer
#define ppy__init_buffer_ALREADY_DEFINED
#else
#define yy_init_buffer ppy__init_buffer
#endif

#ifdef yy_flush_buffer
#define ppy__flush_buffer_ALREADY_DEFINED
#else
#define yy_flush_buffer ppy__flush_buffer
#endif

#ifdef yy_load_buffer_state
#define ppy__load_buffer_state_ALREADY_DEFINED
#else
#define yy_load_buffer_state ppy__load_buffer_state
#endif

#ifdef yy_switch_to_buffer
#define ppy__switch_to_buffer_ALREADY_DEFINED
#else
#define yy_switch_to_buffer ppy__switch_to_buffer
#endif

#ifdef yypush_buffer_state
#define ppy_push_buffer_state_ALREADY_DEFINED
#else
#define yypush_buffer_state ppy_push_buffer_state
#endif

#ifdef yypop_buffer_state
#define ppy_pop_buffer_state_ALREADY_DEFINED
#else
#define yypop_buffer_state ppy_pop_buffer_state
#endif

#ifdef yyensure_buffer_stack
#define ppy_ensure_buffer_stack_ALREADY_DEFINED
#else
#define yyensure_buffer_stack ppy_ensure_buffer_stack
#endif

#ifdef yylex
#define ppy_lex_ALREADY_DEFINED
#else
#define yylex ppy_lex
#endif

#ifdef yyrestart
#define ppy_restart_ALREADY_DEFINED
#else
#define yyrestart ppy_restart
#endif

#ifdef yylex_init
#define ppy_lex_init_ALREADY_DEFINED
#else
#define yylex_init ppy_lex_init
#endif

#ifdef yylex_init_extra
#define ppy_lex_init_extra_ALREADY_DEFINED
#else
#define yylex_init_extra ppy_lex_init_extra
#endif

#ifdef yylex_destroy
#define ppy_lex_destroy_ALREADY_DEFINED
#else
#define yylex_destroy ppy_lex_destroy
#endif

#ifdef yyget_debug
#define ppy_get_debug_ALREADY_DEFINED
#else
#define yyget_debug ppy_get_debug
#endif

#ifdef yyset_debug
#define ppy_set_debug_ALREADY_DEFINED
#else
#define yyset_debug ppy_set_debug
#endif

#ifdef yyget_extra
#define ppy_get_extra_ALREADY_DEFINED
#else
#define yyget_extra ppy_get_extra
#endif

#ifdef yyset_extra
#define ppy_set_extra_ALREADY_DEFINED
#else
#define yyset_extra ppy_set_extra
#endif

#ifdef yyget_in
#define ppy_get_in_ALREADY_DEFINED
#else
#define yyget_in ppy_get_in
#endif

#ifdef yyset_in
#define ppy_set_in_ALREADY_DEFINED
#else
#define yyset_in ppy_set_in
#endif

#ifdef yyget_out
#define ppy_get_out_ALREADY_DEFINED
#else
#define yyget_out ppy_get_out
#endif

#ifdef yyset_out
#define ppy_set_out_ALREADY_DEFINED
#else
#define yyset_out ppy_set_out
#endif

#ifdef yyget_leng
#define ppy_get_leng_ALREADY_DEFINED
#else
#define yyget_leng ppy_get_leng
#endif

#ifdef yyget_text
#define ppy_get_text_ALREADY_DEFINED
#else
#define yyget_text ppy_get_text
#endif

#ifdef yyget_lineno
#define ppy_get_lineno_ALREADY_DEFINED
#else
#define yyget_lineno ppy_get_lineno
#endif

#ifdef yyset_lineno
#define ppy_set_lineno_ALREADY_DEFINED
#else
#define yyset_lineno ppy_set_lineno
#endif

#ifdef yywrap
#define ppy_wrap_ALREADY_DEFINED
#else
#define yywrap ppy_wrap
#endif

#ifdef yyalloc
#define ppy_alloc_ALREADY_DEFINED
#else
#define yyalloc ppy_alloc
#endif

#ifdef yyrealloc
#define ppy_realloc_ALREADY_DEFINED
#else
#define yyrealloc ppy_realloc
#endif

#ifdef yyfree
#define ppy_free_ALREADY_DEFINED
#else
#define yyfree ppy_free
#endif

#ifdef yytext
#define ppy_text_ALREADY_DEFINED
#else
#define yytext ppy_text
#endif

#ifdef yyleng
#define ppy_leng_ALREADY_DEFINED
#else
#define yyleng ppy_leng
#endif

#ifdef yyin
#define ppy_in_ALREADY_DEFINED
#else
#define yyin ppy_in
#endif

#ifdef yyout
#define ppy_out_ALREADY_DEFINED
#else
#define yyout ppy_out
#endif

#ifdef yy_flex_debug
#define ppy__flex_debug_ALREADY_DEFINED
#else
#define yy_flex_debug ppy__flex_debug
#endif

#ifdef yylineno
#define ppy_lineno_ALREADY_DEFINED
#else
#define yylineno ppy_lineno
#endif

/* First, we deal with  platform-specific or compiler-specific issues. */

/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */

#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L

/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
 * if you want the limit (max/min) macros for int types. 
 */
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif

#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t; 
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;

/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN               (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN              (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN              (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX               (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX              (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX              (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX              (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX             (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX             (4294967295U)
#endif

#ifndef SIZE_MAX
#define SIZE_MAX               (~(size_t)0)
#endif

#endif /* ! C99 */

#endif /* ! FLEXINT_H */

/* begin standard C++ headers. */

/* TODO: this is always defined, so inline it */
#define yyconst const

#if defined(__GNUC__) && __GNUC__ >= 3
#define yynoreturn __attribute__((__noreturn__))
#else
#define yynoreturn
#endif

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

/* Promotes a possibly negative, possibly signed char to an
 *   integer in range [0..255] for use as an array index.
 */
#define YY_SC_TO_UI(c) ((YY_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. */
#ifndef YY_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k.
 * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
 * Ditto for the __ia64__ case accordingly.
 */
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ */
#endif

/* The state buf must be large enough to hold one state per character in the main buffer.
 */
#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))

#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif

#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif

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
    
    #define YY_LESS_LINENO(n)
    #define YY_LINENO_REWIND_TO(ptr)
    
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
	do \
		{ \
		/* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		*yy_cp = (yy_hold_char); \
		YY_RESTORE_YY_MORE_OFFSET \
		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
		} \
	while ( 0 )
#define unput(c) yyunput( c, (yytext_ptr)  )

#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
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.
	 */
	int 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;

    int yy_bs_lineno; /**< The line count. */
    int yy_bs_column; /**< The column count. */

	/* 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

	};
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

/* Stack of input buffers. */
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */

/* 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".
 *
 * Returns the top of the stack, or NULL.
 */
#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
                          : NULL)
/* Same as previous macro, but useful when we know that the buffer stack is not
 * NULL or when we need an lvalue. For internal use only.
 */
#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]

/* 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 = NULL;
static int yy_init = 0;		/* 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 ( FILE *input_file  );
void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer  );
YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size  );
void yy_delete_buffer ( YY_BUFFER_STATE b  );
void yy_flush_buffer ( YY_BUFFER_STATE b  );
void yypush_buffer_state ( YY_BUFFER_STATE new_buffer  );
void yypop_buffer_state ( void );

static void yyensure_buffer_stack ( void );
static void yy_load_buffer_state ( void );
static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )

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

void *yyalloc ( yy_size_t  );
void *yyrealloc ( void *, yy_size_t  );
void yyfree ( void *  );

#define yy_new_buffer yy_create_buffer
#define yy_set_interactive(is_interactive) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){ \
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
	}
#define yy_set_bol(at_bol) \
	{ \
	if ( ! YY_CURRENT_BUFFER ){\
        yyensure_buffer_stack (); \
		YY_CURRENT_BUFFER_LVALUE =    \
            yy_create_buffer( yyin, YY_BUF_SIZE ); \
	} \
	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
	}
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */
typedef flex_uint8_t YY_CHAR;

FILE *yyin = NULL, *yyout = NULL;

typedef int yy_state_type;

extern int yylineno;
int yylineno = 1;

extern char *yytext;
#ifdef yytext_ptr
#undef yytext_ptr
#endif
#define yytext_ptr yytext

static yy_state_type yy_get_previous_state ( void );
static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
static int yy_get_next_buffer ( void );
static void yynoreturn yy_fatal_error ( const 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 145
#define YY_END_OF_BUFFER 146
/* This struct is not used in this scanner,
   but its presence is necessary. */
struct yy_trans_info
	{
	flex_int32_t yy_verify;
	flex_int32_t yy_nxt;
	};
static const flex_int16_t yy_accept[421] =
    {   0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,  119,  119,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,  146,  135,  136,  137,
      123,  144,  124,  135,  134,  135,  136,    1,   21,   16,
       18,   16,   21,   20,   17,   17,   17,   17,   17,   17,
       17,   17,   70,   73,   71,   72,   28,   25,   26,   24,
       28,   23,   28,   28,  125,  133,  126,  144,  127,  128,
      144,  129,  130,  119,  120,  119,   79,   77,   79,   79,

       76,   79,   80,   84,   86,   85,  144,   81,   92,   88,
       92,   87,   90,   92,   92,   89,   92,   94,  102,  104,
       97,  103,   99,   98,   95,   99,   94,  108,  108,  106,
      105,  108,  116,  115,  112,  113,  109,  110,  111,  116,
      116,  135,  136,  140,  123,  140,  124,  135,  134,  135,
       53,   50,   47,   53,   52,   53,   51,   53,   33,   35,
       53,   53,   53,   53,   49,   53,   53,   60,   57,   58,
       60,   56,   60,   54,   55,   64,   61,   62,   64,   64,
       22,   69,   66,   69,   67,   69,   65,   69,   29,   30,
       32,   32,   32,   29,    1,  142,  145,  143,  141,  141,

      135,  136,  135,  118,  122,  134,  138,  139,  136,    1,
       16,   17,   17,   17,   17,   17,   17,   17,   17,   18,
       19,   20,   17,   17,   17,   17,   17,   11,   17,   17,
       17,   17,   17,   70,   71,   72,   74,   72,   25,   27,
       28,  125,  132,  131,  132,  127,  129,  119,  119,  119,
      121,   77,   75,   76,   78,   79,   80,   81,   83,   81,
       88,   87,   92,   89,   93,   92,   94,   96,   99,   98,
       98,   95,  101,   99,   94,  108,  106,  105,  108,  107,
      108,  116,  116,  114,  117,  116,  135,  140,  140,   50,
       44,   41,   33,   34,   33,   33,   37,   35,   35,   35,

       39,   45,   43,   46,   40,   48,   49,  134,   42,   57,
       56,   59,   60,   54,   61,   63,    0,   22,   66,   65,
       69,   68,   69,   29,   31,   32,   29,  142,  141,  122,
      122,   17,   17,   17,   17,   17,   17,   11,   17,   17,
       17,   17,   17,   17,   17,   71,   82,   91,  100,   34,
       34,   33,   33,   33,   36,   35,   35,   35,  134,  122,
       17,   12,   13,   17,   17,   17,   17,   17,   17,   15,
       17,   17,   17,   34,   34,   34,   33,   36,   36,   35,
      134,   17,   12,   13,   14,    4,    7,    9,   17,   17,
       15,   17,    8,   17,   34,   36,   36,   36,  134,    3,

       14,    4,    7,    9,   10,   17,    6,    8,   17,   36,
      134,    3,   10,    2,    6,    5,   38,    2,    5,    0
    } ;

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

       33,   34,   35,   36,   37,   36,   36,   38,   39,   40,
       41,   42,   36,   43,   44,   45,   46,   36,   47,   48,
       36,   36,    1,   49,    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,    1
    } ;

static const YY_CHAR yy_meta[50] =
    {   0,
        1,    2,    3,    2,    1,    4,    5,    1,    6,    7,
        8,    9,    8,   10,   11,   12,   12,   12,    1,    1,
       13,   14,   15,   15,   15,   15,   16,   17,   14,   14,
       14,   14,   14,   14,   15,   15,   15,   15,   15,   15,
       15,   15,   15,   15,   15,   15,   15,   15,    1
    } ;

static const flex_int16_t yy_base[467] =
    {   0,
        0,   48,   55,    0,  102,  103,  130,    0,  177,  178,
      179,  182,  186,  187,  104,  107,  214,    0,  261,  262,
      289,    0,  338,    0,  386,  389,  414,  439,  466,    0,
      515,    0,  564,    0, 1129, 1128,  399,  403,  612,  638,
      665,    0,  428,  618,  714,  763, 1130,    0,   49, 1920,
     1920, 1920, 1920,   96,    0,  109,  118, 1920, 1920,  811,
     1920, 1126,  111,  111,  858, 1095,  154,  161, 1090, 1083,
     1085, 1095,    0, 1920,  184,  124, 1920,  196, 1920, 1920,
      254, 1920,    0,  199,    0, 1920, 1920,  269,    0, 1920,
     1120,    0, 1920,    0, 1920,  263, 1920,  208, 1920,  267,

     1112,  277,    0, 1920, 1920, 1920,  271,  281, 1920,  393,
     1920,  396, 1920, 1107,  396,    0,  406,    0, 1920, 1920,
     1113, 1920,  400,  905,    0,  418,  954, 1920,  430, 1920,
     1920,  433,    0, 1920, 1920, 1920, 1920, 1920, 1920,  432,
      435,    0,  449, 1920, 1920, 1920, 1920,  444,    0, 1003,
     1920,  456, 1920, 1099, 1920, 1110, 1920,  449, 1037,  714,
      443, 1097,  603,    0,  623, 1083, 1066, 1920,  615, 1920,
      619,    0,  632,    0, 1920, 1920,  644, 1920,  635,  634,
      635, 1920,  655, 1920, 1920,  646,    0,  659,    0, 1920,
     1920,  725,  738,  741, 1920,  742, 1920, 1920,    0,  735,

        0,  747,  741, 1920,    0,    0, 1920, 1111,  755, 1920,
        0,    0, 1079,  747,  754, 1074, 1067, 1069, 1079, 1920,
     1920, 1104, 1069,  717, 1070, 1058, 1067,  777, 1063, 1052,
     1062, 1056, 1041,    0,    0, 1920, 1920, 1079,  787, 1920,
     1078,    0, 1920, 1920, 1077,    0,    0,    0,  743,  765,
     1920,  791, 1920, 1069, 1920, 1075,    0, 1920,  794, 1074,
      795,  798, 1062,    0, 1920, 1071,    0, 1920,  789,    0,
     1085,    0,  801, 1070,    0,  804, 1920, 1920,  807, 1920,
     1069,    0,  804, 1920, 1920, 1068,  806, 1920,    0,  818,
     1920, 1920,  847,  843,  874,  799,    0,  905,  903,  800,

     1920, 1920, 1920, 1920, 1920, 1920, 1066, 1026, 1920,  823,
        0, 1920, 1048,    0,  824, 1920, 1047,  816,  871,    0,
     1920, 1920, 1027,    0, 1920, 1006,  872,  876,    0, 1134,
        0,  969,  971,  948,  943,  906,  897,  880,  875,  871,
      864,  844,  835,  833,  799,    0,  884, 1920,  890,  907,
      845,  618,  863,  873,  914,  889,  910,  912,  799, 1183,
      795,  938,  942,  796,  786,  747,  702,  695,  614,  959,
      610,  598,  428,  932,  945,  946, 1920,  947,  952, 1920,
      406,  395,  975,  984,  985,  990,  993,  994,  385,  372,
      997,  365,  998,  247, 1920,  966,  991,  994,  241, 1023,

     1024, 1029, 1032, 1033, 1036,  153, 1037, 1040,   74, 1920,
       22, 1041, 1044, 1045, 1054, 1055,    0, 1062, 1063, 1920,
     1232, 1249, 1266, 1283, 1300, 1317, 1334, 1351, 1368, 1385,
     1402, 1419, 1436, 1453, 1466, 1468, 1485, 1502, 1519, 1536,
     1553, 1570, 1587, 1604, 1615, 1632, 1649, 1655, 1672, 1689,
     1706, 1712, 1729, 1746, 1763, 1769, 1786, 1792, 1809, 1826,
     1834, 1851, 1868, 1885, 1056, 1902
    } ;

static const flex_int16_t yy_def[467] =
    {   0,
      420,    1,  420,    3,  421,  421,  420,    7,  422,  422,
      423,  423,  424,  424,  425,  425,  420,   17,  426,  426,
      420,   21,  420,   23,  427,  427,  428,  428,  420,   29,
      420,   31,  420,   33,  429,  429,  430,  430,  431,  431,
      420,   41,  432,  432,  433,  433,  420,  434,  420,  420,
      420,  420,  420,  435,  436,  435,  420,  420,  420,  420,
      420,   60,  420,  420,   60,   65,   65,   65,   65,   65,
       65,   65,  437,  420,  438,  420,  420,  420,  420,  420,
      420,  420,  436,  420,  439,  420,  420,  440,  441,  420,
      440,  442,  420,  443,  420,  444,  420,  420,  420,  420,

      445,  420,  446,  420,  420,  420,  447,  420,  420,  420,
      420,  420,  420,  420,  420,  448,  420,  449,  420,  420,
      420,  420,  450,  451,  452,  420,  452,  420,  420,  420,
      420,  420,  453,  420,  420,  420,  420,  420,  420,  454,
      420,  434,  420,  420,  420,  420,  420,  435,  436,  455,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  436,  420,  436,  420,  420,  420,  420,
      420,  456,  420,  457,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  458,  459,  460,  420,
      420,  420,  420,  460,  420,  420,  420,  420,  461,  461,

      434,  420,  435,  420,  462,  436,  420,  420,  420,  420,
       60,   65,   65,   65,   65,   65,   65,   65,   65,  420,
      420,  420,   65,   65,   65,   65,   65,   65,   65,   65,
       65,   65,   65,  437,  463,  420,  420,  420,  420,  420,
      420,  439,  420,  420,  420,  441,  442,  443,  444,  444,
      420,  420,  420,  445,  420,  420,  446,  420,  420,  420,
      420,  420,  420,  448,  420,  420,  449,  420,  450,  464,
      451,  452,  420,  420,  127,  420,  420,  420,  420,  420,
      420,  453,  454,  420,  420,  420,  435,  420,  455,  420,
      420,  420,  420,  420,  420,  420,  465,  420,  420,  420,

      420,  420,  420,  420,  420,  420,  420,  436,  420,  420,
      456,  420,  420,  457,  420,  420,  420,  420,  420,  458,
      420,  420,  420,  460,  420,  420,  460,  420,  461,  466,
      462,   65,   65,   65,   65,   65,   65,  420,   65,   65,
       65,   65,   65,   65,   65,  463,  420,  420,  420,  420,
      420,  420,  420,  420,  465,  420,  420,  420,  436,  466,
       65,   65,   65,   65,   65,   65,   65,   65,   65,   65,
       65,   65,   65,  420,  420,  420,  420,  420,  420,  420,
      436,   65,  420,  420,   65,   65,   65,   65,   65,   65,
      420,   65,   65,   65,  420,  420,  420,  420,  436,   65,

      420,  420,  420,  420,   65,   65,   65,  420,   65,  420,
      436,  420,  420,   65,  420,   65,  436,  420,  420,    0,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420
    } ;

static const flex_int16_t yy_nxt[1970] =
    {   0,
       48,   49,   50,   49,   48,   51,   52,   48,   53,   48,
       48,   48,   48,   48,   54,   48,   48,   48,   48,   48,
       48,   55,   55,   55,   55,   55,   56,   55,   55,   55,
       55,   55,   55,   55,   55,   55,   55,   55,   55,   55,
       55,   55,   55,   55,   55,   55,   55,   55,   48,   57,
      202,   57,  202,  417,   58,   59,   60,   61,   62,   59,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   63,
       59,   59,   59,   59,   59,   59,   59,   59,   59,   59,
       59,   64,   59,   65,   65,   65,   66,   67,   65,   65,
       65,   68,   69,   65,   65,   65,   70,   65,   65,   65,

       71,   72,   65,   59,   74,   74,   95,  204,  416,   95,
      205,  207,  208,  221,  222,   96,   75,   75,   96,  209,
      420,  209,  204,  420,  210,  205,  237,  238,   76,   76,
       77,   78,   79,   78,   77,   80,   77,   77,   77,   77,
       77,   77,   77,   77,   81,   77,   77,   77,   82,   77,
       77,   83,   83,   83,   83,   83,   84,   83,   83,   83,
       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
       83,   83,   83,   83,   83,   83,   83,   83,   77,   86,
       86,   86,   87,   87,   86,  414,  236,   90,   86,   86,
       90,  224,  227,  225,  228,  204,  226,  239,  205,  239,

      229,  240,  241,   88,   88,   91,   93,   93,   91,  252,
      236,  252,   91,   91,   97,   98,   99,   98,   97,   97,
       97,   97,   97,   97,   97,   97,   97,   97,  100,   97,
       97,   97,   97,   97,   97,  101,  101,  101,  101,  101,
      102,  101,  101,  101,  101,  101,  101,  101,  101,  101,
      101,  101,  101,  101,  101,  101,  101,  101,  101,  101,
      101,  101,   97,  104,  104,  204,  105,  105,  205,  106,
      106,  244,  245,  411,  250,  107,  107,  251,  204,  255,
      256,  205,  204,  259,  260,  205,  409,  108,  108,  109,
      110,  111,  110,  109,  109,  109,  109,  109,  109,  112,

      109,  113,  114,  115,  109,  109,  109,  109,  109,  109,
      116,  116,  116,  116,  116,  117,  116,  116,  116,  116,
      116,  116,  116,  116,  116,  116,  116,  116,  116,  116,
      116,  116,  116,  116,  116,  116,  116,  109,  118,  118,
      119,  118,  118,  120,  121,  118,  122,  118,  118,  118,
      118,  118,  123,  124,  124,  124,  118,  118,  118,  125,
      125,  125,  125,  125,  126,  127,  125,  125,  125,  125,
      125,  125,  125,  125,  125,  125,  125,  125,  125,  125,
      125,  125,  125,  125,  125,  125,  118,  129,  130,  129,
      129,  130,  129,  407,  261,  131,  261,  262,  131,  262,

      177,  178,  177,  406,  177,  178,  177,  204,  265,  266,
      205,  204,  132,  179,  205,  132,  134,  179,  405,  135,
      273,  274,  136,  137,  138,  180,  139,  400,  140,  180,
      190,  276,  277,  276,  191,  280,  281,  285,  286,  278,
      141,  134,  192,  284,  135,  399,  205,  136,  137,  138,
      202,  139,  202,  140,  193,  420,  279,  290,  420,  290,
      204,  301,  302,  205,  394,  141,  142,  143,  144,  143,
      142,  145,  146,  142,  147,  142,  142,  142,  142,  142,
      148,  142,  142,  142,  142,  142,  142,  149,  149,  149,
      149,  149,  150,  149,  149,  149,  149,  149,  149,  149,

      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,
      149,  149,  149,  149,  142,  151,  152,  153,  152,  154,
      155,  151,  156,  157,  151,  151,  151,  151,  151,  158,
      159,  160,  160,  161,  162,  163,  164,  164,  164,  164,
      164,  165,  164,  164,  164,  164,  166,  164,  164,  164,
      164,  164,  164,  164,  164,  164,  164,  164,  164,  164,
      164,  164,  164,  167,  168,  169,  170,  169,  168,  168,
      168,  168,  168,  168,  168,  168,  168,  168,  171,  168,
      168,  168,  168,  168,  168,  172,  172,  172,  172,  172,
      173,  172,  172,  172,  172,  172,  172,  172,  172,  172,

      172,  172,  172,  172,  172,  172,  172,  172,  172,  172,
      172,  172,  168,   78,   79,   78,  310,   80,  310,  194,
      190,  194,  304,  305,  195,  306,  307,  181,  181,  181,
      204,  393,  192,  205,  312,  313,  316,  317,   84,   78,
       79,   78,  377,   80,  193,  315,  204,  315,  392,  205,
      318,  318,  318,  181,  181,  181,  319,  204,  319,  390,
      205,  322,  323,  377,   84,  182,  183,  184,  183,  182,
      182,  182,  182,  182,  185,  185,  182,  182,  182,  186,
      182,  182,  182,  182,  182,  182,  187,  187,  187,  187,
      187,  188,  187,  187,  187,  187,  187,  187,  187,  187,

      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
      187,  187,  187,  182,   52,  196,  197,  196,   52,  198,
       52,   52,   52,   52,   52,   52,   52,  389,  200,  298,
      298,  298,   52,   52,   52,  388,  204,  299,  300,  205,
      325,  326,  327,  328,  327,  328,  204,  210,  202,  330,
      202,  299,  420,  333,  420,  420,  209,  420,  209,  300,
      334,  210,   52,   52,  196,  197,  196,   52,  198,   52,
       52,   52,   52,   52,   52,   52,  250,  200,  338,  251,
      338,   52,   52,   52,  224,  227,  225,  228,  239,  226,
      239,  387,  252,  229,  252,  347,  261,  347,  261,  262,

      420,  262,  349,  420,  349,  276,  277,  276,  339,  280,
      281,   52,  211,  278,  211,  420,  340,  420,  420,  290,
      420,  290,  354,  358,  310,  315,  310,  315,  386,  385,
      279,  318,  318,  318,  382,  381,  354,  358,  373,  212,
      212,  212,  213,  214,  212,  212,  212,  215,  216,  212,
      212,  212,  217,  212,  212,  212,  218,  219,  212,  420,
      294,  420,  293,  293,  294,  372,  350,  351,  376,  371,
      295,  296,  319,  327,  319,  327,  370,  328,  210,  328,
      350,  338,  376,  338,  295,  347,  377,  347,  351,  212,
      212,  349,  296,  349,  212,  212,  377,  352,  353,  212,

      377,  369,  368,  212,  212,  270,  270,  367,  270,  270,
      377,  352,  270,  380,  270,  270,  270,  270,  270,  353,
      298,  298,  298,  270,  270,  270,  356,  357,  299,  300,
      374,  375,  270,  380,  380,  380,  366,  378,  379,  383,
      356,  383,  299,  384,  374,  384,  365,  380,  357,  380,
      300,  378,  375,  270,  267,  267,  395,  267,  267,  379,
      391,  267,  391,  267,  267,  267,  267,  267,  395,  395,
      396,  397,  267,  267,  267,  398,  383,  395,  383,  364,
      363,  275,  395,  395,  396,  384,  401,  384,  401,  398,
      410,  402,  397,  402,  403,  404,  403,  404,  391,  408,

      391,  408,  267,  287,  362,  361,  289,  287,  325,  287,
      287,  410,  287,  287,  410,  287,  287,  410,  287,  287,
      287,  287,  287,  287,  412,  401,  412,  401,  410,  322,
      402,  410,  402,  403,  404,  403,  404,  413,  415,  413,
      415,  408,  412,  408,  412,  413,  418,  413,  418,  316,
      312,  287,  293,  293,  294,  415,  419,  415,  419,  359,
      295,  296,  297,  418,  419,  418,  419,  355,  306,  355,
      285,  280,  273,  265,  295,  348,  259,  255,  253,  244,
      240,  237,  296,  345,  297,  270,  270,  344,  270,  270,
      343,  342,  270,  341,  270,  270,  270,  270,  270,  337,

      336,  335,  332,  270,  270,  270,  221,  233,  232,  231,
      230,  223,  270,  207,  309,  308,  303,  292,  291,  268,
      263,  253,  420,  233,  232,  231,  230,  223,  220,  420,
      175,  175,  420,  270,  331,  331,  420,  331,  331,  331,
      331,  331,  331,  331,  331,  331,  331,  420,  420,  420,
      420,  420,  331,  331,  331,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  331,  331,  331,  420,  331,  331,  331,  331,
      331,  331,  331,  331,  331,  331,  420,  420,  420,  420,

      420,  331,  331,  331,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  331,   73,   73,   73,   73,   73,   73,   73,   73,
       73,   73,   73,   73,   73,   73,   73,   73,   73,   85,
       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
       85,   85,   85,   85,   85,   85,   89,   89,   89,   89,
       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
       89,   89,   89,   92,   92,   92,   92,   92,   92,   92,
       92,   92,   92,   92,   92,   92,   92,   92,   92,   92,

       94,   94,   94,   94,   94,   94,   94,   94,   94,   94,
       94,   94,   94,   94,   94,   94,   94,  103,  103,  103,
      103,  103,  103,  103,  103,  103,  103,  103,  103,  103,
      103,  103,  103,  103,  128,  128,  128,  128,  128,  128,
      128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
      128,  133,  133,  133,  133,  133,  133,  133,  133,  133,
      133,  133,  133,  133,  133,  133,  133,  133,  174,  174,
      174,  174,  174,  174,  174,  174,  174,  174,  174,  174,
      174,  174,  174,  174,  174,  176,  176,  176,  176,  176,
      176,  176,  176,  176,  176,  176,  176,  176,  176,  176,

      176,  176,   77,   77,   77,   77,   77,   77,   77,   77,
       77,   77,   77,   77,   77,   77,   77,   77,   77,  189,
      189,  189,  189,  189,  189,  189,  189,  189,  189,  189,
      189,  189,  189,  189,  189,  189,  199,  199,  199,  199,
      199,  199,  199,  199,  199,  199,  199,  199,  199,  199,
      199,  199,  199,  201,  420,  420,  420,  420,  420,  201,
      201,  201,  201,  420,  201,  201,  203,  420,  420,  420,
      203,  420,  203,  203,  203,  203,  203,  203,  203,  206,
      420,  206,  206,  420,  206,  234,  234,  420,  234,  234,
      234,  234,  234,  234,  234,  420,  234,  234,  234,  234,

      420,  234,  235,  235,  235,  235,  235,  235,  235,  235,
      235,  235,  235,  235,  235,  235,  235,  235,  235,  242,
      242,  420,  420,  242,  242,  242,  242,  242,  242,  242,
      242,  242,  242,  242,  420,  242,  243,  243,  243,  243,
      243,  243,  243,  243,  243,  243,  243,  243,  243,  243,
      243,  243,  243,  246,  246,  420,  246,  246,  420,  246,
      246,  246,  246,  246,  246,  246,  246,  246,  420,  246,
      247,  247,  420,  247,  247,  247,  247,  247,  247,  247,
      247,  247,  420,  247,  247,  420,  247,  248,  248,  420,
      248,  248,  248,  248,  248,  420,  248,  248,  248,  248,

      248,  248,  248,  248,  249,  249,  420,  249,  249,  249,
      249,  249,  249,  249,  249,  249,  249,  249,  249,  249,
      249,  254,  420,  420,  420,  420,  254,  420,  254,  254,
      420,  254,  257,  257,  420,  420,  257,  420,  257,  257,
      257,  257,  420,  257,  257,  257,  257,  420,  257,  258,
      258,  258,  258,  258,  258,  258,  258,  258,  258,  258,
      258,  258,  258,  258,  258,  258,  264,  420,  264,  264,
      420,  264,  267,  267,  420,  420,  420,  420,  267,  267,
      267,  267,  420,  420,  267,  420,  420,  420,  267,  269,
      269,  420,  420,  420,  420,  269,  269,  269,  269,  269,

      269,  269,  269,  269,  420,  269,  271,  271,  420,  420,
      420,  420,  271,  271,  271,  271,  420,  271,  271,  271,
      271,  420,  271,  272,  420,  272,  272,  420,  272,  282,
      282,  420,  420,  282,  420,  420,  420,  282,  282,  420,
      282,  282,  282,  282,  420,  282,  283,  283,  420,  420,
      283,  420,  420,  420,  283,  283,  283,  283,  283,  283,
      283,  420,  283,  288,  288,  288,  288,  288,  288,  288,
      288,  288,  288,  288,  288,  288,  288,  288,  288,  288,
      311,  420,  311,  311,  420,  311,  314,  314,  420,  314,
      314,  314,  314,  314,  314,  314,  314,  314,  314,  314,

      314,  314,  314,  320,  420,  320,  320,  420,  320,  321,
      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
      321,  321,  321,  321,  321,  321,  324,  324,  420,  324,
      420,  324,  324,  324,  324,  324,  420,  324,  324,  324,
      324,  420,  324,  329,  329,  329,  420,  329,  329,  329,
      329,  331,  331,  420,  331,  331,  331,  331,  331,  331,
      331,  331,  331,  331,  331,  331,  331,  331,  346,  346,
      420,  346,  346,  346,  346,  346,  420,  346,  420,  346,
      346,  346,  346,  420,  346,  270,  270,  420,  420,  420,
      420,  270,  270,  270,  270,  420,  420,  270,  420,  420,

      420,  270,  360,  360,  420,  360,  360,  360,  360,  360,
      360,  360,  360,  360,  360,  360,  360,  360,  360,   47,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420
    } ;

static const flex_int16_t yy_chk[1970] =
    {   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,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,
       49,    2,   49,  411,    2,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,

        3,    3,    3,    3,    5,    6,   15,   54,  409,   16,
       54,   56,   56,   64,   64,   15,    5,    6,   16,   57,
       56,   57,   63,   56,   57,   63,   76,   76,    5,    6,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
        7,    7,    7,    7,    7,    7,    7,    7,    7,    9,
       10,   11,    9,   10,   12,  406,   75,   11,   13,   14,
       12,   67,   68,   67,   68,   75,   67,   78,   75,   78,

       68,   84,   84,    9,   10,   11,   13,   14,   12,   98,
       75,   98,   13,   14,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
       17,   17,   17,   19,   20,   81,   19,   20,   81,   19,
       20,   88,   88,  399,   96,   19,   20,   96,  100,  102,
      102,  100,  107,  108,  108,  107,  394,   19,   20,   21,
       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,

       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
       21,   21,   21,   21,   21,   21,   21,   21,   23,   23,
       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
       23,   23,   23,   23,   23,   23,   23,   25,   25,   25,
       26,   26,   26,  392,  110,   25,  110,  112,   26,  112,

       37,   37,   37,  390,   38,   38,   38,  115,  117,  117,
      115,  123,   25,   37,  123,   26,   27,   38,  389,   27,
      126,  126,   27,   27,   27,   37,   27,  382,   27,   38,
       43,  129,  129,  129,   43,  132,  132,  141,  141,  129,
       27,   28,   43,  140,   28,  381,  140,   28,   28,   28,
      143,   28,  143,   28,   43,  148,  129,  152,  148,  152,
      158,  161,  161,  158,  373,   28,   29,   29,   29,   29,
       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,

       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
       29,   29,   29,   29,   29,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
       31,   31,   31,   31,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,

       33,   33,   33,   33,   33,   33,   33,   33,   33,   33,
       33,   33,   33,   39,   39,   39,  169,   39,  169,   44,
       44,   44,  163,  163,   44,  165,  165,   39,   39,   39,
      171,  372,   44,  171,  173,  173,  180,  180,   39,   40,
       40,   40,  352,   40,   44,  177,  179,  177,  371,  179,
      181,  181,  181,   40,   40,   40,  183,  186,  183,  369,
      186,  188,  188,  352,   40,   41,   41,   41,   41,   41,
       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,

       41,   41,   41,   41,   41,   41,   41,   41,   41,   41,
       41,   41,   41,   41,   45,   45,   45,   45,   45,   45,
       45,   45,   45,   45,   45,   45,   45,  368,   45,  160,
      160,  160,   45,   45,   45,  367,  192,  160,  160,  192,
      193,  193,  194,  196,  194,  196,  200,  194,  202,  200,
      202,  160,  203,  224,  249,  203,  209,  249,  209,  160,
      224,  209,   45,   46,   46,   46,   46,   46,   46,   46,
       46,   46,   46,   46,   46,   46,  250,   46,  228,  250,
      228,   46,   46,   46,  214,  215,  214,  215,  239,  214,
      239,  366,  252,  215,  252,  259,  261,  259,  261,  262,

      269,  262,  273,  269,  273,  276,  276,  276,  228,  279,
      279,   46,   60,  276,   60,  283,  228,  287,  283,  290,
      287,  290,  296,  300,  310,  315,  310,  315,  365,  364,
      276,  318,  318,  318,  361,  359,  296,  300,  345,   60,
       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
       60,   60,   60,   60,   60,   60,   60,   60,   60,   65,
      294,   65,  293,  293,  293,  344,  294,  294,  351,  343,
      293,  293,  319,  327,  319,  327,  342,  328,  327,  328,
      294,  338,  351,  338,  293,  347,  353,  347,  294,   65,
       65,  349,  293,  349,   65,   65,  354,  295,  295,   65,

      353,  341,  340,   65,   65,  124,  124,  339,  124,  124,
      354,  295,  124,  356,  124,  124,  124,  124,  124,  295,
      298,  298,  298,  124,  124,  124,  299,  299,  298,  298,
      350,  350,  124,  357,  356,  358,  337,  355,  355,  362,
      299,  362,  298,  363,  350,  363,  336,  357,  299,  358,
      298,  355,  350,  124,  127,  127,  374,  127,  127,  355,
      370,  127,  370,  127,  127,  127,  127,  127,  375,  376,
      378,  378,  127,  127,  127,  379,  383,  374,  383,  335,
      334,  127,  375,  376,  378,  384,  385,  384,  385,  379,
      396,  386,  378,  386,  387,  388,  387,  388,  391,  393,

      391,  393,  127,  150,  333,  332,  150,  150,  326,  150,
      150,  396,  150,  150,  397,  150,  150,  398,  150,  150,
      150,  150,  150,  150,  400,  401,  400,  401,  397,  323,
      402,  398,  402,  403,  404,  403,  404,  405,  407,  405,
      407,  408,  412,  408,  412,  413,  414,  413,  414,  317,
      313,  150,  159,  159,  159,  415,  416,  415,  416,  308,
      159,  159,  159,  418,  419,  418,  419,  465,  307,  465,
      286,  281,  274,  266,  159,  263,  260,  256,  254,  245,
      241,  238,  159,  233,  159,  271,  271,  232,  271,  271,
      231,  230,  271,  229,  271,  271,  271,  271,  271,  227,

      226,  225,  223,  271,  271,  271,  222,  219,  218,  217,
      216,  213,  271,  208,  167,  166,  162,  156,  154,  121,
      114,  101,   91,   72,   71,   70,   69,   66,   62,   47,
       36,   35,    0,  271,  330,  330,    0,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,    0,    0,    0,
        0,    0,  330,  330,  330,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,  330,  360,  360,    0,  360,  360,  360,  360,
      360,  360,  360,  360,  360,  360,    0,    0,    0,    0,

        0,  360,  360,  360,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,  360,  421,  421,  421,  421,  421,  421,  421,  421,
      421,  421,  421,  421,  421,  421,  421,  421,  421,  422,
      422,  422,  422,  422,  422,  422,  422,  422,  422,  422,
      422,  422,  422,  422,  422,  422,  423,  423,  423,  423,
      423,  423,  423,  423,  423,  423,  423,  423,  423,  423,
      423,  423,  423,  424,  424,  424,  424,  424,  424,  424,
      424,  424,  424,  424,  424,  424,  424,  424,  424,  424,

      425,  425,  425,  425,  425,  425,  425,  425,  425,  425,
      425,  425,  425,  425,  425,  425,  425,  426,  426,  426,
      426,  426,  426,  426,  426,  426,  426,  426,  426,  426,
      426,  426,  426,  426,  427,  427,  427,  427,  427,  427,
      427,  427,  427,  427,  427,  427,  427,  427,  427,  427,
      427,  428,  428,  428,  428,  428,  428,  428,  428,  428,
      428,  428,  428,  428,  428,  428,  428,  428,  429,  429,
      429,  429,  429,  429,  429,  429,  429,  429,  429,  429,
      429,  429,  429,  429,  429,  430,  430,  430,  430,  430,
      430,  430,  430,  430,  430,  430,  430,  430,  430,  430,

      430,  430,  431,  431,  431,  431,  431,  431,  431,  431,
      431,  431,  431,  431,  431,  431,  431,  431,  431,  432,
      432,  432,  432,  432,  432,  432,  432,  432,  432,  432,
      432,  432,  432,  432,  432,  432,  433,  433,  433,  433,
      433,  433,  433,  433,  433,  433,  433,  433,  433,  433,
      433,  433,  433,  434,    0,    0,    0,    0,    0,  434,
      434,  434,  434,    0,  434,  434,  435,    0,    0,    0,
      435,    0,  435,  435,  435,  435,  435,  435,  435,  436,
        0,  436,  436,    0,  436,  437,  437,    0,  437,  437,
      437,  437,  437,  437,  437,    0,  437,  437,  437,  437,

        0,  437,  438,  438,  438,  438,  438,  438,  438,  438,
      438,  438,  438,  438,  438,  438,  438,  438,  438,  439,
      439,    0,    0,  439,  439,  439,  439,  439,  439,  439,
      439,  439,  439,  439,    0,  439,  440,  440,  440,  440,
      440,  440,  440,  440,  440,  440,  440,  440,  440,  440,
      440,  440,  440,  441,  441,    0,  441,  441,    0,  441,
      441,  441,  441,  441,  441,  441,  441,  441,    0,  441,
      442,  442,    0,  442,  442,  442,  442,  442,  442,  442,
      442,  442,    0,  442,  442,    0,  442,  443,  443,    0,
      443,  443,  443,  443,  443,    0,  443,  443,  443,  443,

      443,  443,  443,  443,  444,  444,    0,  444,  444,  444,
      444,  444,  444,  444,  444,  444,  444,  444,  444,  444,
      444,  445,    0,    0,    0,    0,  445,    0,  445,  445,
        0,  445,  446,  446,    0,    0,  446,    0,  446,  446,
      446,  446,    0,  446,  446,  446,  446,    0,  446,  447,
      447,  447,  447,  447,  447,  447,  447,  447,  447,  447,
      447,  447,  447,  447,  447,  447,  448,    0,  448,  448,
        0,  448,  449,  449,    0,    0,    0,    0,  449,  449,
      449,  449,    0,    0,  449,    0,    0,    0,  449,  450,
      450,    0,    0,    0,    0,  450,  450,  450,  450,  450,

      450,  450,  450,  450,    0,  450,  451,  451,    0,    0,
        0,    0,  451,  451,  451,  451,    0,  451,  451,  451,
      451,    0,  451,  452,    0,  452,  452,    0,  452,  453,
      453,    0,    0,  453,    0,    0,    0,  453,  453,    0,
      453,  453,  453,  453,    0,  453,  454,  454,    0,    0,
      454,    0,    0,    0,  454,  454,  454,  454,  454,  454,
      454,    0,  454,  455,  455,  455,  455,  455,  455,  455,
      455,  455,  455,  455,  455,  455,  455,  455,  455,  455,
      456,    0,  456,  456,    0,  456,  457,  457,    0,  457,
      457,  457,  457,  457,  457,  457,  457,  457,  457,  457,

      457,  457,  457,  458,    0,  458,  458,    0,  458,  459,
      459,  459,  459,  459,  459,  459,  459,  459,  459,  459,
      459,  459,  459,  459,  459,  459,  460,  460,    0,  460,
        0,  460,  460,  460,  460,  460,    0,  460,  460,  460,
      460,    0,  460,  461,  461,  461,    0,  461,  461,  461,
      461,  462,  462,    0,  462,  462,  462,  462,  462,  462,
      462,  462,  462,  462,  462,  462,  462,  462,  463,  463,
        0,  463,  463,  463,  463,  463,    0,  463,    0,  463,
      463,  463,  463,    0,  463,  464,  464,    0,    0,    0,
        0,  464,  464,  464,  464,    0,    0,  464,    0,    0,

        0,  464,  466,  466,    0,  466,  466,  466,  466,  466,
      466,  466,  466,  466,  466,  466,  466,  466,  466,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420,  420,
      420,  420,  420,  420,  420,  420,  420,  420,  420
    } ;

static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;

extern int yy_flex_debug;
int yy_flex_debug = 0;

/* 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 "ppl.l"
/* -*-C-*-
 * Wrc preprocessor lexical analysis
 *
 * Copyright 1999-2000	Bertho A. Stultiens (BS)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 * History:
 * 24-Apr-2000 BS	- Started from scratch to restructure everything
 *			  and reintegrate the source into the wine-tree.
 * 04-Jan-2000 BS	- Added comments about the lexicographical
 *			  grammar to give some insight in the complexity.
 * 28-Dec-1999 BS	- Eliminated backing-up of the flexer by running
 *			  `flex -b' on the source. This results in some
 *			  weirdo extra rules, but a much faster scanner.
 * 23-Dec-1999 BS	- Started this file
 *
 *-------------------------------------------------------------------------
 * The preprocessor's lexographical grammar (approximately):
 *
 * pp		:= {ws} # {ws} if {ws} {expr} {ws} \n
 *		|  {ws} # {ws} ifdef {ws} {id} {ws} \n
 *		|  {ws} # {ws} ifndef {ws} {id} {ws} \n
 *		|  {ws} # {ws} elif {ws} {expr} {ws} \n
 *		|  {ws} # {ws} else {ws} \n
 *		|  {ws} # {ws} endif {ws} \n
 *		|  {ws} # {ws} include {ws} < {anytext} > \n
 *		|  {ws} # {ws} include {ws} " {anytext} " \n
 *		|  {ws} # {ws} define {ws} {anytext} \n
 *		|  {ws} # {ws} define( {arglist} ) {ws} {expansion} \n
 *		|  {ws} # {ws} pragma {ws} {anytext} \n
 *		|  {ws} # {ws} ident {ws} {anytext} \n
 *		|  {ws} # {ws} error {ws} {anytext} \n
 *		|  {ws} # {ws} warning {ws} {anytext} \n
 *		|  {ws} # {ws} line {ws} " {anytext} " {number} \n
 *		|  {ws} # {ws} {number} " {anytext} " {number} [ {number} [{number}] ] \n
 *		|  {ws} # {ws} \n
 *
 * ws		:= [ \t\r\f\v]*
 *
 * expr		:= {expr} [+-*%^/|&] {expr}
 *		|  {expr} {logor|logand} {expr}
 *		|  [!~+-] {expr}
 *		|  {expr} ? {expr} : {expr}
 *
 * logor	:= ||
 *
 * logand	:= &&
 *
 * id		:= [a-zA-Z_][a-zA-Z0-9_]*
 *
 * anytext	:= [^\n]*	(see note)
 *
 * arglist	:=
 *		|  {id}
 *		|  {arglist} , {id}
 *		|  {arglist} , {id} ...
 *
 * expansion	:= {id}
 *		|  # {id}
 *		|  {anytext}
 *		|  {anytext} ## {anytext}
 *
 * number	:= [0-9]+
 *
 * Note: "anytext" is not always "[^\n]*". This is because the
 *	 trailing context must be considered as well.
 *
 * The only certain assumption for the preprocessor to make is that
 * directives start at the beginning of the line, followed by a '#'
 * and end with a newline.
 * Any directive may be suffixed with a line-continuation. Also
 * classical comment / *...* / (note: no comments within comments,
 * therefore spaces) is considered to be a line-continuation
 * (according to gcc and egcs AFAIK, ANSI is a bit vague).
 * Comments have not been added to the above grammar for simplicity
 * reasons. However, it is allowed to enter comment anywhere within
 * the directives as long as they do not interfere with the context.
 * All comments are considered to be deletable whitespace (both
 * classical form "/ *...* /" and C++ form "//...\n").
 *
 * All recursive scans, except for macro-expansion, are done by the
 * parser, whereas the simple state transitions of non-recursive
 * directives are done in the scanner. This results in the many
 * exclusive start-conditions of the scanner.
 *
 * Macro expansions are slightly more difficult because they have to
 * prescan the arguments. Parameter substitution is literal if the
 * substitution is # or ## (either side). This enables new identifiers
 * to be created (see 'info cpp' node Macro|Pitfalls|Prescan for more
 * information).
 *
 * FIXME: Variable macro parameters is recognized, but not yet
 * expanded. I have to reread the ANSI standard on the subject (yes,
 * ANSI defines it).
 *
 * The following special defines are supported:
 * __FILE__	-> "thissource.c"
 * __LINE__	-> 123
 * __DATE__	-> "May  1 2000"
 * __TIME__	-> "23:59:59"
 * These macros expand, as expected, into their ANSI defined values.
 *
 * The same include prevention is implemented as gcc and egcs does.
 * This results in faster processing because we do not read the text
 * at all. Some wine-sources attempt to include the same file 4 or 5
 * times. This strategy also saves a lot blank output-lines, which in
 * its turn improves the real resource scanner/parser.
 *
 */

/*
 * Special flex options and exclusive scanner start-conditions
 */
#define YY_NO_INPUT 1






















#line 165 "ppl.l"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include <errno.h>
#include <limits.h>

#ifndef LLONG_MAX
# define LLONG_MAX  ((__int64)0x7fffffff << 32 | 0xffffffff)
# define LLONG_MIN  (-LLONG_MAX - 1)
#endif
#ifndef ULLONG_MAX
# define ULLONG_MAX ((__int64)0xffffffff << 32 | 0xffffffff)
#endif

#ifndef HAVE_UNISTD_H
#define YY_NO_UNISTD_H
#endif

#include "wine/wpp.h"
#include "wpp_private.h"
#include "ppy.tab.h"

/*
 * Make sure that we are running an appropriate version of flex.
 */
#if !defined(YY_FLEX_MAJOR_VERSION) || (1000 * YY_FLEX_MAJOR_VERSION + YY_FLEX_MINOR_VERSION < 2005)
#error Must use flex version 2.5.1 or higher (yy_scan_* routines are required).
#endif

#define YY_READ_BUF_SIZE	65536		/* So we read most of a file at once */

#define yy_current_state()	YY_START
#define yy_pp_state(x)		yy_pop_state(); yy_push_state(x)

/*
 * Always update the current character position within a line
 */
#define YY_USER_ACTION	pp_status.char_number+=ppy_leng;

/*
 * Buffer management for includes and expansions
 */
#define MAXBUFFERSTACK	128	/* Nesting more than 128 includes or macro expansion textss is insane */

typedef struct bufferstackentry {
	YY_BUFFER_STATE	bufferstate;	/* Buffer to switch back to */
	void		*filehandle;    /* Handle to be used with wpp_callbacks->read */
	pp_entry_t	*define;	/* Points to expanding define or NULL if handling includes */
	int		line_number;	/* Line that we were handling */
	int		char_number;	/* The current position on that line */
	char		*filename;	/* Filename that we were handling */
	int		if_depth;	/* How many #if:s deep to check matching #endif:s */
	int		ncontinuations;	/* Remember the continuation state */
	int		should_pop;	/* Set if we must pop the start-state on EOF */
	/* Include management */
        include_state_t incl;
	char 		*include_filename;
} bufferstackentry_t;

#define ALLOCBLOCKSIZE	(1 << 10)	/* Allocate these chunks at a time for string-buffers */

/*
 * Macro expansion nesting
 * We need the stack to handle expansions while scanning
 * a macro's arguments. The TOS must always be the macro
 * that receives the current expansion from the scanner.
 */
#define MAXMACEXPSTACK	128	/* Nesting more than 128 macro expansions is insane */

typedef struct macexpstackentry {
	pp_entry_t	*ppp;		/* This macro we are scanning */
	char		**args;		/* With these arguments */
	char		**ppargs;	/* Resulting in these preprocessed arguments */
	int		*nnls;		/* Number of newlines per argument */
	int		nargs;		/* And this many arguments scanned */
	int		parentheses;	/* Nesting level of () */
	int		curargsize;	/* Current scanning argument's size */
	int		curargalloc;	/* Current scanning argument's block allocated */
	char		*curarg;	/* Current scanning argument's content */
} macexpstackentry_t;

#define MACROPARENTHESES()	(top_macro()->parentheses)

/*
 * Prototypes
 */
static void newline(int);
static int make_number(int radix, YYSTYPE *val, const char *str, int len);
static void put_buffer(const char *s, int len);
/* Buffer management */
static void push_buffer(pp_entry_t *ppp, char *filename, char *incname, int pop);
static bufferstackentry_t *pop_buffer(void);
/* String functions */
static void new_string(void);
static void add_string(const char *str, int len);
static char *get_string(void);
static void put_string(void);
static int string_start(void);
/* Macro functions */
static void push_macro(pp_entry_t *ppp);
static macexpstackentry_t *top_macro(void);
static macexpstackentry_t *pop_macro(void);
static void free_macro(macexpstackentry_t *mep);
static void add_text_to_macro(const char *text, int len);
static void macro_add_arg(int last);
static void macro_add_expansion(void);
/* Expansion */
static void expand_special(pp_entry_t *ppp);
static void expand_define(pp_entry_t *ppp);
static void expand_macro(macexpstackentry_t *mep);

/*
 * Local variables
 */
static int ncontinuations;

static int strbuf_idx = 0;
static int strbuf_alloc = 0;
static char *strbuffer = NULL;
static int str_startline;

static macexpstackentry_t *macexpstack[MAXMACEXPSTACK];
static int macexpstackidx = 0;

static bufferstackentry_t bufferstack[MAXBUFFERSTACK];
static int bufferstackidx = 0;

/*
 * Global variables
 */
include_state_t pp_incl_state =
{
    -1,    /* state */
    NULL,  /* ppp */
    0,     /* ifdepth */
    0      /* seen_junk */
};

includelogicentry_t *pp_includelogiclist = NULL;

#define YY_INPUT(buf,result,max_size)					     \
	{								     \
		result = fread(buf, 1, max_size, pp_status.file);	     \
	}

#define BUFFERINITIALCAPACITY 256

void pp_writestring(const char *format, ...)
{
	va_list valist;
	int len;
	static char *buffer;
	static int buffercapacity;
	char *new_buffer;

	if(buffercapacity == 0)
	{
		buffer = pp_xmalloc(BUFFERINITIALCAPACITY);
		if(buffer == NULL)
			return;
		buffercapacity = BUFFERINITIALCAPACITY;
	}

	va_start(valist, format);
	len = vsnprintf(buffer, buffercapacity,
			format, valist);
	va_end(valist);
        /* If the string is longer than buffersize, vsnprintf returns
         * the string length with glibc >= 2.1, -1 with glibc < 2.1 */
	while(len > buffercapacity || len < 0)
	{
		do
		{
			buffercapacity *= 2;
		} while(len > buffercapacity);

		new_buffer = pp_xrealloc(buffer, buffercapacity);
		if(new_buffer == NULL)
		{
			va_end(valist);
			return;
		}
		buffer = new_buffer;
		va_start(valist, format);
		len = vsnprintf(buffer, buffercapacity,
				format, valist);
		va_end(valist);
	}

        fwrite(buffer, 1, len, ppy_out);
}

#line 1625 "ppl.yy.c"
/*
 **************************************************************************
 * The scanner starts here
 **************************************************************************
 */
#line 1631 "ppl.yy.c"

#define INITIAL 0
#define pp_pp 1
#define pp_eol 2
#define pp_inc 3
#define pp_dqs 4
#define pp_sqs 5
#define pp_iqs 6
#define pp_comment 7
#define pp_def 8
#define pp_define 9
#define pp_macro 10
#define pp_mbody 11
#define pp_macign 12
#define pp_macscan 13
#define pp_macexp 14
#define pp_if 15
#define pp_ifd 16
#define pp_ifignored 17
#define pp_endif 18
#define pp_line 19
#define pp_defined 20
#define pp_ignore 21
#define RCINCL 22

#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
 * down here because we want the user's section 1 to have been scanned first.
 * The user has a chance to override it with an option.
 */
#include <unistd.h>
#endif

#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

static int yy_init_globals ( void );

/* Accessor methods to globals.
   These are made visible to non-reentrant scanners for convenience. */

int yylex_destroy ( void );

int yyget_debug ( void );

void yyset_debug ( int debug_flag  );

YY_EXTRA_TYPE yyget_extra ( void );

void yyset_extra ( YY_EXTRA_TYPE user_defined  );

FILE *yyget_in ( void );

void yyset_in  ( FILE * _in_str  );

FILE *yyget_out ( void );

void yyset_out  ( FILE * _out_str  );

			int yyget_leng ( void );

char *yyget_text ( void );

int yyget_lineno ( void );

void yyset_lineno ( int _line_number  );

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

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

#ifndef YY_NO_UNPUT
    
#endif

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

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

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

#endif

        static int yy_start_stack_ptr = 0;
        static int yy_start_stack_depth = 0;
        static int *yy_start_stack = NULL;
    
    static void yy_push_state ( int _new_state );
    
    static void yy_pop_state ( void );
    
    static int yy_top_state ( void );
    
/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#ifdef __ia64__
/* On IA-64, the buffer size is 16k, not 8k */
#define YY_READ_BUF_SIZE 16384
#else
#define YY_READ_BUF_SIZE 8192
#endif /* __ia64__ */
#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 do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
#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_LVALUE->yy_is_interactive ) \
		{ \
		int c = '*'; \
		int 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 \
		{ \
		errno=0; \
		while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
			{ \
			if( errno != EINTR) \
				{ \
				YY_FATAL_ERROR( "input in flex scanner failed" ); \
				break; \
				} \
			errno=0; \
			clearerr(yyin); \
			} \
		}\
\

#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

/* end tables serialization structures and prototypes */

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1

extern int yylex (void);

#define YY_DECL int yylex (void)
#endif /* !YY_DECL */

/* 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 /*LINTED*/break;
#endif

#define YY_RULE_SETUP \
	if ( yyleng > 0 ) \
		YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
				(yytext[yyleng - 1] == '\n'); \
	YY_USER_ACTION

/** The main scanner function which does all the work.
 */
YY_DECL
{
	yy_state_type yy_current_state;
	char *yy_cp, *yy_bp;
	int yy_act;
    
	if ( !(yy_init) )
		{
		(yy_init) = 1;

#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 ) {
			yyensure_buffer_stack ();
			YY_CURRENT_BUFFER_LVALUE =
				yy_create_buffer( yyin, YY_BUF_SIZE );
		}

		yy_load_buffer_state(  );
		}

	{
#line 367 "ppl.l"

#line 369 "ppl.l"
	/*
	 * Catch line-continuations.
	 * Note: Gcc keeps the line-continuations in, for example, strings
	 * intact. However, I prefer to remove them all so that the next
	 * scanner will not need to reduce the continuation state.
	 *
	 * <*>\\\n		newline(0);
	 */

	/*
	 * Detect the leading # of a preprocessor directive.
	 */
#line 1896 "ppl.yy.c"

	while ( /*CONSTCOND*/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_current_state += YY_AT_BOL();
yy_match:
		do
			{
			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 >= 421 )
					yy_c = yy_meta[yy_c];
				}
			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
			++yy_cp;
			}
		while ( yy_current_state != 420 );
		yy_cp = (yy_last_accepting_cpos);
		yy_current_state = (yy_last_accepting_state);

yy_find_action:
		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 381 "ppl.l"
pp_incl_state.seen_junk++; yy_push_state(pp_pp);
	YY_BREAK
/*
	 * Scan for the preprocessor directives
	 */
case 2:
YY_RULE_SETUP
#line 386 "ppl.l"
if(yy_top_state() != pp_ignore) {yy_pp_state(pp_inc); return tINCLUDE;} else {yy_pp_state(pp_eol);}
	YY_BREAK
case 3:
YY_RULE_SETUP
#line 387 "ppl.l"
yy_pp_state(yy_current_state() != pp_ignore ? pp_def : pp_eol);
	YY_BREAK
case 4:
YY_RULE_SETUP
#line 388 "ppl.l"
yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tERROR;
	YY_BREAK
case 5:
YY_RULE_SETUP
#line 389 "ppl.l"
yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tWARNING;
	YY_BREAK
case 6:
YY_RULE_SETUP
#line 390 "ppl.l"
yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tPRAGMA;
	YY_BREAK
case 7:
YY_RULE_SETUP
#line 391 "ppl.l"
yy_pp_state(pp_eol);	if(yy_top_state() != pp_ignore) return tPPIDENT;
	YY_BREAK
case 8:
YY_RULE_SETUP
#line 392 "ppl.l"
if(yy_top_state() != pp_ignore) {yy_pp_state(pp_ifd); return tUNDEF;} else {yy_pp_state(pp_eol);}
	YY_BREAK
case 9:
YY_RULE_SETUP
#line 393 "ppl.l"
yy_pp_state(pp_ifd);	return tIFDEF;
	YY_BREAK
case 10:
YY_RULE_SETUP
#line 394 "ppl.l"
pp_incl_state.seen_junk--; yy_pp_state(pp_ifd);	return tIFNDEF;
	YY_BREAK
case 11:
YY_RULE_SETUP
#line 395 "ppl.l"
if(yy_top_state() != pp_ignore) {yy_pp_state(pp_if);} else {yy_pp_state(pp_ifignored);} return tIF;
	YY_BREAK
case 12:
YY_RULE_SETUP
#line 396 "ppl.l"
yy_pp_state(pp_if);	return tELIF;
	YY_BREAK
case 13:
YY_RULE_SETUP
#line 397 "ppl.l"
yy_pp_state(pp_endif);  return tELSE;
	YY_BREAK
case 14:
YY_RULE_SETUP
#line 398 "ppl.l"
yy_pp_state(pp_endif);  return tENDIF;
	YY_BREAK
case 15:
YY_RULE_SETUP
#line 399 "ppl.l"
if(yy_top_state() != pp_ignore) {yy_pp_state(pp_line); return tLINE;} else {yy_pp_state(pp_eol);}
	YY_BREAK
case 16:
YY_RULE_SETUP
#line 400 "ppl.l"
if(yy_top_state() != pp_ignore) {yy_pp_state(pp_line); return tGCCLINE;} else {yy_pp_state(pp_eol);}
	YY_BREAK
case 17:
YY_RULE_SETUP
#line 401 "ppl.l"
ppy_error("Invalid preprocessor token '%s'", ppy_text);
	YY_BREAK
case 18:
/* rule 18 can match eol */
YY_RULE_SETUP
#line 402 "ppl.l"
newline(1); yy_pop_state(); return tNL;	/* This could be the null-token */
	YY_BREAK
case 19:
/* rule 19 can match eol */
YY_RULE_SETUP
#line 403 "ppl.l"
newline(0);
	YY_BREAK
case 20:
YY_RULE_SETUP
#line 404 "ppl.l"
ppy_error("Preprocessor junk '%s'", ppy_text);
	YY_BREAK
case 21:
YY_RULE_SETUP
#line 405 "ppl.l"
return *ppy_text;
	YY_BREAK
/*
	 * Handle #include and #line
	 */
case 22:
YY_RULE_SETUP
#line 410 "ppl.l"
return make_number(10, &ppy_lval, ppy_text, ppy_leng);
	YY_BREAK
case 23:
YY_RULE_SETUP
#line 411 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_iqs);
	YY_BREAK
case 24:
YY_RULE_SETUP
#line 412 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
	YY_BREAK
case 25:
YY_RULE_SETUP
#line 413 "ppl.l"
;
	YY_BREAK
case 26:
/* rule 26 can match eol */
YY_RULE_SETUP
#line 414 "ppl.l"
newline(1); yy_pop_state(); return tNL;
	YY_BREAK
case 27:
/* rule 27 can match eol */
YY_RULE_SETUP
#line 415 "ppl.l"
newline(0);
	YY_BREAK
case 28:
YY_RULE_SETUP
#line 416 "ppl.l"
ppy_error(yy_current_state() == pp_inc ? "Trailing junk in #include" : "Trailing junk in #line");
	YY_BREAK
/*
	 * Ignore all input when a false clause is parsed
	 */
case 29:
YY_RULE_SETUP
#line 421 "ppl.l"
;
	YY_BREAK
case 30:
/* rule 30 can match eol */
YY_RULE_SETUP
#line 422 "ppl.l"
newline(1);
	YY_BREAK
case 31:
/* rule 31 can match eol */
YY_RULE_SETUP
#line 423 "ppl.l"
newline(0);
	YY_BREAK
case 32:
YY_RULE_SETUP
#line 424 "ppl.l"
;
	YY_BREAK
/*
	 * Handle #if and #elif.
	 * These require conditionals to be evaluated, but we do not
	 * want to jam the scanner normally when we see these tokens.
	 * Note: tIDENT is handled below.
	 */
case 33:
YY_RULE_SETUP
#line 433 "ppl.l"
return make_number(8, &ppy_lval, ppy_text, ppy_leng);
	YY_BREAK
case 34:
YY_RULE_SETUP
#line 434 "ppl.l"
ppy_error("Invalid octal digit");
	YY_BREAK
case 35:
YY_RULE_SETUP
#line 435 "ppl.l"
return make_number(10, &ppy_lval, ppy_text, ppy_leng);
	YY_BREAK
case 36:
YY_RULE_SETUP
#line 436 "ppl.l"
return make_number(16, &ppy_lval, ppy_text, ppy_leng);
	YY_BREAK
case 37:
YY_RULE_SETUP
#line 437 "ppl.l"
ppy_error("Invalid hex number");
	YY_BREAK
case 38:
YY_RULE_SETUP
#line 438 "ppl.l"
yy_push_state(pp_defined); return tDEFINED;
	YY_BREAK
case 39:
YY_RULE_SETUP
#line 439 "ppl.l"
return tLSHIFT;
	YY_BREAK
case 40:
YY_RULE_SETUP
#line 440 "ppl.l"
return tRSHIFT;
	YY_BREAK
case 41:
YY_RULE_SETUP
#line 441 "ppl.l"
return tLOGAND;
	YY_BREAK
case 42:
YY_RULE_SETUP
#line 442 "ppl.l"
return tLOGOR;
	YY_BREAK
case 43:
YY_RULE_SETUP
#line 443 "ppl.l"
return tEQ;
	YY_BREAK
case 44:
YY_RULE_SETUP
#line 444 "ppl.l"
return tNE;
	YY_BREAK
case 45:
YY_RULE_SETUP
#line 445 "ppl.l"
return tLTE;
	YY_BREAK
case 46:
YY_RULE_SETUP
#line 446 "ppl.l"
return tGTE;
	YY_BREAK
case 47:
/* rule 47 can match eol */
YY_RULE_SETUP
#line 447 "ppl.l"
newline(1); yy_pop_state(); return tNL;
	YY_BREAK
case 48:
/* rule 48 can match eol */
YY_RULE_SETUP
#line 448 "ppl.l"
newline(0);
	YY_BREAK
case 49:
YY_RULE_SETUP
#line 449 "ppl.l"
ppy_error("Junk in conditional expression");
	YY_BREAK
case 50:
YY_RULE_SETUP
#line 450 "ppl.l"
;
	YY_BREAK
case 51:
YY_RULE_SETUP
#line 451 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
	YY_BREAK
case 52:
YY_RULE_SETUP
#line 452 "ppl.l"
ppy_error("String constants not allowed in conditionals");
	YY_BREAK
case 53:
YY_RULE_SETUP
#line 453 "ppl.l"
return *ppy_text;
	YY_BREAK
case 54:
YY_RULE_SETUP
#line 455 "ppl.l"
ppy_lval.sint = 0; return tSINT;
	YY_BREAK
case 55:
/* rule 55 can match eol */
YY_RULE_SETUP
#line 456 "ppl.l"
newline(1); yy_pop_state(); return tNL;
	YY_BREAK
/*
	 * Handle #ifdef, #ifndef and #undef
	 * to get only an untranslated/unexpanded identifier
	 */
case 56:
YY_RULE_SETUP
#line 462 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
	YY_BREAK
case 57:
YY_RULE_SETUP
#line 463 "ppl.l"
;
	YY_BREAK
case 58:
/* rule 58 can match eol */
YY_RULE_SETUP
#line 464 "ppl.l"
newline(1); yy_pop_state(); return tNL;
	YY_BREAK
case 59:
/* rule 59 can match eol */
YY_RULE_SETUP
#line 465 "ppl.l"
newline(0);
	YY_BREAK
case 60:
YY_RULE_SETUP
#line 466 "ppl.l"
ppy_error("Identifier expected");
	YY_BREAK
/*
	 * Handle #else and #endif.
	 */
case 61:
YY_RULE_SETUP
#line 471 "ppl.l"
;
	YY_BREAK
case 62:
/* rule 62 can match eol */
YY_RULE_SETUP
#line 472 "ppl.l"
newline(1); yy_pop_state(); return tNL;
	YY_BREAK
case 63:
/* rule 63 can match eol */
YY_RULE_SETUP
#line 473 "ppl.l"
newline(0);
	YY_BREAK
case 64:
YY_RULE_SETUP
#line 474 "ppl.l"
ppy_error("Garbage after #else or #endif.");
	YY_BREAK
/*
	 * Handle the special 'defined' keyword.
	 * This is necessary to get the identifier prior to any
	 * substitutions.
	 */
case 65:
YY_RULE_SETUP
#line 481 "ppl.l"
yy_pop_state(); ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
	YY_BREAK
case 66:
YY_RULE_SETUP
#line 482 "ppl.l"
;
	YY_BREAK
case 67:
YY_RULE_SETUP
#line 483 "ppl.l"
return *ppy_text;
	YY_BREAK
case 68:
/* rule 68 can match eol */
YY_RULE_SETUP
#line 484 "ppl.l"
newline(0);
	YY_BREAK
case 69:
/* rule 69 can match eol */
YY_RULE_SETUP
#line 485 "ppl.l"
ppy_error("Identifier expected");
	YY_BREAK
/*
	 * Handle #error, #warning, #pragma and #ident.
	 * Pass everything literally to the parser, which
	 * will act appropriately.
	 * Comments are stripped from the literal text.
	 */
case 70:
YY_RULE_SETUP
#line 493 "ppl.l"
if(yy_top_state() != pp_ignore) { ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL; }
	YY_BREAK
case 71:
YY_RULE_SETUP
#line 494 "ppl.l"
if(yy_top_state() != pp_ignore) { ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL; }
	YY_BREAK
case 72:
/* rule 72 can match eol */
YY_RULE_SETUP
#line 495 "ppl.l"
if(yy_top_state() != pp_ignore) { ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL; }
	YY_BREAK
case 73:
/* rule 73 can match eol */
YY_RULE_SETUP
#line 496 "ppl.l"
newline(1); yy_pop_state(); if(yy_current_state() != pp_ignore) { return tNL; }
	YY_BREAK
case 74:
/* rule 74 can match eol */
YY_RULE_SETUP
#line 497 "ppl.l"
newline(0);
	YY_BREAK
/*
	 * Handle left side of #define
	 */
case 75:
YY_RULE_SETUP
#line 502 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); if(ppy_lval.cptr) ppy_lval.cptr[ppy_leng-1] = '\0'; yy_pp_state(pp_macro);  return tMACRO;
	YY_BREAK
case 76:
YY_RULE_SETUP
#line 503 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); yy_pp_state(pp_define); return tDEFINE;
	YY_BREAK
case 77:
YY_RULE_SETUP
#line 504 "ppl.l"
;
	YY_BREAK
case 78:
/* rule 78 can match eol */
YY_RULE_SETUP
#line 505 "ppl.l"
newline(0);
	YY_BREAK
case 79:
/* rule 79 can match eol */
YY_RULE_SETUP
#line 506 "ppl.l"
perror("Identifier expected");
	YY_BREAK
/*
	 * Scan the substitution of a define
	 */
case 80:
YY_RULE_SETUP
#line 511 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
	YY_BREAK
case 81:
/* rule 81 can match eol */
YY_RULE_SETUP
#line 512 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
	YY_BREAK
case 82:
/* rule 82 can match eol */
YY_RULE_SETUP
#line 513 "ppl.l"
newline(0); ppy_lval.cptr = pp_xstrdup(" "); return tLITERAL;
	YY_BREAK
case 83:
/* rule 83 can match eol */
YY_RULE_SETUP
#line 514 "ppl.l"
newline(0);
	YY_BREAK
case 84:
/* rule 84 can match eol */
YY_RULE_SETUP
#line 515 "ppl.l"
newline(1); yy_pop_state(); return tNL;
	YY_BREAK
case 85:
YY_RULE_SETUP
#line 516 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
	YY_BREAK
case 86:
YY_RULE_SETUP
#line 517 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
	YY_BREAK
/*
	 * Scan the definition macro arguments
	 */
case 87:
YY_RULE_SETUP
#line 522 "ppl.l"
yy_pp_state(pp_mbody); return tMACROEND;
	YY_BREAK
case 88:
YY_RULE_SETUP
#line 523 "ppl.l"
;
	YY_BREAK
case 89:
YY_RULE_SETUP
#line 524 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
	YY_BREAK
case 90:
YY_RULE_SETUP
#line 525 "ppl.l"
return ',';
	YY_BREAK
case 91:
YY_RULE_SETUP
#line 526 "ppl.l"
return tELIPSIS;
	YY_BREAK
case 92:
/* rule 92 can match eol */
YY_RULE_SETUP
#line 527 "ppl.l"
ppy_error("Argument identifier expected");
	YY_BREAK
case 93:
/* rule 93 can match eol */
YY_RULE_SETUP
#line 528 "ppl.l"
newline(0);
	YY_BREAK
/*
	 * Scan the substitution of a macro
	 */
case 94:
YY_RULE_SETUP
#line 533 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
	YY_BREAK
case 95:
YY_RULE_SETUP
#line 534 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tIDENT;
	YY_BREAK
case 96:
YY_RULE_SETUP
#line 535 "ppl.l"
return tCONCAT;
	YY_BREAK
case 97:
YY_RULE_SETUP
#line 536 "ppl.l"
return tSTRINGIZE;
	YY_BREAK
case 98:
YY_RULE_SETUP
#line 537 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
	YY_BREAK
case 99:
YY_RULE_SETUP
#line 538 "ppl.l"
ppy_lval.cptr = pp_xstrdup(ppy_text); return tLITERAL;
	YY_BREAK
case 100:
/* rule 100 can match eol */
YY_RULE_SETUP
#line 539 "ppl.l"
newline(0); ppy_lval.cptr = pp_xstrdup(" "); return tLITERAL;
	YY_BREAK
case 101:
/* rule 101 can match eol */
YY_RULE_SETUP
#line 540 "ppl.l"
newline(0);
	YY_BREAK
case 102:
/* rule 102 can match eol */
YY_RULE_SETUP
#line 541 "ppl.l"
newline(1); yy_pop_state(); return tNL;
	YY_BREAK
case 103:
YY_RULE_SETUP
#line 542 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
	YY_BREAK
case 104:
YY_RULE_SETUP
#line 543 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
	YY_BREAK
/*
	 * Macro expansion text scanning.
	 * This state is active just after the identifier is scanned
	 * that triggers an expansion. We *must* delete the leading
	 * whitespace before we can start scanning for arguments.
	 *
	 * If we do not see a '(' as next trailing token, then we have
	 * a false alarm. We just continue with a nose-bleed...
	 */
case 105:
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
#line 554 "ppl.l"
yy_pp_state(pp_macscan);
	YY_BREAK
case 106:
/* rule 106 can match eol */
YY_RULE_SETUP
#line 555 "ppl.l"
{
		if(yy_top_state() != pp_macscan)
			newline(0);
	}
	YY_BREAK
case 107:
/* rule 107 can match eol */
YY_RULE_SETUP
#line 559 "ppl.l"
newline(0);
	YY_BREAK
case 108:
YY_RULE_SETUP
#line 560 "ppl.l"
{
		macexpstackentry_t *mac = pop_macro();
		yy_pop_state();
		put_buffer(mac->ppp->ident, strlen(mac->ppp->ident));
		put_buffer(ppy_text, ppy_leng);
		free_macro(mac);
	}
	YY_BREAK
/*
	 * Macro expansion argument text scanning.
	 * This state is active when a macro's arguments are being read for expansion.
	 */
case 109:
YY_RULE_SETUP
#line 572 "ppl.l"
{
		if(++MACROPARENTHESES() > 1)
			add_text_to_macro(ppy_text, ppy_leng);
	}
	YY_BREAK
case 110:
YY_RULE_SETUP
#line 576 "ppl.l"
{
		if(--MACROPARENTHESES() == 0)
		{
			yy_pop_state();
			macro_add_arg(1);
		}
		else
			add_text_to_macro(ppy_text, ppy_leng);
	}
	YY_BREAK
case 111:
YY_RULE_SETUP
#line 585 "ppl.l"
{
		if(MACROPARENTHESES() > 1)
			add_text_to_macro(ppy_text, ppy_leng);
		else
			macro_add_arg(0);
	}
	YY_BREAK
case 112:
YY_RULE_SETUP
#line 591 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
	YY_BREAK
case 113:
YY_RULE_SETUP
#line 592 "ppl.l"
new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
	YY_BREAK
case 114:
YY_RULE_SETUP
#line 593 "ppl.l"
yy_push_state(pp_comment); add_text_to_macro(" ", 1);
	YY_BREAK
case 115:
/* rule 115 can match eol */
YY_RULE_SETUP
#line 594 "ppl.l"
pp_status.line_number++; pp_status.char_number = 1; add_text_to_macro(ppy_text, ppy_leng);
	YY_BREAK
case 116:
YY_RULE_SETUP
#line 595 "ppl.l"
add_text_to_macro(ppy_text, ppy_leng);
	YY_BREAK
case 117:
/* rule 117 can match eol */
YY_RULE_SETUP
#line 596 "ppl.l"
newline(0);
	YY_BREAK
/*
	 * Comment handling (almost all start-conditions)
	 */
case 118:
YY_RULE_SETUP
#line 601 "ppl.l"
yy_push_state(pp_comment);
	YY_BREAK
case 119:
YY_RULE_SETUP
#line 602 "ppl.l"
;
	YY_BREAK
case 120:
/* rule 120 can match eol */
YY_RULE_SETUP
#line 603 "ppl.l"
newline(0);
	YY_BREAK
case 121:
YY_RULE_SETUP
#line 604 "ppl.l"
yy_pop_state();
	YY_BREAK
/*
	 * Remove C++ style comment (almost all start-conditions)
	 */
case 122:
YY_RULE_SETUP
#line 609 "ppl.l"
{
		if(ppy_text[ppy_leng-1] == '\\')
			ppy_warning("C++ style comment ends with an escaped newline (escape ignored)");
	}
	YY_BREAK
/*
	 * Single, double and <> quoted constants
	 */
case 123:
YY_RULE_SETUP
#line 617 "ppl.l"
pp_incl_state.seen_junk++; new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_dqs);
	YY_BREAK
case 124:
YY_RULE_SETUP
#line 618 "ppl.l"
pp_incl_state.seen_junk++; new_string(); add_string(ppy_text, ppy_leng); yy_push_state(pp_sqs);
	YY_BREAK
case 125:
YY_RULE_SETUP
#line 619 "ppl.l"
add_string(ppy_text, ppy_leng);
	YY_BREAK
case 126:
YY_RULE_SETUP
#line 620 "ppl.l"
{
		add_string(ppy_text, ppy_leng);
		yy_pop_state();
		switch(yy_current_state())
		{
		case pp_pp:
		case pp_define:
		case pp_mbody:
		case pp_inc:
		case RCINCL:
			if (yy_current_state()==RCINCL) yy_pop_state();
			ppy_lval.cptr = get_string();
			return tDQSTRING;
		case pp_line:
			ppy_lval.cptr = get_string();
			return tDQSTRING;
		default:
			put_string();
		}
	}
	YY_BREAK
case 127:
YY_RULE_SETUP
#line 640 "ppl.l"
add_string(ppy_text, ppy_leng);
	YY_BREAK
case 128:
YY_RULE_SETUP
#line 641 "ppl.l"
{
		add_string(ppy_text, ppy_leng);
		yy_pop_state();
		switch(yy_current_state())
		{
		case pp_if:
		case pp_define:
		case pp_mbody:
			ppy_lval.cptr = get_string();
			return tSQSTRING;
		default:
			put_string();
		}
	}
	YY_BREAK
case 129:
YY_RULE_SETUP
#line 655 "ppl.l"
add_string(ppy_text, ppy_leng);
	YY_BREAK
case 130:
YY_RULE_SETUP
#line 656 "ppl.l"
{
		add_string(ppy_text, ppy_leng);
		yy_pop_state();
		ppy_lval.cptr = get_string();
		return tIQSTRING;
	}
	YY_BREAK
case 131:
/* rule 131 can match eol */
YY_RULE_SETUP
#line 662 "ppl.l"
{
		/*
		 * This is tricky; we need to remove the line-continuation
		 * from preprocessor strings, but OTOH retain them in all
		 * other strings. This is because the resource grammar is
		 * even more braindead than initially analysed and line-
		 * continuations in strings introduce, sigh, newlines in
		 * the output. There goes the concept of non-breaking, non-
		 * spacing whitespace.
		 */
		switch(yy_top_state())
		{
		case pp_pp:
		case pp_define:
		case pp_mbody:
		case pp_inc:
		case pp_line:
			newline(0);
			break;
		default:
			add_string(ppy_text, ppy_leng);
			newline(-1);
		}
	}
	YY_BREAK
case 132:
YY_RULE_SETUP
#line 686 "ppl.l"
add_string(ppy_text, ppy_leng);
	YY_BREAK
case 133:
/* rule 133 can match eol */
YY_RULE_SETUP
#line 687 "ppl.l"
{
		newline(1);
		add_string(ppy_text, ppy_leng);
		ppy_warning("Newline in string constant encountered (started line %d)", string_start());
	}
	YY_BREAK
/*
	 * Identifier scanning
	 */
case 134:
YY_RULE_SETUP
#line 696 "ppl.l"
{
		pp_entry_t *ppp;
		pp_incl_state.seen_junk++;
		if(!(ppp = pplookup(ppy_text)))
		{
			if(yy_current_state() == pp_inc)
				ppy_error("Expected include filename");

			else if(yy_current_state() == pp_if)
			{
				ppy_lval.cptr = pp_xstrdup(ppy_text);
				return tIDENT;
			}
			else {
				if((yy_current_state()==INITIAL) && (strcasecmp(ppy_text,"RCINCLUDE")==0)){
					yy_push_state(RCINCL);
					return tRCINCLUDE;
				}
				else put_buffer(ppy_text, ppy_leng);
			}
		}
		else if(!ppp->expanding)
		{
			switch(ppp->type)
			{
			case def_special:
				expand_special(ppp);
				break;
			case def_define:
				expand_define(ppp);
				break;
			case def_macro:
				yy_push_state(pp_macign);
				push_macro(ppp);
				break;
			default:
				pp_internal_error(__FILE__, __LINE__, "Invalid define type %d\n", ppp->type);
			}
		}
		else put_buffer(ppy_text, ppy_leng);
	}
	YY_BREAK
/*
	 * Everything else that needs to be passed and
	 * newline and continuation handling
	 */
case 135:
YY_RULE_SETUP
#line 742 "ppl.l"
pp_incl_state.seen_junk++; put_buffer(ppy_text, ppy_leng);
	YY_BREAK
case 136:
YY_RULE_SETUP
#line 743 "ppl.l"
put_buffer(ppy_text, ppy_leng);
	YY_BREAK
case 137:
/* rule 137 can match eol */
YY_RULE_SETUP
#line 744 "ppl.l"
newline(1);
	YY_BREAK
case 138:
/* rule 138 can match eol */
YY_RULE_SETUP
#line 745 "ppl.l"
newline(0);
	YY_BREAK
case 139:
YY_RULE_SETUP
#line 746 "ppl.l"
pp_incl_state.seen_junk++; put_buffer(ppy_text, ppy_leng);
	YY_BREAK
/*
	 * Special catcher for macro argmument expansion to prevent
	 * newlines to propagate to the output or admin.
	 */
case 140:
/* rule 140 can match eol */
YY_RULE_SETUP
#line 752 "ppl.l"
put_buffer(ppy_text, ppy_leng);
	YY_BREAK
case 141:
YY_RULE_SETUP
#line 754 "ppl.l"
{
		ppy_lval.cptr=pp_xstrdup(ppy_text);
        	yy_pop_state();
		return tRCINCLUDEPATH;
	}
	YY_BREAK
case 142:
YY_RULE_SETUP
#line 760 "ppl.l"
;
	YY_BREAK
case 143:
YY_RULE_SETUP
#line 762 "ppl.l"
{
		new_string(); add_string(ppy_text,ppy_leng);yy_push_state(pp_dqs);
	}
	YY_BREAK
/*
	 * This is a 'catch-all' rule to discover errors in the scanner
	 * in an orderly manner.
	 */
case 144:
YY_RULE_SETUP
#line 770 "ppl.l"
pp_incl_state.seen_junk++; ppy_warning("Unmatched text '%c' (0x%02x); please report\n", isprint(*ppy_text & 0xff) ? *ppy_text : ' ', *ppy_text);
	YY_BREAK
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(pp_pp):
case YY_STATE_EOF(pp_eol):
case YY_STATE_EOF(pp_inc):
case YY_STATE_EOF(pp_dqs):
case YY_STATE_EOF(pp_sqs):
case YY_STATE_EOF(pp_iqs):
case YY_STATE_EOF(pp_comment):
case YY_STATE_EOF(pp_def):
case YY_STATE_EOF(pp_define):
case YY_STATE_EOF(pp_macro):
case YY_STATE_EOF(pp_mbody):
case YY_STATE_EOF(pp_macign):
case YY_STATE_EOF(pp_macscan):
case YY_STATE_EOF(pp_macexp):
case YY_STATE_EOF(pp_if):
case YY_STATE_EOF(pp_ifd):
case YY_STATE_EOF(pp_ifignored):
case YY_STATE_EOF(pp_endif):
case YY_STATE_EOF(pp_line):
case YY_STATE_EOF(pp_defined):
case YY_STATE_EOF(pp_ignore):
case YY_STATE_EOF(RCINCL):
#line 772 "ppl.l"
{
		YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
		bufferstackentry_t *bep = pop_buffer();

		if((!bep && pp_get_if_depth()) || (bep && pp_get_if_depth() != bep->if_depth))
			ppy_warning("Unmatched #if/#endif at end of file");

		if(!bep)
		{
			if(YY_START != INITIAL)
			{
				ppy_error("Unexpected end of file during preprocessing");
				BEGIN(INITIAL);
			}
			yyterminate();
		}
		else if(bep->should_pop == 2)
		{
			macexpstackentry_t *mac;
			mac = pop_macro();
			expand_macro(mac);
		}
		ppy__delete_buffer(b);
	}
	YY_BREAK
case 145:
YY_RULE_SETUP
#line 797 "ppl.l"
ECHO;
	YY_BREAK
#line 2986 "ppl.yy.c"

	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_LVALUE->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_LVALUE->yy_n_chars;
			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
			YY_CURRENT_BUFFER_LVALUE->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_LVALUE->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_last_accepting_cpos);
				yy_current_state = (yy_last_accepting_state);
				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_LVALUE->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 user's declarations */
} /* 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 (void)
{
    	char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
	char *source = (yytext_ptr);
	int number_to_move, i;
	int ret_val;

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

	if ( YY_CURRENT_BUFFER_LVALUE->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_LVALUE->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_LVALUE->yy_n_chars = (yy_n_chars) = 0;

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

		while ( num_to_read <= 0 )
			{ /* Not enough room in the buffer - grow it. */

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

			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. */
					yyrealloc( (void *) b->yy_ch_buf,
							 (yy_size_t) (b->yy_buf_size + 2)  );
				}
			else
				/* Can't grow it, we don't own it. */
				b->yy_ch_buf = NULL;

			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_LVALUE->yy_buf_size -
						number_to_move - 1;

			}

		if ( num_to_read > YY_READ_BUF_SIZE )
			num_to_read = YY_READ_BUF_SIZE;

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

		YY_CURRENT_BUFFER_LVALUE->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_LVALUE->yy_buffer_status =
				YY_BUFFER_EOF_PENDING;
			}
		}

	else
		ret_val = EOB_ACT_CONTINUE_SCAN;

	if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
		/* Extend the array by 50%, plus the number we really need. */
		int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
			(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
		/* "- 2" to take care of EOB's */
		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
	}

	(yy_n_chars) += number_to_move;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;

	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->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 (void)
{
	yy_state_type yy_current_state;
	char *yy_cp;
    
	yy_current_state = (yy_start);
	yy_current_state += YY_AT_BOL();

	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
		{
		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 >= 421 )
				yy_c = yy_meta[yy_c];
			}
		yy_current_state = yy_nxt[yy_base[yy_current_state] + 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 );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
{
	int yy_is_jam;
    	char *yy_cp = (yy_c_buf_p);

	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 >= 421 )
			yy_c = yy_meta[yy_c];
		}
	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
	yy_is_jam = (yy_current_state == 420);

		return yy_is_jam ? 0 : yy_current_state;
}

#ifndef YY_NO_UNPUT

#endif

#ifndef YY_NO_INPUT
#ifdef __cplusplus
    static int yyinput (void)
#else
    static int input  (void)
#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_LVALUE->yy_ch_buf[(yy_n_chars)] )
			/* This was really a NUL. */
			*(yy_c_buf_p) = '\0';

		else
			{ /* need more input */
			int offset = (int) ((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 );

					/*FALLTHROUGH*/

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

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

	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');

	return c;
}
#endif	/* ifndef YY_NO_INPUT */

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * 
 * @note This function does not reset the start condition to @c INITIAL .
 */
    void yyrestart  (FILE * input_file )
{
    
	if ( ! YY_CURRENT_BUFFER ){
        yyensure_buffer_stack ();
		YY_CURRENT_BUFFER_LVALUE =
            yy_create_buffer( yyin, YY_BUF_SIZE );
	}

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

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * 
 */
    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
{
    
	/* TODO. We should be able to replace this entire function body
	 * with
	 *		yypop_buffer_state();
	 *		yypush_buffer_state(new_buffer);
     */
	yyensure_buffer_stack ();
	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_LVALUE->yy_buf_pos = (yy_c_buf_p);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

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

static void yy_load_buffer_state  (void)
{
    	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
	(yy_hold_char) = *(yy_c_buf_p);
}

/** Allocate and initialize an input buffer state.
 * @param file A readable stream.
 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
 * 
 * @return the allocated buffer state.
 */
    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
{
	YY_BUFFER_STATE b;
    
	b = (YY_BUFFER_STATE) yyalloc( 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 *) yyalloc( (yy_size_t) (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;
}

/** Destroy the buffer.
 * @param b a buffer created with yy_create_buffer()
 * 
 */
    void yy_delete_buffer (YY_BUFFER_STATE  b )
{
    
	if ( ! b )
		return;

	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;

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

	yyfree( (void *) b  );
}

/* Initializes or reinitializes a buffer.
 * This function is sometimes called more than once on the same buffer,
 * such as during a yyrestart() or at EOF.
 */
    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )

{
	int oerrno = errno;
    
	yy_flush_buffer( b );

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

    /* If b is the current buffer, then yy_init_buffer was _probably_
     * called from yyrestart() or through yy_get_next_buffer.
     * In that case, we don't want to reset the lineno or column.
     */
    if (b != YY_CURRENT_BUFFER){
        b->yy_bs_lineno = 1;
        b->yy_bs_column = 0;
    }

        b->yy_is_interactive = 0;
    
	errno = oerrno;
}

/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
 * 
 */
    void yy_flush_buffer (YY_BUFFER_STATE  b )
{
    	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(  );
}

/** Pushes the new state onto the stack. The new state becomes
 *  the current state. This function will allocate the stack
 *  if necessary.
 *  @param new_buffer The new state.
 *  
 */
void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
{
    	if (new_buffer == NULL)
		return;

	yyensure_buffer_stack();

	/* This block is copied from yy_switch_to_buffer. */
	if ( YY_CURRENT_BUFFER )
		{
		/* Flush out information for old buffer. */
		*(yy_c_buf_p) = (yy_hold_char);
		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
		}

	/* Only push if top exists. Otherwise, replace top. */
	if (YY_CURRENT_BUFFER)
		(yy_buffer_stack_top)++;
	YY_CURRENT_BUFFER_LVALUE = new_buffer;

	/* copied from yy_switch_to_buffer. */
	yy_load_buffer_state(  );
	(yy_did_buffer_switch_on_eof) = 1;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  
 */
void yypop_buffer_state (void)
{
    	if (!YY_CURRENT_BUFFER)
		return;

	yy_delete_buffer(YY_CURRENT_BUFFER );
	YY_CURRENT_BUFFER_LVALUE = NULL;
	if ((yy_buffer_stack_top) > 0)
		--(yy_buffer_stack_top);

	if (YY_CURRENT_BUFFER) {
		yy_load_buffer_state(  );
		(yy_did_buffer_switch_on_eof) = 1;
	}
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void yyensure_buffer_stack (void)
{
	yy_size_t num_to_alloc;
    
	if (!(yy_buffer_stack)) {

		/* First allocation is just for 2 elements, since we don't know if this
		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
		 * immediate realloc on the next call.
         */
      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
		(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
								(num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));

		(yy_buffer_stack_max) = num_to_alloc;
		(yy_buffer_stack_top) = 0;
		return;
	}

	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){

		/* Increase the buffer to prepare for a possible push. */
		yy_size_t grow_size = 8 /* arbitrary grow size */;

		num_to_alloc = (yy_buffer_stack_max) + grow_size;
		(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
								((yy_buffer_stack),
								num_to_alloc * sizeof(struct yy_buffer_state*)
								);
		if ( ! (yy_buffer_stack) )
			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );

		/* zero only the new slots.*/
		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
		(yy_buffer_stack_max) = num_to_alloc;
	}
}

/** Setup the input buffer state to scan directly from a user-specified character buffer.
 * @param base the character buffer
 * @param size the size in bytes of the character buffer
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
{
	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 NULL;

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

	b->yy_buf_size = (int) (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 = NULL;
	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;
}

/** Setup the input buffer state to scan a string. The next call to yylex() will
 * scan from a @e copy of @a str.
 * @param yystr a NUL-terminated string to scan
 * 
 * @return the newly allocated buffer state object.
 * @note If you want to scan bytes that may contain NUL values, then use
 *       yy_scan_bytes() instead.
 */
YY_BUFFER_STATE yy_scan_string (const char * yystr )
{
    
	return yy_scan_bytes( yystr, (int) strlen(yystr) );
}

/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
 * scan from a @e copy of @a bytes.
 * @param yybytes the byte buffer to scan
 * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
 * 
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
{
	YY_BUFFER_STATE b;
	char *buf;
	yy_size_t n;
	int i;
    
	/* Get memory for full buffer, including space for trailing EOB's. */
	n = (yy_size_t) (_yybytes_len + 2);
	buf = (char *) yyalloc( n  );
	if ( ! buf )
		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );

	for ( i = 0; i < _yybytes_len; ++i )
		buf[i] = yybytes[i];

	buf[_yybytes_len] = buf[_yybytes_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;
}

    static void yy_push_state (int  _new_state )
{
    	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_size_t) (yy_start_stack_depth) * sizeof( int );

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

		else
			(yy_start_stack) = (int *) yyrealloc(
					(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);
}

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

	BEGIN((yy_start_stack)[(yy_start_stack_ptr)]);
}

    static int yy_top_state  (void)
{
    	return (yy_start_stack)[(yy_start_stack_ptr) - 1];
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yynoreturn yy_fatal_error (const char* msg )
{
			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. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
		yytext[yyleng] = (yy_hold_char); \
		(yy_c_buf_p) = yytext + yyless_macro_arg; \
		(yy_hold_char) = *(yy_c_buf_p); \
		*(yy_c_buf_p) = '\0'; \
		yyleng = yyless_macro_arg; \
		} \
	while ( 0 )

/* Accessor  methods (get/set functions) to struct members. */

/** Get the current line number.
 * 
 */
int yyget_lineno  (void)
{
    
    return yylineno;
}

/** Get the input stream.
 * 
 */
FILE *yyget_in  (void)
{
        return yyin;
}

/** Get the output stream.
 * 
 */
FILE *yyget_out  (void)
{
        return yyout;
}

/** Get the length of the current token.
 * 
 */
int yyget_leng  (void)
{
        return yyleng;
}

/** Get the current token.
 * 
 */

char *yyget_text  (void)
{
        return yytext;
}

/** Set the current line number.
 * @param _line_number line number
 * 
 */
void yyset_lineno (int  _line_number )
{
    
    yylineno = _line_number;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param _in_str A readable stream.
 * 
 * @see yy_switch_to_buffer
 */
void yyset_in (FILE *  _in_str )
{
        yyin = _in_str ;
}

void yyset_out (FILE *  _out_str )
{
        yyout = _out_str ;
}

int yyget_debug  (void)
{
        return yy_flex_debug;
}

void yyset_debug (int  _bdebug )
{
        yy_flex_debug = _bdebug ;
}

static int yy_init_globals (void)
{
        /* Initialization is the same as for the non-reentrant scanner.
     * This function is called from yylex_destroy(), so don't allocate here.
     */

    (yy_buffer_stack) = NULL;
    (yy_buffer_stack_top) = 0;
    (yy_buffer_stack_max) = 0;
    (yy_c_buf_p) = NULL;
    (yy_init) = 0;
    (yy_start) = 0;

    (yy_start_stack_ptr) = 0;
    (yy_start_stack_depth) = 0;
    (yy_start_stack) =  NULL;

/* Defined in main.c */
#ifdef YY_STDINIT
    yyin = stdin;
    yyout = stdout;
#else
    yyin = NULL;
    yyout = NULL;
#endif

    /* For future reference: Set errno on error, since we are called by
     * yylex_init()
     */
    return 0;
}

/* yylex_destroy is for both reentrant and non-reentrant scanners. */
int yylex_destroy  (void)
{
    
    /* Pop the buffer stack, destroying each element. */
	while(YY_CURRENT_BUFFER){
		yy_delete_buffer( YY_CURRENT_BUFFER  );
		YY_CURRENT_BUFFER_LVALUE = NULL;
		yypop_buffer_state();
	}

	/* Destroy the stack itself. */
	yyfree((yy_buffer_stack) );
	(yy_buffer_stack) = NULL;

    /* Destroy the start condition stack. */
        yyfree( (yy_start_stack)  );
        (yy_start_stack) = NULL;

    /* Reset the globals. This is important in a non-reentrant scanner so the next time
     * yylex() is called, initialization will occur. */
    yy_init_globals( );

    return 0;
}

/*
 * Internal utility routines.
 */

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

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (const char * s )
{
	int n;
	for ( n = 0; s[n]; ++n )
		;

	return n;
}
#endif

void *yyalloc (yy_size_t  size )
{
			return malloc(size);
}

void *yyrealloc  (void * ptr, yy_size_t  size )
{
		
	/* 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 realloc(ptr, size);
}

void yyfree (void * ptr )
{
			free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

#line 797 "ppl.l"

/*
 **************************************************************************
 * Support functions
 **************************************************************************
 */

#ifndef ppy_wrap
int ppy_wrap(void)
{
	return 1;
}
#endif


/*
 *-------------------------------------------------------------------------
 * Output newlines or set them as continuations
 *
 * Input: -1 - Don't count this one, but update local position (see pp_dqs)
 *	   0 - Line-continuation seen and cache output
 *	   1 - Newline seen and flush output
 *-------------------------------------------------------------------------
 */
static void newline(int dowrite)
{
	pp_status.line_number++;
	pp_status.char_number = 1;

	if(dowrite == -1)
		return;

	ncontinuations++;
	if(dowrite)
	{
		for(;ncontinuations; ncontinuations--)
			put_buffer("\n", 1);
	}
}


/*
 *-------------------------------------------------------------------------
 * Make a number out of an any-base and suffixed string
 *
 * Possible number extensions:
 * - ""		int
 * - "L"	long int
 * - "LL"	long long int
 * - "U"	unsigned int
 * - "UL"	unsigned long int
 * - "ULL"	unsigned long long int
 * - "LU"	unsigned long int
 * - "LLU"	unsigned long long int
 * - "LUL"	invalid
 *
 * FIXME:
 * The sizes of resulting 'int' and 'long' are compiler specific.
 * I depend on sizeof(int) > 2 here (although a relatively safe
 * assumption).
 * Long longs are not yet implemented because this is very compiler
 * specific and I don't want to think too much about the problems.
 *
 *-------------------------------------------------------------------------
 */
static int make_number(int radix, YYSTYPE *val, const char *str, int len)
{
	int is_l  = 0;
	int is_ll = 0;
	int is_u  = 0;
	char ext[4];
	long l;

	ext[3] = '\0';
	ext[2] = toupper(str[len-1]);
	ext[1] = len > 1 ? toupper(str[len-2]) : ' ';
	ext[0] = len > 2 ? toupper(str[len-3]) : ' ';

	if(!strcmp(ext, "LUL"))
	{
		ppy_error("Invalid constant suffix");
		return 0;
	}
	else if(!strcmp(ext, "LLU") || !strcmp(ext, "ULL"))
	{
		is_ll++;
		is_u++;
	}
	else if(!strcmp(ext+1, "LU") || !strcmp(ext+1, "UL"))
	{
		is_l++;
		is_u++;
	}
	else if(!strcmp(ext+1, "LL"))
	{
		is_ll++;
	}
	else if(!strcmp(ext+2, "L"))
	{
		is_l++;
	}
	else if(!strcmp(ext+2, "U"))
	{
		is_u++;
	}

	if(is_u && is_ll)
	{
		errno = 0;
		val->ull = strtoull(str, NULL, radix);
		if (val->ull == ULLONG_MAX && errno == ERANGE)
		    ppy_error("integer constant %s is too large\n", str);
		return tULONGLONG;
	}
	else if(!is_u && is_ll)
	{
		errno = 0;
		val->sll = strtoll(str, NULL, radix);
		if ((val->sll == LLONG_MIN || val->sll == LLONG_MAX) && errno == ERANGE)
		    ppy_error("integer constant %s is too large\n", str);
		return tSLONGLONG;
	}
	else if(is_u && is_l)
	{
		errno = 0;
		val->ulong = strtoul(str, NULL, radix);
		if (val->ulong == ULONG_MAX && errno == ERANGE)
			ppy_error("integer constant %s is too large\n", str);
		return tULONG;
	}
	else if(!is_u && is_l)
	{
		errno = 0;
		val->slong = strtol(str, NULL, radix);
		if ((val->slong == LONG_MIN || val->slong == LONG_MAX) && errno == ERANGE)
			ppy_error("integer constant %s is too large\n", str);
		return tSLONG;
	}
	else if(is_u && !is_l)
	{
		unsigned long ul;
		errno = 0;
		ul = strtoul(str, NULL, radix);
		if ((ul == ULONG_MAX && errno == ERANGE) || (ul > UINT_MAX))
			ppy_error("integer constant %s is too large\n", str);
		val->uint = (unsigned int)ul;
		return tUINT;
	}

	/* Else it must be an int... */
	errno = 0;
	l = strtol(str, NULL, radix);
	if (((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE) ||
		(l > INT_MAX) || (l < INT_MIN))
		ppy_error("integer constant %s is too large\n", str);
	val->sint = (int)l;
	return tSINT;
}


/*
 *-------------------------------------------------------------------------
 * Macro and define expansion support
 *
 * FIXME: Variable macro arguments.
 *-------------------------------------------------------------------------
 */
static void expand_special(pp_entry_t *ppp)
{
	static char *buf = NULL;
	char *new_buf;

	assert(ppp->type == def_special);

	if(!strcmp(ppp->ident, "__LINE__"))
	{
		new_buf = pp_xrealloc(buf, 32);
		if(!new_buf)
			return;
		buf = new_buf;
		sprintf(buf, "%d", pp_status.line_number);
	}
	else if(!strcmp(ppp->ident, "__FILE__"))
	{
		new_buf = pp_xrealloc(buf, strlen(pp_status.input) + 3);
		if(!new_buf)
			return;
		buf = new_buf;
		sprintf(buf, "\"%s\"", pp_status.input);
	}
	else
		pp_internal_error(__FILE__, __LINE__, "Special macro '%s' not found...\n", ppp->ident);

	if(pp_flex_debug)
		fprintf(stderr, "expand_special(%d): %s:%d: '%s' -> '%s'\n",
			macexpstackidx,
			pp_status.input,
			pp_status.line_number,
			ppp->ident,
			buf ? buf : "");

	if(buf && buf[0])
	{
		push_buffer(ppp, NULL, NULL, 0);
		yy_scan_string(buf);
	}
}

static void expand_define(pp_entry_t *ppp)
{
	assert(ppp->type == def_define);

	if(pp_flex_debug)
		fprintf(stderr, "expand_define(%d): %s:%d: '%s' -> '%s'\n",
			macexpstackidx,
			pp_status.input,
			pp_status.line_number,
			ppp->ident,
			ppp->subst.text);
	if(ppp->subst.text && ppp->subst.text[0])
	{
		push_buffer(ppp, NULL, NULL, 0);
		yy_scan_string(ppp->subst.text);
	}
}

static int curdef_idx = 0;
static int curdef_alloc = 0;
static char *curdef_text = NULL;

static void add_text(const char *str, int len)
{
	int new_alloc;
	char *new_text;

	if(len == 0)
		return;
	if(curdef_idx >= curdef_alloc || curdef_alloc - curdef_idx < len)
	{
		new_alloc = curdef_alloc + ((len + ALLOCBLOCKSIZE-1) & ~(ALLOCBLOCKSIZE-1));
		new_text = pp_xrealloc(curdef_text, new_alloc * sizeof(curdef_text[0]));
		if(!new_text)
			return;
		curdef_text = new_text;
		curdef_alloc = new_alloc;
		if(curdef_alloc > 65536)
			ppy_warning("Reallocating macro-expansion buffer larger than 64kB");
	}
	memcpy(&curdef_text[curdef_idx], str, len);
	curdef_idx += len;
}

static mtext_t *add_expand_text(mtext_t *mtp, macexpstackentry_t *mep, int *nnl)
{
	char *cptr;
	char *exp;
	int tag;
	int n;

	if(mtp == NULL)
		return NULL;

	switch(mtp->type)
	{
	case exp_text:
		if(pp_flex_debug)
			fprintf(stderr, "add_expand_text: exp_text: '%s'\n", mtp->subst.text);
		add_text(mtp->subst.text, strlen(mtp->subst.text));
		break;

	case exp_stringize:
		if(pp_flex_debug)
			fprintf(stderr, "add_expand_text: exp_stringize(%d): '%s'\n",
				mtp->subst.argidx,
				mep->args[mtp->subst.argidx]);
		cptr = mep->args[mtp->subst.argidx];
		add_text("\"", 1);
		while(*cptr)
		{
			if(*cptr == '"' || *cptr == '\\')
				add_text("\\", 1);
			add_text(cptr, 1);
			cptr++;
		}
		add_text("\"", 1);
		break;

	case exp_concat:
		if(pp_flex_debug)
			fprintf(stderr, "add_expand_text: exp_concat\n");
		/* Remove trailing whitespace from current expansion text */
		while(curdef_idx)
		{
			if(isspace(curdef_text[curdef_idx-1] & 0xff))
				curdef_idx--;
			else
				break;
		}
		/* tag current position and recursively expand the next part */
		tag = curdef_idx;
		mtp = add_expand_text(mtp->next, mep, nnl);

		/* Now get rid of the leading space of the expansion */
		cptr = &curdef_text[tag];
		n = curdef_idx - tag;
		while(n)
		{
			if(isspace(*cptr & 0xff))
			{
				cptr++;
				n--;
			}
			else
				break;
		}
		if(cptr != &curdef_text[tag])
		{
			memmove(&curdef_text[tag], cptr, n);
			curdef_idx -= (curdef_idx - tag) - n;
		}
		break;

	case exp_subst:
		if((mtp->next && mtp->next->type == exp_concat) || (mtp->prev && mtp->prev->type == exp_concat))
			exp = mep->args[mtp->subst.argidx];
		else
			exp = mep->ppargs[mtp->subst.argidx];
		if(exp)
		{
			add_text(exp, strlen(exp));
			*nnl -= mep->nnls[mtp->subst.argidx];
			cptr = strchr(exp, '\n');
			while(cptr)
			{
				*cptr = ' ';
				cptr = strchr(cptr+1, '\n');
			}
			mep->nnls[mtp->subst.argidx] = 0;
		}
		if(pp_flex_debug)
			fprintf(stderr, "add_expand_text: exp_subst(%d): '%s'\n", mtp->subst.argidx, exp);
		break;

	default:
		pp_internal_error(__FILE__, __LINE__, "Invalid expansion type (%d) in macro expansion\n", mtp->type);
	}
	return mtp;
}

static void expand_macro(macexpstackentry_t *mep)
{
	mtext_t *mtp;
	int n, k;
	char *cptr;
	int nnl = 0;
	pp_entry_t *ppp = mep->ppp;
	int nargs = mep->nargs;

	assert(ppp->type == def_macro);
	assert(ppp->expanding == 0);

	if((ppp->nargs >= 0 && nargs != ppp->nargs) || (ppp->nargs < 0 && nargs < -ppp->nargs))
	{
		ppy_error("Too %s macro arguments (%d)", nargs < abs(ppp->nargs) ? "few" : "many", nargs);
		return;
	}

	for(n = 0; n < nargs; n++)
		nnl += mep->nnls[n];

	if(pp_flex_debug)
		fprintf(stderr, "expand_macro(%d): %s:%d: '%s'(%d,%d) -> ...\n",
			macexpstackidx,
			pp_status.input,
			pp_status.line_number,
			ppp->ident,
			mep->nargs,
			nnl);

	curdef_idx = 0;

	for(mtp = ppp->subst.mtext; mtp; mtp = mtp->next)
	{
		if(!(mtp = add_expand_text(mtp, mep, &nnl)))
			break;
	}

	for(n = 0; n < nnl; n++)
		add_text("\n", 1);

	/* To make sure there is room and termination (see below) */
	add_text(" \0", 2);

	/* Strip trailing whitespace from expansion */
	for(k = curdef_idx, cptr = &curdef_text[curdef_idx-1]; k > 0; k--, cptr--)
	{
		if(!isspace(*cptr & 0xff))
			break;
	}

	/*
	 * We must add *one* whitespace to make sure that there
	 * is a token-separation after the expansion.
	 */
	*(++cptr) = ' ';
	*(++cptr) = '\0';
	k++;

	/* Strip leading whitespace from expansion */
	for(n = 0, cptr = curdef_text; n < k; n++, cptr++)
	{
		if(!isspace(*cptr & 0xff))
			break;
	}

	if(k - n > 0)
	{
		if(pp_flex_debug)
			fprintf(stderr, "expand_text: '%s'\n", curdef_text + n);
		push_buffer(ppp, NULL, NULL, 0);
		/*yy_scan_bytes(curdef_text + n, k - n);*/
		yy_scan_string(curdef_text + n);
	}
}

/*
 *-------------------------------------------------------------------------
 * String collection routines
 *-------------------------------------------------------------------------
 */
static void new_string(void)
{
#ifdef DEBUG
	if(strbuf_idx)
		ppy_warning("new_string: strbuf_idx != 0");
#endif
	strbuf_idx = 0;
	str_startline = pp_status.line_number;
}

static void add_string(const char *str, int len)
{
	int new_alloc;
	char *new_buffer;

	if(len == 0)
		return;
	if(strbuf_idx >= strbuf_alloc || strbuf_alloc - strbuf_idx < len)
	{
		new_alloc = strbuf_alloc + ((len + ALLOCBLOCKSIZE-1) & ~(ALLOCBLOCKSIZE-1));
		new_buffer = pp_xrealloc(strbuffer, new_alloc * sizeof(strbuffer[0]));
		if(!new_buffer)
			return;
		strbuffer = new_buffer;
		strbuf_alloc = new_alloc;
		if(strbuf_alloc > 65536)
			ppy_warning("Reallocating string buffer larger than 64kB");
	}
	memcpy(&strbuffer[strbuf_idx], str, len);
	strbuf_idx += len;
}

static char *get_string(void)
{
	char *str = pp_xmalloc(strbuf_idx + 1);
	if(!str)
		return NULL;
	memcpy(str, strbuffer, strbuf_idx);
	str[strbuf_idx] = '\0';
#ifdef DEBUG
	strbuf_idx = 0;
#endif
	return str;
}

static void put_string(void)
{
	put_buffer(strbuffer, strbuf_idx);
#ifdef DEBUG
	strbuf_idx = 0;
#endif
}

static int string_start(void)
{
	return str_startline;
}


/*
 *-------------------------------------------------------------------------
 * Buffer management
 *-------------------------------------------------------------------------
 */
static void push_buffer(pp_entry_t *ppp, char *filename, char *incname, int pop)
{
	if(ppy_debug)
		printf("push_buffer(%d): %p %p %p %d\n", bufferstackidx, ppp, filename, incname, pop);
	if(bufferstackidx >= MAXBUFFERSTACK)
		pp_internal_error(__FILE__, __LINE__, "Buffer stack overflow");

	memset(&bufferstack[bufferstackidx], 0, sizeof(bufferstack[0]));
	bufferstack[bufferstackidx].bufferstate	= YY_CURRENT_BUFFER;
	bufferstack[bufferstackidx].filehandle  = pp_status.file;
	bufferstack[bufferstackidx].define	= ppp;
	bufferstack[bufferstackidx].line_number	= pp_status.line_number;
	bufferstack[bufferstackidx].char_number	= pp_status.char_number;
	bufferstack[bufferstackidx].if_depth	= pp_get_if_depth();
	bufferstack[bufferstackidx].should_pop	= pop;
	bufferstack[bufferstackidx].filename	= pp_status.input;
	bufferstack[bufferstackidx].ncontinuations	= ncontinuations;
	bufferstack[bufferstackidx].incl		= pp_incl_state;
	bufferstack[bufferstackidx].include_filename	= incname;

	if(ppp)
		ppp->expanding = 1;
	else if(filename)
	{
		/* These will track the ppy_error to the correct file and line */
		pp_status.line_number = 1;
		pp_status.char_number = 1;
		pp_status.input  = filename;
		ncontinuations = 0;
	}
	else if(!pop)
		pp_internal_error(__FILE__, __LINE__, "Pushing buffer without knowing where to go to");
	bufferstackidx++;
}

static bufferstackentry_t *pop_buffer(void)
{
	if(bufferstackidx < 0)
		pp_internal_error(__FILE__, __LINE__, "Bufferstack underflow?");

	if(bufferstackidx == 0)
		return NULL;

	bufferstackidx--;

	if(bufferstack[bufferstackidx].define)
		bufferstack[bufferstackidx].define->expanding = 0;
	else
	{
		includelogicentry_t *iep = NULL;

		if(!bufferstack[bufferstackidx].should_pop)
		{
			fclose(pp_status.file);
			pp_writestring("# %d \"%s\" 2\n", bufferstack[bufferstackidx].line_number, bufferstack[bufferstackidx].filename);

			/* We have EOF, check the include logic */
			if(pp_incl_state.state == 2 && !pp_incl_state.seen_junk && pp_incl_state.ppp)
			{
				pp_entry_t *ppp = pplookup(pp_incl_state.ppp);
				if(ppp)
				{
					iep = pp_xmalloc(sizeof(includelogicentry_t));
					if (iep)
					{
						iep->ppp = ppp;
						ppp->iep = iep;
						iep->filename = bufferstack[bufferstackidx].include_filename;
						iep->prev = NULL;
						iep->next = pp_includelogiclist;
						if(iep->next)
							iep->next->prev = iep;
						pp_includelogiclist = iep;
						if(pp_status.debug)
							fprintf(stderr, "pop_buffer: %s:%d: includelogic added, include_ppp='%s', file='%s'\n",
                                                                bufferstack[bufferstackidx].filename, bufferstack[bufferstackidx].line_number, pp_incl_state.ppp, iep->filename);
					}
				}
			}
			free(pp_incl_state.ppp);
			pp_incl_state	= bufferstack[bufferstackidx].incl;

		}
		if (bufferstack[bufferstackidx].include_filename)
		{
			free(pp_status.input);
			pp_status.input = bufferstack[bufferstackidx].filename;
		}
		pp_status.line_number = bufferstack[bufferstackidx].line_number;
		pp_status.char_number = bufferstack[bufferstackidx].char_number;
		ncontinuations = bufferstack[bufferstackidx].ncontinuations;
		if (!iep)
			free(bufferstack[bufferstackidx].include_filename);
	}

	if(ppy_debug)
		printf("pop_buffer(%d): %p %p (%d, %d, %d) %p %d\n",
			bufferstackidx,
			bufferstack[bufferstackidx].bufferstate,
			bufferstack[bufferstackidx].define,
			bufferstack[bufferstackidx].line_number,
			bufferstack[bufferstackidx].char_number,
			bufferstack[bufferstackidx].if_depth,
			bufferstack[bufferstackidx].filename,
			bufferstack[bufferstackidx].should_pop);

	pp_status.file = bufferstack[bufferstackidx].filehandle;
	ppy__switch_to_buffer(bufferstack[bufferstackidx].bufferstate);

	if(bufferstack[bufferstackidx].should_pop)
	{
		if(yy_current_state() == pp_macexp)
			macro_add_expansion();
		else
			pp_internal_error(__FILE__, __LINE__, "Pop buffer and state without macro expansion state");
		yy_pop_state();
	}

	return &bufferstack[bufferstackidx];
}


/*
 *-------------------------------------------------------------------------
 * Macro nestng support
 *-------------------------------------------------------------------------
 */
static void push_macro(pp_entry_t *ppp)
{
	if(macexpstackidx >= MAXMACEXPSTACK)
	{
		ppy_error("Too many nested macros");
		return;
	}

	macexpstack[macexpstackidx] = pp_xmalloc(sizeof(macexpstack[0][0]));
	if(!macexpstack[macexpstackidx])
		return;
        memset( macexpstack[macexpstackidx], 0, sizeof(macexpstack[0][0]));
	macexpstack[macexpstackidx]->ppp = ppp;
	macexpstackidx++;
}

static macexpstackentry_t *top_macro(void)
{
	return macexpstackidx > 0 ? macexpstack[macexpstackidx-1] : NULL;
}

static macexpstackentry_t *pop_macro(void)
{
	if(macexpstackidx <= 0)
		pp_internal_error(__FILE__, __LINE__, "Macro expansion stack underflow\n");
	return macexpstack[--macexpstackidx];
}

static void free_macro(macexpstackentry_t *mep)
{
	int i;

	for(i = 0; i < mep->nargs; i++)
		free(mep->args[i]);
	free(mep->args);
	free(mep->nnls);
	free(mep->curarg);
	free(mep);
}

static void add_text_to_macro(const char *text, int len)
{
	macexpstackentry_t *mep = top_macro();

	assert(mep->ppp->expanding == 0);

	if(mep->curargalloc - mep->curargsize <= len+1)	/* +1 for '\0' */
	{
		char *new_curarg;
		int new_alloc =	mep->curargalloc + ((ALLOCBLOCKSIZE > len+1) ? ALLOCBLOCKSIZE : len+1);
		new_curarg = pp_xrealloc(mep->curarg, new_alloc * sizeof(mep->curarg[0]));
		if(!new_curarg)
			return;
		mep->curarg = new_curarg;
		mep->curargalloc = new_alloc;
	}
	memcpy(mep->curarg + mep->curargsize, text, len);
	mep->curargsize += len;
	mep->curarg[mep->curargsize] = '\0';
}

static void macro_add_arg(int last)
{
	int nnl = 0;
	char *cptr;
	char **new_args, **new_ppargs;
	int *new_nnls;
	macexpstackentry_t *mep = top_macro();

	assert(mep->ppp->expanding == 0);

	new_args = pp_xrealloc(mep->args, (mep->nargs+1) * sizeof(mep->args[0]));
	if(!new_args)
		return;
	mep->args = new_args;

	new_ppargs = pp_xrealloc(mep->ppargs, (mep->nargs+1) * sizeof(mep->ppargs[0]));
	if(!new_ppargs)
		return;
	mep->ppargs = new_ppargs;

	new_nnls = pp_xrealloc(mep->nnls, (mep->nargs+1) * sizeof(mep->nnls[0]));
	if(!new_nnls)
		return;
	mep->nnls = new_nnls;

	mep->args[mep->nargs] = pp_xstrdup(mep->curarg ? mep->curarg : "");
	if(!mep->args[mep->nargs])
		return;
	cptr = mep->args[mep->nargs]-1;
	while((cptr = strchr(cptr+1, '\n')))
	{
		nnl++;
	}
	mep->nnls[mep->nargs] = nnl;
	mep->nargs++;
	free(mep->curarg);
	mep->curargalloc = mep->curargsize = 0;
	mep->curarg = NULL;

	if(pp_flex_debug)
		fprintf(stderr, "macro_add_arg: %s:%d: %d -> '%s'\n",
			pp_status.input,
			pp_status.line_number,
			mep->nargs-1,
			mep->args[mep->nargs-1]);

	/* Each macro argument must be expanded to cope with stingize */
	if(last || mep->args[mep->nargs-1][0])
	{
		yy_push_state(pp_macexp);
		push_buffer(NULL, NULL, NULL, last ? 2 : 1);
		yy_scan_string(mep->args[mep->nargs-1]);
		/*mep->bufferstackidx = bufferstackidx;	 But not nested! */
	}
}

static void macro_add_expansion(void)
{
	macexpstackentry_t *mep = top_macro();

	assert(mep->ppp->expanding == 0);

	mep->ppargs[mep->nargs-1] = pp_xstrdup(mep->curarg ? mep->curarg : "");
	free(mep->curarg);
	mep->curargalloc = mep->curargsize = 0;
	mep->curarg = NULL;

	if(pp_flex_debug)
		fprintf(stderr, "macro_add_expansion: %s:%d: %d -> '%s'\n",
			pp_status.input,
			pp_status.line_number,
			mep->nargs-1,
			mep->ppargs[mep->nargs-1] ? mep->ppargs[mep->nargs-1] : "");
}


/*
 *-------------------------------------------------------------------------
 * Output management
 *-------------------------------------------------------------------------
 */
static void put_buffer(const char *s, int len)
{
	if(top_macro())
		add_text_to_macro(s, len);
	else
		fwrite(s, 1, len, ppy_out);
}


/*
 *-------------------------------------------------------------------------
 * Include management
 *-------------------------------------------------------------------------
 */
void pp_do_include(char *fname, int type)
{
	char *newpath;
	int n;
	includelogicentry_t *iep;
	void *fp;

	if(!fname)
		return;

	for(iep = pp_includelogiclist; iep; iep = iep->next)
	{
		if(!strcmp(iep->filename, fname))
		{
			/*
			 * We are done. The file was included before.
			 * If the define was deleted, then this entry would have
			 * been deleted too.
			 */
			free(fname);
			return;
		}
	}

	n = strlen(fname);

	if(n <= 2)
	{
		ppy_error("Empty include filename");
		free(fname);
		return;
	}

	/* Undo the effect of the quotation */
	fname[n-1] = '\0';

	if((fp = pp_open_include(fname+1, type, pp_status.input, &newpath)) == NULL)
	{
		ppy_error("Unable to open include file %s", fname+1);
		free(fname);
		return;
	}

	fname[n-1] = *fname;	/* Redo the quotes */
	push_buffer(NULL, newpath, fname, 0);
	pp_incl_state.seen_junk = 0;
	pp_incl_state.state = 0;
	pp_incl_state.ppp = NULL;

	if(pp_status.debug)
		fprintf(stderr, "pp_do_include: %s:%d: include_state=%d, include_ifdepth=%d\n",
                        pp_status.input, pp_status.line_number, pp_incl_state.state, pp_incl_state.ifdepth);
	pp_status.file = fp;
	ppy__switch_to_buffer(ppy__create_buffer(NULL, YY_BUF_SIZE));

	pp_writestring("# 1 \"%s\" 1%s\n", newpath, type ? "" : " 3");
}

/*
 *-------------------------------------------------------------------------
 * Push/pop preprocessor ignore state when processing conditionals
 * which are false.
 *-------------------------------------------------------------------------
 */
void pp_push_ignore_state(void)
{
	yy_push_state(pp_ignore);
}

void pp_pop_ignore_state(void)
{
	yy_pop_state();
}

