diff --git a/src/FlexLexer.h b/src/FlexLexer.h index c4dad2b1..84de9b58 100644 --- a/src/FlexLexer.h +++ b/src/FlexLexer.h @@ -139,6 +139,7 @@ public: void yypush_buffer_state( yy_buffer_state* new_buffer ); void yypop_buffer_state(); + virtual int yyread(char *buf, size_t); virtual int yylex(); virtual void switch_streams( std::istream& new_in, std::ostream& new_out ); virtual void switch_streams( std::istream* new_in = 0, std::ostream* new_out = 0 ); @@ -148,7 +149,7 @@ protected: virtual int LexerInput( char* buf, int max_size ); virtual void LexerOutput( const char* buf, int size ); virtual void LexerError( const char* msg ); - + void yyunput( int c, char* buf_ptr ); int yyinput(); diff --git a/src/cpp-flex.skl b/src/cpp-flex.skl index c6b4c9a8..45932f85 100644 --- a/src/cpp-flex.skl +++ b/src/cpp-flex.skl @@ -124,6 +124,7 @@ m4_ifelse(M4_MODE_PREFIX,yy,, #define yyalloc M4_MODE_PREFIX[[alloc]] #define yyrealloc M4_MODE_PREFIX[[realloc]] #define yyfree M4_MODE_PREFIX[[free]] +#define yyread M4_MODE_PREFIX[[read]] ) %endif %endif @@ -1503,61 +1504,101 @@ m4_ifdef( [[M4_YY_NOT_IN_HEADER]], m4_ifdef( [[M4_YY_NOT_IN_HEADER]], [[ +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +%if-c-only +static void yynoreturn yy_fatal_error YYFARGS1(const char*, msg) { + M4_YY_DECL_GUTS_VAR(); + M4_YY_NOOP_GUTS_VAR(); + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} +%endif +%if-c++-only +void yyFlexLexer::LexerError( const char* msg ) { + M4_YY_DECL_GUTS_VAR(); + std::cerr << msg << std::endl; + exit( YY_EXIT_FAILURE ); +} +%endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +%if-c-only +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg M4_YY_CALL_LAST_ARG) +%endif +%if-c++-only +#define YY_FATAL_ERROR(msg) LexerError( msg ) +%endif +#endif + +/* Legacy interface */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) do {result = yyread(buf, max_size M4_YY_CALL_LAST_ARG);} while (0) /* 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-c-only \ -m4_ifdef( [[M4_MODE_CPP_USE_READ]], [[ \ - errno=0; \ - while ( (result = (int) read( fileno(yyin), buf, (yy_size_t) max_size )) < 0 ) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - }\ -]]) \ -m4_ifdef( [[M4_MODE_NO_CPP_USE_READ]], [[ \ - 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 \ -\ -%if-c++-only C++ definition \ - if ( (int)(result = LexerInput( (char *) buf, max_size )) < 0 ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); +%if-c++-only +int yyFlexLexer::yyread(char *buf, size_t max_size) { +%endif +%if-c-only +static int yyread(char *buf, size_t max_size M4_YY_PROTO_LAST_ARG) { +%endif + int result; + M4_YY_DECL_GUTS_VAR(); +%if-c-only +m4_ifdef( [[M4_MODE_CPP_USE_READ]], [[ + errno=0; + while ( (result = (int) read( fileno(yyin), buf, (yy_size_t) max_size )) < 0 ) + { + if( errno != EINTR) + { + YY_FATAL_ERROR( "input in flex scanner failed" ); + break; + } + errno=0; + clearerr(yyin); + } +]]) +m4_ifdef( [[M4_MODE_NO_CPP_USE_READ]], [[ + 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 +%if-c++-only C++ definition + if ( (int)(result = LexerInput( (char *) buf, max_size )) < 0 ) + YY_FATAL_ERROR( "input in flex scanner failed" ); +%endif + return result; +} #endif ]]) @@ -1577,19 +1618,6 @@ m4_ifdef( [[M4_YY_NOT_IN_HEADER]], #define YY_START_STACK_INCR 25 #endif -m4_ifdef( [[M4_YY_NOT_IN_HEADER]], -[[ -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -%if-c-only -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg M4_YY_CALL_LAST_ARG) -%endif -%if-c++-only -#define YY_FATAL_ERROR(msg) LexerError( msg ) -%endif -#endif -]]) - %if-tables-serialization structures and prototypes m4preproc_include(`tables_shared.h') @@ -3338,26 +3366,6 @@ int yyFlexLexer::yy_top_state() } ]]) -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -%if-c-only -static void yynoreturn yy_fatal_error YYFARGS1(const char*, msg) { - M4_YY_DECL_GUTS_VAR(); - M4_YY_NOOP_GUTS_VAR(); - fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); -} -%endif -%if-c++-only -void yyFlexLexer::LexerError( const char* msg ) { - M4_YY_DECL_GUTS_VAR(); - std::cerr << msg << std::endl; - exit( YY_EXIT_FAILURE ); -} -%endif - /* Redefine yyless() so it works in section 3 code. */ #undef yyless