/* A lexical scanner generated by flex */
/* First, we deal with platform-specific or compiler-specific issues. */
#include "stdhdr.h"
/* begin standard C headers. */
/* flex integer type definitions */
#if defined(__GNUC__) && __GNUC__ >= 3
#define yynoreturn __attribute__((__noreturn__))
#else
#define yynoreturn
#endif
/* Promotes a possibly negative, possibly signed char to an unsigned
* integer for use as an array index. If the signed char is negative,
* we want to instead treat it as an 8-bit unsigned char, hence the
* double cast.
*/
#define YY_SC_TO_UI(c) ((unsigned) (unsigned char) c)
static int yy_start = 0; /* start state number */
/* 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.
*/
static void BEGIN(int x) {yy_start = 1 + 2 * x;}
/* Translate the current start state into a value that can be later handed
* to BEGIN to return to the state.
*/
static int YY_START() {return (yy_start - 1) / 2;}
/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
/* Size of default input buffer. */
#define YY_BUF_SIZE 16384
/* 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(int))
#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 pptext. */ \
size_t yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
*yy_cp = (yy_hold_char); \
(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - 0; \
YY_DO_BEFORE_ACTION; /* set up pptext again */ \
} \
while ( 0 )
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;
enum{
YY_BUFFER_NEW = 0,
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 "pnew"
* (via pprestart()), so that the user can continue scanning by
* just pointing ppin at a pnew input file.
*/
YY_BUFFER_EOF_PENDING = 2,
}yy_buffer_status;
};
typedef struct yy_buffer_state *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 pptext is formed. */
static char yy_hold_char;
static int yy_n_chars; /* number of characters read into yy_ch_buf */
int ppleng;
/* Points to current character in buffer. */
static char *yy_c_buf_p = NULL;
static int yy_init = 0; /* whether we need to initialize */
/* Flag which is used to allow ppwrap()'s to do buffer switches
* instead of setting up a fresh ppin. A bit of a hack ...
*/
static int yy_did_buffer_switch_on_eof;
void pprestart (FILE *input_file );
void pp_switch_to_buffer (YY_BUFFER_STATE new_buffer );
YY_BUFFER_STATE pp_create_buffer (FILE *file,int size );
void pp_delete_buffer (YY_BUFFER_STATE b );
void pp_flush_buffer (YY_BUFFER_STATE b );
void pppush_buffer_state (YY_BUFFER_STATE new_buffer );
void pppop_buffer_state (void );
static void ppensure_buffer_stack (void );
static void pp_load_buffer_state (void );
static void pp_init_buffer (YY_BUFFER_STATE b,FILE *file );
#define YY_FLUSH_BUFFER pp_flush_buffer(YY_CURRENT_BUFFER )
YY_BUFFER_STATE pp_scan_buffer (char *base,size_t size );
YY_BUFFER_STATE pp_scan_string (const char *yy_str );
YY_BUFFER_STATE pp_scan_bytes (const char *bytes,int len );
void *ppalloc (size_t );
void *pprealloc (void *,size_t );
void ppfree (void * );
#define yy_new_buffer pp_create_buffer
#define yy_set_interactive(is_interactive) \
{ \
if ( ! YY_CURRENT_BUFFER ){ \
ppensure_buffer_stack (); \
YY_CURRENT_BUFFER_LVALUE = \
pp_create_buffer(ppin,YY_BUF_SIZE ); \
} \
YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
}
#define yy_set_bol(at_bol) \
{ \
if ( ! YY_CURRENT_BUFFER ){\
ppensure_buffer_stack (); \
YY_CURRENT_BUFFER_LVALUE = \
pp_create_buffer(ppin,YY_BUF_SIZE ); \
} \
YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
}
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
static FILE *ppin, *ppout;
static int pplineno = 1;
static int yy_get_previous_state (void );
static int yy_try_NUL_trans (int current_state );
static int yy_get_next_buffer (void );
/* Report a fatal error. */
static void yynoreturn Fatal(const char* msg) {
fprintf( stderr, "%s\n", msg );
exit(2); // EXIT_FAILURE
}
/* Done after the current pattern has been matched and before the
* corresponding action - sets up pptext.
*/
#define YY_DO_BEFORE_ACTION \
(pptext) = yy_bp; \
ppleng = (int) (yy_cp - yy_bp); \
(yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
#define YY_NUM_RULES 41
#define YY_END_OF_BUFFER 42
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info {
int32_t yy_verify;
int32_t yy_nxt;
};
static const int8_t yy_accept[165] = {
0, 36, 36, 36, 36, 36, 36, 42, 38, 36, 40, 35, 38, 38, 38, 38,
37, 36, 37, 23, 11, 37, 33, 34, 37, 22, 22, 37, 37, 37, 11, 11,
11, 11, 11, 11, 11, 11, 11, 37, 36, 35, 35, 35, 0, 0, 0, 0,
39, 0, 0, 30, 23, 23, 23, 11, 11, 6, 31, 11, 19, 22, 13, 17,
20, 15, 22, 25, 28, 0, 29, 27, 26, 0, 11, 11, 11, 11, 11, 0,
0, 0, 11, 11, 0, 11, 32, 35, 35, 35, 35, 0, 5, 0, 0, 0,
23, 23, 23, 23, 11, 12, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0,
0, 0, 0, 11, 9, 0, 0, 11, 35, 35, 0, 0, 0, 0, 23, 23,
10, 0, 24, 24, 0, 0, 14, 18, 21, 8, 16, 11, 0, 0, 2, 0,
23, 0, 0, 7, 0, 1, 3, 23, 23, 23, 0, 23, 23, 23, 23, 23,
0, 23, 23, 4, 0} ;
static const uint8_t yy_ec[256] = {
0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 5, 6, 7, 1, 1, 8, 9, 10, 11, 1, 1, 1, 12, 13, 1,
14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 1, 17, 18, 19, 20, 21,
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 32, 34, 35,
36, 37, 38, 32, 39, 40, 41, 42, 43, 32, 32, 1, 44, 1, 1, 22,
1, 45, 46, 25, 47, 48, 49, 50, 51, 52, 32, 32, 53, 32, 54, 55,
56, 37, 57, 32, 39, 58, 59, 60, 61, 32, 32, 1, 62, 1, 1, 1,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22};
static const uint8_t yy_meta[63] ={
0, 1, 1, 2, 3, 1, 4, 5, 1, 6, 1, 1, 7, 8, 9, 10,
10, 1, 1, 1, 1, 11, 5, 9, 9, 10, 10, 10, 9, 12, 12, 12,
12, 12, 13, 12, 12, 12, 13, 13, 12, 13, 12, 13, 14, 9, 9, 10,
10, 9, 12, 12, 12, 12, 13, 12, 12, 13, 12, 13, 12, 13, 1};
static const uint16_t yy_base[182] = {
0, 0, 51,103, 0, 6, 9,406,854, 12,854, 12, 20, 0, 0, 0,
854, 17,385, 18, 22,394,854,854, 18,142,145, 20,380, 3,391,197,
246,384,379, 28, 31,377, 33,321, 39, 29,854,293, 17, 36, 36,369,
0, 46,147,854, 39,854,346,167,370,368,854,366, 77, 0, 0, 0,
0, 0,249,854,854, 35,854,854,854,324,354,350,348,320,304,253,
85,248,161,175,237,169,854,170,201,402, 0, 49,854,168,182,186,
180,222,446, 0, 77,298, 0, 0, 0, 0,211,204,237,171,186,224,
247, 90,238,248, 79, 24,262,255,304,482,242,133,257,260,350,518,
854, 21,854, 16,227, 0,854,854,854, 11,854,220,260,264,854,266,
245,311, 0, 6,289,854,854,296,302,562,168,314,357,334,615, 0,
303,367,651,854,854,700,714,728,742,752,761,766,775,780,793,801,
808,815,825,352,839,387};
static const uint8_t yy_def[182] = {
0,165,165,164, 3,165,165,164,164,164,164,166,164,167,164,164,
164,164,164,168,169,164,164,164,170,171,171,164,164,164,169,172,
172, 32, 32, 32, 32, 32, 32,164,164,166,164,166,164,164,164,164,
167,164,164,164,168,164,168,169,169,169,164,169,164, 26, 26, 26,
26, 26,173,164,164,164,164,164,164,174, 32, 32, 32, 32, 32,175,
164,176, 32, 32,177, 32,164,166,166,166, 43,164,164,164,164,164,
168,168,168, 54,169,173,101,101,101,101,164,164,178,175,175,164,
164,176,176, 32, 32,177,177, 32,166, 89,164,164,164,164,168, 98,
164,164,164,164,164,179,164,164,164, 32,164, 32,164,164,164,164,
180,164,181, 32,164,164,164,180,180,180,164,180,180,180,180,153,
164,180,158,164, 0,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164,164};
static const uint8_t yy_nxt[917] = {
0,164, 9, 10, 9,164, 11, 12, 9, 10, 9, 9, 10, 9, 40,164,
40, 13, 42, 40,164, 40, 71, 72, 53,130, 14, 49, 50, 55,144, 15,
60, 60, 60, 42,164, 81, 67, 68,164, 40,164, 40, 49, 53, 44, 14,
49, 50, 69, 45, 15, 9, 10, 9, 43, 11, 12, 82, 46, 47, 54, 57,
50, 49, 83, 44, 13, 85, 91, 69, 45, 43, 93,122,106, 14, 46, 47,
82, 57, 15, 54, 55, 50, 83,128,164, 85, 91, 60, 60, 60,106, 93,
122,111, 14,112,112,112,164, 15, 16, 17, 10, 17, 18, 19, 20, 21,
16, 22, 23, 16, 24, 25, 26, 26, 16, 27, 28, 29, 30, 30, 31, 32,
33, 34, 33, 33, 33, 35, 33, 33, 36, 33, 37, 33, 37, 33, 33, 38,
33, 33, 33, 16, 31, 32, 34, 33, 33, 33, 35, 33, 36, 33, 37, 33,
33, 38, 33, 33, 33, 39, 62,141, 63, 62,164, 63, 64, 94, 55, 64,
42, 65,164, 65, 65, 95, 65,164,164, 66, 53,141, 62, 63,115, 62,
63, 64, 94,134, 64, 65,164,123, 65, 95,160, 66, 55,119, 73, 42,
100,124, 56,115,125,130, 43,120,120,116, 56, 56,123, 75,160, 76,
54,119,100, 77, 53,164,124,129, 78,125, 78,116,126,126,112,112,
112,145,145, 75, 76, 43,131,136, 77,117,164,132, 78, 55,152, 79,
135,164,147, 56,113,112,112,112,164,109, 54, 56, 56,140, 75,138,
76,102,164,103, 77,147,137,104,133, 78,139, 78,105,142,105,143,
148,153,140,149, 75, 76,150,102,103, 77,133,137,104, 78, 87,139,
105,152,142, 88,143,148, 42,152,149,164, 87,150, 87, 87, 87, 87,
154, 87,102,152,103,107,107, 87,104,164,163, 87, 87,105, 87,105,
89, 90, 87, 87,153,154, 87,152,102,103,153, 87, 43,104, 87,163,
87,105, 89, 96, 53,164,153,164, 97,146,146,164, 96, 96,152, 96,
108, 96, 96,161,161, 55, 96, 55,152, 55,153, 92, 96,157,157, 86,
96, 96, 84, 96, 80, 98, 99, 96, 96,164, 54, 96,107,107, 55, 70,
96,153, 58, 96, 51, 96,164, 98, 42,164,164,153,164,164,164,164,
121,121,121,164,164,164,164,164,164,121,121,121,121,121,121,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164, 43,121,
121,121,121,121, 53,164,164,164,164,164,164,164,127,127,127,164,
164,164,164,164,164,127,127,127,127,127,127,164,164,164,164,164,
164,164,164,164,164,164,164,164,164,164, 54,127,127,127,127,127,
87, 87, 87,164,164,164,164,164,164, 87, 87, 87, 87, 87, 87,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, 87,
87, 87, 87, 87, 96, 96, 96,164,164,164,164,164,164, 96, 96, 96,
96, 96, 96,164,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164, 96, 96, 96, 96, 96,151,164,164,155,164,164,164,164,
156,164,164,164,164,164,164,157,164,157,157,164,164,164,157,164,
164,164,164,164,157,164,164,164,157,157,164,157,164,158,159,157,
157,164,164,157,164,164,164,164,157,164,164,157,164,157,164,158,
152,164,164,164,164,162,162,162,164,164,164,164,164,164,162,162,
162,162,162,162,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,153,162,162,162,162,162,157,157,157,164,164,164,164,
164,164,157,157,157,157,157,157,164,164,164,164,164,164,164,164,
164,164,164,164,164,164,164,164,157,157,157,157,157, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 41,164,164, 41, 41,
41, 41, 41, 41, 41, 41, 41, 41, 41, 48,164, 48, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 52,164,164, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 56,164,164, 56, 56, 56, 56, 56, 56, 59,164,
164,164, 59, 59, 59, 59, 59, 61, 61,164, 61, 61, 74, 74,164, 74,
74, 74, 74, 74, 74,101,101,164,101,101,107,164,164,164,107,107,
107,107,107,107,107,107,107,107,110,164,110,110,164,110,110,114,
164,114,114,164,114,114,118,164,118,118,164,118,118,107,164,107,
164,164,107,164,107,164,107,107,151,164,164,164,151,151,151,151,
151,151,151,151,151,151, 7,164,164,164,164,164,164,164,164,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164};
static const uint8_t yy_chk[917] = {
0, 0, 1, 1, 1, 0, 1, 1, 5, 5, 5, 6, 6, 6, 9,147,
9, 1, 11, 17,137, 17, 29, 29, 19,131, 1, 14, 15, 20,129, 1,
24, 24, 24, 41,117, 35, 27, 27, 36, 40, 38, 40, 44, 52, 12, 1,
14, 15, 27, 12, 1, 2, 2, 2, 11, 2, 2, 35, 12, 12, 19, 20,
45, 44, 36, 12, 2, 38, 46, 27, 12, 41, 49, 91, 69, 2, 12, 12,
35, 20, 2, 52,100, 45, 36,100,116, 38, 46, 60, 60, 60, 69, 49,
91, 80, 2, 80, 80, 80,113, 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, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 25,123, 25, 26, 82, 26, 25, 50, 55, 26,
87, 25, 85, 25, 26, 50, 26,109, 83, 25, 96,123, 25, 25, 82, 26,
26, 25, 50,110, 26, 25,110, 93, 26, 50,154, 25, 31, 85, 31, 88,
55, 94, 31, 82, 95,107, 87, 88, 88, 83, 31, 31, 93, 31,154, 31,
96, 85, 55, 31, 97,139, 94,106, 31, 95, 31, 83, 97, 97,111,111,
111,132,132, 31, 31, 88,108,114, 31, 84,114,108, 31, 32,144, 32,
112,115,139, 32, 81,112,112,112,119, 79, 97, 32, 32,122, 32,118,
32, 66,118, 66, 32,139,115, 66,108, 32,119, 32, 66,124, 66,125,
140,144,122,141, 32, 32,143, 66, 66, 32,108,115, 66, 32, 43,119,
66,151,124, 43,125,140,120,152,141, 78, 43,143, 43, 43,120,120,
148, 43,101,155,101,145,145, 43,101, 77,160, 43, 43,101, 43,101,
43, 43, 43, 43,151,148, 43,157,101,101,152, 43,120,101, 43,160,
43,101, 43, 54,126, 76,155, 75, 54,179,179, 74,126,126,156, 54,
73, 54, 54,156,156, 59, 54, 57,161, 56,157, 47, 54,161,161, 39,
54, 54, 37, 54, 34, 54, 54, 54, 54, 33,126, 54,181,181, 30, 28,
54,156, 21, 54, 18, 54, 7, 54, 89, 0, 0,161, 0, 0, 0, 0,
89, 89, 89, 0, 0, 0, 0, 0, 0, 89, 89, 89, 89, 89, 89, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 89,
89, 89, 89, 89, 98, 0, 0, 0, 0, 0, 0, 0, 98, 98, 98, 0,
0, 0, 0, 0, 0, 98, 98, 98, 98, 98, 98, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 98, 98, 98, 98, 98,
121,121,121, 0, 0, 0, 0, 0, 0,121,121,121,121,121,121, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,121,
121,121,121,121,127,127,127, 0, 0, 0, 0, 0, 0,127,127,127,
127,127,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,127,127,127,127,127,153, 0, 0,153, 0, 0, 0, 0,
153, 0, 0, 0, 0, 0, 0,153, 0,153,153, 0, 0, 0,153, 0,
0, 0, 0, 0,153, 0, 0, 0,153,153, 0,153, 0,153,153,153,
153, 0, 0,153, 0, 0, 0, 0,153, 0, 0,153, 0,153, 0,153,
158, 0, 0, 0, 0,158,158,158, 0, 0, 0, 0, 0, 0,158,158,
158,158,158,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0,158,158,158,158,158,158,162,162,162, 0, 0, 0, 0,
0, 0,162,162,162,162,162,162, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,162,162,162,162,162,165,165,165,
165,165,165,165,165,165,165,165,165,165,165,166, 0, 0,166,166,
166,166,166,166,166,166,166,166,166,167, 0,167,167,167,167,167,
167,167,167,167,167,167,167,168, 0, 0,168,168,168,168,168,168,
168,168,168,168,168,169, 0, 0,169,169,169,169,169,169,170, 0,
0, 0,170,170,170,170,170,171,171, 0,171,171,172,172, 0,172,
172,172,172,172,172,173,173, 0,173,173,174, 0, 0, 0,174,174,
174,174,174,174,174,174,174,174,175, 0,175,175, 0,175,175,176,
0,176,176, 0,176,176,177, 0,177,177, 0,177,177,178, 0,178,
0, 0,178, 0,178, 0,178,178,180, 0, 0, 0,180,180,180,180,
180,180,180,180,180,180,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
164,164,164,164,164};
static int yy_last_accepting_state;
static char *yy_last_accepting_cpos;
/* The intent behind this definition is that it'll catch
* any uses of REJECT which flex missed.
*/
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
char *pptext;
/* lexical analyser for gpasm preprocessor #v() evaluation
Copyright 2012 Borut Ražem
*/
#include "libgputils.h"
#include "gpasm.h"
#include "gpmsg.h"
#include "preprocess.h"
#include "ppparse.h"
#define OPERATOR(x) return (pplval.i = (x))
#define YY_USER_ACTION ppcol_end += ppleng;
int ppcol_begin;
int ppcol_end;
static int brack_depth;
static bool found_hv;
enum{
INITIAL = 0,
hv = 1,
def = 2,
};
static int yy_init_globals (void );
/* Accessor methods to globals.
These are made visible to non-reentrant scanners for convenience. */
static int pplex_destroy (void );
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
static void yyunput (int c,char *buf_ptr );
/* Amount of stuff to slurp up with each read. */
#define YY_READ_BUF_SIZE 8192
/* 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( ppin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
if ( c == '\n' ) \
buf[n++] = (char) c; \
if ( c == EOF && ferror( ppin ) ) \
Fatal( "input in flex scanner failed" ); \
result = n; \
} \
else \
{ \
errno=0; \
while ( (result = (int) fread(buf, 1, (size_t) max_size, ppin)) == 0 && ferror(ppin)) \
{ \
if( errno != EINTR) \
{ \
Fatal( "input in flex scanner failed" ); \
break; \
} \
errno=0; \
clearerr(ppin); \
} \
}\
\
#endif
/* end tables serialization structures and prototypes */
/* Code executed at the beginning of each rule, after pptext and ppleng
* have been set up.
*/
#define YY_RULE_SETUP YY_USER_ACTION
/** The main scanner function which does all the work.
*/
int pplex (void) {
int 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 ( ! ppin )
ppin = stdin;
if ( ! ppout )
ppout = stdout;
if ( ! YY_CURRENT_BUFFER ) {
ppensure_buffer_stack ();
YY_CURRENT_BUFFER_LVALUE =
pp_create_buffer(ppin,YY_BUF_SIZE );
}
pp_load_buffer_state( );
}
{
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
yy_cp = (yy_c_buf_p);
/* Support of pptext. */
*yy_cp = (yy_hold_char);
/* yy_bp points to the position in yy_ch_buf of the start of
* the current run.
*/
yy_bp = yy_cp;
yy_current_state = (yy_start);
yy_match:
do
{
unsigned 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 >= 165 )
yy_c = yy_meta[(unsigned) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (int16_t) yy_c];
++yy_cp;
}
while ( yy_base[yy_current_state] != 854 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
if ( yy_act == 0 )
{ /* have to back up */
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
yy_act = yy_accept[yy_current_state];
}
YY_DO_BEFORE_ACTION;
do_action: /* This label is used only to access EOF actions. */
switch ( yy_act )
{ /* beginning of action switch */
case 0: /* must back up */
/* undo the effects of YY_DO_BEFORE_ACTION */
*yy_cp = (yy_hold_char);
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
goto yy_find_action;
case 1:
case 2:
case 3:
case 4:
YY_RULE_SETUP
{
BEGIN(def);
}
break;
case 5:
YY_RULE_SETUP
{
BEGIN(hv);
brack_depth = 1;
ppcol_begin = ppcol_end - ppleng;
found_hv = true;
return HV;
}
break;
case 6:
YY_RULE_SETUP
/* ignore inner #v-s */
break;
case 7:
YY_RULE_SETUP
{
pplval.i = UPPER;
return UPPER;
}
break;
case 8:
YY_RULE_SETUP
{
pplval.i = HIGH;
return HIGH;
}
break;
case 9:
YY_RULE_SETUP
{
pplval.i = LOW;
return LOW;
}
break;
case 10:
YY_RULE_SETUP
{
int i = ppleng - 3;
pplval.s = GP_Strndup(pptext, i);
yyunput('(', (pptext));
++brack_depth;
return IDENTIFIER;
}
break;
case 11:
YY_RULE_SETUP
{
pplval.s = GP_Strdup(pptext);
return IDENTIFIER;
}
break;
case 12:
YY_RULE_SETUP
{
pplval.i = string_to_int(pptext + 2, 16);
return NUMBER;
}
break;
case 13:
YY_RULE_SETUP
{
if (state.radix == 16) {
pplval.i = string_to_int(pptext, 16);
return NUMBER;
}
else {
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext, 2);
return NUMBER;
}
}
break;
case 14:
YY_RULE_SETUP
{
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext + 2, 2);
return NUMBER;
}
break;
case 15:
YY_RULE_SETUP
{
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext, 8);
return NUMBER;
}
break;
case 16:
YY_RULE_SETUP
{
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext + 2, 8);
return NUMBER;
}
break;
case 17:
YY_RULE_SETUP
{
if (state.radix == 16) {
pplval.i = string_to_int(pptext, 16);
return NUMBER;
}
else {
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext, 10);
return NUMBER;
}
}
break;
case 18:
YY_RULE_SETUP
{
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext + 2, 10);
return NUMBER;
}
break;
case 19:
YY_RULE_SETUP
{
pplval.i = string_to_int(pptext + 1, 10);
return NUMBER;
}
break;
case 20:
YY_RULE_SETUP
{
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext, 16);
return NUMBER;
}
break;
case 21:
YY_RULE_SETUP
{
pptext[ppleng - 1] = '\0';
pplval.i = string_to_int(pptext + 2, 16);
return NUMBER;
}
break;
case 22:
YY_RULE_SETUP
{
pplval.i = string_to_int(pptext, state.radix);
return NUMBER;
}
break;
case 23: // String?
YY_RULE_SETUP
{
const char *pc;
if ((ppleng > 1) && (pptext[ppleng - 1] == '"')) {
--ppleng;
}
else {
gpmsg(GPW_MISSING_QUOTE, NULL);
}
pc = convert_escape_chars(pptext + 1, &pplval.i,false);
if (pc != &pptext[ppleng]) {
gpmsg(GPE_ILLEGAL_ARGU, NULL, pptext);
}
return NUMBER;
}
break;
case 24:
YY_RULE_SETUP
{
const char *pc = convert_escape_chars(pptext + 2, &pplval.i,false);
assert(pc == &pptext[ppleng - 1]);
return NUMBER;
}
break;
case 25:
YY_RULE_SETUP
OPERATOR(LSH);
break;
case 26:
YY_RULE_SETUP
OPERATOR(RSH);
break;
case 27:
YY_RULE_SETUP
OPERATOR(GREATER_EQUAL);
break;
case 28:
YY_RULE_SETUP
OPERATOR(LESS_EQUAL);
break;
case 29:
YY_RULE_SETUP
OPERATOR(EQUAL);
break;
case 30:
YY_RULE_SETUP
OPERATOR(NOT_EQUAL);
break;
case 31:
YY_RULE_SETUP
OPERATOR(LOGICAL_AND);
break;
case 32:
YY_RULE_SETUP
OPERATOR(LOGICAL_OR);
break;
case 33:
YY_RULE_SETUP
{
++brack_depth;
return pptext[0];
}
break;
case 34:
YY_RULE_SETUP
{
if (--brack_depth <= 0) {
BEGIN(INITIAL);
return 0;
}
return pptext[0];
}
break;
case 35:
YY_RULE_SETUP
break;
case 36:
YY_RULE_SETUP
break;
case 37:
YY_RULE_SETUP
{
pplval.i = pptext[0];
return pptext[0];
}
break;
case 38:
YY_RULE_SETUP
break;
case 39:
case 40:
/* rule 40 can match eol */
YY_RULE_SETUP
{
BEGIN(INITIAL);
}
break;
case 41:
YY_RULE_SETUP
fwrite( pptext, (size_t) ppleng, 1, ppout ); // ECHO
break;
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(hv):
case YY_STATE_EOF(def):
return 0;
case YY_END_OF_BUFFER:
{
/* Amount of text matched not including the EOB char. */
int yy_amount_of_matched_text = (int) (yy_cp - (pptext)) - 1;
/* Undo the effects of YY_DO_BEFORE_ACTION. */
*yy_cp = (yy_hold_char);
if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == yy_buffer_state::YY_BUFFER_NEW )
{
/* We're scanning a pnew file or input source. It's
* possible that this happened because the user
* just pointed ppin at a pnew source and called
* pplex(). 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 pnew input source.
*/
(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
YY_CURRENT_BUFFER_LVALUE->yy_input_file = ppin;
YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = yy_buffer_state::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. */
int yy_next_state;
(yy_c_buf_p) = (pptext) + 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 = (pptext) + 0;
if ( yy_next_state )
{
/* Consume the NUL. */
yy_cp = ++(yy_c_buf_p);
yy_current_state = yy_next_state;
goto yy_match;
}
else
{
yy_cp = (yy_c_buf_p);
goto yy_find_action;
}
}
else switch ( yy_get_next_buffer( ) )
{
case EOB_ACT_END_OF_FILE:
{
(yy_did_buffer_switch_on_eof) = 0;
if (1)
{
/* Note: because we've taken care in
* yy_get_next_buffer() to have set up
* pptext, 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) = (pptext) + 0;
yy_act = YY_STATE_EOF(YY_START());
goto do_action;
}
else
{
if ( ! (yy_did_buffer_switch_on_eof) )
pprestart(ppin);
}
break;
}
case EOB_ACT_CONTINUE_SCAN:
(yy_c_buf_p) =
(pptext) + yy_amount_of_matched_text;
yy_current_state = yy_get_previous_state( );
yy_cp = (yy_c_buf_p);
yy_bp = (pptext) + 0;
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 = (pptext) + 0;
goto yy_find_action;
}
break;
}
default:
Fatal(
"fatal flex scanner internal error--no action found" );
} /* end of action switch */
} /* end of scanning one token */
} /* end of user's declarations */
} /* end of pplex */
/* yy_get_next_buffer - try to read in a pnew 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 = (pptext);
size_t number_to_move, i;
int ret_val;
if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
Fatal(
"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) - (pptext) - 0 == 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 = (size_t) ((yy_c_buf_p) - (pptext)) - 1;
for ( i = 0; i < number_to_move; ++i )
*(dest++) = *(source++);
if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == yy_buffer_state::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. */
pprealloc((void *) b->yy_ch_buf,(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 )
Fatal(
"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 == 0 )
{
ret_val = EOB_ACT_END_OF_FILE;
pprestart(ppin );
}
else
{
ret_val = EOB_ACT_LAST_MATCH;
YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
yy_buffer_state::YY_BUFFER_EOF_PENDING;
}
}
else
ret_val = EOB_ACT_CONTINUE_SCAN;
if ((int) ((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 *) pprealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,(size_t) new_size );
if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
Fatal( "out of dynamic memory in yy_get_next_buffer()" );
}
(yy_n_chars) += number_to_move;
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = 0;
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = 0;
(pptext) = &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 int yy_get_previous_state (void)
{
int yy_current_state;
char *yy_cp;
yy_current_state = (yy_start);
for ( yy_cp = (pptext) + 0; yy_cp < (yy_c_buf_p); ++yy_cp )
{
unsigned 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 >= 165 )
yy_c = yy_meta[(unsigned) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (int16_t) 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 int yy_try_NUL_trans (int yy_current_state )
{
int yy_is_jam;
char *yy_cp = (yy_c_buf_p);
unsigned 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 >= 165 )
yy_c = yy_meta[(unsigned) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (int16_t) yy_c];
yy_is_jam = (yy_current_state == 164);
return yy_is_jam ? 0 : yy_current_state;
}
static void yyunput (int c, char * yy_bp ) {
char *yy_cp;
yy_cp = (yy_c_buf_p);
/* undo effects of setting up pptext */
*yy_cp = (yy_hold_char);
if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
{ /* need to shift things up to make room */
/* +2 for EOB chars. */
int number_to_move = (yy_n_chars) + 2;
char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
char *source =
&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
*--dest = *--source;
yy_cp += (int) (dest - source);
yy_bp += (int) (dest - source);
YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
(yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
Fatal( "flex scanner push-back overflow" );
}
*--yy_cp = (char) c;
(pptext) = yy_bp;
(yy_hold_char) = *yy_cp;
(yy_c_buf_p) = yy_cp;
}
/** 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 pprestart (FILE * input_file )
{
if ( ! YY_CURRENT_BUFFER ){
ppensure_buffer_stack ();
YY_CURRENT_BUFFER_LVALUE =
pp_create_buffer(ppin,YY_BUF_SIZE );
}
pp_init_buffer(YY_CURRENT_BUFFER,input_file );
pp_load_buffer_state( );
}
/** Switch to a different input buffer.
* @param new_buffer The pnew input buffer.
*
*/
void pp_switch_to_buffer (YY_BUFFER_STATE new_buffer )
{
/* TODO. We should be able to replace this entire function body
* with
* pppop_buffer_state();
* pppush_buffer_state(new_buffer);
*/
ppensure_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;
pp_load_buffer_state( );
/* We don't actually know whether we did this switch during
* EOF (ppwrap()) processing, but the only time this flag
* is looked at is after ppwrap() is called, so it's safe
* to go ahead and always set it.
*/
(yy_did_buffer_switch_on_eof) = 1;
}
static void pp_load_buffer_state (void)
{
(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
(pptext) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
ppin = 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 pp_create_buffer (FILE * file, int size )
{
YY_BUFFER_STATE b;
b = (YY_BUFFER_STATE) ppalloc(sizeof( struct yy_buffer_state ) );
if ( ! b )
Fatal( "out of dynamic memory in pp_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 *) ppalloc((size_t) (b->yy_buf_size + 2) );
if ( ! b->yy_ch_buf )
Fatal( "out of dynamic memory in pp_create_buffer()" );
b->yy_is_our_buffer = 1;
pp_init_buffer(b,file );
return b;
}
/** Destroy the buffer.
* @param b a buffer created with pp_create_buffer()
*
*/
void pp_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 )
ppfree((void *) b->yy_ch_buf );
ppfree((void *) b );
}
/* Initializes or reinitializes a buffer.
* This function is sometimes called more than once on the same buffer,
* such as during a pprestart() or at EOF.
*/
static void pp_init_buffer (YY_BUFFER_STATE b, FILE * file )
{
int oerrno = errno;
pp_flush_buffer(b );
b->yy_input_file = file;
b->yy_fill_buffer = 1;
/* If b is the current buffer, then pp_init_buffer was _probably_
* called from pprestart() 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 = file ? (isatty( fileno(file) ) > 0) : 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 pp_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] = 0;
b->yy_ch_buf[1] = 0;
b->yy_buf_pos = &b->yy_ch_buf[0];
b->yy_at_bol = 1;
b->yy_buffer_status = yy_buffer_state::YY_BUFFER_NEW;
if ( b == YY_CURRENT_BUFFER )
pp_load_buffer_state( );
}
/** Pushes the pnew state onto the stack. The pnew state becomes
* the current state. This function will allocate the stack
* if necessary.
* @param new_buffer The pnew state.
*
*/
void pppush_buffer_state (YY_BUFFER_STATE new_buffer )
{
if (new_buffer == NULL)
return;
ppensure_buffer_stack();
/* This block is copied from pp_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 pp_switch_to_buffer. */
pp_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 pnew top.
*
*/
void pppop_buffer_state (void)
{
if (!YY_CURRENT_BUFFER)
return;
pp_delete_buffer(YY_CURRENT_BUFFER );
YY_CURRENT_BUFFER_LVALUE = NULL;
if ((yy_buffer_stack_top) > 0)
--(yy_buffer_stack_top);
if (YY_CURRENT_BUFFER) {
pp_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 ppensure_buffer_stack (void) {
int 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**)ppalloc
(num_to_alloc * sizeof(struct yy_buffer_state*)
);
if ( ! (yy_buffer_stack) )
Fatal( "out of dynamic memory in ppensure_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. */
size_t grow_size = 8 /* arbitrary grow size */;
num_to_alloc = (yy_buffer_stack_max) + grow_size;
(yy_buffer_stack) = (struct yy_buffer_state**)pprealloc
((yy_buffer_stack),
num_to_alloc * sizeof(struct yy_buffer_state*)
);
if ( ! (yy_buffer_stack) )
Fatal( "out of dynamic memory in ppensure_buffer_stack()" );
/* zero only the pnew 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 pp_scan_buffer (char * base, size_t size )
{
YY_BUFFER_STATE b;
if ( size < 2 ||
base[size-2] != 0 ||
base[size-1] != 0 )
/* They forgot to leave room for the EOB's. */
return NULL;
b = (YY_BUFFER_STATE) ppalloc(sizeof( struct yy_buffer_state ) );
if ( ! b )
Fatal( "out of dynamic memory in pp_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_state::YY_BUFFER_NEW;
pp_switch_to_buffer(b );
return b;
}
/** Setup the input buffer state to scan a string. The next call to pplex() 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
* pp_scan_bytes() instead.
*/
YY_BUFFER_STATE pp_scan_string (const char * yystr )
{
return pp_scan_bytes(yystr,(int) strlen(yystr) );
}
/** Setup the input buffer state to scan the given bytes. The next call to pplex() 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 pp_scan_bytes (const char * yybytes, int _yybytes_len )
{
YY_BUFFER_STATE b;
char *buf;
size_t n;
size_t i;
/* Get memory for full buffer, including space for trailing EOB's. */
n = (size_t) _yybytes_len + 2;
buf = (char *) ppalloc(n );
if ( ! buf )
Fatal( "out of dynamic memory in pp_scan_bytes()" );
for ( i = 0; i < (unsigned)_yybytes_len; ++i )
buf[i] = yybytes[i];
buf[_yybytes_len] = buf[_yybytes_len+1] = 0;
b = pp_scan_buffer(buf,n );
if ( ! b )
Fatal( "bad buffer in pp_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;
}
/* Redefine yyless() so it works in section 3 code. */
#undef yyless
#define yyless(n) \
do \
{ \
/* Undo effects of setting up pptext. */ \
size_t yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
pptext[ppleng] = (yy_hold_char); \
(yy_c_buf_p) = pptext + yyless_macro_arg; \
(yy_hold_char) = *(yy_c_buf_p); \
*(yy_c_buf_p) = '\0'; \
ppleng = yyless_macro_arg; \
} \
while ( 0 )
/* Accessor methods (get/set functions) to struct members. */
/** Set the input stream. This does not discard the current
* input buffer.
* @param _in_str A readable stream.
*
* @see pp_switch_to_buffer
*/
static int yy_init_globals (void) {
/* Initialization is the same as for the non-reentrant scanner.
* This function is called from pplex_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;
ppin = NULL;
ppout = NULL;
/* For future reference: Set errno on error, since we are called by
* pplex_init()
*/
return 0;
}
/* pplex_destroy is for both reentrant and non-reentrant scanners. */
static int pplex_destroy(void) {
/* Pop the buffer stack, destroying each element. */
while(YY_CURRENT_BUFFER){
pp_delete_buffer(YY_CURRENT_BUFFER );
YY_CURRENT_BUFFER_LVALUE = NULL;
pppop_buffer_state();
}
/* Destroy the stack itself. */
ppfree((yy_buffer_stack) );
(yy_buffer_stack) = NULL;
/* Reset the globals. This is important in a non-reentrant scanner so the next time
* pplex() is called, initialization will occur. */
yy_init_globals( );
return 0;
}
/*
* Internal utility routines.
*/
#ifndef pptext
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 *ppalloc (size_t size )
{
return malloc(size);
}
void *pprealloc (void * ptr, 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 ppfree (void * ptr )
{
free( (char *) ptr ); /* see pprealloc() for (char *) cast */
}
#define YYTABLES_NAME "yytables"
#if 0
static void
yyprint(FILE *File, int Type, YYSTYPE Value)
{
printf("@%d:", ppcol_end);
switch (Type) {
case IDENTIFIER:
fprintf(File, "'%s' ", Value.s);
break;
case NUMBER:
case UPPER:
case HIGH:
case LOW:
case LSH:
case RSH:
case GREATER_EQUAL:
case LESS_EQUAL:
case EQUAL:
case NOT_EQUAL:
case '<':
case '>':
case '&':
case '|':
case '^':
case LOGICAL_AND:
case LOGICAL_OR:
case '=':
fprintf(File, "'%d' ", Value.i);
break;
case HV:
fprintf(File, "'%d' ", Type);
break;
default: {
if (Type < 256) {
fprintf(File, "'%c' ", Type);
}
else {
fprintf(File, "'?%d?' ", Type);
}
break;
}
}
}
void
lex_line(char *Line)
{
int type;
pp_scan_string(Line);
while ((type = pplex()) != 0) {
yyprint(stdout, type, pplval);
}
pp_delete_buffer(YY_CURRENT_BUFFER);
putchar('\n');
}
#endif
int
ppparse_chunk(char *Buf, int Begin, int End)
{
int res;
pp_scan_bytes(&Buf[Begin],End - Begin);
ppcol_begin = 0;
ppcol_end = 0;
found_hv = false;
BEGIN(INITIAL);
brack_depth = 0;
res = ((ppparse() == 0) && found_hv);
ppcol_begin += Begin;
ppcol_end += Begin;
pp_delete_buffer(YY_CURRENT_BUFFER);
return res;
}
Vorgefundene Kodierung: UTF-8 | 0
|