summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorWill Estes <westes575@gmail.com>2012-08-07 12:18:08 -0400
committerWill Estes <westes575@gmail.com>2012-08-07 15:56:44 -0400
commitec676fce008138b222d072de28fb05e1dfd945fb (patch)
tree1d45f3a3df39df4647ec4487f426f8f6b564373a /tests
parentc1a633de7c2ee2fb450b24ec46e9c4390f3c69ea (diff)
downloadflex-git-bug-2172046.tar.gz
reorganize flex skeleton and m4 processingbug-2172046
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am14
-rw-r--r--tests/test-alloc-extra/scanner.l3
-rw-r--r--tests/test-basic-nr/scan.h210
-rw-r--r--tests/test-basic-nr/scanner.l2
-rw-r--r--tests/test-basic-r/scanner.l2
-rw-r--r--tests/test-bison-nr/parser.y14
-rw-r--r--tests/test-bison-yylloc/parser.y11
-rw-r--r--tests/test-bison-yylval/parser.y12
-rw-r--r--tests/test-c++-table-opts/.gitignore2
-rw-r--r--tests/test-c++-table-opts/Makefile.am119
-rw-r--r--tests/test-c++-table-opts/scanner.l83
-rw-r--r--tests/test-c++-table-opts/test.input2
-rw-r--r--tests/test-extended/scanner.l1
-rw-r--r--tests/test-include-by-buffer/scanner.h0
-rw-r--r--tests/test-include-by-buffer/scanner.l4
-rw-r--r--tests/test-include-by-reentrant/scanner.l4
-rw-r--r--tests/test-lineno-nr/scanner.l4
-rw-r--r--tests/test-lineno-r/scanner.l4
-rw-r--r--tests/test-mem-nr/scanner.l1
-rw-r--r--tests/test-mem-r/scanner.l1
-rw-r--r--tests/test-namespace-nr/.gitignore2
-rw-r--r--tests/test-namespace-nr/Makefile.am50
-rw-r--r--tests/test-namespace-nr/parser.y61
-rw-r--r--tests/test-namespace-nr/scanner.l54
-rw-r--r--tests/test-namespace-nr/test.input2
-rw-r--r--tests/test-no-m4/.gitignore2
-rw-r--r--tests/test-no-m4/Makefile.am50
-rw-r--r--tests/test-no-m4/parser.y61
-rw-r--r--tests/test-no-m4/scanner.l70
-rw-r--r--tests/test-no-m4/test.input2
-rw-r--r--tests/test-prefix-nr/scanner.l6
-rw-r--r--tests/test-prefix-r/scanner.l4
-rw-r--r--tests/test-pthread/scanner.l3
-rw-r--r--tests/test-quotes/scanner.l2
-rw-r--r--tests/test-reject/scanner.l31
-rw-r--r--tests/test-rescan-r/scanner.l2
-rw-r--r--tests/test-table-opts/Makefile.am4
-rw-r--r--tests/test-table-opts/scanner.l28
-rw-r--r--tests/test-top-header/Makefile.am54
-rw-r--r--tests/test-top-header/main.c63
-rw-r--r--tests/test-top-header/scanner.c2109
-rw-r--r--tests/test-top-header/scanner.h390
-rw-r--r--tests/test-top-header/scanner.l54
-rw-r--r--tests/test-top-header/test.input3
-rw-r--r--tests/test-yyextra/scanner.l3
45 files changed, 3542 insertions, 61 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 33c20bd..6aa7947 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -26,6 +26,8 @@ dist_noinst_SCRIPTS = \
create-test
DIST_SUBDIRS = \
+ test-no-m4 \
+ test-namespace-nr \
test-concatenated-options \
test-c++-yywrap \
test-extended \
@@ -70,11 +72,12 @@ DIST_SUBDIRS = \
test-string-r \
test-yyextra \
test-alloc-extra \
- test-noansi-nr \
- test-noansi-r \
- test-table-opts
+ test-table-opts \
+ test-c++-table-opts
SUBDIRS = \
+ test-no-m4 \
+ test-namespace-nr \
test-concatenated-options \
test-c++-yywrap \
test-extended \
@@ -117,10 +120,9 @@ SUBDIRS = \
test-string-r \
test-yyextra \
test-alloc-extra \
- test-noansi-nr \
- test-noansi-r \
test-top \
- test-table-opts
+ test-table-opts \
+ test-c++-table-opts
# clean up before running the test suite so we dont test old builds of test code
diff --git a/tests/test-alloc-extra/scanner.l b/tests/test-alloc-extra/scanner.l
index bedd43b..fb0ad6d 100644
--- a/tests/test-alloc-extra/scanner.l
+++ b/tests/test-alloc-extra/scanner.l
@@ -40,6 +40,9 @@ struct Check {
char qux;
};
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+
/* Save char into junk array at next position. */
static void check_extra ( yyscan_t scanner );
diff --git a/tests/test-basic-nr/scan.h b/tests/test-basic-nr/scan.h
new file mode 100644
index 0000000..4e10113
--- /dev/null
+++ b/tests/test-basic-nr/scan.h
@@ -0,0 +1,210 @@
+
+#ifndef testFLEX_HEADER_H
+#define testFLEX_HEADER_H
+#define testIN_HEADER 1
+
+/* A lexical scanner generated by flex */
+
+M4_LINE_DIRECTIVE()
+
+/* begin standard C headers. */
+m4_if_cxx_streamio(,
+#include <stdio.h>
+)
+m4_if_c_only(
+#include <string.h>
+#include <stdlib.h>
+,
+
+#include <stdlib.h> /* C memory allocation is used in the C++ class */
+)
+#include <errno.h>
+m4_if_tables_serialization(
+/* These are for ntohs() and ntohl(), used for serialized tables: */
+#include <sys/types.h>
+#include <netinet/in.h>
+)
+/* end standard C headers. */
+
+/* begin standard C++ headers. */
+m4_if_cxx_streamio(
+#include <iostream>
+,
+
+ m4_if_cxx_only([[
+#include <cstdio>
+ ]])
+)
+m4_if_cxx_only(
+#include <cstring>
+#include <cstdlib>
+)
+/* end standard C++ headers. */
+
+/* begin "flexint.h" */
+m4_flex_include(flexint.h)
+/* end "flexint.h" */
+
+m4_if_c_only(
+m4_ifdef([[M4_YY_NAMESPACE]],[[
+namespace M4_YY_NAMESPACE() {
+]])
+m4_flex_include([[flex_public_header.m4]])
+m4_ifdef([[M4_YY_NO_EXTERN_C]],,[[
+#ifdef __cplusplus
+extern "C" {
+#endif
+]])
+m4_flex_include([[flex_public_typedefs.m4]])
+m4_if_not_reentrant([[
+/************************************************************/
+/* Declaration of public globals */
+M4_PUBLIC_GLOBALS()
+]])
+m4_flex_include([[flex_public_protos.m4]])
+m4_ifdef([[M4_YY_NO_EXTERN_C]],,[[
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+]])
+m4_ifdef([[M4_YY_NAMESPACE]],[[
+} /* end namespace M4_YY_NAMESPACE() */
+]])
+,
+
+/************************************************************/
+/* These defines prevent inclusion of the previous "FlexLexer.h" by user code. */
+#define yyFlexLexerOnce
+#define __FLEX_LEXER_H
+
+#ifndef YYLEX_BASE_CLASS_DEFINED
+#define YYLEX_BASE_CLASS_DEFINED
+
+m4_flex_include([[flex_public_header.m4]])
+
+/* pure-virtual base class */
+class M4_YY_LEX_BASE_CLASS {
+public:
+m4_flex_include([[flex_public_typedefs.m4]])
+
+protected: /*FIXME protected: */
+m4_flex_include([[flex_private_typedefs.m4]])
+
+public:
+/* Note: no destructor defined */
+ virtual ~M4_YY_LEX_BASE_CLASS()(void) { };
+
+ virtual void switch_to_buffer(YY_BUFFER_STATE new_buffer ) = 0;
+ virtual YY_BUFFER_STATE create_buffer(M4_INSTREAM* stream, int size ) = 0;
+ virtual void delete_buffer(YY_BUFFER_STATE buffer ) = 0;
+ virtual void restart(M4_INSTREAM* stream ) = 0;
+ virtual int lex(void) = 0;
+
+ // NOTE: In Flex, yytext is allowed to be modified in scanner actions.
+ // This version allows read-only access for general use with the base class.
+ inline const char* YYText(void) { return text; }
+ inline int YYLeng(void) { return leng; }
+ //inline int lineno() const { return yylineno; }
+ inline int debug() const { return flex_debug; }
+ inline void debug( int flag ) { flex_debug = flag; }
+
+ // Call yylex with new input/output sources.
+ inline int lex(M4_INSTREAM* new_in, M4_OUTSTREAM* new_out = NULL )
+ {
+ switch_streams( new_in, new_out );
+ return lex();
+ }
+
+ // Switch to new input/output streams. If NULL, the stream is unchanged.
+ virtual void switch_streams( M4_INSTREAM* new_in = NULL,
+ M4_OUTSTREAM* new_out = NULL ) = 0;
+
+ /************ Common state variables ************/
+// These are equivalent to the public globals in the non-reentrant C scanner.
+
+protected:
+
+M4_PUBLIC_GLOBALS()
+
+}; /* end M4_YY_LEX_BASE_CLASS */
+#endif // YYLEX_BASE_CLASS_DEFINED
+
+#define yyFlexLexer M4_YY_LEX_CLASS()
+
+class M4_YY_LEX_CLASS() : public M4_YY_LEX_BASE_CLASS {
+public:
+m4_ifdef( [[M4_YY_NO_EXTRA]],,
+[[
+ /* User-defined. Not touched by flex. */
+ YY_EXTRA_TYPE extra;
+]])
+
+ M4_YY_LEX_CLASS()
+ (M4_INSTREAM* arg_yyin = M4_STDIN,
+ M4_OUTSTREAM* arg_yyout = M4_STDOUT);
+
+ ~M4_YY_LEX_CLASS()(void);
+
+// C++ subclasses must have the standard lex(void) function to
+// support the base class. YY_DECL may still be used to alter the
+// yy[[]]lex function constructed by flex, but you then must
+// provide a body for the default lex() function.
+// For Bison lloc and lval, use set_lval() and set_lloc().
+ int lex(void);
+#ifdef YY_DECL
+ YY_DECL;
+#endif
+
+m4_ifdef( [[M4_YY_SKIP_YYWRAP]],
+[[
+ inline int yywrap(void) const { return 1; };
+]])
+
+// Declarations for additional C++-only functions.
+
+/* Standard YY_INPUT() */
+ int LexerInput( char* buf, int max_size );
+
+/* Standard ECHO() */
+ inline int LexerOutput( const char* buf, int size )
+ {
+m4_if_cxx_streamio([[
+/* With an error, iostream does not expose the number of bytes written,
+ * so it is estimated as all-or-nothing. (Good enough for error tests.)
+ */
+ out->write( buf, size );
+ return (out->bad() ? 0 : size);
+]],
+[[
+ return fwrite( buf, 1, size, out );
+]])
+ }
+
+ virtual void LexerError( const char* msg ) { LexerClassError(msg); }
+
+ void switch_streams(M4_INSTREAM* new_in, M4_OUTSTREAM* new_out=0);
+
+public:
+m4_define([[yy_flex_strlen]],[[strlen]])
+M4_FUNC_PROTO_NG(void, LexerClassError, const char *msg);
+m4_flex_include([[flex_public_protos.m4]])
+
+private:
+M4_PRIVATE_GLOBALS()
+
+private:
+m4_dnl This strips the assignments, to give just declarations.
+m4_patsubst(m4_quote(M4_GEN_DATA_TABLES),[[\s*=[^;]*;]],[[;]])
+
+private:
+m4_flex_include([[flex_private_protos.m4]])
+
+/* This allows the class to be modified without an additional sub-class */
+#ifdef YY_CLASS_USER_CODE
+YY_CLASS_USER_CODE
+#endif
+}; /* end M4_YY_LEX_CLASS */
+)
+
+#undef testIN_HEADER
+#endif /* testFLEX_HEADER_H */
diff --git a/tests/test-basic-nr/scanner.l b/tests/test-basic-nr/scanner.l
index c284884..92112da 100644
--- a/tests/test-basic-nr/scanner.l
+++ b/tests/test-basic-nr/scanner.l
@@ -35,7 +35,7 @@
#include "config.h"
%}
-%option prefix="test" outfile="scanner.c"
+%option prefix="test" outfile="scanner.c" header-file="scan.h"
%option nounput noyywrap noyylineno warn nodefault
IDENT [[:alnum:]_-]
diff --git a/tests/test-basic-r/scanner.l b/tests/test-basic-r/scanner.l
index 6e3510f..72ad04e 100644
--- a/tests/test-basic-r/scanner.l
+++ b/tests/test-basic-r/scanner.l
@@ -33,7 +33,7 @@
#include "config.h"
%}
-%option prefix="test" outfile="scanner.c"
+%option prefix="test" outfile="scanner.c"
%option nounput noyywrap noyylineno warn nodefault
%option reentrant
diff --git a/tests/test-bison-nr/parser.y b/tests/test-bison-nr/parser.y
index 2cbf9aa..ed51b39 100644
--- a/tests/test-bison-nr/parser.y
+++ b/tests/test-bison-nr/parser.y
@@ -36,8 +36,6 @@
/* #define YYLEX_PARAM scanner */
int yyerror(char* msg);
-extern int testget_lineno(void);
-
/* A dummy function. A check against seg-faults in yylval->str. */
int process_text(char* s) {
@@ -63,6 +61,18 @@ int process_text(char* s) {
%token EQUAL "="
%token COLON ":"
%token SPACE " "
+
+%{
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern int testget_lineno(void);
+extern int testlex(union YYSTYPE *yylval, struct YYLTYPE *yylloc);
+#ifdef __cplusplus
+}
+#endif
+%}
+
%%
file:
diff --git a/tests/test-bison-yylloc/parser.y b/tests/test-bison-yylloc/parser.y
index e8f4e56..dfcbcae 100644
--- a/tests/test-bison-yylloc/parser.y
+++ b/tests/test-bison-yylloc/parser.y
@@ -63,6 +63,17 @@ int process_text(char* s) {
%token EQUAL "="
%token COLON ":"
%token SPACE " "
+%{
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef void *yyscan_t;
+extern int testget_lineno(void*);
+extern int testlex(YYSTYPE *yylval, YYLTYPE *yylloc, yyscan_t yyscanner);
+#ifdef __cplusplus
+}
+#endif
+%}
%%
file:
diff --git a/tests/test-bison-yylval/parser.y b/tests/test-bison-yylval/parser.y
index 0ffdb89..d594be5 100644
--- a/tests/test-bison-yylval/parser.y
+++ b/tests/test-bison-yylval/parser.y
@@ -60,7 +60,17 @@ int process_text(char* s) {
%token LT
%token GT
%token LTSLASH "</"
-
+%{
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef void *yyscan_t;
+extern int testget_lineno(void*);
+extern int testlex(YYSTYPE *yylval, yyscan_t yyscanner);
+#ifdef __cplusplus
+}
+#endif
+%}
%%
html:
diff --git a/tests/test-c++-table-opts/.gitignore b/tests/test-c++-table-opts/.gitignore
new file mode 100644
index 0000000..19be287
--- /dev/null
+++ b/tests/test-c++-table-opts/.gitignore
@@ -0,0 +1,2 @@
+test-c++-table-opts
+OUTPUT
diff --git a/tests/test-c++-table-opts/Makefile.am b/tests/test-c++-table-opts/Makefile.am
new file mode 100644
index 0000000..bd1253d
--- /dev/null
+++ b/tests/test-c++-table-opts/Makefile.am
@@ -0,0 +1,119 @@
+# This file is part of flex.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+
+# Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+# ------------------------------------------------
+# This test is really a set of tests, one for
+# each compression flag. -Ca, -Cem, etc..
+# 'test-opt' builds non-serialized scanners with various table options.
+# 'test-ver' verifies that the serialized tables match the in-code tables.
+# 'test-ser' deserializes the tables at runtime.
+# 'test-mul' checks that we can store multiple tables in a single file.
+# ------------------------------------------------
+
+FLEX = $(top_builddir)/flex
+
+testname := test-table-opts
+allopts := -Ca -Ce -Cf -CF -Cm -Cem -Cae -Caef -CaeF -Cam -Caem
+
+# the test names themselves
+opttests := $(foreach opt,$(allopts), test-opt$(opt))
+sertests := $(foreach opt,$(allopts), test-ser$(opt))
+vertests := $(foreach opt,$(allopts), test-ver$(opt))
+alltests := $(opttests) $(vertests) $(sertests) test-mul
+
+# the executables to build
+optexe := $(addsuffix $(EXEEXT),$(opttests))
+verexe := $(addsuffix $(EXEEXT),$(vertests))
+serexe := $(addsuffix $(EXEEXT),$(sertests))
+allexe := $(optexe) $(verexe) $(serexe)
+
+# the .cpp files
+optsrc := $(addsuffix .cpp,$(opttests))
+versrc := $(addsuffix .cpp,$(vertests))
+sersrc := $(addsuffix .cpp,$(sertests))
+allsrc := $(optsrc) $(versrc) $(sersrc)
+
+# the .o files
+optobj := $(addsuffix .o,$(opttests))
+verobj := $(addsuffix .o,$(vertests))
+serobj := $(addsuffix .o,$(sertests))
+allobj := $(optobj) $(verobj) $(serobj)
+
+# the .tables files
+sertables := $(addsuffix .tables,$(sertests))
+alltables := $(addsuffix .tables,$(alltests))
+
+EXTRA_DIST = scanner.l test.input
+CLEANFILES = scanner.cpp OUTPUT $(allobj) $(allsrc) $(alltables) \
+ all-ser.tables $(allexe)
+AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir) -I$(top_builddir)
+
+test: test-opt test-ser test-ver test-mul
+
+test-opt%.cpp: $(srcdir)/scanner.l
+ $(FLEX) -L -P $(subst -,_,$(basename $(@F))) $* -o $@ $<
+
+test-ser%.cpp: $(srcdir)/scanner.l
+ $(FLEX) -L -P $(subst -,_,$(basename $(@F))) --tables-file="test-ser$*.tables" $* -o $@ $<
+
+test-ver%.cpp: $(srcdir)/scanner.l
+ $(FLEX) -L -P $(subst -,_,$(basename $(@F))) --tables-file="test-ver$*.tables" --tables-verify $* -o $@ $<
+
+test-opt%$(EXEEXT): test-opt%.o
+ $(CXX) -o $@ $(LDFLAGS) $< $(LOADLIBES)
+
+test-ser%$(EXEEXT): test-ser%.o
+ $(CXX) -o $@ $(LDFLAGS) $< $(LOADLIBES)
+
+test-ver%$(EXEEXT): test-ver%.o
+ $(CXX) -o $@ $(LDFLAGS) $< $(LOADLIBES)
+
+test-opt: $(optexe)
+ for t in $(optexe) ; do \
+ ./$$t `basename $$t $(EXEEXT)`.tables < $(srcdir)/test.input \
+ || { echo $t FAILED ; exit 1 ; } ; \
+ done
+
+test-ver: $(verexe)
+ for t in $(verexe) ; do \
+ ./$$t `basename $$t $(EXEEXT)`.tables < $(srcdir)/test.input \
+ || { echo $t FAILED ; exit 1 ; } ; \
+ done
+
+test-ser: $(serexe)
+ for t in $(serexe) ; do \
+ ./$$t `basename $$t $(EXEEXT)`.tables < $(srcdir)/test.input \
+ || { echo $t FAILED ; exit 1 ; } ; \
+ done
+
+test-mul: $(serexe)
+ $(RM) all-ser.tables
+ cat $(sertables) > all-ser.tables
+ for t in $(serexe) ; do \
+ ./$$t all-ser.tables < $(srcdir)/test.input || { echo $$t FAILED; exit 1; } ; \
+ done
+
+test-opt-%.o: test-opt-%.cpp ; $(CXX) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $<
+test-ser-%.o: test-ser-%.cpp ; $(CXX) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_EXTERNAL $(CFLAGS) $<
+test-ver-%.o: test-ver-%.cpp ; $(CXX) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_VERIFY -DTEST_HAS_TABLES_EXTERNAL $(CFLAGS) $<
+
+.PHONY: test test-opt test-ser test-ver test-mul
+.SECONDARY: $(allobj) $(allsrc)
diff --git a/tests/test-c++-table-opts/scanner.l b/tests/test-c++-table-opts/scanner.l
new file mode 100644
index 0000000..7c07331
--- /dev/null
+++ b/tests/test-c++-table-opts/scanner.l
@@ -0,0 +1,83 @@
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+%{
+/* A template scanner file to build "scanner.c". */
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+%}
+
+%option 8bit
+%option nounput nomain noyywrap
+%option warn yylineno c++
+
+
+
+%%
+
+foo|bar ;
+[[:digit:]]+ ;
+[[:blank:]]+ ;
+.|\n ;
+%%
+
+#include <fstream>
+int main ( int argc, char** argv )
+{
+ std::ifstream* fp;
+ yyFlexLexer *lexer;
+
+#ifdef TEST_HAS_TABLES_EXTERNAL
+ fp = new std::ifstream(argv[1],std::ios::binary);
+ if(!fp->is_open())
+ YY_GLOBAL_FATAL_ERROR("could not open tables file for reading");
+
+ if(yyFlexLexer::yytables_fload(fp) < 0)
+ YY_GLOBAL_FATAL_ERROR("yytables_fload returned < 0");
+
+ delete fp;
+#ifdef TEST_HAS_TABLES_VERIFY
+ exit(0);
+#endif
+#endif
+
+ if(argc > 2){
+ fp = new std::ifstream(argv[2]);
+ if (!fp->is_open())
+ YY_GLOBAL_FATAL_ERROR("could not open input file for reading");
+ lexer = new yyFlexLexer(fp);
+ } else {
+ lexer = new yyFlexLexer(&std::cin);
+ }
+
+ while(lexer->lex() != 0)
+ ;
+
+#ifdef TEST_HAS_TABLES_EXTERNAL
+ lexer->tables_destroy();
+#endif
+ delete lexer;
+
+ return 0;
+}
diff --git a/tests/test-c++-table-opts/test.input b/tests/test-c++-table-opts/test.input
new file mode 100644
index 0000000..aec9276
--- /dev/null
+++ b/tests/test-c++-table-opts/test.input
@@ -0,0 +1,2 @@
+0000 foo 1111 foo 0000 bar foobar
+0000 foo 1111 foo 0000 bar foobar
diff --git a/tests/test-extended/scanner.l b/tests/test-extended/scanner.l
index 222c7dd..221e481 100644
--- a/tests/test-extended/scanner.l
+++ b/tests/test-extended/scanner.l
@@ -68,6 +68,5 @@ main ()
yyin = stdin;
yyout = stdout;
yylex();
- //printf("TEST RETURNING OK.\n");
return 0;
}
diff --git a/tests/test-include-by-buffer/scanner.h b/tests/test-include-by-buffer/scanner.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/test-include-by-buffer/scanner.h
diff --git a/tests/test-include-by-buffer/scanner.l b/tests/test-include-by-buffer/scanner.l
index 3224543..3f48001 100644
--- a/tests/test-include-by-buffer/scanner.l
+++ b/tests/test-include-by-buffer/scanner.l
@@ -30,14 +30,14 @@
#include <stdlib.h>
#include "config.h"
%}
-
+%option header="scanner.h"
%option 8bit outfile="scanner.c" prefix="test"
%option nounput nomain noyywrap
%option warn
%x GET_FILENAME
%{
-
+#include "scanner.h"
#define MAX_INCLUDE_DEPTH 10
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
int include_stack_ptr = 0;
diff --git a/tests/test-include-by-reentrant/scanner.l b/tests/test-include-by-reentrant/scanner.l
index 8d23681..aaff8c2 100644
--- a/tests/test-include-by-reentrant/scanner.l
+++ b/tests/test-include-by-reentrant/scanner.l
@@ -77,9 +77,7 @@
int main (int argc, char** argv);
int
-main ( argc, argv )
- int argc;
- char ** argv;
+main (int argc, char ** argv)
{
FILE * fp;
yyscan_t scanner;
diff --git a/tests/test-lineno-nr/scanner.l b/tests/test-lineno-nr/scanner.l
index 4341335..191f90d 100644
--- a/tests/test-lineno-nr/scanner.l
+++ b/tests/test-lineno-nr/scanner.l
@@ -78,9 +78,7 @@ count_newlines (FILE* in)
int main ( int, char**);
int
-main ( argc, argv )
- int argc;
- char** argv;
+main (int argc, char **argv )
{
if( argc > 1 )
printf("%d\n", count_newlines(stdin));
diff --git a/tests/test-lineno-r/scanner.l b/tests/test-lineno-r/scanner.l
index 8933f5f..7fe040c 100644
--- a/tests/test-lineno-r/scanner.l
+++ b/tests/test-lineno-r/scanner.l
@@ -78,9 +78,7 @@ count_newlines (FILE* in)
int main ( int argc, char** argv );
int
-main (argc, argv)
- int argc;
- char ** argv;
+main (int argc, char **argv)
{
if( argc > 1 )
printf("%d\n", count_newlines(stdin));
diff --git a/tests/test-mem-nr/scanner.l b/tests/test-mem-nr/scanner.l
index d03996a..6a2adc9 100644
--- a/tests/test-mem-nr/scanner.l
+++ b/tests/test-mem-nr/scanner.l
@@ -43,6 +43,7 @@
%option nounput nomain noyywrap
%option warn stack nodefault
%option noyyalloc noyyrealloc noyyfree
+%option noyy_top_state
%x parens
diff --git a/tests/test-mem-r/scanner.l b/tests/test-mem-r/scanner.l
index ba6e0b5..8a9fd33 100644
--- a/tests/test-mem-r/scanner.l
+++ b/tests/test-mem-r/scanner.l
@@ -43,6 +43,7 @@
%option nounput nomain noyywrap
%option warn stack nodefault reentrant
%option noyyalloc noyyrealloc noyyfree
+%option noyy_top_state
%x parens
diff --git a/tests/test-namespace-nr/.gitignore b/tests/test-namespace-nr/.gitignore
new file mode 100644
index 0000000..1c31973
--- /dev/null
+++ b/tests/test-namespace-nr/.gitignore
@@ -0,0 +1,2 @@
+test-namespace-nr
+OUTPUT
diff --git a/tests/test-namespace-nr/Makefile.am b/tests/test-namespace-nr/Makefile.am
new file mode 100644
index 0000000..77c309a
--- /dev/null
+++ b/tests/test-namespace-nr/Makefile.am
@@ -0,0 +1,50 @@
+# This file is part of flex.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+
+# Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+FLEX = $(top_builddir)/flex
+
+builddir = @builddir@
+
+EXTRA_DIST = scanner.l test.input
+CLEANFILES = scanner.c scanner.h parser.c parser.h $(testname)$(EXEEXT) OUTPUT $(OBJS)
+OBJS = scanner.o # parser.o
+
+AM_CPPFLAGS = -I$(srcdir) -I$(builddir) -I$(top_srcdir) -I$(top_builddir)
+#LDFLAGS = $(top_srcdir)/libfl.a
+#LFLAGS = --header="scanner.h"
+#YFLAGS = --defines --output=parser.c
+
+testname = test-namespace-nr
+
+scanner.c: $(srcdir)/scanner.l
+ $(FLEX) $(LFLAGS) $<
+
+parser.c: $(srcdir)/parser.y
+ $(BISON) $(YFLAGS) $<
+
+$(testname)$(EXEEXT): $(OBJS)
+ $(CXX) -o $@ $(LDFLAGS) $(OBJS) $(LOADLIBES)
+
+test: $(testname)$(EXEEXT)
+ ./$(testname)$(EXEEXT) < $(srcdir)/test.input
+
+.c.o:
+ $(CXX) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $<
diff --git a/tests/test-namespace-nr/parser.y b/tests/test-namespace-nr/parser.y
new file mode 100644
index 0000000..54c428b
--- /dev/null
+++ b/tests/test-namespace-nr/parser.y
@@ -0,0 +1,61 @@
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/* A dummy template parser to build "parser.c" and "parser.h".
+ How to compile:
+ bison --defines --output-file="parser.c" --name-prefix="test" parser.y
+ */
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+
+#define YYERROR_VERBOSE 1 /* For debugging. */
+/* #define YYPARSE_PARAM scanner */ /* For pure bison parser. */
+/* #define YYLEX_PARAM scanner */ /* For reentrant flex. */
+
+
+int yyerror(char* msg);
+extern int testlex();
+
+%}
+
+%%
+
+rule: ;
+
+%%
+
+int yyerror(char* msg) {
+ fprintf(stderr,"%s\n",msg);
+ return 0;
+}
+
+/*
+int
+main ( int argc, char** argv )
+{
+ yyparse ();
+ return 0;
+}
+*/
diff --git a/tests/test-namespace-nr/scanner.l b/tests/test-namespace-nr/scanner.l
new file mode 100644
index 0000000..96fe5f6
--- /dev/null
+++ b/tests/test-namespace-nr/scanner.l
@@ -0,0 +1,54 @@
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+%{
+/* A template scanner file to build "scanner.c". */
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+/*#include "parser.h" */
+
+%}
+
+%option 8bit outfile="scanner.c" prefix="test"
+%option nounput nomain noyywrap
+%option warn
+%option namespace="yyns"
+
+%%
+
+. { }
+
+%%
+
+int main(void);
+
+int
+main ()
+{
+ yyns::yyin = stdin;
+ yyns::yyout = stdout;
+ yyns::yylex();
+ printf("TEST RETURNING OK.\n");
+ return 0;
+}
diff --git a/tests/test-namespace-nr/test.input b/tests/test-namespace-nr/test.input
new file mode 100644
index 0000000..7288a40
--- /dev/null
+++ b/tests/test-namespace-nr/test.input
@@ -0,0 +1,2 @@
+0000 foo 1111 foo 0000 bar
+0000 foo 1111 foo 0000 bar
diff --git a/tests/test-no-m4/.gitignore b/tests/test-no-m4/.gitignore
new file mode 100644
index 0000000..f287690
--- /dev/null
+++ b/tests/test-no-m4/.gitignore
@@ -0,0 +1,2 @@
+test-no-m4
+OUTPUT
diff --git a/tests/test-no-m4/Makefile.am b/tests/test-no-m4/Makefile.am
new file mode 100644
index 0000000..ba09c11
--- /dev/null
+++ b/tests/test-no-m4/Makefile.am
@@ -0,0 +1,50 @@
+# This file is part of flex.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+
+# Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+FLEX = $(top_builddir)/flex
+
+builddir = @builddir@
+
+EXTRA_DIST = scanner.l test.input
+CLEANFILES = scanner.c scanner.h parser.c parser.h $(testname)$(EXEEXT) OUTPUT $(OBJS)
+OBJS = scanner.o
+
+AM_CPPFLAGS = -I$(srcdir) -I$(builddir) -I$(top_srcdir) -I$(top_builddir)
+#LDFLAGS = $(top_srcdir)/libfl.a
+#LFLAGS = --header="scanner.h"
+#YFLAGS = --defines --output=parser.c
+
+testname = test-no-m4
+
+scanner.c: $(srcdir)/scanner.l
+ $(FLEX) $(LFLAGS) $<
+
+parser.c: $(srcdir)/parser.y
+ $(BISON) $(YFLAGS) $<
+
+$(testname)$(EXEEXT): $(OBJS)
+ $(CC) -o $@ $(LDFLAGS) $(OBJS) $(LOADLIBES)
+
+test: $(testname)$(EXEEXT)
+ ./$(testname)$(EXEEXT) < $(srcdir)/test.input
+
+.c.o:
+ $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $<
diff --git a/tests/test-no-m4/parser.y b/tests/test-no-m4/parser.y
new file mode 100644
index 0000000..54c428b
--- /dev/null
+++ b/tests/test-no-m4/parser.y
@@ -0,0 +1,61 @@
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/* A dummy template parser to build "parser.c" and "parser.h".
+ How to compile:
+ bison --defines --output-file="parser.c" --name-prefix="test" parser.y
+ */
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+
+#define YYERROR_VERBOSE 1 /* For debugging. */
+/* #define YYPARSE_PARAM scanner */ /* For pure bison parser. */
+/* #define YYLEX_PARAM scanner */ /* For reentrant flex. */
+
+
+int yyerror(char* msg);
+extern int testlex();
+
+%}
+
+%%
+
+rule: ;
+
+%%
+
+int yyerror(char* msg) {
+ fprintf(stderr,"%s\n",msg);
+ return 0;
+}
+
+/*
+int
+main ( int argc, char** argv )
+{
+ yyparse ();
+ return 0;
+}
+*/
diff --git a/tests/test-no-m4/scanner.l b/tests/test-no-m4/scanner.l
new file mode 100644
index 0000000..cdb41e3
--- /dev/null
+++ b/tests/test-no-m4/scanner.l
@@ -0,0 +1,70 @@
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+/* If any of these #defines get parsed by m4, the trailing quote will
+ * lost, causing a compile error.
+ */
+
+%top{
+#define TEST_TOP "m4_dnl"
+}
+
+%header{
+#define TEST_HEADER "m4_dnl"
+%}
+
+%{
+/* A template scanner file to build "scanner.c". */
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+/*#include "parser.h" */
+#define TEST1 "m4_dnl"
+%}
+
+%option 8bit outfile="scanner.c" prefix="test"
+%option nounput nomain noyywrap
+%option warn
+
+
+%%
+%{
+#define TEST2 "m4_dnl"
+%}
+. { }
+
+%%
+
+#define TEST3 "m4_dnl"
+
+int main(void);
+const char *string = TEST_TOP TEST_HEADER TEST1 TEST2 TEST3;
+int
+main ()
+{
+ yyin = stdin;
+ yyout = stdout;
+ yylex();
+ puts(string);
+ puts("TEST RETURNING OK.");
+ return 0;
+}
diff --git a/tests/test-no-m4/test.input b/tests/test-no-m4/test.input
new file mode 100644
index 0000000..7288a40
--- /dev/null
+++ b/tests/test-no-m4/test.input
@@ -0,0 +1,2 @@
+0000 foo 1111 foo 0000 bar
+0000 foo 1111 foo 0000 bar
diff --git a/tests/test-prefix-nr/scanner.l b/tests/test-prefix-nr/scanner.l
index 4497aa1..f9a91a7 100644
--- a/tests/test-prefix-nr/scanner.l
+++ b/tests/test-prefix-nr/scanner.l
@@ -47,8 +47,8 @@
FOO_init_buffer((YY_BUFFER_STATE)0,(FILE*)0);
FOO_load_buffer_state();
FOO_scan_buffer((char*)0,(yy_size_t)0);
- FOO_scan_bytes((yyconst char*)0, 0);
- FOO_scan_string((yyconst char*)0);
+ FOO_scan_bytes((const char*)0, 0);
+ FOO_scan_string((const char*)0);
FOO_switch_to_buffer((YY_BUFFER_STATE)0);
yyin = (FILE*)0;
yyout = (FILE*)0;
@@ -64,7 +64,7 @@
int main(void);
int
-main ()
+main (void)
{
yyin = stdin;
yyout = stdout;
diff --git a/tests/test-prefix-r/scanner.l b/tests/test-prefix-r/scanner.l
index 4c25982..abb7b66 100644
--- a/tests/test-prefix-r/scanner.l
+++ b/tests/test-prefix-r/scanner.l
@@ -48,8 +48,8 @@
FOO_init_buffer( (YY_BUFFER_STATE)0, (FILE*)0, yyscanner);
FOO_load_buffer_state( yyscanner);
FOO_scan_buffer( (char*)0, (yy_size_t)0, yyscanner);
- FOO_scan_bytes( (yyconst char*)0, 0, yyscanner);
- FOO_scan_string( (yyconst char*)0, yyscanner);
+ FOO_scan_bytes( (const char*)0, 0, yyscanner);
+ FOO_scan_string( (const char*)0, yyscanner);
FOO_switch_to_buffer( (YY_BUFFER_STATE)0, yyscanner);
FOOrestart( (FILE*)0, (yyscan_t )0);
diff --git a/tests/test-pthread/scanner.l b/tests/test-pthread/scanner.l
index 8603873..61434f3 100644
--- a/tests/test-pthread/scanner.l
+++ b/tests/test-pthread/scanner.l
@@ -42,7 +42,8 @@
#endif
/* A naive test for segfaults when accessing yytext. */
-static int process_text(char* s, yyscan_t scanner);
+/* static int process_text(char* s, yyscan_t scanner); FIXME ? */
+static int process_text(char* s, void * scanner);
%}
diff --git a/tests/test-quotes/scanner.l b/tests/test-quotes/scanner.l
index 0c7c482..d16dcd0 100644
--- a/tests/test-quotes/scanner.l
+++ b/tests/test-quotes/scanner.l
@@ -74,7 +74,7 @@ f return 1+foo(a[b[c[0]]]);
/* action block [[[ 3 ]]] TEST_XXX */
/* action block [[[[ 4 ]]]] TEST_XXX */
/* action block ]] unmatched [[ TEST_XXX */
- return 1+foo(a[b[c[0]]]); // TEST_XXX
+ return 1+foo(a[b[c[0]]]); /* TEST_XXX */
}
%%
diff --git a/tests/test-reject/scanner.l b/tests/test-reject/scanner.l
index 5e5208e..370e645 100644
--- a/tests/test-reject/scanner.l
+++ b/tests/test-reject/scanner.l
@@ -43,38 +43,41 @@
int main ( int argc, char** argv )
{
FILE* fp = NULL;
- void *yyscanner=0;
- M4_YY_DECL_GUTS_VAR();
#ifdef TEST_IS_REENTRANT
+ void *yyscanner=NULL;
yylex_init(&yyscanner);
+#define YY_CALL_LAST_ARG , yyscanner
+#define YY_CALL_ONLY_ARG yyscanner
+#else
+#define YY_CALL_LAST_ARG
+#define YY_CALL_ONLY_ARG
#endif
#ifdef TEST_HAS_TABLES_EXTERNAL
if((fp = fopen(argv[1],"r"))== NULL)
- YY_FATAL_ERROR("could not open tables file for reading");
- if(yytables_fload(fp M4_YY_CALL_LAST_ARG) < 0)
- YY_FATAL_ERROR("yytables_fload returned < 0");
- if(M4_YY_TABLES_VERIFY)
- exit(0);
+ yy_fatal_error("could not open tables file for reading" YY_CALL_LAST_ARG);
+
+ if(yytables_fload(fp YY_CALL_LAST_ARG) < 0)
+ yy_fatal_error("yytables_fload returned < 0" YY_CALL_LAST_ARG);
+#ifdef YY_TABLES_VERIFY
+ exit(0);
+#endif
#endif
if(argc > 2){
if((fp = fopen(argv[2],"r"))== NULL)
- YY_FATAL_ERROR("could not open input file for reading");
+ yy_fatal_error("could not open input file for reading" YY_CALL_LAST_ARG);
yyin = fp;
}
- while(yylex(M4_YY_CALL_ONLY_ARG) != 0)
+ while(yylex(YY_CALL_ONLY_ARG) != 0)
;
#ifdef TEST_HAS_TABLES_EXTERNAL
- yytables_destroy(M4_YY_CALL_ONLY_ARG);
+ yytables_destroy(YY_CALL_ONLY_ARG);
#endif
- yylex_destroy(M4_YY_CALL_ONLY_ARG);
-
- if(argc < 0) /* silence the compiler */
- yyscanner = (void*)fp;
+ yylex_destroy(YY_CALL_ONLY_ARG);
return 0;
}
diff --git a/tests/test-rescan-r/scanner.l b/tests/test-rescan-r/scanner.l
index 3357ce8..2b4c0eb 100644
--- a/tests/test-rescan-r/scanner.l
+++ b/tests/test-rescan-r/scanner.l
@@ -74,7 +74,7 @@ main (int argc, char* const argv[])
printf("Test 2: Rescanning with new scanner each time.\n");
- memset(&yyscanner,0,sizeof(yyscanner)); // Just to be clean about it.
+ memset(&yyscanner,0,sizeof(yyscanner)); /* Just to be clean about it. */
for (i=0; i < 4; ++i){
yyscan_t s;
diff --git a/tests/test-table-opts/Makefile.am b/tests/test-table-opts/Makefile.am
index a52f617..ff4b7fa 100644
--- a/tests/test-table-opts/Makefile.am
+++ b/tests/test-table-opts/Makefile.am
@@ -122,11 +122,11 @@ test-mul: $(serexe)
test-opt-nr-%.o: test-opt-nr-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $<
test-ser-nr-%.o: test-ser-nr-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_EXTERNAL $(CFLAGS) $<
-test-ver-nr-%.o: test-ver-nr-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_EXTERNAL $(CFLAGS) $<
+test-ver-nr-%.o: test-ver-nr-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_VERIFY -DTEST_HAS_TABLES_EXTERNAL $(CFLAGS) $<
test-opt-r-%.o: test-opt-r-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_IS_REENTRANT $(CFLAGS) $<
test-ser-r-%.o: test-ser-r-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_EXTERNAL -DTEST_IS_REENTRANT $(CFLAGS) $<
-test-ver-r-%.o: test-ver-r-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_EXTERNAL -DTEST_IS_REENTRANT $(CFLAGS) $<
+test-ver-r-%.o: test-ver-r-%.c ; $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) -DTEST_HAS_TABLES_VERIFY -DTEST_HAS_TABLES_EXTERNAL -DTEST_IS_REENTRANT $(CFLAGS) $<
.PHONY: test test-opt test-ser test-ver test-mul
.SECONDARY: $(allobj) $(allsrc)
diff --git a/tests/test-table-opts/scanner.l b/tests/test-table-opts/scanner.l
index 3ad6199..b7f5b76 100644
--- a/tests/test-table-opts/scanner.l
+++ b/tests/test-table-opts/scanner.l
@@ -45,38 +45,40 @@ foo|bar ;
int main ( int argc, char** argv )
{
FILE* fp = NULL;
- void *yyscanner=0;
- M4_YY_DECL_GUTS_VAR();
#ifdef TEST_IS_REENTRANT
+ void *yyscanner=NULL;
yylex_init(&yyscanner);
+#define YY_CALL_LAST_ARG , yyscanner
+#define YY_CALL_ONLY_ARG yyscanner
+#else
+#define YY_CALL_LAST_ARG
+#define YY_CALL_ONLY_ARG
#endif
#ifdef TEST_HAS_TABLES_EXTERNAL
if((fp = fopen(argv[1],"r"))== NULL)
- YY_FATAL_ERROR("could not open tables file for reading");
+ yy_fatal_error("could not open tables file for reading" YY_CALL_LAST_ARG);
- if(yytables_fload(fp M4_YY_CALL_LAST_ARG) < 0)
- YY_FATAL_ERROR("yytables_fload returned < 0");
- if(M4_YY_TABLES_VERIFY)
+ if(yytables_fload(fp YY_CALL_LAST_ARG) < 0)
+ yy_fatal_error("yytables_fload returned < 0" YY_CALL_LAST_ARG);
+#ifdef TEST_HAS_TABLES_VERIFY
exit(0);
#endif
+#endif
if(argc > 2){
if((fp = fopen(argv[2],"r"))== NULL)
- YY_FATAL_ERROR("could not open input file for reading");
+ yy_fatal_error("could not open input file for reading" YY_CALL_LAST_ARG);
yyin = fp;
}
- while(yylex(M4_YY_CALL_ONLY_ARG) != 0)
+ while(yylex(YY_CALL_ONLY_ARG) != 0)
;
#ifdef TEST_HAS_TABLES_EXTERNAL
- yytables_destroy(M4_YY_CALL_ONLY_ARG);
+ yytables_destroy(YY_CALL_ONLY_ARG);
#endif
- yylex_destroy(M4_YY_CALL_ONLY_ARG);
-
- if(argc < 0) /* silence the compiler */
- yyscanner = (void*)fp;
+ yylex_destroy(YY_CALL_ONLY_ARG);
return 0;
}
diff --git a/tests/test-top-header/Makefile.am b/tests/test-top-header/Makefile.am
new file mode 100644
index 0000000..f855545
--- /dev/null
+++ b/tests/test-top-header/Makefile.am
@@ -0,0 +1,54 @@
+# This file is part of flex.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+
+# Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE.
+
+
+FLEX = $(top_builddir)/flex
+
+builddir = @builddir@
+
+EXTRA_DIST = scanner.l test.input main.c
+CLEANFILES = scanner.c scanner.h $(testname)$(EXEEXT) OUTPUT $(OBJS)
+OBJS = scanner.o main.o
+
+AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir) -I$(top_builddir) -I$(builddir)
+#LDFLAGS = $(top_srcdir)/libfl.a
+LFLAGS = --header="scanner.h"
+#YFLAGS = --defines --output=parser.c
+
+testname = test-top
+
+scanner.c: $(srcdir)/scanner.l
+ $(FLEX) $(LFLAGS) $<
+
+parser.c: $(srcdir)/parser.y
+ $(BISON) $(YFLAGS) $<
+
+$(testname)$(EXEEXT): $(OBJS)
+ $(CC) -o $@ $(LDFLAGS) $(OBJS) $(LOADLIBES)
+
+test: $(testname)$(EXEEXT)
+ ./$(testname)$(EXEEXT) < $(srcdir)/test.input
+
+.c.o:
+ $(CC) -c -o $@ $(AM_CPPFLAGS) $(CPPFLAGS) $(CFLAGS) $<
+
+scanner.h: scanner.c
+main.o: scanner.h
diff --git a/tests/test-top-header/main.c b/tests/test-top-header/main.c
new file mode 100644
index 0000000..353a63e
--- /dev/null
+++ b/tests/test-top-header/main.c
@@ -0,0 +1,63 @@
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+#include "scanner.h"
+
+/* The scanner itself is not important here.
+ * We simply try to use all the functions that are exported in the
+ * header, to see if we get any compiler warnings.
+ */
+int
+main ( int argc, char** argv )
+{
+ yyscan_t scanner;
+ FILE *fp;
+ char * extra = "EXTRA";
+
+ testlex_init(&scanner);
+ testset_in(stdin,scanner);
+ testset_out(stdout,scanner);
+ testset_extra(extra,scanner);
+
+ fp = testget_in(scanner);
+ fp = testget_out(scanner);
+
+ while(testlex(scanner)) {
+ char * text;
+ int line;
+ line = testget_lineno(scanner);
+ text = testget_text(scanner);
+
+ if( (char*)testget_extra(scanner) != extra)
+ break;
+
+ if ( !text || line < 0)
+ continue;
+ }
+ testlex_destroy(scanner);
+ printf("TEST RETURNING OK.\n");
+ return 0;
+}
+
+
+/* vim:set tabstop=8 softtabstop=4 shiftwidth=4: */
diff --git a/tests/test-top-header/scanner.c b/tests/test-top-header/scanner.c
new file mode 100644
index 0000000..c0d5d90
--- /dev/null
+++ b/tests/test-top-header/scanner.c
@@ -0,0 +1,2109 @@
+
+#ifndef testFLEX_HEADER_H
+
+/* A lexical scanner generated by flex */
+
+#line 40 "scanner.l"
+#define DEFINE_ME "hello{"
+
+
+#line 11 "scanner.c"
+
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+#line 25 "scanner.l"
+/* Build "scanner.c".
+ The scanner is not important.
+ This tests the use of %header{ ... %} as an alternative to %top{ ... }.
+ %top is easy to break with brace characters, like the one in the string below.
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+
+#ifndef DEFINE_ME
+#error "DEFINE_ME undefined!"
+#endif
+#line 48 "scanner.c"
+
+/* begin standard C headers. */
+
+#include <stdio.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* end standard C headers. */
+
+/* begin standard C++ headers. */
+
+/* end standard C++ headers. */
+
+/* begin "flexint.h" */
+/* 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;
+#endif /* ! C99 */
+
+/* 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
+
+#endif /* ! FLEXINT_H */
+
+/* end "flexint.h" */
+
+/************************************************************/
+/* Public CPP definitions */
+
+#define YY_INT_ALIGNED flex_int16_t
+
+#define YYIN_INIT ((FILE *)0)
+#define YYOUT_INIT ((FILE *)0)
+
+#define FLEX_SCANNER
+
+#define YY_FLEX_VERSION 2.5.35
+
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* FIXME: move these to the private header? */
+/* 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(). Checking for successful output is new.
+ */
+#define ECHO if ( fwrite(yytext, yyleng, 1, yyout) != yyleng) \
+ { YY_FATAL_ERROR( "output in flex scanner failed" ); }
+
+#endif
+
+/* YY_INPUT Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+
+#ifdef YY_INPUT_INLINE
+/* Note: yy_input() is not the same as yyinput(). */
+#define YY_INPUT(buf,result,max_size) result = yy_input(buf,max_size)
+#else
+#define YY_INPUT(buf,result,max_size) \
+if ( YY_CURRENT_BUFFER->is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for( n = 0; n < (int)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 = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if ( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ } \
+
+#endif
+
+#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
+
+#ifndef YY_ISATTY
+
+#define YY_ISATTY(file) (file ? (isatty(fileno(file)) > 0) : 0)
+
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+
+#define YY_FATAL_ERROR(msg) yy_fatal_error(msg, yyscanner)
+
+#endif
+
+/* The exit() code for fatal errors. */
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+/* Report a non-fatal error. (experimental) */
+#ifndef YY_NONFATAL_ERROR
+#define YY_NONFATAL_ERROR YY_FATAL_ERROR
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/************************************************************/
+/* Public Typedefs */
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *input_file;
+
+ char *ch_buf; /* input buffer */
+ char *buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int 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 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 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 at_bol;
+
+ int bs_lineno; /**< The line count. */
+ int bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int fill_buffer;
+
+ /* Buffer status #defines are currently not written to the
+ * public header.
+ */
+ int buffer_status;
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+/*******************************************************************/
+/* Declaration of public functions */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+ extern int testlex(yyscan_t yyscanner);
+ #endif
+
+extern void testrestart(FILE *input_file,yyscan_t yyscanner);
+extern void test_switch_to_buffer(YY_BUFFER_STATE new_buffer,yyscan_t yyscanner);
+extern YY_BUFFER_STATE test_create_buffer(FILE *file,int size ,yyscan_t yyscanner);
+extern void test_delete_buffer(YY_BUFFER_STATE b,yyscan_t yyscanner);
+extern void test_flush_buffer(YY_BUFFER_STATE b,yyscan_t yyscanner);
+extern void testpush_buffer_state(YY_BUFFER_STATE new_buffer,yyscan_t yyscanner);
+extern void testpop_buffer_state(yyscan_t yyscanner);
+
+extern void * testalloc(yy_size_t size,yyscan_t yyscanner);
+extern void * testrealloc(void *ptr,yy_size_t size,yyscan_t yyscanner);
+extern void testfree(void *ptr,yyscan_t yyscanner);
+
+extern YY_BUFFER_STATE test_scan_buffer(char *base,yy_size_t size,yyscan_t yyscanner);
+extern YY_BUFFER_STATE test_scan_string(const char *yy_str,yyscan_t yyscanner);
+extern YY_BUFFER_STATE test_scan_bytes(const char *bytes,int len,yyscan_t yyscanner);
+
+/* Constructors for the C reentrant scanner. The destructor is
+ * yylex_destroy(), which is also used to release the non-reentrant scanner.
+ */
+extern int testlex_init(yyscan_t *yyscanner_return);
+
+extern int testlex_init_extra(YY_EXTRA_TYPE user_defined,yyscan_t *yyscanner_return);
+
+extern void testlex_init_state(yyscan_t yyscanner);
+
+/*******************************************************************/
+/* Accessor methods to globals.
+ * These are made visible to non-reentrant scanners for convenience.
+ * A nice feature would be an option to make these inline functions.
+ */
+
+extern int testlex_destroy(yyscan_t yyscanner);
+
+extern int testget_debug(const yyscan_t yyscanner);
+
+extern void testset_debug(int debug_flag,yyscan_t yyscanner);
+
+extern YY_EXTRA_TYPE testget_extra(const yyscan_t yyscanner);
+
+extern void testset_extra(YY_EXTRA_TYPE user_defined,yyscan_t yyscanner);
+
+extern FILE * testget_in(const yyscan_t yyscanner);
+
+extern void testset_in(FILE *in_str,yyscan_t yyscanner);
+
+extern FILE * testget_out(const yyscan_t yyscanner);
+
+extern void testset_out(FILE *out_str,yyscan_t yyscanner);
+
+extern int testget_leng(const yyscan_t yyscanner);
+
+extern char * testget_text(const yyscan_t yyscanner);
+
+extern int testget_lineno(const yyscan_t yyscanner);
+
+extern void testset_lineno(int line_number,yyscan_t yyscanner);
+
+extern int testget_column(const yyscan_t yyscanner);
+
+extern void testset_column(int column_no,yyscan_t yyscanner);
+
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+#endif /* testFLEX_HEADER_H */
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. */
+# include <unistd.h>
+#else
+# ifdef __cplusplus
+extern "C" {
+ extern int isatty(int, fd);
+}
+# else
+extern int isatty(int, fd);
+# endif
+#endif
+
+/************************************************************/
+/* Private (file scope) CPP definitions */
+
+#define yywrap() 1
+
+#define YY_SKIP_YYWRAP
+
+#define YY_REENTRANT 1
+
+#define yytext_ptr yytext
+
+#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 testrestart ), so that the user can continue scanning by
+ * just pointing yyin at a new input file.
+ */
+#define YY_BUFFER_EOF_PENDING 2
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+#define YY_JAMBASE 4
+#define YY_JAMSTATE 5
+#define YY_LASTDFA 4
+#define YY_NUL_EC 1
+
+#define YY_NUM_RULES 2
+#define YY_END_OF_BUFFER 3
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index. If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition. This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state. The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE testrestart (yyin , yyscanner)
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* 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))
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+#define YY_LESS_LINENO(n)
+
+/* 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 )
+
+#ifndef YY_NO_INPUT
+#define input() yyinput(yyscanner)
+#endif
+
+/* 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]
+
+#define YY_FLUSH_BUFFER test_flush_buffer (YY_CURRENT_BUFFER, yyscanner)
+
+#define yy_new_buffer test_create_buffer
+
+#define yy_set_interactive(is_interactive_) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack(); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ test_create_buffer (yyin,YY_BUF_SIZE, yyscanner); \
+ } \
+ YY_CURRENT_BUFFER->is_interactive = is_interactive_; \
+ }
+
+#define yy_set_bol(at_bol_) \
+ { \
+ if ( ! YY_CURRENT_BUFFER ){ \
+ yyensure_buffer_stack(); \
+ YY_CURRENT_BUFFER_LVALUE = \
+ test_create_buffer (yyin,YY_BUF_SIZE, yyscanner); \
+ } \
+ YY_CURRENT_BUFFER->at_bol = at_bol_; \
+ }
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER->at_bol)
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+YY_TEXT_IS_ARRAY = false
+YY_USES_YYMORE = false
+ */
+
+#define YY_DO_BEFORE_ACTION \
+yytext_ptr = yy_bp; \
+ yyleng = (size_t) (yy_cp - yy_bp); \
+ yy_hold_char = *yy_cp; \
+ *yy_cp = '\0'; \
+ yy_c_buf_p = yy_cp;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+
+/* The intent behind this definition is that it'll catch
+ * any uses of yymore() which flex missed.
+ */
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+
+#ifndef YY_START_CONDITIONS_DEFINED
+#define INITIAL 0
+
+#endif
+
+/**** PREFIX CONVERSION MACROS ****/
+#ifndef YY_NO_RENAME_MACROS
+
+#define yyextra (((struct yyobject_t*)yyscanner)->extra)
+#define yyin (((struct yyobject_t*)yyscanner)->in)
+#define yyout (((struct yyobject_t*)yyscanner)->out)
+#define yytext (((struct yyobject_t*)yyscanner)->text)
+#define yy_flex_debug (((struct yyobject_t*)yyscanner)->flex_debug)
+#define yyleng (((struct yyobject_t*)yyscanner)->leng)
+#define yy_buffer_stack_top (((struct yyobject_t*)yyscanner)->buffer_stack_top)
+#define yy_buffer_stack_max (((struct yyobject_t*)yyscanner)->buffer_stack_max)
+#define yy_buffer_stack (((struct yyobject_t*)yyscanner)->buffer_stack)
+#define yy_hold_char (((struct yyobject_t*)yyscanner)->hold_char)
+#define yy_n_chars (((struct yyobject_t*)yyscanner)->n_chars)
+#define yy_c_buf_p (((struct yyobject_t*)yyscanner)->c_buf_p)
+#define yy_init (((struct yyobject_t*)yyscanner)->init)
+#define yy_start (((struct yyobject_t*)yyscanner)->start)
+#define yy_did_buffer_switch_on_eof (((struct yyobject_t*)yyscanner)->did_buffer_switch_on_eof)
+#define yy_start_stack_ptr (((struct yyobject_t*)yyscanner)->start_stack_ptr)
+#define yy_start_stack_depth (((struct yyobject_t*)yyscanner)->start_stack_depth)
+#define yy_start_stack (((struct yyobject_t*)yyscanner)->start_stack)
+#define yy_last_accepting_state (((struct yyobject_t*)yyscanner)->last_accepting_state)
+#define yy_last_accepting_cpos (((struct yyobject_t*)yyscanner)->last_accepting_cpos)
+#define yylex testlex
+#define yyrestart testrestart
+#define yy_switch_to_buffer test_switch_to_buffer
+#define yy_create_buffer test_create_buffer
+#define yy_delete_buffer test_delete_buffer
+#define yy_flush_buffer test_flush_buffer
+#define yypush_buffer_state testpush_buffer_state
+#define yypop_buffer_state testpop_buffer_state
+#define yyalloc testalloc
+#define yyrealloc testrealloc
+#define yyfree testfree
+#define yy_scan_buffer test_scan_buffer
+#define yy_scan_string test_scan_string
+#define yy_scan_bytes test_scan_bytes
+#define yylex_init testlex_init
+#define yylex_init_extra testlex_init_extra
+#define yylex_init_state testlex_init_state
+#define yylex_destroy testlex_destroy
+#define yyget_debug testget_debug
+#define yyset_debug testset_debug
+#define yyget_extra testget_extra
+#define yyset_extra testset_extra
+#define yyget_in testget_in
+#define yyset_in testset_in
+#define yyget_out testget_out
+#define yyset_out testset_out
+#define yyget_leng testget_leng
+#define yyget_text testget_text
+#define yyget_lineno testget_lineno
+#define yyset_lineno testset_lineno
+#define yyget_column testget_column
+#define yyset_column testset_column
+
+/* These have renamed prefixes in previous flex versions. All other
+ * static functions retain the yy prefix, so these were changed to conform.
+ */
+#define test_init_buffer yy_init_buffer
+#define test_load_buffer_state yy_load_buffer_state
+
+#endif /* YY_NO_RENAME_MACROS */
+
+/* FIXME: why are these mapped to a specific buffer only for the reentrant scanner?? */
+#undef yylineno
+#define yylineno (YY_CURRENT_BUFFER->bs_lineno)
+#define yycolumn (YY_CURRENT_BUFFER->bs_column)
+
+/**** Private typedefs ****/
+typedef unsigned char YY_CHAR;
+
+struct yy_trans_info
+{
+ flex_int32_t yy_verify;
+ flex_int32_t yy_nxt;
+};
+
+typedef int yy_state_type;
+
+/* Holds the entire state of the reentrant C scanner. */
+struct yyobject_t
+ {
+ /* User-accessible globals (via set/get) */
+
+ /* User-defined. Not touched by flex. */
+ /* Defined first so that (yyobject_t*) can be cast to (YY_EXTRA_TYPE*) */
+ YY_EXTRA_TYPE extra;
+ FILE * in;
+ FILE * out;
+ char * text;
+ int flex_debug;
+ int leng;
+
+ /* Private and other globals for use within testlex (yyscanner) */
+/* Private globals */
+/* Stack of input buffers. */
+ size_t buffer_stack_top; /**< index of top of stack. */
+ size_t buffer_stack_max; /**< capacity of stack. */
+ YY_BUFFER_STATE * buffer_stack; /**< Stack as an array. */
+/* yy_hold_char holds the character lost when yytext is formed. */
+ char hold_char;
+ int n_chars;
+/* Points to current character in buffer. */
+ char * c_buf_p;
+/* Flag indicating whether the testlex state is intialized; called from testlex */
+ int init;
+/* Defines the initial start state for current start-condition */
+ int start;
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin. A bit of a hack ...
+ */
+ int did_buffer_switch_on_eof;
+/* Stack state */
+ int start_stack_ptr;
+ int start_stack_depth;
+ int * start_stack;
+/* Definitions for backing up. We don't need them if REJECT
+ * is being used because then we use an alternative backing-up
+ * technique instead.
+ */
+ yy_state_type last_accepting_state;
+ char * last_accepting_cpos;
+ /* yytext state information */
+
+ }; /* end struct yyobject_t */
+
+/****************** Private Function Prototypes **********************/
+
+static int yy_init_globals(yyscan_t yyscanner);
+
+static void yyensure_buffer_stack(yyscan_t yyscanner);
+static void yy_load_buffer_state(yyscan_t yyscanner);
+static void yy_init_buffer(YY_BUFFER_STATE b,FILE *file,yyscan_t yyscanner);
+static yy_state_type yy_get_previous_state(yyscan_t yyscanner);
+static yy_state_type yy_try_NUL_trans(yy_state_type current_state,yyscan_t yyscanner);
+static int yy_get_next_buffer(yyscan_t yyscanner);
+static void yy_fatal_error(const char *msg,yyscan_t yyscanner);
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen(const char *str);
+#else
+#define yy_flex_strlen strlen
+#endif
+
+#ifndef YY_NO_INPUT
+static int yyinput(yyscan_t yyscanner);
+#endif
+
+/****************** Define Data Tables ******************/
+
+static const flex_int16_t yy_accept[6] = { 0,
+ 0, 0, 3, 1, 0
+ };
+
+static const flex_int16_t yy_base[6] = { 0,
+ 0, 0, 3, 4, 4
+ };
+
+static const flex_int16_t yy_chk[7] = { 0,
+ 1, 1, 3, 5, 5, 5
+ };
+
+static const flex_int16_t yy_def[6] = { 0,
+ 5, 1, 5, 5, 0
+ };
+
+static const flex_int16_t yy_ec[256] = { 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 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 flex_int16_t yy_meta[3] = { 0,
+ 1, 1
+ };
+
+static const flex_int16_t yy_nxt[7] = { 0,
+ 4, 4, 5, 3, 5, 5
+ };
+
+/****************** Define functions *****************/
+#ifdef YY_INPUT_INLINE
+inline int
+yy_input(char* buf,int max_size,yyscan_t yyscanner)
+{
+ int result;
+
+ if ( YY_CURRENT_BUFFER->is_interactive )
+ {
+ int c = '*';
+ int n;
+ for( n = 0; n < (int)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 = fread(buf, 1, max_size, yyin))==0 && ferror(yyin))
+ {
+ if ( errno != EINTR)
+ {
+ YY_FATAL_ERROR( "input in flex scanner failed" );
+ break;
+ }
+ errno=0;
+ clearerr(yyin);
+ }
+ }
+
+ return result;
+}
+#endif
+
+/* The main scanner function which does all the work.
+ * A #define so the user can easily add parameters.
+ * If YY_DECL is defined in the reentrant scanner, and includes yylval
+ * and/or yylloc parameters, #define YY_LVAL_PARAM and YY_LLOC_PARAM to
+ * the parameter names. Alternatively, leave out those parameters, and
+ * set them via yyset_lval() and yyset_lloc().
+ */
+
+#define YY_RULE_SETUP YY_USER_ACTION
+
+#ifdef YY_DECL
+YY_DECL
+#else
+ int
+testlex (yyscan_t yyscanner)
+ #endif
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp, *yy_bp;
+ register int yy_act;
+
+#line 49 "scanner.l"
+
+
+#line 866 "scanner.c"
+ if ( !yy_init )
+ {
+ yy_init = 1;
+
+#ifdef YY_USER_INIT
+ YY_USER_INIT;
+#endif
+
+/* FIXME: This internal init should be available with input(),unput(). See bug 618177.
+ BUT: are those functions supposed to be valid outside of testlex (yyscanner)? */
+
+ if ( ! yy_start )
+ yy_start = 1; /* first start state */
+/* FIXME: why init these when the stdinit option may be disabled?? */
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ test_create_buffer (yyin,YY_BUF_SIZE, yyscanner);
+ }
+
+ yy_load_buffer_state (yyscanner);
+ }
+
+ while ( 1 ) /* loops until end-of-file is reached */
+ {
+
+ yy_cp = yy_c_buf_p;
+
+ /* Support of yytext. */
+ *yy_cp = yy_hold_char;
+
+ /* yy_bp points to the position in yy_ch_buf of the start of
+ * the current run.
+ */
+ yy_bp = yy_cp;
+
+ yy_current_state = yy_start;
+
+yy_match:
+
+ do {
+
+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+
+ if ( yy_accept[yy_current_state] )
+
+ {
+ yy_last_accepting_state = yy_current_state;
+ yy_last_accepting_cpos = yy_cp;
+ }
+
+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+ {
+ yy_current_state = (int) yy_def[yy_current_state];
+
+ if ( yy_current_state >= (YY_LASTDFA+2) )
+ yy_c = yy_meta[(unsigned int) yy_c];
+
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+
+ ++yy_cp;
+ }
+
+ while ( yy_base[yy_current_state] != YY_JAMBASE );
+
+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;
+
+ /* Backing-up info for compressed tables is taken *after*
+ * yy_cp has been incremented for the next state.
+ */
+ yy_cp = yy_last_accepting_cpos;
+
+ yy_current_state = yy_last_accepting_state;
+ goto yy_find_action;
+
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+#line 51 "scanner.l"
+{ }
+ YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 53 "scanner.l"
+ECHO;
+ YY_BREAK
+#line 980 "scanner.c"
+ case YY_STATE_EOF(INITIAL):
+ yyterminate();
+#line 983 "scanner.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->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
+ * testlex (yyscanner). 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->n_chars;
+ YY_CURRENT_BUFFER->input_file = yyin;
+ YY_CURRENT_BUFFER->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->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 (yyscanner);
+
+ /* Okay, we're now positioned to make the NUL
+ * transition. We couldn't have
+ * yy_get_previous_state (yyscanner) 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, yyscanner);
+
+ yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+ if ( yy_next_state )
+ {
+ /* Consume the NUL. */
+ yy_cp = ++yy_c_buf_p;
+ yy_current_state = yy_next_state;
+ goto yy_match;
+ }
+
+ else
+ {
+
+ yy_cp = yy_c_buf_p;
+
+ goto yy_find_action;
+ }
+ }
+
+ else switch( yy_get_next_buffer (yyscanner) )
+ {
+ 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 (yyscanner) 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 (yyscanner);
+
+ 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->ch_buf[yy_n_chars];
+
+ yy_current_state = yy_get_previous_state (yyscanner);
+
+ 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 testlex */
+
+/* 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 (yyscan_t yyscanner)
+{
+ register char *dest = YY_CURRENT_BUFFER->ch_buf;
+ register char *source = yytext_ptr;
+ register int number_to_move, i;
+ int ret_val;
+
+ if ( yy_c_buf_p > &YY_CURRENT_BUFFER->ch_buf[yy_n_chars + 1] )
+ YY_FATAL_ERROR(
+ "fatal flex scanner internal error--end of buffer missed" );
+
+ if ( YY_CURRENT_BUFFER->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->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->n_chars = yy_n_chars = 0;
+
+ else
+ {
+ int num_to_read =
+ YY_CURRENT_BUFFER->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;
+
+ int yy_c_buf_p_offset =
+ (int) (yy_c_buf_p - b->ch_buf);
+
+ if ( b->is_our_buffer )
+ {
+ int new_size = b->buf_size * 2;
+
+ if ( new_size <= 0 )
+ b->buf_size += b->buf_size / 8;
+ else
+ b->buf_size *= 2;
+
+ b->ch_buf = (char *)
+ /* Include room in for 2 EOB chars. */
+ testrealloc ((void *) b->ch_buf,b->buf_size + 2 , yyscanner);
+ }
+ else
+ /* Can't grow it, we don't own it. */
+ b->ch_buf = 0;
+
+ if ( ! b->ch_buf )
+ YY_FATAL_ERROR(
+ "fatal error - scanner input buffer overflow" );
+
+ yy_c_buf_p = &b->ch_buf[yy_c_buf_p_offset];
+
+ num_to_read = YY_CURRENT_BUFFER->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->ch_buf[number_to_move]),
+ yy_n_chars, (size_t) num_to_read );
+
+ YY_CURRENT_BUFFER->n_chars = yy_n_chars;
+ }
+
+ if ( yy_n_chars == 0 )
+ {
+ if ( number_to_move == YY_MORE_ADJ )
+ {
+ ret_val = EOB_ACT_END_OF_FILE;
+ testrestart (yyin, yyscanner);
+ }
+
+ else
+ {
+ ret_val = EOB_ACT_LAST_MATCH;
+ YY_CURRENT_BUFFER->buffer_status =
+ YY_BUFFER_EOF_PENDING;
+ }
+ }
+
+ else
+ ret_val = EOB_ACT_CONTINUE_SCAN;
+
+ if ((yy_size_t) (yy_n_chars + number_to_move) > YY_CURRENT_BUFFER->buf_size) {
+ /* Extend the array by 50%, plus the number we really need. */
+ yy_size_t new_size = yy_n_chars + number_to_move + (yy_n_chars >> 1);
+ YY_CURRENT_BUFFER->ch_buf = (char *) testrealloc ((void *) YY_CURRENT_BUFFER->ch_buf,new_size , yyscanner);
+ if ( ! YY_CURRENT_BUFFER->ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer (yyscanner)" );
+ }
+
+ yy_n_chars += number_to_move;
+ YY_CURRENT_BUFFER->ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+ YY_CURRENT_BUFFER->ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+ yytext_ptr = &YY_CURRENT_BUFFER->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 (yyscan_t yyscanner)
+{
+ register yy_state_type yy_current_state;
+ register char *yy_cp;
+
+ yy_current_state = yy_start;
+
+ for( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+ {
+
+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : YY_NUL_EC);
+
+ 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 >= (YY_LASTDFA+2) )
+ yy_c = yy_meta[(unsigned int) yy_c];
+
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+
+ }
+
+ return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ * next_state = yy_try_NUL_trans (current_state , yyscanner);
+ */
+ /* NOTE: the reentrant object may be unreferenced, depending upon build options. */
+static yy_state_type
+yy_try_NUL_trans (yy_state_type yy_current_state,yyscan_t yyscanner)
+{
+ register int yy_is_jam;
+
+ register char *yy_cp = yy_c_buf_p;
+
+ register YY_CHAR yy_c = YY_NUL_EC;
+
+ 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 >= (YY_LASTDFA+2) )
+ yy_c = yy_meta[(unsigned int) yy_c];
+
+ }
+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+
+ yy_is_jam = (yy_current_state == YY_JAMSTATE);
+
+ return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_INPUT
+/* Function to read one character from the input stream */
+static int
+yyinput (yyscan_t yyscanner)
+{
+ 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->ch_buf[yy_n_chars] )
+ /* This was really a NUL. */
+ *yy_c_buf_p = '\0';
+
+ else
+ { /* need more input */
+ int offset = yy_c_buf_p - yytext_ptr;
+ ++yy_c_buf_p;
+
+ switch( yy_get_next_buffer (yyscanner) )
+ {
+ 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. */
+ testrestart (yyin, yyscanner);
+
+ /*FALLTHROUGH*/
+
+ case EOB_ACT_END_OF_FILE:
+ {
+ if ( yywrap( ) )
+ return EOF;
+
+ if ( ! yy_did_buffer_switch_on_eof )
+ YY_NEW_FILE;
+ return input();
+ }
+
+ case EOB_ACT_CONTINUE_SCAN:
+ yy_c_buf_p = yytext_ptr + offset;
+ break;
+ }
+ }
+ }
+
+ c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */
+ *yy_c_buf_p = '\0'; /* preserve yytext */
+ yy_hold_char = *++yy_c_buf_p;
+
+ return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * @param yyscanner The scanner object.
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+void
+testrestart (FILE *input_file,yyscan_t yyscanner)
+{
+
+ if ( ! YY_CURRENT_BUFFER ){
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ test_create_buffer (yyin,YY_BUF_SIZE, yyscanner);
+ }
+
+ yy_init_buffer (YY_CURRENT_BUFFER,input_file, yyscanner);
+ yy_load_buffer_state (yyscanner);
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * @param yyscanner The scanner object.
+ */
+void
+test_switch_to_buffer (YY_BUFFER_STATE new_buffer,yyscan_t yyscanner)
+{
+
+ /* TODO. We should be able to replace this entire function body
+ * with
+ * testpop_buffer_state (yyscanner);
+ * testpush_buffer_state (new_buffer, yyscanner);
+ */
+ yyensure_buffer_stack (yyscanner);
+ if ( YY_CURRENT_BUFFER_LVALUE == new_buffer )
+ return;
+
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yy_c_buf_p = yy_hold_char;
+ YY_CURRENT_BUFFER->buf_pos = yy_c_buf_p;
+ YY_CURRENT_BUFFER->n_chars = yy_n_chars;
+ }
+
+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
+ yy_load_buffer_state (yyscanner);
+
+ /* 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 (yyscan_t yyscanner)
+{
+ yy_n_chars = YY_CURRENT_BUFFER->n_chars;
+ yytext_ptr = yy_c_buf_p = YY_CURRENT_BUFFER->buf_pos;
+ yyin = YY_CURRENT_BUFFER->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.
+ * @param yyscanner The scanner object.
+ * @return the allocated buffer state.
+ */
+YY_BUFFER_STATE
+test_create_buffer (FILE *file,int size,yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ b = (YY_BUFFER_STATE) testalloc (sizeof( struct yy_buffer_state ) , yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in test_create_buffer (yyscanner)" );
+
+ b->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->ch_buf = (char *) testalloc (b->buf_size + 2 , yyscanner);
+ if ( ! b->ch_buf )
+ YY_FATAL_ERROR( "out of dynamic memory in test_create_buffer (yyscanner)" );
+
+ b->is_our_buffer = 1;
+
+ yy_init_buffer (b,file, yyscanner);
+
+ return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with test_create_buffer (yyscanner)
+ * @param yyscanner The scanner object.
+ */
+void
+test_delete_buffer (YY_BUFFER_STATE b,yyscan_t yyscanner)
+{
+
+ 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->is_our_buffer )
+ testfree ((void *) b->ch_buf , yyscanner);
+
+ testfree ((void *) b , yyscanner);
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a testrestart (yyscanner) or at EOF.
+ */
+static void
+yy_init_buffer (YY_BUFFER_STATE b,FILE * file,yyscan_t yyscanner)
+{
+ int oerrno = errno;
+
+ test_flush_buffer (b, yyscanner);
+
+ b->input_file = file;
+ b->fill_buffer = 1;
+
+ /* If b is the current buffer, then yy_init_buffer was _probably_
+ * called from testrestart (yyscanner) 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->bs_lineno = 1;
+ b->bs_column = 0;
+ }
+
+ b->is_interactive = YY_ISATTY(file);
+
+ 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.
+ * @param yyscanner The scanner object.
+ */
+void
+test_flush_buffer (YY_BUFFER_STATE b,yyscan_t yyscanner)
+{
+ if ( ! b )
+ return;
+
+ b->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->ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+ b->ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+ b->buf_pos = &b->ch_buf[0];
+
+ b->at_bol = 1;
+ b->buffer_status = YY_BUFFER_NEW;
+
+ if ( b == YY_CURRENT_BUFFER )
+ yy_load_buffer_state (yyscanner);
+}
+
+/** 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.
+ * @param yyscanner The scanner object.
+ */
+void
+testpush_buffer_state (YY_BUFFER_STATE new_buffer,yyscan_t yyscanner)
+{
+ if (new_buffer == NULL)
+ return;
+
+ yyensure_buffer_stack (yyscanner);
+
+ /* This block is copied from test_switch_to_buffer . */
+ if ( YY_CURRENT_BUFFER )
+ {
+ /* Flush out information for old buffer. */
+ *yy_c_buf_p = yy_hold_char;
+ YY_CURRENT_BUFFER->buf_pos = yy_c_buf_p;
+ YY_CURRENT_BUFFER->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 test_switch_to_buffer . */
+ yy_load_buffer_state (yyscanner);
+ yy_did_buffer_switch_on_eof = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ * The next element becomes the new top.
+ * @param yyscanner The scanner object.
+ */
+void
+testpop_buffer_state (yyscan_t yyscanner)
+{
+ if (!YY_CURRENT_BUFFER)
+ return;
+
+ test_delete_buffer (YY_CURRENT_BUFFER, yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ if (yy_buffer_stack_top > 0)
+ --yy_buffer_stack_top;
+
+ if (YY_CURRENT_BUFFER) {
+ yy_load_buffer_state (yyscanner);
+ 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 (yyscan_t yyscanner)
+{
+ 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;
+ yy_buffer_stack = (struct yy_buffer_state**)
+ testalloc (num_to_alloc * sizeof(struct yy_buffer_state*), yyscanner);
+
+ if ( ! yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack (yyscanner)" );
+
+ 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. */
+ int grow_size = 8 /* arbitrary grow size */;
+
+ num_to_alloc = yy_buffer_stack_max + grow_size;
+ yy_buffer_stack = (struct yy_buffer_state**)
+ testrealloc (yy_buffer_stack,num_to_alloc * sizeof(struct yy_buffer_state*), yyscanner);
+
+ if ( ! yy_buffer_stack )
+ YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack (yyscanner)" );
+
+ /* 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
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE
+test_scan_buffer (char * base,yy_size_t size,yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+
+ if ( size < 2 ||
+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
+ base[size-1] != YY_END_OF_BUFFER_CHAR )
+ /* They forgot to leave room for the EOB's. */
+ return 0;
+
+ b = (YY_BUFFER_STATE) testalloc (sizeof( struct yy_buffer_state ) , yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "out of dynamic memory in test_scan_buffer (yyscanner)" );
+
+ b->buf_size = size - 2; /* "- 2" to take care of EOB's */
+ b->buf_pos = b->ch_buf = base;
+ b->is_our_buffer = 0;
+ b->input_file = 0;
+ b->n_chars = b->buf_size;
+ b->is_interactive = 0;
+ b->at_bol = 1;
+ b->fill_buffer = 0;
+ b->buffer_status = YY_BUFFER_NEW;
+
+ test_switch_to_buffer (b , yyscanner);
+
+ return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to testlex (yyscanner) will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ * test_scan_bytes (yyscanner) instead.
+ */
+YY_BUFFER_STATE
+test_scan_string (const char * yystr,yyscan_t yyscanner)
+{
+
+ return test_scan_bytes (yystr,strlen(yystr), yyscanner);
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to testlex (yyscanner) will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yyscanner The scanner object.
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE
+test_scan_bytes (const char * yybytes,int _yybytes_len,yyscan_t yyscanner)
+{
+ YY_BUFFER_STATE b;
+ char *buf;
+ yy_size_t n;
+ int i;
+
+ /* Get memory for full buffer, including space for trailing EOB's. */
+ n = _yybytes_len + 2;
+ buf = (char *) testalloc (n , yyscanner);
+ if ( ! buf )
+ YY_FATAL_ERROR( "out of dynamic memory in test_scan_bytes (yyscanner)" );
+
+ for( i = 0; i < _yybytes_len; ++i )
+ buf[i] = yybytes[i];
+
+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+ b = test_scan_buffer (buf,n, yyscanner);
+ if ( ! b )
+ YY_FATAL_ERROR( "bad buffer in test_scan_bytes (yyscanner)" );
+
+ /* It's okay to grow etc. this buffer, and we should throw it
+ * away when we're done.
+ */
+ b->is_our_buffer = 1;
+
+ return b;
+}
+
+static void
+yy_fatal_error (const char* msg,yyscan_t yyscanner)
+{
+
+ (void) fprintf( stderr, "%s\n", msg );
+
+ exit( YY_EXIT_FAILURE );
+}
+
+/* Accessor methods(get/set functions) to struct members. */
+
+/** Get the user-defined data for this scanner.
+ * @param yyscanner The scanner object.
+ */
+YY_EXTRA_TYPE
+testget_extra (const yyscan_t yyscanner)
+{
+ return yyextra;
+}
+
+/** Get the current line number.
+ * @param yyscanner The scanner object.
+ */
+int
+testget_lineno (const yyscan_t yyscanner)
+{
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yylineno;
+}
+
+/** Get the current column number.
+ * @param yyscanner The scanner object.
+ */
+int
+testget_column (const yyscan_t yyscanner)
+{
+
+ if (! YY_CURRENT_BUFFER)
+ return 0;
+
+ return yycolumn;
+}
+
+/** Get the input stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *
+testget_in (const yyscan_t yyscanner)
+{
+ return yyin;
+}
+
+/** Get the output stream.
+ * @param yyscanner The scanner object.
+ */
+FILE *
+testget_out (const yyscan_t yyscanner)
+{
+ return yyout;
+}
+
+/** Get the length of the current token.
+ * @param yyscanner The scanner object.
+ */
+int
+testget_leng (const yyscan_t yyscanner)
+{
+ return yyleng;
+}
+
+/** Get the current token.
+ * @param yyscanner The scanner object.
+ */
+
+char *
+testget_text (const yyscan_t yyscanner)
+{
+ return yytext;
+}
+
+/** Set the user-defined data. This data is never touched by the scanner.
+ * @param user_defined The data to be associated with this scanner.
+ * @param yyscanner The scanner object.
+ */
+void
+testset_extra (YY_EXTRA_TYPE user_defined,yyscan_t yyscanner)
+{
+ yyextra = user_defined ;
+}
+
+/** Set the current line number.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void
+testset_lineno (int line_number,yyscan_t yyscanner)
+{
+
+ /* lineno is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "testset_lineno called with no buffer");
+
+ yylineno = line_number;
+}
+
+/** Set the current column.
+ * @param line_number
+ * @param yyscanner The scanner object.
+ */
+void
+testset_column (int column_no,yyscan_t yyscanner)
+{
+
+ /* column is only valid if an input buffer exists. */
+ if (! YY_CURRENT_BUFFER )
+ YY_FATAL_ERROR( "testset_column called with no buffer");
+
+ yycolumn = column_no;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * @param yyscanner The scanner object.
+ * @see test_switch_to_buffer
+ */
+void
+testset_in (FILE * in_str,yyscan_t yyscanner)
+{
+ yyin = in_str ;
+}
+
+void
+testset_out (FILE * out_str,yyscan_t yyscanner)
+{
+ yyout = out_str ;
+}
+
+int
+testget_debug (const yyscan_t yyscanner)
+{
+ return yy_flex_debug;
+}
+
+void
+testset_debug (int bdebug,yyscan_t yyscanner)
+{
+ yy_flex_debug = bdebug ;
+}
+
+/* User-visible API */
+
+/* testlex_init creates the scanner object itself (a constructor).
+ * It follows the convention of taking the scanner as the last argument, but
+ * it is a *pointer* to a scanner, and will be allocated by this call.
+ */
+int
+testlex_init(yyscan_t *yyscanner_return)
+{
+ yyscan_t yyscanner;
+
+ if (yyscanner_return == 0){
+ errno = EINVAL;
+ return 1;
+ }
+/* yyscanner may be invalid here, unless called from testlex_init_extra. */
+ yyscanner = *yyscanner_return;
+
+ *yyscanner_return = (yyscan_t) testalloc (sizeof( struct yyobject_t ), yyscanner);
+
+ if (*yyscanner_return == 0){
+ errno = ENOMEM;
+ return 1;
+ }
+
+ yyscanner = *yyscanner_return;
+
+ /* By setting to 0xAA, we expose bugs in yy_init_globals . Leave at 0x00 for releases. */
+
+ memset(yyscanner,0x00,sizeof(struct yyobject_t));
+
+ return yy_init_globals (yyscanner);
+}
+
+/* testlex_init_extra has the same functionality as testlex_init, but includes
+ * an argument to initialize the yyextra pointer. This version is required
+ * if you supply a testalloc (yyscanner) function that references the yyextra pointer.
+ */
+int
+testlex_init_extra(YY_EXTRA_TYPE user_defined,yyscan_t *yyscanner_return)
+{
+ struct yyobject_t dummy_object;
+ int status;
+
+ yyscan_t yyscanner = (yyscan_t)&dummy_object;
+ testset_extra (user_defined, yyscanner);
+ status = testlex_init(&yyscanner);
+
+ if (!status) {
+ testset_extra (user_defined, yyscanner);
+ *yyscanner_return = yyscanner;
+ }
+
+ return status;
+}
+
+static int
+yy_init_globals (yyscan_t yyscanner)
+{
+ /* Initialization is the same as for the non-reentrant scanner.
+ * This function is called from testlex_destroy (yyscanner), so don't allocate here.
+ * (Which means that is essentially impossible to get an error here.)
+ */
+ ((struct yyobject_t*)yyscanner)->in = YYIN_INIT;
+ ((struct yyobject_t*)yyscanner)->out = YYOUT_INIT;
+ ((struct yyobject_t*)yyscanner)->text = NULL;
+ ((struct yyobject_t*)yyscanner)->flex_debug = 0;
+ ((struct yyobject_t*)yyscanner)->leng = 0;
+ ((struct yyobject_t*)yyscanner)->buffer_stack_top = 0;
+ ((struct yyobject_t*)yyscanner)->buffer_stack_max = 0;
+ ((struct yyobject_t*)yyscanner)->buffer_stack = 0;
+ ((struct yyobject_t*)yyscanner)->c_buf_p = 0;
+ ((struct yyobject_t*)yyscanner)->init = 0;
+ ((struct yyobject_t*)yyscanner)->start = 0;
+ ((struct yyobject_t*)yyscanner)->did_buffer_switch_on_eof = 0;
+ ((struct yyobject_t*)yyscanner)->start_stack_ptr = 0;
+ ((struct yyobject_t*)yyscanner)->start_stack_depth = 0;
+ ((struct yyobject_t*)yyscanner)->start_stack = 0;
+
+ /* For future reference: Set errno on error, since we are called by
+ * testlex_init()
+ */
+ return 0;
+}
+
+void
+testlex_init_state (yyscan_t yyscanner) {
+ if (!yy_init) {
+ yy_init = 1;
+
+ if ( ! yy_start )
+ BEGIN(INITIAL); /* first start state */
+
+/* FIXME: why init these even when the stdinit option may be disabled?? */
+ if ( ! yyin )
+ yyin = stdin;
+
+ if ( ! yyout )
+ yyout = stdout;
+
+ if ( ! YY_CURRENT_BUFFER ) {
+ yyensure_buffer_stack (yyscanner);
+ YY_CURRENT_BUFFER_LVALUE =
+ test_create_buffer (yyin,YY_BUF_SIZE, yyscanner);
+ }
+
+ yy_load_buffer_state (yyscanner);
+ }
+}
+
+/* testlex_destroy is for both reentrant and non-reentrant scanners. */
+int
+testlex_destroy (yyscan_t yyscanner)
+{
+
+ /* Pop the buffer stack, destroying each element. */
+ while (YY_CURRENT_BUFFER){
+ test_delete_buffer (YY_CURRENT_BUFFER , yyscanner);
+ YY_CURRENT_BUFFER_LVALUE = NULL;
+ testpop_buffer_state (yyscanner);
+ }
+
+ /* Destroy the stack itself. */
+ testfree (yy_buffer_stack, yyscanner);
+ yy_buffer_stack = NULL;
+
+ /* Destroy the start condition stack. */
+ testfree (yy_start_stack , yyscanner);
+ yy_start_stack = NULL;
+
+ /* Destroy the main struct(reentrant only). */
+ testfree (yyscanner , yyscanner);
+
+ return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifdef YY_NEED_STRLEN
+static int
+yy_flex_strlen(const char *s)
+{
+ register int n;
+ for( n = 0; s[n]; ++n )
+ ;
+
+ return n;
+}
+#endif
+
+void *
+testalloc (yy_size_t size,yyscan_t yyscanner)
+{
+ return(void *) malloc( size );
+}
+
+void *
+testrealloc (void *ptr,yy_size_t size,yyscan_t yyscanner)
+{
+ /* The cast to(char *) in the following accommodates both
+ * implementations that use char* generic pointers, and those
+ * that use void* generic pointers. It works with the latter
+ * because both ANSI C and C++ allow castless assignment from
+ * any pointer type to void*, and deal with argument conversions
+ * as though doing an assignment.
+ */
+ return(void *) realloc( (char *) ptr, size );
+}
+
+void
+testfree (void *ptr,yyscan_t yyscanner)
+{
+ free( (char *) ptr ); /* see testrealloc (yyscanner) for(char *) cast */
+}
+
+/* end table serialization code definitions */
+
+/*****************************************************/
+
+/* 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 )
+
+#line 53 "scanner.l"
+
+
+#line 2109 "scanner.c"
+
diff --git a/tests/test-top-header/scanner.h b/tests/test-top-header/scanner.h
new file mode 100644
index 0000000..f8d385a
--- /dev/null
+++ b/tests/test-top-header/scanner.h
@@ -0,0 +1,390 @@
+
+#ifndef testFLEX_HEADER_H
+#define testFLEX_HEADER_H
+#define testIN_HEADER 1
+
+/* A lexical scanner generated by flex */
+
+#line 40 "scanner.l"
+#define DEFINE_ME "hello{"
+
+
+#line 13 "scanner.h"
+
+/* begin standard C headers. */
+
+#include <stdio.h>
+
+#include <string.h>
+#include <stdlib.h>
+
+#include <errno.h>
+
+/* end standard C headers. */
+
+/* begin standard C++ headers. */
+
+/* end standard C++ headers. */
+
+/* begin "flexint.h" */
+/* 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;
+#endif /* ! C99 */
+
+/* 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
+
+#endif /* ! FLEXINT_H */
+
+/* end "flexint.h" */
+
+/************************************************************/
+/* Public CPP definitions */
+
+#define YY_INT_ALIGNED flex_int16_t
+
+#define YYIN_INIT ((FILE *)0)
+#define YYOUT_INIT ((FILE *)0)
+
+#define FLEX_SCANNER
+
+#define YY_FLEX_VERSION 2.5.35
+
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 35
+
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+#ifdef YY_HEADER_EXPORT_START_CONDITIONS
+#define YY_START_CONDITIONS_DEFINED
+#define INITIAL 0
+
+#endif
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* FIXME: move these to the private header? */
+/* 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(). Checking for successful output is new.
+ */
+#define ECHO if ( fwrite(yytext, yyleng, 1, yyout) != yyleng) \
+ { YY_FATAL_ERROR( "output in flex scanner failed" ); }
+
+#endif
+
+/* YY_INPUT Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+
+#ifdef YY_INPUT_INLINE
+/* Note: yy_input() is not the same as yyinput(). */
+#define YY_INPUT(buf,result,max_size) result = yy_input(buf,max_size)
+#else
+#define YY_INPUT(buf,result,max_size) \
+if ( YY_CURRENT_BUFFER->is_interactive ) \
+ { \
+ int c = '*'; \
+ int n; \
+ for( n = 0; n < (int)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 = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+ { \
+ if ( errno != EINTR) \
+ { \
+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
+ break; \
+ } \
+ errno=0; \
+ clearerr(yyin); \
+ } \
+ } \
+
+#endif
+
+#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
+
+#ifndef YY_ISATTY
+
+#define YY_ISATTY(file) (file ? (isatty(fileno(file)) > 0) : 0)
+
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+
+#define YY_FATAL_ERROR(msg) yy_fatal_error(msg, yyscanner)
+
+#endif
+
+/* The exit() code for fatal errors. */
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+/* Report a non-fatal error. (experimental) */
+#ifndef YY_NONFATAL_ERROR
+#define YY_NONFATAL_ERROR YY_FATAL_ERROR
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/************************************************************/
+/* Public Typedefs */
+
+/* An opaque pointer. */
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void* yyscan_t;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+ {
+ FILE *input_file;
+
+ char *ch_buf; /* input buffer */
+ char *buf_pos; /* current position in input buffer */
+
+ /* Size of input buffer in bytes, not including room for EOB
+ * characters.
+ */
+ yy_size_t buf_size;
+
+ /* Number of characters read into yy_ch_buf, not including EOB
+ * characters.
+ */
+ int 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 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 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 at_bol;
+
+ int bs_lineno; /**< The line count. */
+ int bs_column; /**< The column count. */
+
+ /* Whether to try to fill the input buffer when we reach the
+ * end of it.
+ */
+ int fill_buffer;
+
+ /* Buffer status #defines are currently not written to the
+ * public header.
+ */
+ int buffer_status;
+
+ };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+/*******************************************************************/
+/* Declaration of public functions */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+ extern int testlex(yyscan_t yyscanner);
+ #endif
+
+extern void testrestart(FILE *input_file,yyscan_t yyscanner);
+extern void test_switch_to_buffer(YY_BUFFER_STATE new_buffer,yyscan_t yyscanner);
+extern YY_BUFFER_STATE test_create_buffer(FILE *file,int size ,yyscan_t yyscanner);
+extern void test_delete_buffer(YY_BUFFER_STATE b,yyscan_t yyscanner);
+extern void test_flush_buffer(YY_BUFFER_STATE b,yyscan_t yyscanner);
+extern void testpush_buffer_state(YY_BUFFER_STATE new_buffer,yyscan_t yyscanner);
+extern void testpop_buffer_state(yyscan_t yyscanner);
+
+extern void * testalloc(yy_size_t size,yyscan_t yyscanner);
+extern void * testrealloc(void *ptr,yy_size_t size,yyscan_t yyscanner);
+extern void testfree(void *ptr,yyscan_t yyscanner);
+
+extern YY_BUFFER_STATE test_scan_buffer(char *base,yy_size_t size,yyscan_t yyscanner);
+extern YY_BUFFER_STATE test_scan_string(const char *yy_str,yyscan_t yyscanner);
+extern YY_BUFFER_STATE test_scan_bytes(const char *bytes,int len,yyscan_t yyscanner);
+
+/* Constructors for the C reentrant scanner. The destructor is
+ * yylex_destroy(), which is also used to release the non-reentrant scanner.
+ */
+extern int testlex_init(yyscan_t *yyscanner_return);
+
+extern int testlex_init_extra(YY_EXTRA_TYPE user_defined,yyscan_t *yyscanner_return);
+
+extern void testlex_init_state(yyscan_t yyscanner);
+
+/*******************************************************************/
+/* Accessor methods to globals.
+ * These are made visible to non-reentrant scanners for convenience.
+ * A nice feature would be an option to make these inline functions.
+ */
+
+extern int testlex_destroy(yyscan_t yyscanner);
+
+extern int testget_debug(const yyscan_t yyscanner);
+
+extern void testset_debug(int debug_flag,yyscan_t yyscanner);
+
+extern YY_EXTRA_TYPE testget_extra(const yyscan_t yyscanner);
+
+extern void testset_extra(YY_EXTRA_TYPE user_defined,yyscan_t yyscanner);
+
+extern FILE * testget_in(const yyscan_t yyscanner);
+
+extern void testset_in(FILE *in_str,yyscan_t yyscanner);
+
+extern FILE * testget_out(const yyscan_t yyscanner);
+
+extern void testset_out(FILE *out_str,yyscan_t yyscanner);
+
+extern int testget_leng(const yyscan_t yyscanner);
+
+extern char * testget_text(const yyscan_t yyscanner);
+
+extern int testget_lineno(const yyscan_t yyscanner);
+
+extern void testset_lineno(int line_number,yyscan_t yyscanner);
+
+extern int testget_column(const yyscan_t yyscanner);
+
+extern void testset_column(int column_no,yyscan_t yyscanner);
+
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+#undef testIN_HEADER
+#endif /* testFLEX_HEADER_H */
diff --git a/tests/test-top-header/scanner.l b/tests/test-top-header/scanner.l
new file mode 100644
index 0000000..c69e52c
--- /dev/null
+++ b/tests/test-top-header/scanner.l
@@ -0,0 +1,54 @@
+/*
+ * This file is part of flex.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+%{
+/* Build "scanner.c".
+ The scanner is not important.
+ This tests the use of %header{ ... %} as an alternative to %top{ ... }.
+ %top is easy to break with brace characters, like the one in the string below.
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+
+#ifndef DEFINE_ME
+#error "DEFINE_ME undefined!"
+#endif
+%}
+
+%header{
+#define DEFINE_ME "hello{"
+%}
+
+%option reentrant
+%option 8bit outfile="scanner.c" prefix="test"
+%option nounput nomain noyywrap
+%option warn
+
+
+%%
+
+.|\n { }
+
+%%
+
diff --git a/tests/test-top-header/test.input b/tests/test-top-header/test.input
new file mode 100644
index 0000000..2ce5001
--- /dev/null
+++ b/tests/test-top-header/test.input
@@ -0,0 +1,3 @@
+Any input is ok for this scanner.
+We only care if it links.
+
diff --git a/tests/test-yyextra/scanner.l b/tests/test-yyextra/scanner.l
index baba52b..8e7c0fe 100644
--- a/tests/test-yyextra/scanner.l
+++ b/tests/test-yyextra/scanner.l
@@ -43,7 +43,8 @@ struct Buffer {
#define YY_EXTRA_TYPE struct Buffer *
/* Save char into junk array at next position. */
-static void append_char (char c, yyscan_t scanner );
+/* static void append_char (char c, yyscan_t scanner ); FIXME? */
+static void append_char (char c, void *scanner );
%}