From c85a67b53f5f5a8c1b911af77352136216b9f393 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Wed, 1 Jun 2022 18:02:58 -0400 Subject: [PATCH 01/37] refactor(backend): Begin definition of C backend --- src/Makefile.am | 3 + src/cpp-backend.c | 351 ++++++++++++++++++++++++++++++++++++++++++++++ src/cpp-backend.h | 47 +++++++ src/flexdef.h | 21 +-- src/main.c | 2 + src/skeletons.c | 23 ++- src/skeletons.h | 98 +++++++++++++ 7 files changed, 523 insertions(+), 22 deletions(-) create mode 100644 src/cpp-backend.c create mode 100644 src/cpp-backend.h create mode 100644 src/skeletons.h diff --git a/src/Makefile.am b/src/Makefile.am index b9ead0740..bc30c206c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -64,6 +64,8 @@ endif COMMON_SOURCES = \ buf.c \ ccl.c \ + cpp-backend.c \ + cpp-backend.h \ dfa.c \ ecs.c \ filter.c \ @@ -82,6 +84,7 @@ COMMON_SOURCES = \ scanopt.c \ scanopt.h \ skeletons.c \ + skeletons.h \ sym.c \ tables.c \ tables.h \ diff --git a/src/cpp-backend.c b/src/cpp-backend.c new file mode 100644 index 000000000..1239a835a --- /dev/null +++ b/src/cpp-backend.c @@ -0,0 +1,351 @@ +/* cpp-backend.c - C++ backend file for flex */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* 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 "flexdef.h" +#include "cpp-backend.h" + +const int CPP_BACKEND_MAX_INDENT = 256; + +const char *cpp_skel[] = { +#include "cpp-flex.h" +0 +}; + +const char * cpp_get_int32_type ( struct flex_backend_t *b ) { + return "flex_int32_t"; +} + +static const char * cpp_get_int16_type ( struct flex_backend_t *b ) { + return "flex_int16_t"; +} + +static void cpp_open_block_comment ( struct flex_backend_t *b ) { + fputs("/* ", stdout); +} + +static void cpp_close_block_comment ( struct flex_backend_t *b ) { + fputs(" */", stdout); +} + +static void cpp_comment ( struct flex_backend_t *b, const char *c ) { + b->indent(b); + fprintf(stdout, "/* %s */", c); +} + +static void cpp_record_separator ( struct flex_backend_t *b ) { + fputs("},\n", stdout); +} + +static void cpp_column_separator ( struct flex_backend_t *b ){ + fputs(", ", stdout); +} + +static void cpp_newline ( struct flex_backend_t *b ) { + fputs("\n", stdout); +} + +static void cpp_increase_indent ( struct flex_backend_t *b ) { + if ( b->indent_level < CPP_BACKEND_MAX_INDENT ) { + b->indent_level += 1; + } +} + +static void cpp_decrease_indent ( struct flex_backend_t *b ) { + if (b->indent_level > 0) { + b->indent_level -= 1; + } +} + +static void cpp_indent ( struct flex_backend_t *b ) { + int i = 0; + while ( i < b->indent_level ) { + fputs("\t", stdout); + ++i; + } +} + +static const char * cpp_get_trace_line_format ( struct flex_backend_t *b ) { + return "#line %d \"%s\"\n"; +} + +static void cpp_line_directive_out ( struct flex_backend_t * b, FILE *output_file, char *path, int linenum ) { + char directive[MAXLINE*2], filename[MAXLINE]; + char *s1, *s2, *s3; + + if (!ctrl.gen_line_dirs) { + return; + } + + /* char *infilename is in the global namespace */ + s1 = (path != NULL) ? path : infilename; + + if ((path != NULL) && !s1) { + s1 = ""; + } + + s2 = filename; + s3 = &filename[sizeof (filename) - 2]; + + while (s2 < s3 && *s1) { + if (*s1 == '\\' || *s1 == '"') { + /* Escape the '\' or '"' */ + *s2++ = '\\'; + } + + *s2++ = *s1++; + } + + *s2 = '\0'; + + if (path != NULL) { + snprintf (directive, sizeof(directive), b->get_trace_line_format(b), linenum, filename); + } else { + snprintf (directive, sizeof(directive), b->get_trace_line_format(b), 0, filename); + } + + /* If output_file is nil then we should put the directive in + * the accumulated actions. + */ + if (output_file) { + fputs (directive, output_file); + } + else { + add_action (directive); + } +} + +static void cpp_open_table ( struct flex_backend_t *b ) { + fputs("{", stdout); +} + +static void cpp_continue_table ( struct flex_backend_t *b ) { + fputs("},\n", stdout); +} + +static void cpp_close_table ( struct flex_backend_t *b ) { + fputs("};\n", stdout); +} + +static void cpp_relativize ( struct flex_backend_t *b, const char *s ) { + fputs(s, stdout); +} + +static void cpp_format_state_table_entry ( struct flex_backend_t * b, int t ) { + b->indent(b); + fprintf(stdout, "&yy_transition[%d],\n", t); +} + +static void cpp_format_normal_state_case_arm ( struct flex_backend_t *b, int c ) { + b->indent(b); + fprintf(stdout, "case %d:", c); +} + +static void cpp_format_eof_state_case_arm ( struct flex_backend_t *b, int c ) { + b->indent(b); + fprintf(stdout, "case YY_STATE_EOF(%d):", c); +} + +static void cpp_eof_state_case_fallthrough ( struct flex_backend_t *b ) { + b->indent(b); + b->comment(b, "FALLTHROUGH"); +} + +static void cpp_eof_state_case_terminate ( struct flex_backend_t *b ) { + b->indent(b); + fputs("yyterminate();\n", stdout); +} + +static void cpp_take_yytext ( struct flex_backend_t *b ) { + b->indent(b); + fputs("YY_DO_BEFORE_ACTION; /* set up yytext */", stdout); +} + +static void cpp_release_yytext ( struct flex_backend_t *b ) { + b->indent(b); + fputs( "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */", stdout); +} + +static void cpp_format_char_rewind ( struct flex_backend_t *b, int c ) { + b->indent(b); + fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp -= %d;", c); +} + +static void cpp_format_line_rewind ( struct flex_backend_t *b, int l ) { + b->indent(b); + fprintf(stdout, "YY_LINENO_REWIND_TO(yy_cp - %d);", l); +} + +static void cpp_format_char_forward ( struct flex_backend_t *b, int c ) { + b->indent(b); + fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;", c); +} + +static void cpp_format_line_forward ( struct flex_backend_t *b, int l ) { + b->indent(b); + fprintf(stdout, "YY_LINENO_REWIND_TO(yy_bp + %d);", l); +} + +static void cpp_format_byte_const ( struct flex_backend_t *b, const char *n, const int c ) { + fprintf(stdout, "#define %s %d\n", n, c); +} + +static void cpp_format_state_const ( struct flex_backend_t *b, const char *n, const int s ) { + fprintf(stdout, "#define %s %d\n", n, s); +} + +static void cpp_format_uint_const ( struct flex_backend_t *b, const char *n, const unsigned int u ) { + fprintf(stdout, "#define %s %u\n", n, u); +} + +static void cpp_format_bool_const ( struct flex_backend_t *b, const char *n, const int t ){ + fprintf(stdout, "#define %s %d\n", n, t); +} + +static void cpp_format_const ( struct flex_backend_t *b, const char *n, const char *v ) { + fprintf(stdout, "#define %s %s\n", n, v); +} + +static void cpp_format_offset_type ( struct flex_backend_t *b, const char *t ) { + b->format_const(b, "YY_OFFSET_TYPE", t); +} + +static void cpp_format_yy_decl ( struct flex_backend_t *b, const char *d ) { + b->format_const(b, "YY_DECL", d); +} + +static void cpp_format_userinit ( struct flex_backend_t *b, const char *d ) { + b->format_const(b, "YY_USER_INIT", d); +} + +static void cpp_format_rule_setup ( struct flex_backend_t *b ) { + b->relativize(b, "YY_RULE_SETUP"); + b->newline(b); +} + +static void cpp_format_user_preaction ( struct flex_backend_t *b, const char *d ) { + b->format_const(b, "YY_USER_ACTION", d); +} + +static void cpp_format_state_case_break ( struct flex_backend_t *b ) { + b->indent(b); + if (!ctrl.postaction) { + fputs("/*LINTED*/break;", stdout); + } + else { + fputs(ctrl.postaction, stdout); + } +} + +static void cpp_format_user_postaction ( struct flex_backend_t *b, const char *d ) { + if (d != NULL) { + b->format_const(b, "YY_STATE_CASE_BREAK", d); + } + else { + b->format_const(b, "YY_STATE_CASE_BREAK", "/*LINTED*/break;"); + } +} + +static void cpp_format_fatal_error ( struct flex_backend_t *b, const char *e ) { + b->indent(b); + fprintf(stdout, "yypanic(%s M4_YY_CALL_LAST_ARG);", e); +} + +static void cpp_echo ( struct flex_backend_t *b ) { + b->indent(b); + fputs("yyecho();", stdout); +} + +static void cpp_format_yyterminate ( struct flex_backend_t *b, const char *d ) { + if (d != NULL) { + b->format_const(b, "yyterminate", d); + } + else { + b->format_const(b, "yyterminate", "return NULL"); + } +} + +static void cpp_format_yyreject ( struct flex_backend_t *b ) { + b->indent(b); + fputs("yyreject()", stdout); +} + +struct flex_backend_t cpp_backend = { + .skel = cpp_skel, + .indent_level = 0, + .get_int32_type = cpp_get_int32_type, + .get_int16_type = cpp_get_int16_type, + .open_block_comment = cpp_open_block_comment, + .close_block_comment = cpp_close_block_comment, + .comment = cpp_comment, + .record_separator = cpp_record_separator, + .column_separator = cpp_column_separator, + .newline = cpp_newline, + .increase_indent = cpp_increase_indent, + .decrease_indent = cpp_decrease_indent, + .indent = cpp_indent, + .get_trace_line_format = cpp_get_trace_line_format, + .line_directive_out = cpp_line_directive_out, + .open_table = cpp_open_table, + .continue_table = cpp_continue_table, + .close_table = cpp_close_table, + .relativize = cpp_relativize, + .format_state_table_entry = cpp_format_state_table_entry, + .format_normal_state_case_arm = cpp_format_normal_state_case_arm, + .format_eof_state_case_arm = cpp_format_eof_state_case_arm, + .eof_state_case_fallthrough = cpp_eof_state_case_fallthrough, + .eof_state_case_terminate = cpp_eof_state_case_terminate, + .take_yytext = cpp_take_yytext, + .release_yytext = cpp_release_yytext, + .format_char_rewind = cpp_format_char_rewind, + .format_line_rewind = cpp_format_line_rewind, + .format_char_forward = cpp_format_char_forward, + .format_line_forward = cpp_format_line_forward, + .format_byte_const = cpp_format_byte_const, + .format_state_const = cpp_format_state_const, + .format_uint_const = cpp_format_uint_const, + .format_bool_const = cpp_format_bool_const, + .format_const = cpp_format_const, + .format_offset_type = cpp_format_offset_type, + .format_yy_decl = cpp_format_yy_decl, + .format_userinit = cpp_format_userinit, + .format_rule_setup = cpp_format_rule_setup, + .format_user_preaction = cpp_format_user_preaction, + .format_state_case_break = cpp_format_state_case_break, + .format_user_postaction = cpp_format_user_postaction, + .format_fatal_error = cpp_format_fatal_error, + .echo = cpp_echo, + .format_yyterminate = cpp_format_yyterminate, + .format_yyreject = cpp_format_yyreject +}; + diff --git a/src/cpp-backend.h b/src/cpp-backend.h new file mode 100644 index 000000000..2454146e9 --- /dev/null +++ b/src/cpp-backend.h @@ -0,0 +1,47 @@ +/* cpp-backend.h - C++ backend header file for flex */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* 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. */ + + +#ifndef FLEX_CPP_BACKEND_H +#define FLEX_CPP_BACKEND_H 1 + +#include "skeletons.h" + +extern const char *cpp_skel[]; + +extern const int CPP_BACKEND_MAX_INDENT; + +extern struct flex_backend_t cpp_backend; + + +#endif /* FLEX_CPP_BACKEND_H */ diff --git a/src/flexdef.h b/src/flexdef.h index adf4fd0a7..3ca0e5a1b 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -1012,21 +1012,28 @@ extern void set_input_file(char *); /* from file skeletons.c */ +/* Initialize backends */ +extern void init_backends( void ); + /* return the correct file suffix for the selected back end */ -const char *suffix (void); +extern const char *suffix (void); -/* Mine a text-valued property out of the skeleton file */ -extern const char *skel_property(const char *); +/* Select a backend by name */ +extern void backend_by_name(const char *); /* Is the default back end selected?*/ extern bool is_default_backend(void); -/* Select a backend by name */ -extern void backend_by_name(const char *); +/* Mine a text-valued property out of the skeleton file */ +extern const char *skel_property(const char *); /* Write out one section of the skeleton file. */ extern void skelout(bool); +/* For blocking out code from the header file. */ +#define OUT_BEGIN_CODE() outn("m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl") +#define OUT_END_CODE() outn("]])") + /* from file sym.c */ /* Save the text of a character class. */ @@ -1097,10 +1104,6 @@ extern struct Buf *buf_prints(struct Buf *buf, const char *fmt, const char* s); extern struct Buf userdef_buf; /* a string buffer for #define's generated by user-options on cmd line. */ extern struct Buf top_buf; /* contains %top code. String buffer. */ -/* For blocking out code from the header file. */ -#define OUT_BEGIN_CODE() outn("m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl") -#define OUT_END_CODE() outn("]])") - /* For setjmp/longjmp (instead of calling exit(2)). Linkage in main.c */ extern jmp_buf flex_main_jmp_buf; diff --git a/src/main.c b/src/main.c index 56ca8ae3c..a7738baf9 100644 --- a/src/main.c +++ b/src/main.c @@ -1185,6 +1185,8 @@ void flexinit (int argc, char **argv) lastprot = 1; set_up_initial_allocations (); + + init_backends(); } diff --git a/src/skeletons.c b/src/skeletons.c index 84e3a4fd2..020cc7c2e 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -34,13 +34,12 @@ #include "flexdef.h" #include "tables.h" +#include "skeletons.h" + /* START digested skeletons */ -const char *cpp_skel[] = { -#include "cpp-flex.h" - 0, -}; +#include "cpp-backend.h" const char *c99_skel[] = { #include "c99-flex.h" @@ -54,17 +53,10 @@ const char *go_skel[] = { /* END digested skeletons */ -/* Method table describing a language-specific back end. - * Even if this never gets a member other than the skel - * array, it prevents us from getting lost in a maze of - * twisty array reference levels, all different. - */ -struct flex_backend_t { - const char **skel; // Digested skeleton file -}; + static struct flex_backend_t backends[] = { - {.skel=cpp_skel}, + {NULL}, {.skel=c99_skel}, {.skel=go_skel}, {NULL} @@ -72,6 +64,11 @@ static struct flex_backend_t backends[] = { static struct flex_backend_t *backend = &backends[0]; +/* Initialize backends */ +void init_backends( void ) { + backends[0] = cpp_backend; +} + /* Functions for querying skeleton properties. */ bool is_default_backend(void) diff --git a/src/skeletons.h b/src/skeletons.h new file mode 100644 index 000000000..0eee48744 --- /dev/null +++ b/src/skeletons.h @@ -0,0 +1,98 @@ + +/* skeletons.h - skeletons file for flex */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* 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. */ + + +#ifndef FLEX_SKELETONS_H +#define FLEX_SKELETONS_H 1 + +/* Method table describing a language-specific back end. + * Even if this never gets a member other than the skel + * array, it prevents us from getting lost in a maze of + * twisty array reference levels, all different. + */ +struct flex_backend_t { + const char **skel; // Digested skeleton file + unsigned int indent_level; + const char * (*get_int32_type) ( struct flex_backend_t *b ); + const char * (*get_int16_type) ( struct flex_backend_t *b ); + void (*open_block_comment) ( struct flex_backend_t *b ); + void (*close_block_comment) ( struct flex_backend_t *b ); + void (*comment) ( struct flex_backend_t *b, const char *c ); + void (*record_separator) ( struct flex_backend_t *b ); + void (*column_separator) ( struct flex_backend_t *b ); + void (*newline) ( struct flex_backend_t *b ); + void (*increase_indent) ( struct flex_backend_t *b ); + void (*decrease_indent) ( struct flex_backend_t *b ); + void (*indent) ( struct flex_backend_t *b ); + const char * (*get_trace_line_format) ( struct flex_backend_t *b ); + void (*line_directive_out) ( struct flex_backend_t *b, FILE *output_file, char *path, int linenum ); + void (*open_table) ( struct flex_backend_t *b ); + void (*continue_table) ( struct flex_backend_t *b ); + void (*close_table) ( struct flex_backend_t *b ); + void (*relativize) ( struct flex_backend_t *b, const char *s ); + void (*format_state_table_entry) ( struct flex_backend_t *b, int t ); + void (*format_normal_state_case_arm) ( struct flex_backend_t *b, int c ); + void (*format_eof_state_case_arm) ( struct flex_backend_t *b, int c ); + void (*eof_state_case_fallthrough) ( struct flex_backend_t *b ); + void (*eof_state_case_terminate) ( struct flex_backend_t *b ); + void (*take_yytext) ( struct flex_backend_t *b ); + void (*release_yytext) ( struct flex_backend_t *b ); + void (*format_char_rewind) ( struct flex_backend_t *b, int c ); + void (*format_line_rewind) ( struct flex_backend_t *b, int l ); + void (*format_char_forward) ( struct flex_backend_t *b, int c ); + void (*format_line_forward) ( struct flex_backend_t *b, int l ); + void (*format_byte_const) ( struct flex_backend_t *b, const char *n, const int c ); + void (*format_state_const) ( struct flex_backend_t *b, const char *n, const int s ); + void (*format_uint_const) ( struct flex_backend_t *b, const char *n, const unsigned int u ); + void (*format_bool_const) ( struct flex_backend_t *b, const char *n, const int t ); + void (*format_const) ( struct flex_backend_t *b, const char *n, const char *v ); + void (*format_offset_type) ( struct flex_backend_t *b, const char *t ); + void (*format_yy_decl) ( struct flex_backend_t *b, const char *d ); + void (*format_userinit) ( struct flex_backend_t *b, const char *d ); + void (*format_rule_setup) ( struct flex_backend_t *b ); + void (*format_user_preaction) ( struct flex_backend_t *b, const char *d ); + void (*format_state_case_break) ( struct flex_backend_t *b ); + void (*format_user_postaction) ( struct flex_backend_t *b, const char *d ); + void (*format_fatal_error) ( struct flex_backend_t *b, const char *e ); + void (*echo) ( struct flex_backend_t *b ); + void (*format_yyterminate) ( struct flex_backend_t *b, const char *d ); + void (*format_yyreject) ( struct flex_backend_t *b ); +}; + +/* For blocking out code from the header file. */ +// #define OUT_BEGIN_CODE() outn("m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl") +// #define OUT_END_CODE() outn("]])") + + +#endif /* FLEX_SKELETONS_H */ From 274d2ed848e06b6dceadacdb29273b9de5c46c00 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Sun, 12 Mar 2023 23:55:49 -0400 Subject: [PATCH 02/37] refactor(backends): Replace out* calls with backend emits. --- src/skeletons.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/skeletons.c b/src/skeletons.c index 020cc7c2e..ed0a8f61b 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -224,8 +224,8 @@ void skelout (bool announce) if (buf[0] == '%') { /* control line */ /* print the control line as a comment. */ if (ctrl.ddebug && buf[1] != '#') { - comment(buf); - outc ('\n'); + backend->comment(backend, buf); + backend->newline(backend); } if (buf[1] == '#') { /* %# indicates comment line to be ignored */ @@ -233,8 +233,8 @@ void skelout (bool announce) else if (buf[1] == '%') { /* %% is a break point for skelout() */ if (announce) { - comment(buf); - outc ('\n'); + backend->comment(backend, buf); + backend->newline(backend); } return; } From 04d2168ca96abceb57a7094e4ec8b4bd6b31e5a3 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 13 Mar 2023 00:46:31 -0400 Subject: [PATCH 03/37] refactor(backend): Hide backend implementation details. --- src/cpp-backend.c | 92 +++++++++++++++++++++++------------------------ src/main.c | 1 + src/misc.c | 46 ++++-------------------- src/skeletons.c | 4 +++ src/skeletons.h | 90 +++++++++++++++++++++++----------------------- 5 files changed, 103 insertions(+), 130 deletions(-) diff --git a/src/cpp-backend.c b/src/cpp-backend.c index 1239a835a..88c5509e7 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -42,52 +42,52 @@ const char *cpp_skel[] = { 0 }; -const char * cpp_get_int32_type ( struct flex_backend_t *b ) { +const char * cpp_get_int32_type ( const struct flex_backend_t *b ) { return "flex_int32_t"; } -static const char * cpp_get_int16_type ( struct flex_backend_t *b ) { +static const char * cpp_get_int16_type ( const struct flex_backend_t *b ) { return "flex_int16_t"; } -static void cpp_open_block_comment ( struct flex_backend_t *b ) { +static void cpp_open_block_comment ( const struct flex_backend_t *b ) { fputs("/* ", stdout); } -static void cpp_close_block_comment ( struct flex_backend_t *b ) { +static void cpp_close_block_comment ( const struct flex_backend_t *b ) { fputs(" */", stdout); } -static void cpp_comment ( struct flex_backend_t *b, const char *c ) { +static void cpp_comment ( const struct flex_backend_t *b, const char *c ) { b->indent(b); fprintf(stdout, "/* %s */", c); } -static void cpp_record_separator ( struct flex_backend_t *b ) { +static void cpp_record_separator ( const struct flex_backend_t *b ) { fputs("},\n", stdout); } -static void cpp_column_separator ( struct flex_backend_t *b ){ +static void cpp_column_separator ( const struct flex_backend_t *b ){ fputs(", ", stdout); } -static void cpp_newline ( struct flex_backend_t *b ) { +static void cpp_newline ( const struct flex_backend_t *b ) { fputs("\n", stdout); } -static void cpp_increase_indent ( struct flex_backend_t *b ) { +static void cpp_increase_indent ( const struct flex_backend_t *b ) { if ( b->indent_level < CPP_BACKEND_MAX_INDENT ) { - b->indent_level += 1; + ((struct flex_backend_t *)b)->indent_level += 1; } } -static void cpp_decrease_indent ( struct flex_backend_t *b ) { +static void cpp_decrease_indent ( const struct flex_backend_t *b ) { if (b->indent_level > 0) { - b->indent_level -= 1; + ((struct flex_backend_t *)b)->indent_level -= 1; } } -static void cpp_indent ( struct flex_backend_t *b ) { +static void cpp_indent ( const struct flex_backend_t *b ) { int i = 0; while ( i < b->indent_level ) { fputs("\t", stdout); @@ -95,11 +95,11 @@ static void cpp_indent ( struct flex_backend_t *b ) { } } -static const char * cpp_get_trace_line_format ( struct flex_backend_t *b ) { +static const char * cpp_get_trace_line_format ( const struct flex_backend_t *b ) { return "#line %d \"%s\"\n"; } -static void cpp_line_directive_out ( struct flex_backend_t * b, FILE *output_file, char *path, int linenum ) { +static void cpp_line_directive_out ( const struct flex_backend_t * b, FILE *output_file, char *path, int linenum ) { char directive[MAXLINE*2], filename[MAXLINE]; char *s1, *s2, *s3; @@ -145,119 +145,119 @@ static void cpp_line_directive_out ( struct flex_backend_t * b, FILE *output_fil } } -static void cpp_open_table ( struct flex_backend_t *b ) { +static void cpp_open_table ( const struct flex_backend_t *b ) { fputs("{", stdout); } -static void cpp_continue_table ( struct flex_backend_t *b ) { +static void cpp_continue_table ( const struct flex_backend_t *b ) { fputs("},\n", stdout); } -static void cpp_close_table ( struct flex_backend_t *b ) { +static void cpp_close_table ( const struct flex_backend_t *b ) { fputs("};\n", stdout); } -static void cpp_relativize ( struct flex_backend_t *b, const char *s ) { +static void cpp_relativize ( const struct flex_backend_t *b, const char *s ) { fputs(s, stdout); } -static void cpp_format_state_table_entry ( struct flex_backend_t * b, int t ) { +static void cpp_format_state_table_entry ( const struct flex_backend_t * b, int t ) { b->indent(b); fprintf(stdout, "&yy_transition[%d],\n", t); } -static void cpp_format_normal_state_case_arm ( struct flex_backend_t *b, int c ) { +static void cpp_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "case %d:", c); } -static void cpp_format_eof_state_case_arm ( struct flex_backend_t *b, int c ) { +static void cpp_format_eof_state_case_arm ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "case YY_STATE_EOF(%d):", c); } -static void cpp_eof_state_case_fallthrough ( struct flex_backend_t *b ) { +static void cpp_eof_state_case_fallthrough ( const struct flex_backend_t *b ) { b->indent(b); b->comment(b, "FALLTHROUGH"); } -static void cpp_eof_state_case_terminate ( struct flex_backend_t *b ) { +static void cpp_eof_state_case_terminate ( const struct flex_backend_t *b ) { b->indent(b); fputs("yyterminate();\n", stdout); } -static void cpp_take_yytext ( struct flex_backend_t *b ) { +static void cpp_take_yytext ( const struct flex_backend_t *b ) { b->indent(b); fputs("YY_DO_BEFORE_ACTION; /* set up yytext */", stdout); } -static void cpp_release_yytext ( struct flex_backend_t *b ) { +static void cpp_release_yytext ( const struct flex_backend_t *b ) { b->indent(b); fputs( "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */", stdout); } -static void cpp_format_char_rewind ( struct flex_backend_t *b, int c ) { +static void cpp_format_char_rewind ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp -= %d;", c); } -static void cpp_format_line_rewind ( struct flex_backend_t *b, int l ) { +static void cpp_format_line_rewind ( const struct flex_backend_t *b, int l ) { b->indent(b); fprintf(stdout, "YY_LINENO_REWIND_TO(yy_cp - %d);", l); } -static void cpp_format_char_forward ( struct flex_backend_t *b, int c ) { +static void cpp_format_char_forward ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;", c); } -static void cpp_format_line_forward ( struct flex_backend_t *b, int l ) { +static void cpp_format_line_forward ( const struct flex_backend_t *b, int l ) { b->indent(b); fprintf(stdout, "YY_LINENO_REWIND_TO(yy_bp + %d);", l); } -static void cpp_format_byte_const ( struct flex_backend_t *b, const char *n, const int c ) { +static void cpp_format_byte_const ( const struct flex_backend_t *b, const char *n, const int c ) { fprintf(stdout, "#define %s %d\n", n, c); } -static void cpp_format_state_const ( struct flex_backend_t *b, const char *n, const int s ) { +static void cpp_format_state_const ( const struct flex_backend_t *b, const char *n, const int s ) { fprintf(stdout, "#define %s %d\n", n, s); } -static void cpp_format_uint_const ( struct flex_backend_t *b, const char *n, const unsigned int u ) { +static void cpp_format_uint_const ( const struct flex_backend_t *b, const char *n, const unsigned int u ) { fprintf(stdout, "#define %s %u\n", n, u); } -static void cpp_format_bool_const ( struct flex_backend_t *b, const char *n, const int t ){ +static void cpp_format_bool_const ( const struct flex_backend_t *b, const char *n, const int t ){ fprintf(stdout, "#define %s %d\n", n, t); } -static void cpp_format_const ( struct flex_backend_t *b, const char *n, const char *v ) { +static void cpp_format_const ( const struct flex_backend_t *b, const char *n, const char *v ) { fprintf(stdout, "#define %s %s\n", n, v); } -static void cpp_format_offset_type ( struct flex_backend_t *b, const char *t ) { +static void cpp_format_offset_type ( const struct flex_backend_t *b, const char *t ) { b->format_const(b, "YY_OFFSET_TYPE", t); } -static void cpp_format_yy_decl ( struct flex_backend_t *b, const char *d ) { +static void cpp_format_yy_decl ( const struct flex_backend_t *b, const char *d ) { b->format_const(b, "YY_DECL", d); } -static void cpp_format_userinit ( struct flex_backend_t *b, const char *d ) { +static void cpp_format_userinit ( const struct flex_backend_t *b, const char *d ) { b->format_const(b, "YY_USER_INIT", d); } -static void cpp_format_rule_setup ( struct flex_backend_t *b ) { +static void cpp_format_rule_setup ( const struct flex_backend_t *b ) { b->relativize(b, "YY_RULE_SETUP"); b->newline(b); } -static void cpp_format_user_preaction ( struct flex_backend_t *b, const char *d ) { +static void cpp_format_user_preaction ( const struct flex_backend_t *b, const char *d ) { b->format_const(b, "YY_USER_ACTION", d); } -static void cpp_format_state_case_break ( struct flex_backend_t *b ) { +static void cpp_format_state_case_break ( const struct flex_backend_t *b ) { b->indent(b); if (!ctrl.postaction) { fputs("/*LINTED*/break;", stdout); @@ -267,7 +267,7 @@ static void cpp_format_state_case_break ( struct flex_backend_t *b ) { } } -static void cpp_format_user_postaction ( struct flex_backend_t *b, const char *d ) { +static void cpp_format_user_postaction ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { b->format_const(b, "YY_STATE_CASE_BREAK", d); } @@ -276,17 +276,17 @@ static void cpp_format_user_postaction ( struct flex_backend_t *b, const char *d } } -static void cpp_format_fatal_error ( struct flex_backend_t *b, const char *e ) { +static void cpp_format_fatal_error ( const struct flex_backend_t *b, const char *e ) { b->indent(b); fprintf(stdout, "yypanic(%s M4_YY_CALL_LAST_ARG);", e); } -static void cpp_echo ( struct flex_backend_t *b ) { +static void cpp_echo ( const struct flex_backend_t *b ) { b->indent(b); fputs("yyecho();", stdout); } -static void cpp_format_yyterminate ( struct flex_backend_t *b, const char *d ) { +static void cpp_format_yyterminate ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { b->format_const(b, "yyterminate", d); } @@ -295,7 +295,7 @@ static void cpp_format_yyterminate ( struct flex_backend_t *b, const char *d ) { } } -static void cpp_format_yyreject ( struct flex_backend_t *b ) { +static void cpp_format_yyreject ( const struct flex_backend_t *b ) { b->indent(b); fputs("yyreject()", stdout); } diff --git a/src/main.c b/src/main.c index a7738baf9..ab5828908 100644 --- a/src/main.c +++ b/src/main.c @@ -36,6 +36,7 @@ #include "version.h" #include "options.h" #include "tables.h" +#include "skeletons.h" #include "parse.h" static char flex_version[] = FLEX_VERSION; diff --git a/src/misc.c b/src/misc.c index 56d2abab6..4f203d364 100644 --- a/src/misc.c +++ b/src/misc.c @@ -32,6 +32,7 @@ /* PURPOSE. */ #include "flexdef.h" #include "tables.h" +#include "skeletons.h" /* Append "new_text" to the running buffer. */ void add_action (const char *new_text) @@ -246,45 +247,9 @@ void lerr_fatal (const char *msg, ...) /* line_directive_out - spit out a "#line" statement or equivalent */ void line_directive_out (FILE *output_file, char *path, int linenum) { - char *trace_fmt = "m4_ifdef([[M4_HOOK_TRACE_LINE_FORMAT]], [[M4_HOOK_TRACE_LINE_FORMAT([[%d]], [[%s]])]])"; - char directive[MAXLINE*2], filename[MAXLINE]; - char *s1, *s2, *s3; + const struct flex_backend_t *bend = get_backend(); - if (!ctrl.gen_line_dirs) - return; - - s1 = (path != NULL) ? path : "M4_YY_OUTFILE_NAME"; - - if ((path != NULL) && !s1) - s1 = ""; - - s2 = filename; - s3 = &filename[sizeof (filename) - 2]; - - while (s2 < s3 && *s1) { - if (*s1 == '\\' || *s1 == '"') - /* Escape the '\' or '"' */ - *s2++ = '\\'; - - *s2++ = *s1++; - } - - *s2 = '\0'; - - if (path != NULL) - snprintf (directive, sizeof(directive), trace_fmt, linenum, filename); - else { - snprintf (directive, sizeof(directive), trace_fmt, 0, filename); - } - - /* If output_file is nil then we should put the directive in - * the accumulated actions. - */ - if (output_file) { - fputs (directive, output_file); - } - else - add_action (directive); + bend->line_directive_out(bend, output_file, path, linenum); } @@ -663,15 +628,16 @@ void comment(const char *txt) { char buf[MAXLINE]; bool eol; + const struct flex_backend_t *bend = get_backend(); strncpy(buf, txt, MAXLINE-1); eol = buf[strlen(buf)-1] == '\n'; if (eol) buf[strlen(buf)-1] = '\0'; - out_str("M4_HOOK_COMMENT_OPEN [[%s]] M4_HOOK_COMMENT_CLOSE", buf); + bend->comment(bend, buf); if (eol) - outc ('\n'); + bend->newline(bend); } diff --git a/src/skeletons.c b/src/skeletons.c index ed0a8f61b..14fa73dbc 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -64,6 +64,10 @@ static struct flex_backend_t backends[] = { static struct flex_backend_t *backend = &backends[0]; +const struct flex_backend_t *get_backend(void) { + return backend; +} + /* Initialize backends */ void init_backends( void ) { backends[0] = cpp_backend; diff --git a/src/skeletons.h b/src/skeletons.h index 0eee48744..4388784e5 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -44,52 +44,54 @@ struct flex_backend_t { const char **skel; // Digested skeleton file unsigned int indent_level; - const char * (*get_int32_type) ( struct flex_backend_t *b ); - const char * (*get_int16_type) ( struct flex_backend_t *b ); - void (*open_block_comment) ( struct flex_backend_t *b ); - void (*close_block_comment) ( struct flex_backend_t *b ); - void (*comment) ( struct flex_backend_t *b, const char *c ); - void (*record_separator) ( struct flex_backend_t *b ); - void (*column_separator) ( struct flex_backend_t *b ); - void (*newline) ( struct flex_backend_t *b ); - void (*increase_indent) ( struct flex_backend_t *b ); - void (*decrease_indent) ( struct flex_backend_t *b ); - void (*indent) ( struct flex_backend_t *b ); - const char * (*get_trace_line_format) ( struct flex_backend_t *b ); - void (*line_directive_out) ( struct flex_backend_t *b, FILE *output_file, char *path, int linenum ); - void (*open_table) ( struct flex_backend_t *b ); - void (*continue_table) ( struct flex_backend_t *b ); - void (*close_table) ( struct flex_backend_t *b ); - void (*relativize) ( struct flex_backend_t *b, const char *s ); - void (*format_state_table_entry) ( struct flex_backend_t *b, int t ); - void (*format_normal_state_case_arm) ( struct flex_backend_t *b, int c ); - void (*format_eof_state_case_arm) ( struct flex_backend_t *b, int c ); - void (*eof_state_case_fallthrough) ( struct flex_backend_t *b ); - void (*eof_state_case_terminate) ( struct flex_backend_t *b ); - void (*take_yytext) ( struct flex_backend_t *b ); - void (*release_yytext) ( struct flex_backend_t *b ); - void (*format_char_rewind) ( struct flex_backend_t *b, int c ); - void (*format_line_rewind) ( struct flex_backend_t *b, int l ); - void (*format_char_forward) ( struct flex_backend_t *b, int c ); - void (*format_line_forward) ( struct flex_backend_t *b, int l ); - void (*format_byte_const) ( struct flex_backend_t *b, const char *n, const int c ); - void (*format_state_const) ( struct flex_backend_t *b, const char *n, const int s ); - void (*format_uint_const) ( struct flex_backend_t *b, const char *n, const unsigned int u ); - void (*format_bool_const) ( struct flex_backend_t *b, const char *n, const int t ); - void (*format_const) ( struct flex_backend_t *b, const char *n, const char *v ); - void (*format_offset_type) ( struct flex_backend_t *b, const char *t ); - void (*format_yy_decl) ( struct flex_backend_t *b, const char *d ); - void (*format_userinit) ( struct flex_backend_t *b, const char *d ); - void (*format_rule_setup) ( struct flex_backend_t *b ); - void (*format_user_preaction) ( struct flex_backend_t *b, const char *d ); - void (*format_state_case_break) ( struct flex_backend_t *b ); - void (*format_user_postaction) ( struct flex_backend_t *b, const char *d ); - void (*format_fatal_error) ( struct flex_backend_t *b, const char *e ); - void (*echo) ( struct flex_backend_t *b ); - void (*format_yyterminate) ( struct flex_backend_t *b, const char *d ); - void (*format_yyreject) ( struct flex_backend_t *b ); + const char * (*get_int32_type) ( const struct flex_backend_t *b ); + const char * (*get_int16_type) ( const struct flex_backend_t *b ); + void (*open_block_comment) ( const struct flex_backend_t *b ); + void (*close_block_comment) ( const struct flex_backend_t *b ); + void (*comment) ( const struct flex_backend_t *b, const char *c ); + void (*record_separator) ( const struct flex_backend_t *b ); + void (*column_separator) ( const struct flex_backend_t *b ); + void (*newline) ( const struct flex_backend_t *b ); + void (*increase_indent) ( const struct flex_backend_t *b ); + void (*decrease_indent) ( const struct flex_backend_t *b ); + void (*indent) ( const struct flex_backend_t *b ); + const char * (*get_trace_line_format) ( const struct flex_backend_t *b ); + void (*line_directive_out) ( const struct flex_backend_t *b, FILE *output_file, char *path, int linenum ); + void (*open_table) ( const struct flex_backend_t *b ); + void (*continue_table) ( const struct flex_backend_t *b ); + void (*close_table) ( const struct flex_backend_t *b ); + void (*relativize) ( const struct flex_backend_t *b, const char *s ); + void (*format_state_table_entry) ( const struct flex_backend_t *b, int t ); + void (*format_normal_state_case_arm) ( const struct flex_backend_t *b, int c ); + void (*format_eof_state_case_arm) ( const struct flex_backend_t *b, int c ); + void (*eof_state_case_fallthrough) ( const struct flex_backend_t *b ); + void (*eof_state_case_terminate) ( const struct flex_backend_t *b ); + void (*take_yytext) ( const struct flex_backend_t *b ); + void (*release_yytext) ( const struct flex_backend_t *b ); + void (*format_char_rewind) ( const struct flex_backend_t *b, int c ); + void (*format_line_rewind) ( const struct flex_backend_t *b, int l ); + void (*format_char_forward) ( const struct flex_backend_t *b, int c ); + void (*format_line_forward) ( const struct flex_backend_t *b, int l ); + void (*format_byte_const) ( const struct flex_backend_t *b, const char *n, const int c ); + void (*format_state_const) ( const struct flex_backend_t *b, const char *n, const int s ); + void (*format_uint_const) ( const struct flex_backend_t *b, const char *n, const unsigned int u ); + void (*format_bool_const) ( const struct flex_backend_t *b, const char *n, const int t ); + void (*format_const) ( const struct flex_backend_t *b, const char *n, const char *v ); + void (*format_offset_type) ( const struct flex_backend_t *b, const char *t ); + void (*format_yy_decl) ( const struct flex_backend_t *b, const char *d ); + void (*format_userinit) ( const struct flex_backend_t *b, const char *d ); + void (*format_rule_setup) ( const struct flex_backend_t *b ); + void (*format_user_preaction) ( const struct flex_backend_t *b, const char *d ); + void (*format_state_case_break) ( const struct flex_backend_t *b ); + void (*format_user_postaction) ( const struct flex_backend_t *b, const char *d ); + void (*format_fatal_error) ( const struct flex_backend_t *b, const char *e ); + void (*echo) ( const struct flex_backend_t *b ); + void (*format_yyterminate) ( const struct flex_backend_t *b, const char *d ); + void (*format_yyreject) ( const struct flex_backend_t *b ); }; +const struct flex_backend_t *get_backend(void); + /* For blocking out code from the header file. */ // #define OUT_BEGIN_CODE() outn("m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl") // #define OUT_END_CODE() outn("]])") From a93fcae00169c58f7828c3768c83ff0f9516daa5 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Sat, 2 Mar 2024 23:20:31 -0500 Subject: [PATCH 04/37] feat(backend): Add backend stack. Add backend enumeration. Reorganize backend lookup code around backend stack. --- .gitignore | 1 + src/skeletons.c | 79 ++++++++++++++++++++++++++++++++++++++++++------- src/skeletons.h | 13 ++++++++ 3 files changed, 83 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index daf0ef997..71b32a7d2 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ flex-*/ libtool m4/ stamp-* +.vscode \ No newline at end of file diff --git a/src/skeletons.c b/src/skeletons.c index 14fa73dbc..6bfa35a09 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -54,30 +54,89 @@ const char *go_skel[] = { /* END digested skeletons */ +/* backends is an array of skeleton code-emitting backend structs. +/* It uses the flex_backend_t enum so we don't have to care what order it's in. + */ +static struct flex_backend_t backends[FLEX_BACKEND_ID_MAX]; + +/* backend_stack is an array-based stack of flex_backend_ids. +/* It lets us keep track of which skeleton and emitter are in use and allows +/* us to switch to another backend during runtime, for example to dump an +/* auxiliary table. +/* The need to switch backends should be uncommon, the stack is only as deep +/* as the number of available backends. +/* backen_stack_head is declared static so it must be manipulated through +/* the stack functions defined in this module. + */ +flex_backend_id_t backend_stack[FLEX_BACKEND_ID_MAX]; +static unsigned int backend_stack_head = 0; + +/* Push a flex_backend_id onto the backend stack. +/* Returns false when the stack is full, and true otherwise. + */ +bool push_backend(flex_backend_id_t bid){ + ++backend_stack_head; + if( backend_stack_head >= FLEX_BACKEND_ID_MAX ){ + --backend_stack_head; + flexerror(_("backend stack depth exceeded")); + return false; + } + else { + backend_stack[backend_stack_head] = bid; + } + return true; +} + +/* Pop a flex_backend_id off of the backend stack. +/* Returns the FLEX_BACKEND_ID_MAX when the stack is empty, and the +/* popped backend id otherwise. */ +flex_backend_id_t pop_backend(void) { + flex_backend_id_t ret = FLEX_BACKEND_ID_MAX; + if( backend_stack_head > 0 ) { + ret = backend_stack[backend_stack_head]; + --backend_stack_head; + return ret; + } + else { + flexerror(_("attempt to pop empty backend stack")); + return ret; + } +} + +/* Return the flex_backend_id on top of the backend stack. +/* Returns the FLEX_BACKEND_ID_MAX when the stack is empty, and the +/* top backend id otherwise. */ +flex_backend_id_t top_backend(void){ + if( backend_stack_head > 0 ) { + return backend_stack[backend_stack_head]; + } + else { + flexerror(_("attempt to read the top of empty backend stack")); + return FLEX_BACKEND_ID_MAX; + } +} + -static struct flex_backend_t backends[] = { - {NULL}, - {.skel=c99_skel}, - {.skel=go_skel}, - {NULL} -}; -static struct flex_backend_t *backend = &backends[0]; const struct flex_backend_t *get_backend(void) { - return backend; + return &backends[top_backend()]; } /* Initialize backends */ void init_backends( void ) { - backends[0] = cpp_backend; + backends[FLEX_BACKEND_CPP] = cpp_backend; + backends[FLEX_BACKEND_C99].skel=c99_skel; + backends[FLEX_BACKEND_GO].skel=go_skel; + backends[FLEX_BACKEND_ID_MAX] = {NULL}; } /* Functions for querying skeleton properties. */ +/* TODO: What does this mean now? */ bool is_default_backend(void) { - return backend == &backends[0]; + return top_backend() == FLEX_BACKEND_CPP; } /* Search for a string in the skeleton prolog, where macros are defined. diff --git a/src/skeletons.h b/src/skeletons.h index 4388784e5..a338f8aaa 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -36,6 +36,19 @@ #ifndef FLEX_SKELETONS_H #define FLEX_SKELETONS_H 1 +typedef enum flex_backend_id = { + FLEX_BACKEND_CPP = 0, + FLEX_BACKEND_C99, + FLEX_BACKEND_GO, + FLEX_BACKEND_ID_MAX /* Only add new backend names above this line. + /* FLEX_BACKEND_ID_MAX sets the size of the backend array + /* and backend stack. */ +} flex_backend_id_t; + +bool push_backend(flex_backend_id_t); +flex_backend_id_t pop_backend(void); +flex_backend_id_t top_backend(void); + /* Method table describing a language-specific back end. * Even if this never gets a member other than the skel * array, it prevents us from getting lost in a maze of From a4030197cb55d0909b5ec4320e8a7d2189ebab14 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 6 Jan 2025 14:11:51 -0500 Subject: [PATCH 05/37] fix: Restore BUILT_SOURCES because parallel builds are broken --- src/Makefile.am | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Makefile.am b/src/Makefile.am index bc30c206c..d3a25cfd4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -122,6 +122,15 @@ SKELINCLUDES = \ c99-flex.h \ go-flex.h +# DO NOT REMOVE - Ignore StackOverflow +# This variable is misnamed and misunderstood. It tells Make that the named +# sources are a junction point for parallelized builds. If you remove this +# variable, builds may work for you but fail for me. (Like they are now.) +# +BUILT_SOURCES = $(SKELINCLUDES) +# +# DO NOT REMOVE + cpp-flex.h: cpp-flex.skl mkskel.sh flexint_shared.h tables_shared.h tables_shared.c $(SHELL) $(srcdir)/mkskel.sh cpp $(srcdir) $(m4) $(VERSION) > $@.tmp $(SHELL) $(srcdir)/chkskel.sh $@.tmp From d63b5a19667c822af83dea98fff1eb64e9ae70f4 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 6 Jan 2025 15:15:33 -0500 Subject: [PATCH 06/37] feat: Shakeout backend stack bugs --- src/skeletons.c | 16 ++++++++++++---- src/skeletons.h | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/skeletons.c b/src/skeletons.c index 6bfa35a09..6503dfab3 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -128,7 +128,7 @@ void init_backends( void ) { backends[FLEX_BACKEND_CPP] = cpp_backend; backends[FLEX_BACKEND_C99].skel=c99_skel; backends[FLEX_BACKEND_GO].skel=go_skel; - backends[FLEX_BACKEND_ID_MAX] = {NULL}; + backends[FLEX_BACKEND_ID_MAX] = (struct flex_backend_t){NULL}; } /* Functions for querying skeleton properties. */ @@ -145,6 +145,8 @@ static bool boneseeker(const char *bone) { int i; + const struct flex_backend_t *backend = get_backend(); + for (i = 0; backend->skel[i] != NULL; i++) { const char *line = backend->skel[i]; if (strstr(line, bone) != NULL) @@ -158,24 +160,28 @@ static bool boneseeker(const char *bone) void backend_by_name(const char *name) { const char *prefix_property; + flex_backend_id_t backend = FLEX_BACKEND_CPP, i = FLEX_BACKEND_CPP; + if (name != NULL) { if (strcmp(name, "nr") == 0) { - backend = &backends[0]; + backend = FLEX_BACKEND_CPP; ctrl.reentrant = false; goto backend_ok; } if (strcmp(name, "r") == 0) { - backend = &backends[0]; + backend = FLEX_BACKEND_CPP; ctrl.reentrant = true; goto backend_ok; } - for (backend = &backends[0]; backend->skel != NULL; backend++) { + for (i = 0; backends[i].skel != NULL && i < FLEX_BACKEND_ID_MAX; ++i) { if (strcasecmp(skel_property("M4_PROPERTY_BACKEND_NAME"), name) == 0) + backend = i; goto backend_ok; } flexerror(_("no such back end")); } backend_ok: + push_backend(backend); ctrl.rewrite = !is_default_backend(); ctrl.backend_name = xstrdup(skel_property("M4_PROPERTY_BACKEND_NAME")); ctrl.traceline_re = xstrdup(skel_property("M4_PROPERTY_TRACE_LINE_REGEXP")); @@ -212,6 +218,7 @@ const char *skel_property(const char *propname) int i; static char name[256], value[256], *np, *vp;; const char *cp; + const struct flex_backend_t *backend = get_backend(); for (i = 0; backend->skel[i] != NULL; i++) { const char *line = backend->skel[i]; @@ -272,6 +279,7 @@ void skelout (bool announce) char buf_storage[MAXLINE]; char *buf = buf_storage; bool do_copy = true; + const struct flex_backend_t *backend = get_backend(); /* Loop pulling lines either from the skelfile, if we're using * one, or from the selected back end's skel[] array. diff --git a/src/skeletons.h b/src/skeletons.h index a338f8aaa..dcf4ee8e9 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -36,7 +36,7 @@ #ifndef FLEX_SKELETONS_H #define FLEX_SKELETONS_H 1 -typedef enum flex_backend_id = { +typedef enum flex_backend_id { FLEX_BACKEND_CPP = 0, FLEX_BACKEND_C99, FLEX_BACKEND_GO, From 6d3c92c5b9f4ee8347a4348748a1138f90adf9d8 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 6 Jan 2025 15:16:24 -0500 Subject: [PATCH 07/37] feat: Shakeout backend stack bugs --- src/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index ab5828908..211b7c9fe 100644 --- a/src/main.c +++ b/src/main.c @@ -723,6 +723,9 @@ void flexinit (int argc, char **argv) buf_init (&userdef_buf, sizeof (char)); /* one long string */ buf_init (&top_buf, sizeof (char)); /* one long string */ + init_backends(); + push_backend(FLEX_BACKEND_CPP); + sf_init (); /* Enable C++ if program name ends with '+'. */ @@ -1186,8 +1189,6 @@ void flexinit (int argc, char **argv) lastprot = 1; set_up_initial_allocations (); - - init_backends(); } From d029417f1dfdbd41fc342e109c2fc4e5a6b93722 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 7 Jan 2025 13:10:25 -0500 Subject: [PATCH 08/37] feat: Shakeout backend stack bugs --- src/flexdef.h | 11 ++++++++++- src/main.c | 6 +++++- src/skeletons.c | 13 +++++++------ src/skeletons.h | 9 --------- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/flexdef.h b/src/flexdef.h index 3ca0e5a1b..783298a03 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -1012,6 +1012,15 @@ extern void set_input_file(char *); /* from file skeletons.c */ +typedef enum flex_backend_id { + FLEX_BACKEND_CPP = 0, + FLEX_BACKEND_C99, + FLEX_BACKEND_GO, + FLEX_BACKEND_ID_MAX /* Only add new backend names above this line. + /* FLEX_BACKEND_ID_MAX sets the size of the backend array + /* and backend stack. */ +} flex_backend_id_t; + /* Initialize backends */ extern void init_backends( void ); @@ -1019,7 +1028,7 @@ extern void init_backends( void ); extern const char *suffix (void); /* Select a backend by name */ -extern void backend_by_name(const char *); +extern flex_backend_id_t backend_by_name(const char *); /* Is the default back end selected?*/ extern bool is_default_backend(void); diff --git a/src/main.c b/src/main.c index 211b7c9fe..9987d09e2 100644 --- a/src/main.c +++ b/src/main.c @@ -1197,6 +1197,7 @@ void flexinit (int argc, char **argv) void readin (void) { char buf[256]; + flex_backend_id_t backend; line_directive_out(NULL, infilename, linenum); @@ -1214,7 +1215,10 @@ void readin (void) * when %option emit was evaluated; this catches command-line * optiins and the default case. */ - backend_by_name(ctrl.emit); + backend = backend_by_name(ctrl.emit); + if ( backend != top_backend() ) + /* only push a new backend if it's not already the top */ + push_backend(backend); initialize_output_filters(); diff --git a/src/skeletons.c b/src/skeletons.c index 6503dfab3..07235109b 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -68,7 +68,7 @@ static struct flex_backend_t backends[FLEX_BACKEND_ID_MAX]; /* backen_stack_head is declared static so it must be manipulated through /* the stack functions defined in this module. */ -flex_backend_id_t backend_stack[FLEX_BACKEND_ID_MAX]; +flex_backend_id_t backend_stack[FLEX_BACKEND_ID_MAX+1]; static unsigned int backend_stack_head = 0; /* Push a flex_backend_id onto the backend stack. @@ -82,7 +82,7 @@ bool push_backend(flex_backend_id_t bid){ return false; } else { - backend_stack[backend_stack_head] = bid; + backend_stack[backend_stack_head-1] = bid; } return true; } @@ -93,7 +93,7 @@ bool push_backend(flex_backend_id_t bid){ flex_backend_id_t pop_backend(void) { flex_backend_id_t ret = FLEX_BACKEND_ID_MAX; if( backend_stack_head > 0 ) { - ret = backend_stack[backend_stack_head]; + ret = backend_stack[backend_stack_head-1]; --backend_stack_head; return ret; } @@ -108,7 +108,7 @@ flex_backend_id_t pop_backend(void) { /* top backend id otherwise. */ flex_backend_id_t top_backend(void){ if( backend_stack_head > 0 ) { - return backend_stack[backend_stack_head]; + return backend_stack[backend_stack_head-1]; } else { flexerror(_("attempt to read the top of empty backend stack")); @@ -157,7 +157,7 @@ static bool boneseeker(const char *bone) return false; } -void backend_by_name(const char *name) +flex_backend_id_t backend_by_name(const char *name) { const char *prefix_property; flex_backend_id_t backend = FLEX_BACKEND_CPP, i = FLEX_BACKEND_CPP; @@ -179,9 +179,9 @@ void backend_by_name(const char *name) goto backend_ok; } flexerror(_("no such back end")); + return FLEX_BACKEND_ID_MAX; } backend_ok: - push_backend(backend); ctrl.rewrite = !is_default_backend(); ctrl.backend_name = xstrdup(skel_property("M4_PROPERTY_BACKEND_NAME")); ctrl.traceline_re = xstrdup(skel_property("M4_PROPERTY_TRACE_LINE_REGEXP")); @@ -191,6 +191,7 @@ void backend_by_name(const char *name) if (prefix_property != NULL) ctrl.prefix = xstrdup(prefix_property); flex_init_regex(ctrl.traceline_re); + return backend; } const char *suffix (void) diff --git a/src/skeletons.h b/src/skeletons.h index dcf4ee8e9..a97f19f07 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -36,15 +36,6 @@ #ifndef FLEX_SKELETONS_H #define FLEX_SKELETONS_H 1 -typedef enum flex_backend_id { - FLEX_BACKEND_CPP = 0, - FLEX_BACKEND_C99, - FLEX_BACKEND_GO, - FLEX_BACKEND_ID_MAX /* Only add new backend names above this line. - /* FLEX_BACKEND_ID_MAX sets the size of the backend array - /* and backend stack. */ -} flex_backend_id_t; - bool push_backend(flex_backend_id_t); flex_backend_id_t pop_backend(void); flex_backend_id_t top_backend(void); From 48c9ea8780f7558baf7b7ae66dd93e4d95285fde Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 7 Jan 2025 13:11:00 -0500 Subject: [PATCH 09/37] fix: Add BUILT_SOURCES sync points for parallel make --- src/Makefile.am | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index d3a25cfd4..9f64d94d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -124,10 +124,11 @@ SKELINCLUDES = \ # DO NOT REMOVE - Ignore StackOverflow # This variable is misnamed and misunderstood. It tells Make that the named -# sources are a junction point for parallelized builds. If you remove this -# variable, builds may work for you but fail for me. (Like they are now.) +# sources are synchronization points for parallel builds (e.g. -j8). +# If you remove or change this variable without testing large parallel builds, +# make will fail randomly. Stop "fixing" this based on StackOverflow threads, please. # -BUILT_SOURCES = $(SKELINCLUDES) +BUILT_SOURCES = $(SKELINCLUDES) stage1scan.c stage2scan.c # # DO NOT REMOVE From 98d6cb784a973e0cf180a8a94db91388ad170b34 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 7 Jan 2025 13:56:46 -0500 Subject: [PATCH 10/37] test: Rename alloc_extra_r.l to match it's reentrant behavior --- tests/Makefile.am | 6 +++--- tests/{alloc_extra_nr.l => alloc_extra_r.l} | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename tests/{alloc_extra_nr.l => alloc_extra_r.l} (100%) diff --git a/tests/Makefile.am b/tests/Makefile.am index fd94e67d4..ad36ac265 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -61,7 +61,7 @@ AM_CPPFLAGS = -I$(top_builddir)/src -I$(top_srcdir)/src check_PROGRAMS = $(RULESET_TESTS) $(SPORADIC_TESTS) $(DIRECT_TESTS) $(I3_TESTS) $(PTHREAD_TESTS) SPORADIC_TESTS = \ - alloc_extra_nr \ + alloc_extra_r \ alloc_extra_c99 \ bison_nr \ bison_yylloc \ @@ -107,7 +107,7 @@ I3_TESTS = \ PTHREAD_TESTS = \ pthread.pthread -alloc_extra_nr_SOURCES = alloc_extra_nr.l +alloc_extra_r_SOURCES = alloc_extra_r.l alloc_extra_c99_SOURCES = alloc_extra_c99.l if HAVE_BISON bison_nr_SOURCES = bison_nr_scanner.l bison_nr_parser.y bison_nr_main.c @@ -172,7 +172,7 @@ state_buf_multiple_direct_SOURCES = state_buf_multiple.direct.lll # it. CLEANFILES = \ - alloc_extra_nr.c \ + alloc_extra_r.c \ alloc_extra_c99.c \ bison_nr_parser.c \ bison_nr_parser.h \ diff --git a/tests/alloc_extra_nr.l b/tests/alloc_extra_r.l similarity index 100% rename from tests/alloc_extra_nr.l rename to tests/alloc_extra_r.l From 3a368c0e552a5e12de45d8bc70a9f462cf825ef5 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 7 Jan 2025 13:57:28 -0500 Subject: [PATCH 11/37] test: Add reentrant option to c99 tests --- tests/alloc_extra_c99.l | 1 + tests/testmaker.m4 | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/alloc_extra_c99.l b/tests/alloc_extra_c99.l index d99a4ca06..72bcde781 100644 --- a/tests/alloc_extra_c99.l +++ b/tests/alloc_extra_c99.l @@ -51,6 +51,7 @@ static void check_extra ( yyscan_t scanner ); %option 8bit %option nounput nomain noyywrap nodefault noinput %option warn +%option reentrant %option extra-type="struct Check *" %option noyyalloc diff --git a/tests/testmaker.m4 b/tests/testmaker.m4 index bddbd445f..ea495b2a9 100644 --- a/tests/testmaker.m4 +++ b/tests/testmaker.m4 @@ -92,6 +92,7 @@ define(`M4_TEST_PREAMBLE', `dnl #include "config.h" #include %} +%option reentrant ')dnl close preamble define(`M4_TEST_DO', `$1;') define(`M4_TEST_FAILMESSAGE', `fprintf(stderr,"TEST FAILED: %d:\"%s\".\n", yylineno, yytext); exit(1);') From 91982ad882e430ef3d2f416cf464850202b0cf30 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 7 Jan 2025 14:33:54 -0500 Subject: [PATCH 12/37] test: Add reentrant option to c99 tests --- tests/mem_c99.l | 1 + tests/prefix_c99.l | 1 + tests/string_c99.l | 1 + tests/yyextra_c99.l | 1 + 4 files changed, 4 insertions(+) diff --git a/tests/mem_c99.l b/tests/mem_c99.l index d6ec025c4..a47c1b35e 100644 --- a/tests/mem_c99.l +++ b/tests/mem_c99.l @@ -44,6 +44,7 @@ void yyfree ( void *, yyscan_t yyscanner ); %option emit="c99" bufsize=8 %option 8bit +%option reentrant %option nounput nomain noyywrap noinput noyy_top_state %option warn stack nodefault %option noyyalloc noyyrealloc noyyfree diff --git a/tests/prefix_c99.l b/tests/prefix_c99.l index 8f484cc8d..dbebebb71 100644 --- a/tests/prefix_c99.l +++ b/tests/prefix_c99.l @@ -33,6 +33,7 @@ %option 8bit prefix="FOO" %option nounput nomain noyywrap noinput %option warn +%option reentrant %% diff --git a/tests/string_c99.l b/tests/string_c99.l index d8eabfc35..33d9cdeaa 100644 --- a/tests/string_c99.l +++ b/tests/string_c99.l @@ -36,6 +36,7 @@ %option 8bit prefix="test" %option nounput nomain nodefault noyywrap noinput %option warn +%option reentrant %% diff --git a/tests/yyextra_c99.l b/tests/yyextra_c99.l index 448688246..66e2b4b45 100644 --- a/tests/yyextra_c99.l +++ b/tests/yyextra_c99.l @@ -50,6 +50,7 @@ static void append_char (char c, yyscan_t scanner ); %option 8bit prefix="test" %option nounput nomain noyywrap nodefault noyyinput %option warn +%option reentrant %option extra-type="struct Buffer *" %% From e597cbebc751d25ab88f1460598fc1fa2283fc78 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 7 Jan 2025 15:36:31 -0500 Subject: [PATCH 13/37] test\!: UNDO Turn off tests for fake Go backend --- tests/Makefile.am | 9 +- tests/ruleset.am | 224 +--------------------------------------------- 2 files changed, 4 insertions(+), 229 deletions(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index ad36ac265..53a35f0f3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -396,13 +396,7 @@ top.h: top.c # Build rules for non-C back ends -.l.go: - $(AM_V_LEX)$(FLEX) $(TESTOPTS) -o $@ $< -# This is a temporary fake rule for use while the Go back end still -# actually generates C. -.go: - $(CC) $< -o $*_go # Most test productions can be autogenerated from ruleset files, but # automake has no way to specify such things with a loop in a variable @@ -435,7 +429,8 @@ RULESETS = \ $(srcdir)/yyunput.rules $(srcdir)/ruleset.am: $(srcdir)/ruleset.sh $(RULESETS) - ( cd $(srcdir) && $(SHELL) ruleset.sh nr r c99 go >ruleset.am ) + ( cd $(srcdir) && $(SHELL) ruleset.sh nr r c99 >ruleset.am ) + include $(srcdir)/ruleset.am diff --git a/tests/ruleset.am b/tests/ruleset.am index 35ea9447a..c159f7d1d 100644 --- a/tests/ruleset.am +++ b/tests/ruleset.am @@ -645,218 +645,6 @@ tableopts_ver_c99_Caem_ver_SOURCES = tableopts_ver_c99-Caem.ver.l tableopts_ver_c99-Caem.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ -array_go_SOURCES = array_go.l -array_go.l: $(srcdir)/array.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -basic_go_SOURCES = basic_go.l -basic_go.l: $(srcdir)/basic.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -bol_go_SOURCES = bol_go.l -bol_go.l: $(srcdir)/bol.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -ccl_go_SOURCES = ccl_go.l -ccl_go.l: $(srcdir)/ccl.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -debug_go_SOURCES = debug_go.l -debug_go.l: $(srcdir)/debug.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -extended_go_SOURCES = extended_go.l -extended_go.l: $(srcdir)/extended.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -fixedtrailing_go_SOURCES = fixedtrailing_go.l -fixedtrailing_go.l: $(srcdir)/fixedtrailing.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -flexname_go_SOURCES = flexname_go.l -flexname_go.l: $(srcdir)/flexname.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -lineno_go_SOURCES = lineno_go.l -lineno_go.l: $(srcdir)/lineno.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -posix_go_SOURCES = posix_go.l -posix_go.l: $(srcdir)/posix.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -preposix_go_SOURCES = preposix_go.l -preposix_go.l: $(srcdir)/preposix.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -quoteincomment_go_SOURCES = quoteincomment_go.l -quoteincomment_go.l: $(srcdir)/quoteincomment.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -reject_go_SOURCES = reject_go.l -reject_go.l: $(srcdir)/reject.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_go_SOURCES = tableopts_go.l -tableopts_go.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -vartrailing_go_SOURCES = vartrailing_go.l -vartrailing_go.l: $(srcdir)/vartrailing.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -yyless_go_SOURCES = yyless_go.l -yyless_go.l: $(srcdir)/yyless.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -yymore_go_SOURCES = yymore_go.l -yymore_go.l: $(srcdir)/yymore.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -yymorearray_go_SOURCES = yymorearray_go.l -yymorearray_go.l: $(srcdir)/yymorearray.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -yymorearraybol_go_SOURCES = yymorearraybol_go.l -yymorearraybol_go.l: $(srcdir)/yymorearraybol.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -yyunput_go_SOURCES = yyunput_go.l -yyunput_go.l: $(srcdir)/yyunput.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Ca_opt_SOURCES = tableopts_opt_go-Ca.opt.l -tableopts_opt_go-Ca.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Ce_opt_SOURCES = tableopts_opt_go-Ce.opt.l -tableopts_opt_go-Ce.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Cf_opt_SOURCES = tableopts_opt_go-Cf.opt.l -tableopts_opt_go-Cf.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_CxF_opt_SOURCES = tableopts_opt_go-CxF.opt.l -tableopts_opt_go-CxF.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Cm_opt_SOURCES = tableopts_opt_go-Cm.opt.l -tableopts_opt_go-Cm.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Cem_opt_SOURCES = tableopts_opt_go-Cem.opt.l -tableopts_opt_go-Cem.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Cae_opt_SOURCES = tableopts_opt_go-Cae.opt.l -tableopts_opt_go-Cae.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Caef_opt_SOURCES = tableopts_opt_go-Caef.opt.l -tableopts_opt_go-Caef.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_CaexF_opt_SOURCES = tableopts_opt_go-CaexF.opt.l -tableopts_opt_go-CaexF.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Cam_opt_SOURCES = tableopts_opt_go-Cam.opt.l -tableopts_opt_go-Cam.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_opt_go_Caem_opt_SOURCES = tableopts_opt_go-Caem.opt.l -tableopts_opt_go-Caem.opt.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Ca_ser_SOURCES = tableopts_ser_go-Ca.ser.l -tableopts_ser_go-Ca.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Ce_ser_SOURCES = tableopts_ser_go-Ce.ser.l -tableopts_ser_go-Ce.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Cf_ser_SOURCES = tableopts_ser_go-Cf.ser.l -tableopts_ser_go-Cf.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_CxF_ser_SOURCES = tableopts_ser_go-CxF.ser.l -tableopts_ser_go-CxF.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Cm_ser_SOURCES = tableopts_ser_go-Cm.ser.l -tableopts_ser_go-Cm.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Cem_ser_SOURCES = tableopts_ser_go-Cem.ser.l -tableopts_ser_go-Cem.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Cae_ser_SOURCES = tableopts_ser_go-Cae.ser.l -tableopts_ser_go-Cae.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Caef_ser_SOURCES = tableopts_ser_go-Caef.ser.l -tableopts_ser_go-Caef.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_CaexF_ser_SOURCES = tableopts_ser_go-CaexF.ser.l -tableopts_ser_go-CaexF.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Cam_ser_SOURCES = tableopts_ser_go-Cam.ser.l -tableopts_ser_go-Cam.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ser_go_Caem_ser_SOURCES = tableopts_ser_go-Caem.ser.l -tableopts_ser_go-Caem.ser.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Ca_ver_SOURCES = tableopts_ver_go-Ca.ver.l -tableopts_ver_go-Ca.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Ce_ver_SOURCES = tableopts_ver_go-Ce.ver.l -tableopts_ver_go-Ce.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Cf_ver_SOURCES = tableopts_ver_go-Cf.ver.l -tableopts_ver_go-Cf.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_CxF_ver_SOURCES = tableopts_ver_go-CxF.ver.l -tableopts_ver_go-CxF.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Cm_ver_SOURCES = tableopts_ver_go-Cm.ver.l -tableopts_ver_go-Cm.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Cem_ver_SOURCES = tableopts_ver_go-Cem.ver.l -tableopts_ver_go-Cem.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Cae_ver_SOURCES = tableopts_ver_go-Cae.ver.l -tableopts_ver_go-Cae.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Caef_ver_SOURCES = tableopts_ver_go-Caef.ver.l -tableopts_ver_go-Caef.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_CaexF_ver_SOURCES = tableopts_ver_go-CaexF.ver.l -tableopts_ver_go-CaexF.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Cam_ver_SOURCES = tableopts_ver_go-Cam.ver.l -tableopts_ver_go-Cam.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - -tableopts_ver_go_Caem_ver_SOURCES = tableopts_ver_go-Caem.ver.l -tableopts_ver_go-Caem.ver.l: $(srcdir)/tableopts.rules $(srcdir)/testmaker.sh $(srcdir)/testmaker.m4 - $(SHELL) $(srcdir)/testmaker.sh -i $(srcdir) $@ - posixlycorrect_nr.c: posixlycorrect_nr.l $(FLEX) $(AM_V_LEX)POSIXLY_CORRECT=1 $(FLEX) $(TESTOPTS) -o $@ $< @@ -881,16 +669,8 @@ test-yydecl-c99.sh$(EXEEXT): $(srcdir)/test-yydecl-gen.sh $(SHELL) $(srcdir)/test-yydecl-gen.sh c99 $(FLEX) >test-yydecl-c99.sh$(EXEEXT) chmod a+x test-yydecl-c99.sh$(EXEEXT) -posixlycorrect_go.go: posixlycorrect_go.l $(FLEX) - $(AM_V_LEX)POSIXLY_CORRECT=1 $(FLEX) $(TESTOPTS) -o $@ $< - -test_yydecl_go_sh_SOURCES = -test-yydecl-go.sh$(EXEEXT): $(srcdir)/test-yydecl-gen.sh - $(SHELL) $(srcdir)/test-yydecl-gen.sh go $(FLEX) >test-yydecl-go.sh$(EXEEXT) - chmod a+x test-yydecl-go.sh$(EXEEXT) - # End generated test rules -RULESET_TESTS = array_nr basic_nr bol_nr ccl_nr debug_nr extended_nr fixedtrailing_nr flexname_nr lexcompat_nr lineno_nr posix_nr posixlycorrect_nr preposix_nr quoteincomment_nr reject_nr tableopts_nr vartrailing_nr yyless_nr yymore_nr yymorearray_nr yymorearraybol_nr yyunput_nr tableopts_opt_nr-Ca.opt tableopts_opt_nr-Ce.opt tableopts_opt_nr-Cf.opt tableopts_opt_nr-CxF.opt tableopts_opt_nr-Cm.opt tableopts_opt_nr-Cem.opt tableopts_opt_nr-Cae.opt tableopts_opt_nr-Caef.opt tableopts_opt_nr-CaexF.opt tableopts_opt_nr-Cam.opt tableopts_opt_nr-Caem.opt tableopts_ser_nr-Ca.ser tableopts_ser_nr-Ce.ser tableopts_ser_nr-Cf.ser tableopts_ser_nr-CxF.ser tableopts_ser_nr-Cm.ser tableopts_ser_nr-Cem.ser tableopts_ser_nr-Cae.ser tableopts_ser_nr-Caef.ser tableopts_ser_nr-CaexF.ser tableopts_ser_nr-Cam.ser tableopts_ser_nr-Caem.ser tableopts_ver_nr-Ca.ver tableopts_ver_nr-Ce.ver tableopts_ver_nr-Cf.ver tableopts_ver_nr-CxF.ver tableopts_ver_nr-Cm.ver tableopts_ver_nr-Cem.ver tableopts_ver_nr-Cae.ver tableopts_ver_nr-Caef.ver tableopts_ver_nr-CaexF.ver tableopts_ver_nr-Cam.ver tableopts_ver_nr-Caem.ver array_r basic_r bol_r ccl_r debug_r extended_r fixedtrailing_r flexname_r lineno_r posix_r preposix_r quoteincomment_r reject_r tableopts_r vartrailing_r yyless_r yymore_r yymorearray_r yymorearraybol_r yyunput_r tableopts_opt_r-Ca.opt tableopts_opt_r-Ce.opt tableopts_opt_r-Cf.opt tableopts_opt_r-CxF.opt tableopts_opt_r-Cm.opt tableopts_opt_r-Cem.opt tableopts_opt_r-Cae.opt tableopts_opt_r-Caef.opt tableopts_opt_r-CaexF.opt tableopts_opt_r-Cam.opt tableopts_opt_r-Caem.opt tableopts_ser_r-Ca.ser tableopts_ser_r-Ce.ser tableopts_ser_r-Cf.ser tableopts_ser_r-CxF.ser tableopts_ser_r-Cm.ser tableopts_ser_r-Cem.ser tableopts_ser_r-Cae.ser tableopts_ser_r-Caef.ser tableopts_ser_r-CaexF.ser tableopts_ser_r-Cam.ser tableopts_ser_r-Caem.ser tableopts_ver_r-Ca.ver tableopts_ver_r-Ce.ver tableopts_ver_r-Cf.ver tableopts_ver_r-CxF.ver tableopts_ver_r-Cm.ver tableopts_ver_r-Cem.ver tableopts_ver_r-Cae.ver tableopts_ver_r-Caef.ver tableopts_ver_r-CaexF.ver tableopts_ver_r-Cam.ver tableopts_ver_r-Caem.ver array_c99 basic_c99 bol_c99 ccl_c99 debug_c99 extended_c99 fixedtrailing_c99 flexname_c99 lineno_c99 posix_c99 preposix_c99 quoteincomment_c99 reject_c99 tableopts_c99 vartrailing_c99 yyless_c99 yymore_c99 yymorearray_c99 yymorearraybol_c99 yyunput_c99 tableopts_opt_c99-Ca.opt tableopts_opt_c99-Ce.opt tableopts_opt_c99-Cf.opt tableopts_opt_c99-CxF.opt tableopts_opt_c99-Cm.opt tableopts_opt_c99-Cem.opt tableopts_opt_c99-Cae.opt tableopts_opt_c99-Caef.opt tableopts_opt_c99-CaexF.opt tableopts_opt_c99-Cam.opt tableopts_opt_c99-Caem.opt tableopts_ser_c99-Ca.ser tableopts_ser_c99-Ce.ser tableopts_ser_c99-Cf.ser tableopts_ser_c99-CxF.ser tableopts_ser_c99-Cm.ser tableopts_ser_c99-Cem.ser tableopts_ser_c99-Cae.ser tableopts_ser_c99-Caef.ser tableopts_ser_c99-CaexF.ser tableopts_ser_c99-Cam.ser tableopts_ser_c99-Caem.ser tableopts_ver_c99-Ca.ver tableopts_ver_c99-Ce.ver tableopts_ver_c99-Cf.ver tableopts_ver_c99-CxF.ver tableopts_ver_c99-Cm.ver tableopts_ver_c99-Cem.ver tableopts_ver_c99-Cae.ver tableopts_ver_c99-Caef.ver tableopts_ver_c99-CaexF.ver tableopts_ver_c99-Cam.ver tableopts_ver_c99-Caem.ver array_go basic_go bol_go ccl_go debug_go extended_go fixedtrailing_go flexname_go lineno_go posix_go preposix_go quoteincomment_go reject_go tableopts_go vartrailing_go yyless_go yymore_go yymorearray_go yymorearraybol_go yyunput_go tableopts_opt_go-Ca.opt tableopts_opt_go-Ce.opt tableopts_opt_go-Cf.opt tableopts_opt_go-CxF.opt tableopts_opt_go-Cm.opt tableopts_opt_go-Cem.opt tableopts_opt_go-Cae.opt tableopts_opt_go-Caef.opt tableopts_opt_go-CaexF.opt tableopts_opt_go-Cam.opt tableopts_opt_go-Caem.opt tableopts_ser_go-Ca.ser tableopts_ser_go-Ce.ser tableopts_ser_go-Cf.ser tableopts_ser_go-CxF.ser tableopts_ser_go-Cm.ser tableopts_ser_go-Cem.ser tableopts_ser_go-Cae.ser tableopts_ser_go-Caef.ser tableopts_ser_go-CaexF.ser tableopts_ser_go-Cam.ser tableopts_ser_go-Caem.ser tableopts_ver_go-Ca.ver tableopts_ver_go-Ce.ver tableopts_ver_go-Cf.ver tableopts_ver_go-CxF.ver tableopts_ver_go-Cm.ver tableopts_ver_go-Cem.ver tableopts_ver_go-Cae.ver tableopts_ver_go-Caef.ver tableopts_ver_go-CaexF.ver tableopts_ver_go-Cam.ver tableopts_ver_go-Caem.ver test-yydecl-nr.sh$(EXEEXT) test-yydecl-r.sh$(EXEEXT) test-yydecl-c99.sh$(EXEEXT) test-yydecl-go.sh$(EXEEXT) -RULESET_REMOVABLES = array_nr array_nr.c array_nr.l basic_nr basic_nr.c basic_nr.l bol_nr bol_nr.c bol_nr.l ccl_nr ccl_nr.c ccl_nr.l debug_nr debug_nr.c debug_nr.l extended_nr extended_nr.c extended_nr.l fixedtrailing_nr fixedtrailing_nr.c fixedtrailing_nr.l flexname_nr flexname_nr.c flexname_nr.l lexcompat_nr lexcompat_nr.c lexcompat_nr.l lineno_nr lineno_nr.c lineno_nr.l posix_nr posix_nr.c posix_nr.l posixlycorrect_nr posixlycorrect_nr.c posixlycorrect_nr.l preposix_nr preposix_nr.c preposix_nr.l quoteincomment_nr quoteincomment_nr.c quoteincomment_nr.l reject_nr reject_nr.c reject_nr.l tableopts_nr tableopts_nr.c tableopts_nr.l vartrailing_nr vartrailing_nr.c vartrailing_nr.l yyless_nr yyless_nr.c yyless_nr.l yymore_nr yymore_nr.c yymore_nr.l yymorearray_nr yymorearray_nr.c yymorearray_nr.l yymorearraybol_nr yymorearraybol_nr.c yymorearraybol_nr.l yyunput_nr yyunput_nr.c yyunput_nr.l tableopts_opt_nr-Ca.opt tableopts_opt_nr-Ca.opt.c tableopts_opt_nr-Ca.opt.l tableopts_opt_nr-Ca.opt.tables tableopts_opt_nr-Ce.opt tableopts_opt_nr-Ce.opt.c tableopts_opt_nr-Ce.opt.l tableopts_opt_nr-Ce.opt.tables tableopts_opt_nr-Cf.opt tableopts_opt_nr-Cf.opt.c tableopts_opt_nr-Cf.opt.l tableopts_opt_nr-Cf.opt.tables tableopts_opt_nr-CxF.opt tableopts_opt_nr-CxF.opt.c tableopts_opt_nr-CxF.opt.l tableopts_opt_nr-CxF.opt.tables tableopts_opt_nr-Cm.opt tableopts_opt_nr-Cm.opt.c tableopts_opt_nr-Cm.opt.l tableopts_opt_nr-Cm.opt.tables tableopts_opt_nr-Cem.opt tableopts_opt_nr-Cem.opt.c tableopts_opt_nr-Cem.opt.l tableopts_opt_nr-Cem.opt.tables tableopts_opt_nr-Cae.opt tableopts_opt_nr-Cae.opt.c tableopts_opt_nr-Cae.opt.l tableopts_opt_nr-Cae.opt.tables tableopts_opt_nr-Caef.opt tableopts_opt_nr-Caef.opt.c tableopts_opt_nr-Caef.opt.l tableopts_opt_nr-Caef.opt.tables tableopts_opt_nr-CaexF.opt tableopts_opt_nr-CaexF.opt.c tableopts_opt_nr-CaexF.opt.l tableopts_opt_nr-CaexF.opt.tables tableopts_opt_nr-Cam.opt tableopts_opt_nr-Cam.opt.c tableopts_opt_nr-Cam.opt.l tableopts_opt_nr-Cam.opt.tables tableopts_opt_nr-Caem.opt tableopts_opt_nr-Caem.opt.c tableopts_opt_nr-Caem.opt.l tableopts_opt_nr-Caem.opt.tables tableopts_ser_nr-Ca.ser tableopts_ser_nr-Ca.ser.c tableopts_ser_nr-Ca.ser.l tableopts_ser_nr-Ca.ser.tables tableopts_ser_nr-Ce.ser tableopts_ser_nr-Ce.ser.c tableopts_ser_nr-Ce.ser.l tableopts_ser_nr-Ce.ser.tables tableopts_ser_nr-Cf.ser tableopts_ser_nr-Cf.ser.c tableopts_ser_nr-Cf.ser.l tableopts_ser_nr-Cf.ser.tables tableopts_ser_nr-CxF.ser tableopts_ser_nr-CxF.ser.c tableopts_ser_nr-CxF.ser.l tableopts_ser_nr-CxF.ser.tables tableopts_ser_nr-Cm.ser tableopts_ser_nr-Cm.ser.c tableopts_ser_nr-Cm.ser.l tableopts_ser_nr-Cm.ser.tables tableopts_ser_nr-Cem.ser tableopts_ser_nr-Cem.ser.c tableopts_ser_nr-Cem.ser.l tableopts_ser_nr-Cem.ser.tables tableopts_ser_nr-Cae.ser tableopts_ser_nr-Cae.ser.c tableopts_ser_nr-Cae.ser.l tableopts_ser_nr-Cae.ser.tables tableopts_ser_nr-Caef.ser tableopts_ser_nr-Caef.ser.c tableopts_ser_nr-Caef.ser.l tableopts_ser_nr-Caef.ser.tables tableopts_ser_nr-CaexF.ser tableopts_ser_nr-CaexF.ser.c tableopts_ser_nr-CaexF.ser.l tableopts_ser_nr-CaexF.ser.tables tableopts_ser_nr-Cam.ser tableopts_ser_nr-Cam.ser.c tableopts_ser_nr-Cam.ser.l tableopts_ser_nr-Cam.ser.tables tableopts_ser_nr-Caem.ser tableopts_ser_nr-Caem.ser.c tableopts_ser_nr-Caem.ser.l tableopts_ser_nr-Caem.ser.tables tableopts_ver_nr-Ca.ver tableopts_ver_nr-Ca.ver.c tableopts_ver_nr-Ca.ver.l tableopts_ver_nr-Ca.ver.tables tableopts_ver_nr-Ce.ver tableopts_ver_nr-Ce.ver.c tableopts_ver_nr-Ce.ver.l tableopts_ver_nr-Ce.ver.tables tableopts_ver_nr-Cf.ver tableopts_ver_nr-Cf.ver.c tableopts_ver_nr-Cf.ver.l tableopts_ver_nr-Cf.ver.tables tableopts_ver_nr-CxF.ver tableopts_ver_nr-CxF.ver.c tableopts_ver_nr-CxF.ver.l tableopts_ver_nr-CxF.ver.tables tableopts_ver_nr-Cm.ver tableopts_ver_nr-Cm.ver.c tableopts_ver_nr-Cm.ver.l tableopts_ver_nr-Cm.ver.tables tableopts_ver_nr-Cem.ver tableopts_ver_nr-Cem.ver.c tableopts_ver_nr-Cem.ver.l tableopts_ver_nr-Cem.ver.tables tableopts_ver_nr-Cae.ver tableopts_ver_nr-Cae.ver.c tableopts_ver_nr-Cae.ver.l tableopts_ver_nr-Cae.ver.tables tableopts_ver_nr-Caef.ver tableopts_ver_nr-Caef.ver.c tableopts_ver_nr-Caef.ver.l tableopts_ver_nr-Caef.ver.tables tableopts_ver_nr-CaexF.ver tableopts_ver_nr-CaexF.ver.c tableopts_ver_nr-CaexF.ver.l tableopts_ver_nr-CaexF.ver.tables tableopts_ver_nr-Cam.ver tableopts_ver_nr-Cam.ver.c tableopts_ver_nr-Cam.ver.l tableopts_ver_nr-Cam.ver.tables tableopts_ver_nr-Caem.ver tableopts_ver_nr-Caem.ver.c tableopts_ver_nr-Caem.ver.l tableopts_ver_nr-Caem.ver.tables array_r array_r.c array_r.l basic_r basic_r.c basic_r.l bol_r bol_r.c bol_r.l ccl_r ccl_r.c ccl_r.l debug_r debug_r.c debug_r.l extended_r extended_r.c extended_r.l fixedtrailing_r fixedtrailing_r.c fixedtrailing_r.l flexname_r flexname_r.c flexname_r.l lineno_r lineno_r.c lineno_r.l posix_r posix_r.c posix_r.l preposix_r preposix_r.c preposix_r.l quoteincomment_r quoteincomment_r.c quoteincomment_r.l reject_r reject_r.c reject_r.l tableopts_r tableopts_r.c tableopts_r.l vartrailing_r vartrailing_r.c vartrailing_r.l yyless_r yyless_r.c yyless_r.l yymore_r yymore_r.c yymore_r.l yymorearray_r yymorearray_r.c yymorearray_r.l yymorearraybol_r yymorearraybol_r.c yymorearraybol_r.l yyunput_r yyunput_r.c yyunput_r.l tableopts_opt_r-Ca.opt tableopts_opt_r-Ca.opt.c tableopts_opt_r-Ca.opt.l tableopts_opt_r-Ca.opt.tables tableopts_opt_r-Ce.opt tableopts_opt_r-Ce.opt.c tableopts_opt_r-Ce.opt.l tableopts_opt_r-Ce.opt.tables tableopts_opt_r-Cf.opt tableopts_opt_r-Cf.opt.c tableopts_opt_r-Cf.opt.l tableopts_opt_r-Cf.opt.tables tableopts_opt_r-CxF.opt tableopts_opt_r-CxF.opt.c tableopts_opt_r-CxF.opt.l tableopts_opt_r-CxF.opt.tables tableopts_opt_r-Cm.opt tableopts_opt_r-Cm.opt.c tableopts_opt_r-Cm.opt.l tableopts_opt_r-Cm.opt.tables tableopts_opt_r-Cem.opt tableopts_opt_r-Cem.opt.c tableopts_opt_r-Cem.opt.l tableopts_opt_r-Cem.opt.tables tableopts_opt_r-Cae.opt tableopts_opt_r-Cae.opt.c tableopts_opt_r-Cae.opt.l tableopts_opt_r-Cae.opt.tables tableopts_opt_r-Caef.opt tableopts_opt_r-Caef.opt.c tableopts_opt_r-Caef.opt.l tableopts_opt_r-Caef.opt.tables tableopts_opt_r-CaexF.opt tableopts_opt_r-CaexF.opt.c tableopts_opt_r-CaexF.opt.l tableopts_opt_r-CaexF.opt.tables tableopts_opt_r-Cam.opt tableopts_opt_r-Cam.opt.c tableopts_opt_r-Cam.opt.l tableopts_opt_r-Cam.opt.tables tableopts_opt_r-Caem.opt tableopts_opt_r-Caem.opt.c tableopts_opt_r-Caem.opt.l tableopts_opt_r-Caem.opt.tables tableopts_ser_r-Ca.ser tableopts_ser_r-Ca.ser.c tableopts_ser_r-Ca.ser.l tableopts_ser_r-Ca.ser.tables tableopts_ser_r-Ce.ser tableopts_ser_r-Ce.ser.c tableopts_ser_r-Ce.ser.l tableopts_ser_r-Ce.ser.tables tableopts_ser_r-Cf.ser tableopts_ser_r-Cf.ser.c tableopts_ser_r-Cf.ser.l tableopts_ser_r-Cf.ser.tables tableopts_ser_r-CxF.ser tableopts_ser_r-CxF.ser.c tableopts_ser_r-CxF.ser.l tableopts_ser_r-CxF.ser.tables tableopts_ser_r-Cm.ser tableopts_ser_r-Cm.ser.c tableopts_ser_r-Cm.ser.l tableopts_ser_r-Cm.ser.tables tableopts_ser_r-Cem.ser tableopts_ser_r-Cem.ser.c tableopts_ser_r-Cem.ser.l tableopts_ser_r-Cem.ser.tables tableopts_ser_r-Cae.ser tableopts_ser_r-Cae.ser.c tableopts_ser_r-Cae.ser.l tableopts_ser_r-Cae.ser.tables tableopts_ser_r-Caef.ser tableopts_ser_r-Caef.ser.c tableopts_ser_r-Caef.ser.l tableopts_ser_r-Caef.ser.tables tableopts_ser_r-CaexF.ser tableopts_ser_r-CaexF.ser.c tableopts_ser_r-CaexF.ser.l tableopts_ser_r-CaexF.ser.tables tableopts_ser_r-Cam.ser tableopts_ser_r-Cam.ser.c tableopts_ser_r-Cam.ser.l tableopts_ser_r-Cam.ser.tables tableopts_ser_r-Caem.ser tableopts_ser_r-Caem.ser.c tableopts_ser_r-Caem.ser.l tableopts_ser_r-Caem.ser.tables tableopts_ver_r-Ca.ver tableopts_ver_r-Ca.ver.c tableopts_ver_r-Ca.ver.l tableopts_ver_r-Ca.ver.tables tableopts_ver_r-Ce.ver tableopts_ver_r-Ce.ver.c tableopts_ver_r-Ce.ver.l tableopts_ver_r-Ce.ver.tables tableopts_ver_r-Cf.ver tableopts_ver_r-Cf.ver.c tableopts_ver_r-Cf.ver.l tableopts_ver_r-Cf.ver.tables tableopts_ver_r-CxF.ver tableopts_ver_r-CxF.ver.c tableopts_ver_r-CxF.ver.l tableopts_ver_r-CxF.ver.tables tableopts_ver_r-Cm.ver tableopts_ver_r-Cm.ver.c tableopts_ver_r-Cm.ver.l tableopts_ver_r-Cm.ver.tables tableopts_ver_r-Cem.ver tableopts_ver_r-Cem.ver.c tableopts_ver_r-Cem.ver.l tableopts_ver_r-Cem.ver.tables tableopts_ver_r-Cae.ver tableopts_ver_r-Cae.ver.c tableopts_ver_r-Cae.ver.l tableopts_ver_r-Cae.ver.tables tableopts_ver_r-Caef.ver tableopts_ver_r-Caef.ver.c tableopts_ver_r-Caef.ver.l tableopts_ver_r-Caef.ver.tables tableopts_ver_r-CaexF.ver tableopts_ver_r-CaexF.ver.c tableopts_ver_r-CaexF.ver.l tableopts_ver_r-CaexF.ver.tables tableopts_ver_r-Cam.ver tableopts_ver_r-Cam.ver.c tableopts_ver_r-Cam.ver.l tableopts_ver_r-Cam.ver.tables tableopts_ver_r-Caem.ver tableopts_ver_r-Caem.ver.c tableopts_ver_r-Caem.ver.l tableopts_ver_r-Caem.ver.tables array_c99 array_c99.c array_c99.l basic_c99 basic_c99.c basic_c99.l bol_c99 bol_c99.c bol_c99.l ccl_c99 ccl_c99.c ccl_c99.l debug_c99 debug_c99.c debug_c99.l extended_c99 extended_c99.c extended_c99.l fixedtrailing_c99 fixedtrailing_c99.c fixedtrailing_c99.l flexname_c99 flexname_c99.c flexname_c99.l lineno_c99 lineno_c99.c lineno_c99.l posix_c99 posix_c99.c posix_c99.l preposix_c99 preposix_c99.c preposix_c99.l quoteincomment_c99 quoteincomment_c99.c quoteincomment_c99.l reject_c99 reject_c99.c reject_c99.l tableopts_c99 tableopts_c99.c tableopts_c99.l vartrailing_c99 vartrailing_c99.c vartrailing_c99.l yyless_c99 yyless_c99.c yyless_c99.l yymore_c99 yymore_c99.c yymore_c99.l yymorearray_c99 yymorearray_c99.c yymorearray_c99.l yymorearraybol_c99 yymorearraybol_c99.c yymorearraybol_c99.l yyunput_c99 yyunput_c99.c yyunput_c99.l tableopts_opt_c99-Ca.opt tableopts_opt_c99-Ca.opt.c tableopts_opt_c99-Ca.opt.l tableopts_opt_c99-Ca.opt.tables tableopts_opt_c99-Ce.opt tableopts_opt_c99-Ce.opt.c tableopts_opt_c99-Ce.opt.l tableopts_opt_c99-Ce.opt.tables tableopts_opt_c99-Cf.opt tableopts_opt_c99-Cf.opt.c tableopts_opt_c99-Cf.opt.l tableopts_opt_c99-Cf.opt.tables tableopts_opt_c99-CxF.opt tableopts_opt_c99-CxF.opt.c tableopts_opt_c99-CxF.opt.l tableopts_opt_c99-CxF.opt.tables tableopts_opt_c99-Cm.opt tableopts_opt_c99-Cm.opt.c tableopts_opt_c99-Cm.opt.l tableopts_opt_c99-Cm.opt.tables tableopts_opt_c99-Cem.opt tableopts_opt_c99-Cem.opt.c tableopts_opt_c99-Cem.opt.l tableopts_opt_c99-Cem.opt.tables tableopts_opt_c99-Cae.opt tableopts_opt_c99-Cae.opt.c tableopts_opt_c99-Cae.opt.l tableopts_opt_c99-Cae.opt.tables tableopts_opt_c99-Caef.opt tableopts_opt_c99-Caef.opt.c tableopts_opt_c99-Caef.opt.l tableopts_opt_c99-Caef.opt.tables tableopts_opt_c99-CaexF.opt tableopts_opt_c99-CaexF.opt.c tableopts_opt_c99-CaexF.opt.l tableopts_opt_c99-CaexF.opt.tables tableopts_opt_c99-Cam.opt tableopts_opt_c99-Cam.opt.c tableopts_opt_c99-Cam.opt.l tableopts_opt_c99-Cam.opt.tables tableopts_opt_c99-Caem.opt tableopts_opt_c99-Caem.opt.c tableopts_opt_c99-Caem.opt.l tableopts_opt_c99-Caem.opt.tables tableopts_ser_c99-Ca.ser tableopts_ser_c99-Ca.ser.c tableopts_ser_c99-Ca.ser.l tableopts_ser_c99-Ca.ser.tables tableopts_ser_c99-Ce.ser tableopts_ser_c99-Ce.ser.c tableopts_ser_c99-Ce.ser.l tableopts_ser_c99-Ce.ser.tables tableopts_ser_c99-Cf.ser tableopts_ser_c99-Cf.ser.c tableopts_ser_c99-Cf.ser.l tableopts_ser_c99-Cf.ser.tables tableopts_ser_c99-CxF.ser tableopts_ser_c99-CxF.ser.c tableopts_ser_c99-CxF.ser.l tableopts_ser_c99-CxF.ser.tables tableopts_ser_c99-Cm.ser tableopts_ser_c99-Cm.ser.c tableopts_ser_c99-Cm.ser.l tableopts_ser_c99-Cm.ser.tables tableopts_ser_c99-Cem.ser tableopts_ser_c99-Cem.ser.c tableopts_ser_c99-Cem.ser.l tableopts_ser_c99-Cem.ser.tables tableopts_ser_c99-Cae.ser tableopts_ser_c99-Cae.ser.c tableopts_ser_c99-Cae.ser.l tableopts_ser_c99-Cae.ser.tables tableopts_ser_c99-Caef.ser tableopts_ser_c99-Caef.ser.c tableopts_ser_c99-Caef.ser.l tableopts_ser_c99-Caef.ser.tables tableopts_ser_c99-CaexF.ser tableopts_ser_c99-CaexF.ser.c tableopts_ser_c99-CaexF.ser.l tableopts_ser_c99-CaexF.ser.tables tableopts_ser_c99-Cam.ser tableopts_ser_c99-Cam.ser.c tableopts_ser_c99-Cam.ser.l tableopts_ser_c99-Cam.ser.tables tableopts_ser_c99-Caem.ser tableopts_ser_c99-Caem.ser.c tableopts_ser_c99-Caem.ser.l tableopts_ser_c99-Caem.ser.tables tableopts_ver_c99-Ca.ver tableopts_ver_c99-Ca.ver.c tableopts_ver_c99-Ca.ver.l tableopts_ver_c99-Ca.ver.tables tableopts_ver_c99-Ce.ver tableopts_ver_c99-Ce.ver.c tableopts_ver_c99-Ce.ver.l tableopts_ver_c99-Ce.ver.tables tableopts_ver_c99-Cf.ver tableopts_ver_c99-Cf.ver.c tableopts_ver_c99-Cf.ver.l tableopts_ver_c99-Cf.ver.tables tableopts_ver_c99-CxF.ver tableopts_ver_c99-CxF.ver.c tableopts_ver_c99-CxF.ver.l tableopts_ver_c99-CxF.ver.tables tableopts_ver_c99-Cm.ver tableopts_ver_c99-Cm.ver.c tableopts_ver_c99-Cm.ver.l tableopts_ver_c99-Cm.ver.tables tableopts_ver_c99-Cem.ver tableopts_ver_c99-Cem.ver.c tableopts_ver_c99-Cem.ver.l tableopts_ver_c99-Cem.ver.tables tableopts_ver_c99-Cae.ver tableopts_ver_c99-Cae.ver.c tableopts_ver_c99-Cae.ver.l tableopts_ver_c99-Cae.ver.tables tableopts_ver_c99-Caef.ver tableopts_ver_c99-Caef.ver.c tableopts_ver_c99-Caef.ver.l tableopts_ver_c99-Caef.ver.tables tableopts_ver_c99-CaexF.ver tableopts_ver_c99-CaexF.ver.c tableopts_ver_c99-CaexF.ver.l tableopts_ver_c99-CaexF.ver.tables tableopts_ver_c99-Cam.ver tableopts_ver_c99-Cam.ver.c tableopts_ver_c99-Cam.ver.l tableopts_ver_c99-Cam.ver.tables tableopts_ver_c99-Caem.ver tableopts_ver_c99-Caem.ver.c tableopts_ver_c99-Caem.ver.l tableopts_ver_c99-Caem.ver.tables array_go array_go.c array_go.l basic_go basic_go.c basic_go.l bol_go bol_go.c bol_go.l ccl_go ccl_go.c ccl_go.l debug_go debug_go.c debug_go.l extended_go extended_go.c extended_go.l fixedtrailing_go fixedtrailing_go.c fixedtrailing_go.l flexname_go flexname_go.c flexname_go.l lineno_go lineno_go.c lineno_go.l posix_go posix_go.c posix_go.l preposix_go preposix_go.c preposix_go.l quoteincomment_go quoteincomment_go.c quoteincomment_go.l reject_go reject_go.c reject_go.l tableopts_go tableopts_go.c tableopts_go.l vartrailing_go vartrailing_go.c vartrailing_go.l yyless_go yyless_go.c yyless_go.l yymore_go yymore_go.c yymore_go.l yymorearray_go yymorearray_go.c yymorearray_go.l yymorearraybol_go yymorearraybol_go.c yymorearraybol_go.l yyunput_go yyunput_go.c yyunput_go.l tableopts_opt_go-Ca.opt tableopts_opt_go-Ca.opt.c tableopts_opt_go-Ca.opt.l tableopts_opt_go-Ca.opt.tables tableopts_opt_go-Ce.opt tableopts_opt_go-Ce.opt.c tableopts_opt_go-Ce.opt.l tableopts_opt_go-Ce.opt.tables tableopts_opt_go-Cf.opt tableopts_opt_go-Cf.opt.c tableopts_opt_go-Cf.opt.l tableopts_opt_go-Cf.opt.tables tableopts_opt_go-CxF.opt tableopts_opt_go-CxF.opt.c tableopts_opt_go-CxF.opt.l tableopts_opt_go-CxF.opt.tables tableopts_opt_go-Cm.opt tableopts_opt_go-Cm.opt.c tableopts_opt_go-Cm.opt.l tableopts_opt_go-Cm.opt.tables tableopts_opt_go-Cem.opt tableopts_opt_go-Cem.opt.c tableopts_opt_go-Cem.opt.l tableopts_opt_go-Cem.opt.tables tableopts_opt_go-Cae.opt tableopts_opt_go-Cae.opt.c tableopts_opt_go-Cae.opt.l tableopts_opt_go-Cae.opt.tables tableopts_opt_go-Caef.opt tableopts_opt_go-Caef.opt.c tableopts_opt_go-Caef.opt.l tableopts_opt_go-Caef.opt.tables tableopts_opt_go-CaexF.opt tableopts_opt_go-CaexF.opt.c tableopts_opt_go-CaexF.opt.l tableopts_opt_go-CaexF.opt.tables tableopts_opt_go-Cam.opt tableopts_opt_go-Cam.opt.c tableopts_opt_go-Cam.opt.l tableopts_opt_go-Cam.opt.tables tableopts_opt_go-Caem.opt tableopts_opt_go-Caem.opt.c tableopts_opt_go-Caem.opt.l tableopts_opt_go-Caem.opt.tables tableopts_ser_go-Ca.ser tableopts_ser_go-Ca.ser.c tableopts_ser_go-Ca.ser.l tableopts_ser_go-Ca.ser.tables tableopts_ser_go-Ce.ser tableopts_ser_go-Ce.ser.c tableopts_ser_go-Ce.ser.l tableopts_ser_go-Ce.ser.tables tableopts_ser_go-Cf.ser tableopts_ser_go-Cf.ser.c tableopts_ser_go-Cf.ser.l tableopts_ser_go-Cf.ser.tables tableopts_ser_go-CxF.ser tableopts_ser_go-CxF.ser.c tableopts_ser_go-CxF.ser.l tableopts_ser_go-CxF.ser.tables tableopts_ser_go-Cm.ser tableopts_ser_go-Cm.ser.c tableopts_ser_go-Cm.ser.l tableopts_ser_go-Cm.ser.tables tableopts_ser_go-Cem.ser tableopts_ser_go-Cem.ser.c tableopts_ser_go-Cem.ser.l tableopts_ser_go-Cem.ser.tables tableopts_ser_go-Cae.ser tableopts_ser_go-Cae.ser.c tableopts_ser_go-Cae.ser.l tableopts_ser_go-Cae.ser.tables tableopts_ser_go-Caef.ser tableopts_ser_go-Caef.ser.c tableopts_ser_go-Caef.ser.l tableopts_ser_go-Caef.ser.tables tableopts_ser_go-CaexF.ser tableopts_ser_go-CaexF.ser.c tableopts_ser_go-CaexF.ser.l tableopts_ser_go-CaexF.ser.tables tableopts_ser_go-Cam.ser tableopts_ser_go-Cam.ser.c tableopts_ser_go-Cam.ser.l tableopts_ser_go-Cam.ser.tables tableopts_ser_go-Caem.ser tableopts_ser_go-Caem.ser.c tableopts_ser_go-Caem.ser.l tableopts_ser_go-Caem.ser.tables tableopts_ver_go-Ca.ver tableopts_ver_go-Ca.ver.c tableopts_ver_go-Ca.ver.l tableopts_ver_go-Ca.ver.tables tableopts_ver_go-Ce.ver tableopts_ver_go-Ce.ver.c tableopts_ver_go-Ce.ver.l tableopts_ver_go-Ce.ver.tables tableopts_ver_go-Cf.ver tableopts_ver_go-Cf.ver.c tableopts_ver_go-Cf.ver.l tableopts_ver_go-Cf.ver.tables tableopts_ver_go-CxF.ver tableopts_ver_go-CxF.ver.c tableopts_ver_go-CxF.ver.l tableopts_ver_go-CxF.ver.tables tableopts_ver_go-Cm.ver tableopts_ver_go-Cm.ver.c tableopts_ver_go-Cm.ver.l tableopts_ver_go-Cm.ver.tables tableopts_ver_go-Cem.ver tableopts_ver_go-Cem.ver.c tableopts_ver_go-Cem.ver.l tableopts_ver_go-Cem.ver.tables tableopts_ver_go-Cae.ver tableopts_ver_go-Cae.ver.c tableopts_ver_go-Cae.ver.l tableopts_ver_go-Cae.ver.tables tableopts_ver_go-Caef.ver tableopts_ver_go-Caef.ver.c tableopts_ver_go-Caef.ver.l tableopts_ver_go-Caef.ver.tables tableopts_ver_go-CaexF.ver tableopts_ver_go-CaexF.ver.c tableopts_ver_go-CaexF.ver.l tableopts_ver_go-CaexF.ver.tables tableopts_ver_go-Cam.ver tableopts_ver_go-Cam.ver.c tableopts_ver_go-Cam.ver.l tableopts_ver_go-Cam.ver.tables tableopts_ver_go-Caem.ver tableopts_ver_go-Caem.ver.c tableopts_ver_go-Caem.ver.l tableopts_ver_go-Caem.ver.tables test-yydecl-nr.sh$(EXEEXT) test-yydecl-r.sh$(EXEEXT) test-yydecl-c99.sh$(EXEEXT) test-yydecl-go.sh$(EXEEXT) +RULESET_TESTS = array_nr basic_nr bol_nr ccl_nr debug_nr extended_nr fixedtrailing_nr flexname_nr lexcompat_nr lineno_nr posix_nr posixlycorrect_nr preposix_nr quoteincomment_nr reject_nr tableopts_nr vartrailing_nr yyless_nr yymore_nr yymorearray_nr yymorearraybol_nr yyunput_nr tableopts_opt_nr-Ca.opt tableopts_opt_nr-Ce.opt tableopts_opt_nr-Cf.opt tableopts_opt_nr-CxF.opt tableopts_opt_nr-Cm.opt tableopts_opt_nr-Cem.opt tableopts_opt_nr-Cae.opt tableopts_opt_nr-Caef.opt tableopts_opt_nr-CaexF.opt tableopts_opt_nr-Cam.opt tableopts_opt_nr-Caem.opt tableopts_ser_nr-Ca.ser tableopts_ser_nr-Ce.ser tableopts_ser_nr-Cf.ser tableopts_ser_nr-CxF.ser tableopts_ser_nr-Cm.ser tableopts_ser_nr-Cem.ser tableopts_ser_nr-Cae.ser tableopts_ser_nr-Caef.ser tableopts_ser_nr-CaexF.ser tableopts_ser_nr-Cam.ser tableopts_ser_nr-Caem.ser tableopts_ver_nr-Ca.ver tableopts_ver_nr-Ce.ver tableopts_ver_nr-Cf.ver tableopts_ver_nr-CxF.ver tableopts_ver_nr-Cm.ver tableopts_ver_nr-Cem.ver tableopts_ver_nr-Cae.ver tableopts_ver_nr-Caef.ver tableopts_ver_nr-CaexF.ver tableopts_ver_nr-Cam.ver tableopts_ver_nr-Caem.ver array_r basic_r bol_r ccl_r debug_r extended_r fixedtrailing_r flexname_r lineno_r posix_r preposix_r quoteincomment_r reject_r tableopts_r vartrailing_r yyless_r yymore_r yymorearray_r yymorearraybol_r yyunput_r tableopts_opt_r-Ca.opt tableopts_opt_r-Ce.opt tableopts_opt_r-Cf.opt tableopts_opt_r-CxF.opt tableopts_opt_r-Cm.opt tableopts_opt_r-Cem.opt tableopts_opt_r-Cae.opt tableopts_opt_r-Caef.opt tableopts_opt_r-CaexF.opt tableopts_opt_r-Cam.opt tableopts_opt_r-Caem.opt tableopts_ser_r-Ca.ser tableopts_ser_r-Ce.ser tableopts_ser_r-Cf.ser tableopts_ser_r-CxF.ser tableopts_ser_r-Cm.ser tableopts_ser_r-Cem.ser tableopts_ser_r-Cae.ser tableopts_ser_r-Caef.ser tableopts_ser_r-CaexF.ser tableopts_ser_r-Cam.ser tableopts_ser_r-Caem.ser tableopts_ver_r-Ca.ver tableopts_ver_r-Ce.ver tableopts_ver_r-Cf.ver tableopts_ver_r-CxF.ver tableopts_ver_r-Cm.ver tableopts_ver_r-Cem.ver tableopts_ver_r-Cae.ver tableopts_ver_r-Caef.ver tableopts_ver_r-CaexF.ver tableopts_ver_r-Cam.ver tableopts_ver_r-Caem.ver array_c99 basic_c99 bol_c99 ccl_c99 debug_c99 extended_c99 fixedtrailing_c99 flexname_c99 lineno_c99 posix_c99 preposix_c99 quoteincomment_c99 reject_c99 tableopts_c99 vartrailing_c99 yyless_c99 yymore_c99 yymorearray_c99 yymorearraybol_c99 yyunput_c99 tableopts_opt_c99-Ca.opt tableopts_opt_c99-Ce.opt tableopts_opt_c99-Cf.opt tableopts_opt_c99-CxF.opt tableopts_opt_c99-Cm.opt tableopts_opt_c99-Cem.opt tableopts_opt_c99-Cae.opt tableopts_opt_c99-Caef.opt tableopts_opt_c99-CaexF.opt tableopts_opt_c99-Cam.opt tableopts_opt_c99-Caem.opt tableopts_ser_c99-Ca.ser tableopts_ser_c99-Ce.ser tableopts_ser_c99-Cf.ser tableopts_ser_c99-CxF.ser tableopts_ser_c99-Cm.ser tableopts_ser_c99-Cem.ser tableopts_ser_c99-Cae.ser tableopts_ser_c99-Caef.ser tableopts_ser_c99-CaexF.ser tableopts_ser_c99-Cam.ser tableopts_ser_c99-Caem.ser tableopts_ver_c99-Ca.ver tableopts_ver_c99-Ce.ver tableopts_ver_c99-Cf.ver tableopts_ver_c99-CxF.ver tableopts_ver_c99-Cm.ver tableopts_ver_c99-Cem.ver tableopts_ver_c99-Cae.ver tableopts_ver_c99-Caef.ver tableopts_ver_c99-CaexF.ver tableopts_ver_c99-Cam.ver tableopts_ver_c99-Caem.ver test-yydecl-nr.sh$(EXEEXT) test-yydecl-r.sh$(EXEEXT) test-yydecl-c99.sh$(EXEEXT) +RULESET_REMOVABLES = array_nr array_nr.c array_nr.l basic_nr basic_nr.c basic_nr.l bol_nr bol_nr.c bol_nr.l ccl_nr ccl_nr.c ccl_nr.l debug_nr debug_nr.c debug_nr.l extended_nr extended_nr.c extended_nr.l fixedtrailing_nr fixedtrailing_nr.c fixedtrailing_nr.l flexname_nr flexname_nr.c flexname_nr.l lexcompat_nr lexcompat_nr.c lexcompat_nr.l lineno_nr lineno_nr.c lineno_nr.l posix_nr posix_nr.c posix_nr.l posixlycorrect_nr posixlycorrect_nr.c posixlycorrect_nr.l preposix_nr preposix_nr.c preposix_nr.l quoteincomment_nr quoteincomment_nr.c quoteincomment_nr.l reject_nr reject_nr.c reject_nr.l tableopts_nr tableopts_nr.c tableopts_nr.l vartrailing_nr vartrailing_nr.c vartrailing_nr.l yyless_nr yyless_nr.c yyless_nr.l yymore_nr yymore_nr.c yymore_nr.l yymorearray_nr yymorearray_nr.c yymorearray_nr.l yymorearraybol_nr yymorearraybol_nr.c yymorearraybol_nr.l yyunput_nr yyunput_nr.c yyunput_nr.l tableopts_opt_nr-Ca.opt tableopts_opt_nr-Ca.opt.c tableopts_opt_nr-Ca.opt.l tableopts_opt_nr-Ca.opt.tables tableopts_opt_nr-Ce.opt tableopts_opt_nr-Ce.opt.c tableopts_opt_nr-Ce.opt.l tableopts_opt_nr-Ce.opt.tables tableopts_opt_nr-Cf.opt tableopts_opt_nr-Cf.opt.c tableopts_opt_nr-Cf.opt.l tableopts_opt_nr-Cf.opt.tables tableopts_opt_nr-CxF.opt tableopts_opt_nr-CxF.opt.c tableopts_opt_nr-CxF.opt.l tableopts_opt_nr-CxF.opt.tables tableopts_opt_nr-Cm.opt tableopts_opt_nr-Cm.opt.c tableopts_opt_nr-Cm.opt.l tableopts_opt_nr-Cm.opt.tables tableopts_opt_nr-Cem.opt tableopts_opt_nr-Cem.opt.c tableopts_opt_nr-Cem.opt.l tableopts_opt_nr-Cem.opt.tables tableopts_opt_nr-Cae.opt tableopts_opt_nr-Cae.opt.c tableopts_opt_nr-Cae.opt.l tableopts_opt_nr-Cae.opt.tables tableopts_opt_nr-Caef.opt tableopts_opt_nr-Caef.opt.c tableopts_opt_nr-Caef.opt.l tableopts_opt_nr-Caef.opt.tables tableopts_opt_nr-CaexF.opt tableopts_opt_nr-CaexF.opt.c tableopts_opt_nr-CaexF.opt.l tableopts_opt_nr-CaexF.opt.tables tableopts_opt_nr-Cam.opt tableopts_opt_nr-Cam.opt.c tableopts_opt_nr-Cam.opt.l tableopts_opt_nr-Cam.opt.tables tableopts_opt_nr-Caem.opt tableopts_opt_nr-Caem.opt.c tableopts_opt_nr-Caem.opt.l tableopts_opt_nr-Caem.opt.tables tableopts_ser_nr-Ca.ser tableopts_ser_nr-Ca.ser.c tableopts_ser_nr-Ca.ser.l tableopts_ser_nr-Ca.ser.tables tableopts_ser_nr-Ce.ser tableopts_ser_nr-Ce.ser.c tableopts_ser_nr-Ce.ser.l tableopts_ser_nr-Ce.ser.tables tableopts_ser_nr-Cf.ser tableopts_ser_nr-Cf.ser.c tableopts_ser_nr-Cf.ser.l tableopts_ser_nr-Cf.ser.tables tableopts_ser_nr-CxF.ser tableopts_ser_nr-CxF.ser.c tableopts_ser_nr-CxF.ser.l tableopts_ser_nr-CxF.ser.tables tableopts_ser_nr-Cm.ser tableopts_ser_nr-Cm.ser.c tableopts_ser_nr-Cm.ser.l tableopts_ser_nr-Cm.ser.tables tableopts_ser_nr-Cem.ser tableopts_ser_nr-Cem.ser.c tableopts_ser_nr-Cem.ser.l tableopts_ser_nr-Cem.ser.tables tableopts_ser_nr-Cae.ser tableopts_ser_nr-Cae.ser.c tableopts_ser_nr-Cae.ser.l tableopts_ser_nr-Cae.ser.tables tableopts_ser_nr-Caef.ser tableopts_ser_nr-Caef.ser.c tableopts_ser_nr-Caef.ser.l tableopts_ser_nr-Caef.ser.tables tableopts_ser_nr-CaexF.ser tableopts_ser_nr-CaexF.ser.c tableopts_ser_nr-CaexF.ser.l tableopts_ser_nr-CaexF.ser.tables tableopts_ser_nr-Cam.ser tableopts_ser_nr-Cam.ser.c tableopts_ser_nr-Cam.ser.l tableopts_ser_nr-Cam.ser.tables tableopts_ser_nr-Caem.ser tableopts_ser_nr-Caem.ser.c tableopts_ser_nr-Caem.ser.l tableopts_ser_nr-Caem.ser.tables tableopts_ver_nr-Ca.ver tableopts_ver_nr-Ca.ver.c tableopts_ver_nr-Ca.ver.l tableopts_ver_nr-Ca.ver.tables tableopts_ver_nr-Ce.ver tableopts_ver_nr-Ce.ver.c tableopts_ver_nr-Ce.ver.l tableopts_ver_nr-Ce.ver.tables tableopts_ver_nr-Cf.ver tableopts_ver_nr-Cf.ver.c tableopts_ver_nr-Cf.ver.l tableopts_ver_nr-Cf.ver.tables tableopts_ver_nr-CxF.ver tableopts_ver_nr-CxF.ver.c tableopts_ver_nr-CxF.ver.l tableopts_ver_nr-CxF.ver.tables tableopts_ver_nr-Cm.ver tableopts_ver_nr-Cm.ver.c tableopts_ver_nr-Cm.ver.l tableopts_ver_nr-Cm.ver.tables tableopts_ver_nr-Cem.ver tableopts_ver_nr-Cem.ver.c tableopts_ver_nr-Cem.ver.l tableopts_ver_nr-Cem.ver.tables tableopts_ver_nr-Cae.ver tableopts_ver_nr-Cae.ver.c tableopts_ver_nr-Cae.ver.l tableopts_ver_nr-Cae.ver.tables tableopts_ver_nr-Caef.ver tableopts_ver_nr-Caef.ver.c tableopts_ver_nr-Caef.ver.l tableopts_ver_nr-Caef.ver.tables tableopts_ver_nr-CaexF.ver tableopts_ver_nr-CaexF.ver.c tableopts_ver_nr-CaexF.ver.l tableopts_ver_nr-CaexF.ver.tables tableopts_ver_nr-Cam.ver tableopts_ver_nr-Cam.ver.c tableopts_ver_nr-Cam.ver.l tableopts_ver_nr-Cam.ver.tables tableopts_ver_nr-Caem.ver tableopts_ver_nr-Caem.ver.c tableopts_ver_nr-Caem.ver.l tableopts_ver_nr-Caem.ver.tables array_r array_r.c array_r.l basic_r basic_r.c basic_r.l bol_r bol_r.c bol_r.l ccl_r ccl_r.c ccl_r.l debug_r debug_r.c debug_r.l extended_r extended_r.c extended_r.l fixedtrailing_r fixedtrailing_r.c fixedtrailing_r.l flexname_r flexname_r.c flexname_r.l lineno_r lineno_r.c lineno_r.l posix_r posix_r.c posix_r.l preposix_r preposix_r.c preposix_r.l quoteincomment_r quoteincomment_r.c quoteincomment_r.l reject_r reject_r.c reject_r.l tableopts_r tableopts_r.c tableopts_r.l vartrailing_r vartrailing_r.c vartrailing_r.l yyless_r yyless_r.c yyless_r.l yymore_r yymore_r.c yymore_r.l yymorearray_r yymorearray_r.c yymorearray_r.l yymorearraybol_r yymorearraybol_r.c yymorearraybol_r.l yyunput_r yyunput_r.c yyunput_r.l tableopts_opt_r-Ca.opt tableopts_opt_r-Ca.opt.c tableopts_opt_r-Ca.opt.l tableopts_opt_r-Ca.opt.tables tableopts_opt_r-Ce.opt tableopts_opt_r-Ce.opt.c tableopts_opt_r-Ce.opt.l tableopts_opt_r-Ce.opt.tables tableopts_opt_r-Cf.opt tableopts_opt_r-Cf.opt.c tableopts_opt_r-Cf.opt.l tableopts_opt_r-Cf.opt.tables tableopts_opt_r-CxF.opt tableopts_opt_r-CxF.opt.c tableopts_opt_r-CxF.opt.l tableopts_opt_r-CxF.opt.tables tableopts_opt_r-Cm.opt tableopts_opt_r-Cm.opt.c tableopts_opt_r-Cm.opt.l tableopts_opt_r-Cm.opt.tables tableopts_opt_r-Cem.opt tableopts_opt_r-Cem.opt.c tableopts_opt_r-Cem.opt.l tableopts_opt_r-Cem.opt.tables tableopts_opt_r-Cae.opt tableopts_opt_r-Cae.opt.c tableopts_opt_r-Cae.opt.l tableopts_opt_r-Cae.opt.tables tableopts_opt_r-Caef.opt tableopts_opt_r-Caef.opt.c tableopts_opt_r-Caef.opt.l tableopts_opt_r-Caef.opt.tables tableopts_opt_r-CaexF.opt tableopts_opt_r-CaexF.opt.c tableopts_opt_r-CaexF.opt.l tableopts_opt_r-CaexF.opt.tables tableopts_opt_r-Cam.opt tableopts_opt_r-Cam.opt.c tableopts_opt_r-Cam.opt.l tableopts_opt_r-Cam.opt.tables tableopts_opt_r-Caem.opt tableopts_opt_r-Caem.opt.c tableopts_opt_r-Caem.opt.l tableopts_opt_r-Caem.opt.tables tableopts_ser_r-Ca.ser tableopts_ser_r-Ca.ser.c tableopts_ser_r-Ca.ser.l tableopts_ser_r-Ca.ser.tables tableopts_ser_r-Ce.ser tableopts_ser_r-Ce.ser.c tableopts_ser_r-Ce.ser.l tableopts_ser_r-Ce.ser.tables tableopts_ser_r-Cf.ser tableopts_ser_r-Cf.ser.c tableopts_ser_r-Cf.ser.l tableopts_ser_r-Cf.ser.tables tableopts_ser_r-CxF.ser tableopts_ser_r-CxF.ser.c tableopts_ser_r-CxF.ser.l tableopts_ser_r-CxF.ser.tables tableopts_ser_r-Cm.ser tableopts_ser_r-Cm.ser.c tableopts_ser_r-Cm.ser.l tableopts_ser_r-Cm.ser.tables tableopts_ser_r-Cem.ser tableopts_ser_r-Cem.ser.c tableopts_ser_r-Cem.ser.l tableopts_ser_r-Cem.ser.tables tableopts_ser_r-Cae.ser tableopts_ser_r-Cae.ser.c tableopts_ser_r-Cae.ser.l tableopts_ser_r-Cae.ser.tables tableopts_ser_r-Caef.ser tableopts_ser_r-Caef.ser.c tableopts_ser_r-Caef.ser.l tableopts_ser_r-Caef.ser.tables tableopts_ser_r-CaexF.ser tableopts_ser_r-CaexF.ser.c tableopts_ser_r-CaexF.ser.l tableopts_ser_r-CaexF.ser.tables tableopts_ser_r-Cam.ser tableopts_ser_r-Cam.ser.c tableopts_ser_r-Cam.ser.l tableopts_ser_r-Cam.ser.tables tableopts_ser_r-Caem.ser tableopts_ser_r-Caem.ser.c tableopts_ser_r-Caem.ser.l tableopts_ser_r-Caem.ser.tables tableopts_ver_r-Ca.ver tableopts_ver_r-Ca.ver.c tableopts_ver_r-Ca.ver.l tableopts_ver_r-Ca.ver.tables tableopts_ver_r-Ce.ver tableopts_ver_r-Ce.ver.c tableopts_ver_r-Ce.ver.l tableopts_ver_r-Ce.ver.tables tableopts_ver_r-Cf.ver tableopts_ver_r-Cf.ver.c tableopts_ver_r-Cf.ver.l tableopts_ver_r-Cf.ver.tables tableopts_ver_r-CxF.ver tableopts_ver_r-CxF.ver.c tableopts_ver_r-CxF.ver.l tableopts_ver_r-CxF.ver.tables tableopts_ver_r-Cm.ver tableopts_ver_r-Cm.ver.c tableopts_ver_r-Cm.ver.l tableopts_ver_r-Cm.ver.tables tableopts_ver_r-Cem.ver tableopts_ver_r-Cem.ver.c tableopts_ver_r-Cem.ver.l tableopts_ver_r-Cem.ver.tables tableopts_ver_r-Cae.ver tableopts_ver_r-Cae.ver.c tableopts_ver_r-Cae.ver.l tableopts_ver_r-Cae.ver.tables tableopts_ver_r-Caef.ver tableopts_ver_r-Caef.ver.c tableopts_ver_r-Caef.ver.l tableopts_ver_r-Caef.ver.tables tableopts_ver_r-CaexF.ver tableopts_ver_r-CaexF.ver.c tableopts_ver_r-CaexF.ver.l tableopts_ver_r-CaexF.ver.tables tableopts_ver_r-Cam.ver tableopts_ver_r-Cam.ver.c tableopts_ver_r-Cam.ver.l tableopts_ver_r-Cam.ver.tables tableopts_ver_r-Caem.ver tableopts_ver_r-Caem.ver.c tableopts_ver_r-Caem.ver.l tableopts_ver_r-Caem.ver.tables array_c99 array_c99.c array_c99.l basic_c99 basic_c99.c basic_c99.l bol_c99 bol_c99.c bol_c99.l ccl_c99 ccl_c99.c ccl_c99.l debug_c99 debug_c99.c debug_c99.l extended_c99 extended_c99.c extended_c99.l fixedtrailing_c99 fixedtrailing_c99.c fixedtrailing_c99.l flexname_c99 flexname_c99.c flexname_c99.l lineno_c99 lineno_c99.c lineno_c99.l posix_c99 posix_c99.c posix_c99.l preposix_c99 preposix_c99.c preposix_c99.l quoteincomment_c99 quoteincomment_c99.c quoteincomment_c99.l reject_c99 reject_c99.c reject_c99.l tableopts_c99 tableopts_c99.c tableopts_c99.l vartrailing_c99 vartrailing_c99.c vartrailing_c99.l yyless_c99 yyless_c99.c yyless_c99.l yymore_c99 yymore_c99.c yymore_c99.l yymorearray_c99 yymorearray_c99.c yymorearray_c99.l yymorearraybol_c99 yymorearraybol_c99.c yymorearraybol_c99.l yyunput_c99 yyunput_c99.c yyunput_c99.l tableopts_opt_c99-Ca.opt tableopts_opt_c99-Ca.opt.c tableopts_opt_c99-Ca.opt.l tableopts_opt_c99-Ca.opt.tables tableopts_opt_c99-Ce.opt tableopts_opt_c99-Ce.opt.c tableopts_opt_c99-Ce.opt.l tableopts_opt_c99-Ce.opt.tables tableopts_opt_c99-Cf.opt tableopts_opt_c99-Cf.opt.c tableopts_opt_c99-Cf.opt.l tableopts_opt_c99-Cf.opt.tables tableopts_opt_c99-CxF.opt tableopts_opt_c99-CxF.opt.c tableopts_opt_c99-CxF.opt.l tableopts_opt_c99-CxF.opt.tables tableopts_opt_c99-Cm.opt tableopts_opt_c99-Cm.opt.c tableopts_opt_c99-Cm.opt.l tableopts_opt_c99-Cm.opt.tables tableopts_opt_c99-Cem.opt tableopts_opt_c99-Cem.opt.c tableopts_opt_c99-Cem.opt.l tableopts_opt_c99-Cem.opt.tables tableopts_opt_c99-Cae.opt tableopts_opt_c99-Cae.opt.c tableopts_opt_c99-Cae.opt.l tableopts_opt_c99-Cae.opt.tables tableopts_opt_c99-Caef.opt tableopts_opt_c99-Caef.opt.c tableopts_opt_c99-Caef.opt.l tableopts_opt_c99-Caef.opt.tables tableopts_opt_c99-CaexF.opt tableopts_opt_c99-CaexF.opt.c tableopts_opt_c99-CaexF.opt.l tableopts_opt_c99-CaexF.opt.tables tableopts_opt_c99-Cam.opt tableopts_opt_c99-Cam.opt.c tableopts_opt_c99-Cam.opt.l tableopts_opt_c99-Cam.opt.tables tableopts_opt_c99-Caem.opt tableopts_opt_c99-Caem.opt.c tableopts_opt_c99-Caem.opt.l tableopts_opt_c99-Caem.opt.tables tableopts_ser_c99-Ca.ser tableopts_ser_c99-Ca.ser.c tableopts_ser_c99-Ca.ser.l tableopts_ser_c99-Ca.ser.tables tableopts_ser_c99-Ce.ser tableopts_ser_c99-Ce.ser.c tableopts_ser_c99-Ce.ser.l tableopts_ser_c99-Ce.ser.tables tableopts_ser_c99-Cf.ser tableopts_ser_c99-Cf.ser.c tableopts_ser_c99-Cf.ser.l tableopts_ser_c99-Cf.ser.tables tableopts_ser_c99-CxF.ser tableopts_ser_c99-CxF.ser.c tableopts_ser_c99-CxF.ser.l tableopts_ser_c99-CxF.ser.tables tableopts_ser_c99-Cm.ser tableopts_ser_c99-Cm.ser.c tableopts_ser_c99-Cm.ser.l tableopts_ser_c99-Cm.ser.tables tableopts_ser_c99-Cem.ser tableopts_ser_c99-Cem.ser.c tableopts_ser_c99-Cem.ser.l tableopts_ser_c99-Cem.ser.tables tableopts_ser_c99-Cae.ser tableopts_ser_c99-Cae.ser.c tableopts_ser_c99-Cae.ser.l tableopts_ser_c99-Cae.ser.tables tableopts_ser_c99-Caef.ser tableopts_ser_c99-Caef.ser.c tableopts_ser_c99-Caef.ser.l tableopts_ser_c99-Caef.ser.tables tableopts_ser_c99-CaexF.ser tableopts_ser_c99-CaexF.ser.c tableopts_ser_c99-CaexF.ser.l tableopts_ser_c99-CaexF.ser.tables tableopts_ser_c99-Cam.ser tableopts_ser_c99-Cam.ser.c tableopts_ser_c99-Cam.ser.l tableopts_ser_c99-Cam.ser.tables tableopts_ser_c99-Caem.ser tableopts_ser_c99-Caem.ser.c tableopts_ser_c99-Caem.ser.l tableopts_ser_c99-Caem.ser.tables tableopts_ver_c99-Ca.ver tableopts_ver_c99-Ca.ver.c tableopts_ver_c99-Ca.ver.l tableopts_ver_c99-Ca.ver.tables tableopts_ver_c99-Ce.ver tableopts_ver_c99-Ce.ver.c tableopts_ver_c99-Ce.ver.l tableopts_ver_c99-Ce.ver.tables tableopts_ver_c99-Cf.ver tableopts_ver_c99-Cf.ver.c tableopts_ver_c99-Cf.ver.l tableopts_ver_c99-Cf.ver.tables tableopts_ver_c99-CxF.ver tableopts_ver_c99-CxF.ver.c tableopts_ver_c99-CxF.ver.l tableopts_ver_c99-CxF.ver.tables tableopts_ver_c99-Cm.ver tableopts_ver_c99-Cm.ver.c tableopts_ver_c99-Cm.ver.l tableopts_ver_c99-Cm.ver.tables tableopts_ver_c99-Cem.ver tableopts_ver_c99-Cem.ver.c tableopts_ver_c99-Cem.ver.l tableopts_ver_c99-Cem.ver.tables tableopts_ver_c99-Cae.ver tableopts_ver_c99-Cae.ver.c tableopts_ver_c99-Cae.ver.l tableopts_ver_c99-Cae.ver.tables tableopts_ver_c99-Caef.ver tableopts_ver_c99-Caef.ver.c tableopts_ver_c99-Caef.ver.l tableopts_ver_c99-Caef.ver.tables tableopts_ver_c99-CaexF.ver tableopts_ver_c99-CaexF.ver.c tableopts_ver_c99-CaexF.ver.l tableopts_ver_c99-CaexF.ver.tables tableopts_ver_c99-Cam.ver tableopts_ver_c99-Cam.ver.c tableopts_ver_c99-Cam.ver.l tableopts_ver_c99-Cam.ver.tables tableopts_ver_c99-Caem.ver tableopts_ver_c99-Caem.ver.c tableopts_ver_c99-Caem.ver.l tableopts_ver_c99-Caem.ver.tables test-yydecl-nr.sh$(EXEEXT) test-yydecl-r.sh$(EXEEXT) test-yydecl-c99.sh$(EXEEXT) From 17cee922e6c8bed61390cbe0fda670a2b83f0ec5 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 4 Feb 2025 13:18:10 -0500 Subject: [PATCH 14/37] test\!: UNDO Turn off tests for fake Go backend --- tests/Makefile.am | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/Makefile.am b/tests/Makefile.am index 53a35f0f3..21ae993e1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -396,7 +396,13 @@ top.h: top.c # Build rules for non-C back ends +#.l.go: +# $(AM_V_LEX)$(FLEX) $(TESTOPTS) -o $@ $< +# This is a temporary fake rule for use while the Go back end still +# actually generates C. +#.go: +# $(CC) $< -o $*_go # Most test productions can be autogenerated from ruleset files, but # automake has no way to specify such things with a loop in a variable @@ -428,6 +434,9 @@ RULESETS = \ $(srcdir)/yymorearraybol.rules \ $(srcdir)/yyunput.rules +#$(srcdir)/ruleset.am: $(srcdir)/ruleset.sh $(RULESETS) +# ( cd $(srcdir) && $(SHELL) ruleset.sh nr r c99 go >ruleset.am ) + $(srcdir)/ruleset.am: $(srcdir)/ruleset.sh $(RULESETS) ( cd $(srcdir) && $(SHELL) ruleset.sh nr r c99 >ruleset.am ) From 442a30f3a4ab5ebd48ff4fc719dbea4ec04da976 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 4 Feb 2025 14:30:09 -0500 Subject: [PATCH 15/37] feat(skel): Add DEAFULT skel ID to enum --- src/flexdef.h | 1 + src/skeletons.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/flexdef.h b/src/flexdef.h index 783298a03..a1c665bd9 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -1013,6 +1013,7 @@ extern void set_input_file(char *); /* from file skeletons.c */ typedef enum flex_backend_id { + FLEX_BACKEND_DEFAULT = 0, FLEX_BACKEND_CPP = 0, FLEX_BACKEND_C99, FLEX_BACKEND_GO, diff --git a/src/skeletons.c b/src/skeletons.c index 07235109b..49ea8b7f2 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -136,7 +136,7 @@ void init_backends( void ) { /* TODO: What does this mean now? */ bool is_default_backend(void) { - return top_backend() == FLEX_BACKEND_CPP; + return top_backend() == FLEX_BACKEND_DEFAULT; } /* Search for a string in the skeleton prolog, where macros are defined. @@ -160,7 +160,7 @@ static bool boneseeker(const char *bone) flex_backend_id_t backend_by_name(const char *name) { const char *prefix_property; - flex_backend_id_t backend = FLEX_BACKEND_CPP, i = FLEX_BACKEND_CPP; + flex_backend_id_t backend = FLEX_BACKEND_DEFAULT, i = FLEX_BACKEND_DEFAULT; if (name != NULL) { if (strcmp(name, "nr") == 0) { From 1d8a13ea2e22d9eff920dfd2ce8d18b733ac3a58 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 4 Feb 2025 14:30:52 -0500 Subject: [PATCH 16/37] feat(skel): Comment backend api --- src/cpp-backend.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/cpp-backend.c b/src/cpp-backend.c index 88c5509e7..c8f8165cb 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -42,18 +42,22 @@ const char *cpp_skel[] = { 0 }; +/* For C and CXX, emit the typedef names from flexint_shared.h */ const char * cpp_get_int32_type ( const struct flex_backend_t *b ) { return "flex_int32_t"; } +/* For C and CXX, emit the typedef names from flexint_shared.h */ static const char * cpp_get_int16_type ( const struct flex_backend_t *b ) { return "flex_int16_t"; } +/* TODO: Indent? */ static void cpp_open_block_comment ( const struct flex_backend_t *b ) { fputs("/* ", stdout); } +/* TODO: Indent? */ static void cpp_close_block_comment ( const struct flex_backend_t *b ) { fputs(" */", stdout); } @@ -64,25 +68,30 @@ static void cpp_comment ( const struct flex_backend_t *b, const char *c ) { } static void cpp_record_separator ( const struct flex_backend_t *b ) { + /* Expected to ocurr at the end of a line, so I'm not indenting. */ fputs("},\n", stdout); } static void cpp_column_separator ( const struct flex_backend_t *b ){ + /* Expected to ocurr at the end of a line, so don't indent. */ fputs(", ", stdout); } static void cpp_newline ( const struct flex_backend_t *b ) { + /* Expected to ocurr at the end of a line, so don't indent. */ fputs("\n", stdout); } static void cpp_increase_indent ( const struct flex_backend_t *b ) { if ( b->indent_level < CPP_BACKEND_MAX_INDENT ) { + /* ++ will require more parens to clarify */ ((struct flex_backend_t *)b)->indent_level += 1; } } static void cpp_decrease_indent ( const struct flex_backend_t *b ) { if (b->indent_level > 0) { + /* -- will require more parens to clarify */ ((struct flex_backend_t *)b)->indent_level -= 1; } } @@ -95,10 +104,19 @@ static void cpp_indent ( const struct flex_backend_t *b ) { } } +/* Return a format string appropriate for the skeleton language. + The format string will perform an equivalent function to the CPP line directive. + That is, it will tell target language compiler what .l source line the target source + corresponds to when the compiler generates warnings and errors. + + This method does not provide the arguments to the format string. It just provides the string. +*/ static const char * cpp_get_trace_line_format ( const struct flex_backend_t *b ) { return "#line %d \"%s\"\n"; } + +/* Combine the format string from *_get_trace_line_format with its arguments. */ static void cpp_line_directive_out ( const struct flex_backend_t * b, FILE *output_file, char *path, int linenum ) { char directive[MAXLINE*2], filename[MAXLINE]; char *s1, *s2, *s3; @@ -145,118 +163,154 @@ static void cpp_line_directive_out ( const struct flex_backend_t * b, FILE *outp } } +/* TODO: indent? */ static void cpp_open_table ( const struct flex_backend_t *b ) { fputs("{", stdout); } static void cpp_continue_table ( const struct flex_backend_t *b ) { + /* Expected to ocurr at the end of a line, so don't indent. */ fputs("},\n", stdout); } +/* TODO: indent? */ static void cpp_close_table ( const struct flex_backend_t *b ) { fputs("};\n", stdout); } +/* Intended to emit a macro call in C/CXX. + Can also emit a bare string. + + TODO: Find a better name. + */ static void cpp_relativize ( const struct flex_backend_t *b, const char *s ) { fputs(s, stdout); } +/* Format an entry from the transition table into the state table. */ static void cpp_format_state_table_entry ( const struct flex_backend_t * b, int t ) { b->indent(b); fprintf(stdout, "&yy_transition[%d],\n", t); } +/* Generate a case for the main state switch (in C/CXX). + Other target languages may use another selection syntax. Basically, each arm matches + the character under examination, treated as a number. +*/ static void cpp_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "case %d:", c); } +/* Generate the special case for EOF. */ static void cpp_format_eof_state_case_arm ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "case YY_STATE_EOF(%d):", c); } +/* Generate the special action FALLTHROUGH. */ static void cpp_eof_state_case_fallthrough ( const struct flex_backend_t *b ) { b->indent(b); b->comment(b, "FALLTHROUGH"); } +/* Generate the special action terminate. */ static void cpp_eof_state_case_terminate ( const struct flex_backend_t *b ) { b->indent(b); fputs("yyterminate();\n", stdout); } +/* Generate the action preamble. */ static void cpp_take_yytext ( const struct flex_backend_t *b ) { b->indent(b); fputs("YY_DO_BEFORE_ACTION; /* set up yytext */", stdout); } +/* Generate the action postamble. */ static void cpp_release_yytext ( const struct flex_backend_t *b ) { b->indent(b); fputs( "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */", stdout); } +/* Generate the buffer rewind sub-action. */ static void cpp_format_char_rewind ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp -= %d;", c); } +/* Generate the line rewind sub-action. */ static void cpp_format_line_rewind ( const struct flex_backend_t *b, int l ) { b->indent(b); fprintf(stdout, "YY_LINENO_REWIND_TO(yy_cp - %d);", l); } +/* Generate the buffer skip sub-action. */ static void cpp_format_char_forward ( const struct flex_backend_t *b, int c ) { b->indent(b); fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;", c); } +/* Generate the line skip sub-action. */ static void cpp_format_line_forward ( const struct flex_backend_t *b, int l ) { b->indent(b); fprintf(stdout, "YY_LINENO_REWIND_TO(yy_bp + %d);", l); } +/* Define a byte-width constant. */ static void cpp_format_byte_const ( const struct flex_backend_t *b, const char *n, const int c ) { fprintf(stdout, "#define %s %d\n", n, c); } +/* Define a state constant. */ static void cpp_format_state_const ( const struct flex_backend_t *b, const char *n, const int s ) { fprintf(stdout, "#define %s %d\n", n, s); } +/* Define a uint constant. */ static void cpp_format_uint_const ( const struct flex_backend_t *b, const char *n, const unsigned int u ) { fprintf(stdout, "#define %s %u\n", n, u); } +/* Define a boolean constant. */ static void cpp_format_bool_const ( const struct flex_backend_t *b, const char *n, const int t ){ fprintf(stdout, "#define %s %d\n", n, t); } +/* Define a string constant. */ static void cpp_format_const ( const struct flex_backend_t *b, const char *n, const char *v ) { fprintf(stdout, "#define %s %s\n", n, v); } +/* Define a constant used by the skeleton. */ static void cpp_format_offset_type ( const struct flex_backend_t *b, const char *t ) { b->format_const(b, "YY_OFFSET_TYPE", t); } +/* Define a constant used by the skeleton. */ static void cpp_format_yy_decl ( const struct flex_backend_t *b, const char *d ) { b->format_const(b, "YY_DECL", d); } +/* Define a constant used by the skeleton. */ static void cpp_format_userinit ( const struct flex_backend_t *b, const char *d ) { b->format_const(b, "YY_USER_INIT", d); } +/* Inject the rule_setup macro call where needed. */ static void cpp_format_rule_setup ( const struct flex_backend_t *b ) { b->relativize(b, "YY_RULE_SETUP"); b->newline(b); } +/* Define the user_action constant, if needed. */ static void cpp_format_user_preaction ( const struct flex_backend_t *b, const char *d ) { b->format_const(b, "YY_USER_ACTION", d); } +/* End a state case arm, optionally inserting user postactions. + + TODO: Why can't this use YY_STATE_CASE_BREAK from format_user_postaction? +*/ static void cpp_format_state_case_break ( const struct flex_backend_t *b ) { b->indent(b); if (!ctrl.postaction) { @@ -267,6 +321,7 @@ static void cpp_format_state_case_break ( const struct flex_backend_t *b ) { } } +/* Generate the definition of the STATE_CASE_BREAK end of action. */ static void cpp_format_user_postaction ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { b->format_const(b, "YY_STATE_CASE_BREAK", d); @@ -276,16 +331,19 @@ static void cpp_format_user_postaction ( const struct flex_backend_t *b, const c } } +/* Generate the fatal_error action. */ static void cpp_format_fatal_error ( const struct flex_backend_t *b, const char *e ) { b->indent(b); fprintf(stdout, "yypanic(%s M4_YY_CALL_LAST_ARG);", e); } +/* Generate the echo action. */ static void cpp_echo ( const struct flex_backend_t *b ) { b->indent(b); fputs("yyecho();", stdout); } +/* Generate the definition of the terminate special action. */ static void cpp_format_yyterminate ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { b->format_const(b, "yyterminate", d); @@ -295,11 +353,20 @@ static void cpp_format_yyterminate ( const struct flex_backend_t *b, const char } } +/* Generate the reject special action. */ static void cpp_format_yyreject ( const struct flex_backend_t *b ) { b->indent(b); fputs("yyreject()", stdout); } +/* Construct the cpp_backend method table. + This follows the definition in skeletons.h. + cpp-backends.h provides a handle to this structure with external linkage. + skeletons.c imports that handle to access these methods. + That module makes this implementation available to others as an opaque singleton. + + Note that indentation level is managed indepentently for each backend. +*/ struct flex_backend_t cpp_backend = { .skel = cpp_skel, .indent_level = 0, From e2ba2a9e830a1c4143da81306fabbd680b1b2b3b Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Tue, 4 Feb 2025 17:50:04 -0500 Subject: [PATCH 17/37] feat(skel): remove out, outn, outc, and comment methods --- src/cpp-backend.c | 29 ++++++--- src/dfa.c | 24 +++++-- src/flexdef.h | 7 -- src/gen.c | 158 ++++++++++++++++++++++++++++++---------------- src/main.c | 63 +++++++++++------- src/misc.c | 77 ++++++++-------------- src/skeletons.c | 6 +- src/skeletons.h | 9 +-- 8 files changed, 214 insertions(+), 159 deletions(-) diff --git a/src/cpp-backend.c b/src/cpp-backend.c index c8f8165cb..a0af6af00 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -180,13 +180,17 @@ static void cpp_close_table ( const struct flex_backend_t *b ) { /* Intended to emit a macro call in C/CXX. Can also emit a bare string. - - TODO: Find a better name. */ -static void cpp_relativize ( const struct flex_backend_t *b, const char *s ) { +static void cpp_verbatim ( const struct flex_backend_t *b, const char *s ) { fputs(s, stdout); } +/* Format an entry into a data table. */ +static void cpp_format_data_table_entry ( const struct flex_backend_t * b, int t ) { + /* Expected to occur in a block format, so don't indent. */ + fprintf(stdout, "%5d", t); +} + /* Format an entry from the transition table into the state table. */ static void cpp_format_state_table_entry ( const struct flex_backend_t * b, int t ) { b->indent(b); @@ -199,16 +203,20 @@ static void cpp_format_state_table_entry ( const struct flex_backend_t * b, int */ static void cpp_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { b->indent(b); - fprintf(stdout, "case %d:", c); + fprintf(stdout, "case %d: ", c); } -/* Generate the special case for EOF. */ -static void cpp_format_eof_state_case_arm ( const struct flex_backend_t *b, int c ) { +/* Generate the special case arm for EOF. + This lives in the body of yyinput and determines whether/when to switch to the next buffer. +*/ +static void cpp_format_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { b->indent(b); - fprintf(stdout, "case YY_STATE_EOF(%d):", c); + fprintf(stdout, "case YY_STATE_EOF(%s): ", c); } -/* Generate the special action FALLTHROUGH. */ +/* Generate the special action FALLTHROUGH. + This is just a comment in C/CXX, but a few languages require a keyword for fallthrough logic. +*/ static void cpp_eof_state_case_fallthrough ( const struct flex_backend_t *b ) { b->indent(b); b->comment(b, "FALLTHROUGH"); @@ -298,7 +306,7 @@ static void cpp_format_userinit ( const struct flex_backend_t *b, const char *d /* Inject the rule_setup macro call where needed. */ static void cpp_format_rule_setup ( const struct flex_backend_t *b ) { - b->relativize(b, "YY_RULE_SETUP"); + b->verbatim(b, "YY_RULE_SETUP"); b->newline(b); } @@ -386,7 +394,8 @@ struct flex_backend_t cpp_backend = { .open_table = cpp_open_table, .continue_table = cpp_continue_table, .close_table = cpp_close_table, - .relativize = cpp_relativize, + .verbatim = cpp_verbatim, + .format_data_table_entry = cpp_format_data_table_entry, .format_state_table_entry = cpp_format_state_table_entry, .format_normal_state_case_arm = cpp_format_normal_state_case_arm, .format_eof_state_case_arm = cpp_format_eof_state_case_arm, diff --git a/src/dfa.c b/src/dfa.c index ed1af9343..1b1cf2854 100644 --- a/src/dfa.c +++ b/src/dfa.c @@ -31,6 +31,7 @@ #include "flexdef.h" #include "tables.h" +#include "skeletons.h" /* declare functions that have forward references */ @@ -383,6 +384,7 @@ size_t ntod (void) int symlist[CSIZE + 1]; int num_start_states; int todo_head, todo_next; + const struct flex_backend_t *bend = get_backend(); struct yytbl_data *yynxt_tbl = 0; flex_int32_t *yynxt_data = 0, yynxt_curr = 0; @@ -507,10 +509,13 @@ size_t ntod (void) /* Note: Used when ctrl.fulltbl is on. Alternately defined elsewhere */ out_str ("m4_define([[M4_HOOK_NXT_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_NXT_ROWS]], [[%d]])", num_full_table_rows); - outn ("m4_define([[M4_HOOK_NXT_BODY]], [[m4_dnl"); - outn ("M4_HOOK_TABLE_OPENER"); + bend->verbatim(bend, "m4_define([[M4_HOOK_NXT_BODY]], [[m4_dnl"); + bend->newline(bend); + bend->verbatim(bend, "M4_HOOK_TABLE_OPENER"); + bend->newline(bend); if (gentables) - outn ("M4_HOOK_TABLE_OPENER"); + bend->verbatim(bend, "M4_HOOK_TABLE_OPENER"); + bend->newline(bend); /* Generate 0 entries for state #0. */ for (i = 0; i < num_full_table_rows; ++i) { @@ -520,7 +525,8 @@ size_t ntod (void) if (gentables) { dataflush (); - outn ("M4_HOOK_TABLE_CONTINUE"); + bend->verbatim(bend, "M4_HOOK_TABLE_CONTINUE"); + bend->newline(bend); } } @@ -675,7 +681,8 @@ size_t ntod (void) yynxt_tbl->td_lolen * sizeof (flex_int32_t)); if (gentables) - outn ("M4_HOOK_TABLE_OPENER"); + bend->verbatim(bend, "M4_HOOK_TABLE_OPENER"); + bend->newline(bend); /* Supply array's 0-element. */ if (ds == end_of_buffer_state) { @@ -700,7 +707,8 @@ size_t ntod (void) if (gentables) { dataflush (); - outn ("M4_HOOK_TABLE_CONTINUE"); + bend->verbatim(bend, "M4_HOOK_TABLE_CONTINUE"); + bend->newline(bend); } } @@ -734,7 +742,9 @@ size_t ntod (void) if (ctrl.fulltbl) { dataend ("M4_HOOK_TABLE_CLOSER"); - outn("/* body */]])"); + bend->comment(bend, "body"); + bend->verbatim(bend, "]])"); + bend->newline(bend); if (tablesext) { yytbl_data_compress (yynxt_tbl); if (yytbl_data_fwrite (&tableswr, yynxt_tbl) < 0) diff --git a/src/flexdef.h b/src/flexdef.h index a1c665bd9..070fd1d6f 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -910,14 +910,11 @@ extern int myctoi(const char *); extern unsigned char myesc(unsigned char[]); /* Output a (possibly-formatted) string to the generated scanner. */ -extern void out(const char *); extern void out_dec(const char *, int); extern void out_dec2(const char *, int, int); extern void out_hex(const char *, unsigned int); extern void out_str(const char *, const char *); extern void out_str_dec(const char *, const char *, int); -extern void outc(int); -extern void outn(const char *); extern void out_m4_define(const char* def, const char* val); /* Return a printable version of the given character, which might be @@ -1040,10 +1037,6 @@ extern const char *skel_property(const char *); /* Write out one section of the skeleton file. */ extern void skelout(bool); -/* For blocking out code from the header file. */ -#define OUT_BEGIN_CODE() outn("m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl") -#define OUT_END_CODE() outn("]])") - /* from file sym.c */ /* Save the text of a character class. */ diff --git a/src/gen.c b/src/gen.c index 3522d875c..38fd344b2 100644 --- a/src/gen.c +++ b/src/gen.c @@ -33,6 +33,7 @@ #include "flexdef.h" #include "tables.h" +#include "skeletons.h" /* These typedefs are only used for computing footprint sizes, * You need to make sure they match reality in the skeleton file to @@ -92,23 +93,29 @@ static void geneoltbl (void) { int i; struct packtype_t *ptype = optimize_pack(num_rules); + const struct flex_backend_t *bend = get_backend(); - outn ("m4_ifdef( [[M4_MODE_YYLINENO]],[["); + bend->verbatim(bend, "m4_ifdef( [[M4_MODE_YYLINENO]],[["); + bend->newline(bend); out_str ("m4_define([[M4_HOOK_EOLTABLE_TYPE]], [[%s]])\n", ptype->name); out_dec ("m4_define([[M4_HOOK_EOLTABLE_SIZE]], [[%d]])", num_rules + 1); - outn ("m4_define([[M4_HOOK_EOLTABLE_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_EOLTABLE_BODY]], [[m4_dnl"); + bend->newline(bend); if (gentables) { for (i = 1; i <= num_rules; i++) { out_dec ("%d, ", rule_has_nl[i] ? 1 : 0); /* format nicely, 20 numbers per line. */ if ((i % 20) == 19) - out ("\n "); + bend->newline(bend); + bend->indent(bend); } } footprint += num_rules * ptype->width; - outn ("]])"); - outn ("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); + bend->verbatim(bend, "]])"); + bend->newline(bend); } @@ -247,10 +254,12 @@ static void genctbl(void) { int i; int end_of_buffer_action = num_rules + 1; + const struct flex_backend_t *bend = get_backend(); /* Table of verify for transition and offset to next state. */ out_dec ("m4_define([[M4_HOOK_TRANSTABLE_SIZE]], [[%d]])", tblend + 2 + 1); - outn ("m4_define([[M4_HOOK_TRANSTABLE_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_TRANSTABLE_BODY]], [[m4_dnl"); + bend->newline(bend); /* We want the transition to be represented as the offset to the * next state, not the actual state number, which is what it currently @@ -317,17 +326,20 @@ static void genctbl(void) transition_struct_out (chk[tblend + 1], nxt[tblend + 1]); transition_struct_out (chk[tblend + 2], nxt[tblend + 2]); - outn ("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += sizeof(struct yy_trans_info) * (tblend + 2 + 1); out_dec ("m4_define([[M4_HOOK_STARTTABLE_SIZE]], [[%d]])", lastsc * 2 + 1); if (gentables) { - outn ("m4_define([[M4_HOOK_STARTTABLE_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_STARTTABLE_BODY]], [[m4_dnl"); + bend->newline(bend); for (i = 0; i <= lastsc * 2; ++i) out_dec ("M4_HOOK_STATE_ENTRY_FORMAT(%d)", base[i]); dataend (NULL); - outn("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += sizeof(struct yy_trans_info *) * (lastsc * 2 + 1); } @@ -367,9 +379,11 @@ static void genecs(void) { int ch, row; int numrows; + const struct flex_backend_t *bend = get_backend(); out_dec ("m4_define([[M4_HOOK_ECSTABLE_SIZE]], [[%d]])", ctrl.csize); - outn ("m4_define([[M4_HOOK_ECSTABLE_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_ECSTABLE_BODY]], [[m4_dnl"); + bend->newline(bend); for (ch = 1; ch < ctrl.csize; ++ch) { ecgroup[ch] = ABS (ecgroup[ch]); @@ -377,7 +391,8 @@ static void genecs(void) } dataend (NULL); - outn("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += sizeof(YY_CHAR) * ctrl.csize; if (env.trace) { @@ -442,13 +457,16 @@ static void genftbl(void) int i; int end_of_buffer_action = num_rules + 1; struct packtype_t *ptype = optimize_pack(num_rules + 1); + const struct flex_backend_t *bend = get_backend(); dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; - outn ("m4_define([[M4_HOOK_NEED_ACCEPT]], 1)"); + bend->verbatim(bend, "m4_define([[M4_HOOK_NEED_ACCEPT]], 1)"); + bend->newline(bend); out_str ("m4_define([[M4_HOOK_ACCEPT_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_ACCEPT_SIZE]], [[%d]])", lastdfa + 1); - outn ("m4_define([[M4_HOOK_ACCEPT_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_ACCEPT_BODY]], [[m4_dnl"); + bend->newline(bend); for (i = 1; i <= lastdfa; ++i) { int anum = dfaacc[i].dfaacc_state; @@ -461,7 +479,8 @@ static void genftbl(void) } dataend (NULL); - outn("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += (lastdfa + 1) * ptype->width; if (ctrl.useecs) @@ -484,6 +503,7 @@ static void gentabs(void) *yynxt_data = 0, *yychk_data = 0, *yyacclist_data=0; flex_int32_t yybase_curr = 0, yyacclist_curr=0,yyacc_curr=0; struct packtype_t *ptype; + const struct flex_backend_t *bend = get_backend(); acc_array = allocate_integer_array (current_max_dfas); nummt = 0; @@ -515,7 +535,8 @@ static void gentabs(void) ptype = optimize_pack(sz); out_str ("m4_define([[M4_HOOK_ACCLIST_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_ACCLIST_SIZE]], [[%d]])", sz); - outn ("m4_define([[M4_HOOK_ACCLIST_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_ACCLIST_BODY]], [[m4_dnl"); + bend->newline(bend); yyacclist_tbl = calloc(1,sizeof(struct yytbl_data)); yytbl_data_init (yyacclist_tbl, YYTD_ID_ACCLIST); @@ -579,7 +600,8 @@ static void gentabs(void) acc_array[i] = j; dataend (NULL); - outn("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += sz * ptype->width; if (tablesext) { yytbl_data_compress (yyacclist_tbl); @@ -623,10 +645,12 @@ static void gentabs(void) /* Note that this table is alternately defined if ctrl.fulltbl */ ptype = optimize_pack(sz); - outn ("m4_define([[M4_HOOK_NEED_ACCEPT]], 1)"); + bend->verbatim(bend, "m4_define([[M4_HOOK_NEED_ACCEPT]], 1)"); + bend->newline(bend); out_str ("m4_define([[M4_HOOK_ACCEPT_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_ACCEPT_SIZE]], [[%d]])", sz); - outn ("m4_define([[M4_HOOK_ACCEPT_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_ACCEPT_BODY]], [[m4_dnl"); + bend->newline(bend); yyacc_tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (yyacc_tbl, YYTD_ID_ACCEPT); @@ -655,7 +679,8 @@ static void gentabs(void) } dataend (NULL); - outn ("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += sz * ptype->width; if (tablesext) { @@ -699,7 +724,8 @@ static void gentabs(void) fputs (_("\n\nMeta-Equivalence Classes:\n"), stderr); out_dec ("m4_define([[M4_HOOK_MECSTABLE_SIZE]], [[%d]])", numecs+1); - outn ("m4_define([[M4_HOOK_MECSTABLE_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_MECSTABLE_BODY]], [[m4_dnl"); + bend->newline(bend); for (i = 1; i <= numecs; ++i) { if (env.trace) @@ -711,7 +737,8 @@ static void gentabs(void) } dataend (NULL); - outn ("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += sizeof(YY_CHAR) * (numecs + 1); if (tablesext) { yytbl_data_compress (yymeta_tbl); @@ -730,7 +757,8 @@ static void gentabs(void) ptype = optimize_pack(sz); out_str ("m4_define([[M4_HOOK_BASE_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_BASE_SIZE]], [[%d]])", sz); - outn ("m4_define([[M4_HOOK_BASE_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_BASE_BODY]], [[m4_dnl"); + bend->newline(bend); yybase_tbl = calloc (1, sizeof (struct yytbl_data)); yytbl_data_init (yybase_tbl, YYTD_ID_BASE); @@ -770,7 +798,8 @@ static void gentabs(void) } dataend (NULL); - outn ("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += sz * ptype->width; if (tablesext) { @@ -787,7 +816,8 @@ static void gentabs(void) ptype = optimize_pack(total_states + 1); out_str ("m4_define([[M4_HOOK_DEF_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_DEF_SIZE]], [[%d]])", total_states + 1); - outn ("m4_define([[M4_HOOK_DEF_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_DEF_BODY]], [[m4_dnl"); + bend->newline(bend); yydef_tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (yydef_tbl, YYTD_ID_DEF); @@ -801,7 +831,8 @@ static void gentabs(void) } dataend (NULL); - outn ("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += (total_states + 1) * ptype->width; if (tablesext) { @@ -820,7 +851,8 @@ static void gentabs(void) */ out_str ("m4_define([[M4_HOOK_YYNXT_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_YYNXT_SIZE]], [[%d]])", tblend + 1); - outn ("m4_define([[M4_HOOK_YYNXT_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_YYNXT_BODY]], [[m4_dnl"); + bend->newline(bend); yynxt_tbl = calloc (1, sizeof (struct yytbl_data)); yytbl_data_init (yynxt_tbl, YYTD_ID_NXT); @@ -840,7 +872,8 @@ static void gentabs(void) } dataend (NULL); - outn("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += ptype->width * (tblend + 1); if (tablesext) { @@ -856,7 +889,8 @@ static void gentabs(void) ptype = optimize_pack(tblend + 1); out_str ("m4_define([[M4_HOOK_CHK_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_CHK_SIZE]], [[%d]])", tblend + 1); - outn ("m4_define([[M4_HOOK_CHK_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_CHK_BODY]], [[m4_dnl"); + bend->newline(bend); yychk_tbl = calloc (1, sizeof (struct yytbl_data)); yytbl_data_init (yychk_tbl, YYTD_ID_CHK); @@ -873,7 +907,8 @@ static void gentabs(void) } dataend (NULL); - outn ("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += ptype->width * (tblend + 1); if (tablesext) { @@ -891,28 +926,34 @@ static void gentabs(void) void visible_define (const char *symname) { + const struct flex_backend_t *bend = get_backend(); + out_m4_define(symname, NULL); - comment(symname); - outc ('\n'); + bend->comment(bend, symname); + bend->newline(bend); } void visible_define_str (const char *symname, const char *val) { char buf[128]; + const struct flex_backend_t *bend = get_backend(); + out_m4_define(symname, val); snprintf(buf, sizeof(buf), "%s = %s", symname, val); - comment(buf); - outc ('\n'); + bend->comment(bend, buf); + bend->newline(bend); } void visible_define_int (const char *symname, const int val) { char nbuf[24], buf[128]; + const struct flex_backend_t *bend = get_backend(); + snprintf(nbuf, sizeof(nbuf), "%d", val); out_m4_define(symname, nbuf); snprintf(buf, sizeof(buf), "%s = %d", symname, val); - comment(buf); - outc ('\n'); + bend->comment(bend, buf); + bend->newline(bend); } /* make_tables - generate transition tables @@ -923,6 +964,7 @@ void make_tables (void) char buf[128]; int i; struct yytbl_data *yynultrans_tbl = NULL; + const struct flex_backend_t *bend = get_backend(); /* This is where we REALLY begin generating the tables. */ @@ -986,22 +1028,28 @@ void make_tables (void) gentabs (); } - snprintf(buf, sizeof(buf), "footprint: %ld bytes\n", footprint); - comment(buf); - snprintf(buf, sizeof(buf), "tblend: %d\n", tblend); - comment(buf); - snprintf(buf, sizeof(buf), "numecs: %d\n", numecs); - comment(buf); - snprintf(buf, sizeof(buf), "num_rules: %d\n", num_rules); - comment(buf); - snprintf(buf, sizeof(buf), "lastdfa: %d\n", lastdfa); - comment(buf); - outc ('\n'); + snprintf(buf, sizeof(buf), "footprint: %ld bytes", footprint); + bend->comment(bend, buf); + bend->newline(bend); + snprintf(buf, sizeof(buf), "tblend: %d", tblend); + bend->comment(bend, buf); + bend->newline(bend); + snprintf(buf, sizeof(buf), "numecs: %d", numecs); + bend->comment(bend, buf); + bend->newline(bend); + snprintf(buf, sizeof(buf), "num_rules: %d", num_rules); + bend->comment(bend, buf); + bend->newline(bend); + snprintf(buf, sizeof(buf), "lastdfa: %d", lastdfa); + bend->comment(bend, buf); + bend->newline(bend); + bend->newline(bend); // Only at this point do we know if the automaton has backups. // Some m4 conditionals require this information. - comment("m4 controls begin\n"); + bend->comment(bend, "m4 controls begin"); + bend->newline(bend); if (num_backing_up > 0) visible_define ( "M4_MODE_HAS_BACKING_UP"); @@ -1012,8 +1060,8 @@ void make_tables (void) if ((num_backing_up > 0 && !reject) && (ctrl.fullspd || ctrl.fulltbl)) visible_define ( "M4_MODE_NULTRANS_WRAP"); - comment("m4 controls end\n"); - out ("\n"); + bend->comment(bend, "m4 controls end"); + bend->newline(bend); if (ctrl.do_yylineno) { @@ -1037,7 +1085,8 @@ void make_tables (void) /* Begin generating yy_NUL_trans */ out_str ("m4_define([[M4_HOOK_NULTRANS_TYPE]], [[%s]])", (ctrl.fullspd) ? "struct yy_trans_info*" : "M4_HOOK_INT32"); out_dec ("m4_define([[M4_HOOK_NULTRANS_SIZE]], [[%d]])", lastdfa + 1); - outn ("m4_define([[M4_HOOK_NULTRANS_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_NULTRANS_BODY]], [[m4_dnl"); + bend->newline(bend); yynultrans_tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (yynultrans_tbl, YYTD_ID_NUL_TRANS); @@ -1065,7 +1114,8 @@ void make_tables (void) } dataend (NULL); - outn("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); footprint += (lastdfa + 1) * (ctrl.fullspd ? sizeof(struct yy_trans_info *) : sizeof(int32_t)); if (tablesext) { yytbl_data_compress (yynultrans_tbl); @@ -1090,11 +1140,13 @@ void make_tables (void) struct packtype_t *ptype = optimize_pack(num_rules); out_str ("m4_define([[M4_HOOK_DEBUGTABLE_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_DEBUGTABLE_SIZE]], [[%d]])", num_rules); - outn ("m4_define([[M4_HOOK_DEBUGTABLE_BODY]], [[m4_dnl"); + bend->verbatim(bend, "m4_define([[M4_HOOK_DEBUGTABLE_BODY]], [[m4_dnl"); + bend->newline(bend); for (i = 1; i < num_rules; ++i) mkdata (rule_linenum[i]); dataend (NULL); - outn("]])"); + bend->verbatim(bend, "]])"); + bend->newline(bend); } } diff --git a/src/main.c b/src/main.c index 9987d09e2..99112bd2c 100644 --- a/src/main.c +++ b/src/main.c @@ -136,6 +136,7 @@ int flex_main (int argc, char *argv[]) { int i, exit_status, child_status; int did_eof_rule = false; + const struct flex_backend_t *bend = NULL; /* Set a longjmp target. Yes, I know it's a hack, but it gets worse: The * return value of setjmp, if non-zero, is the desired exit code PLUS ONE. @@ -166,6 +167,9 @@ int flex_main (int argc, char *argv[]) flexinit (argc, argv); readin (); + + bend = get_backend(); + skelout (true); /* %% [1.0] DFA */ footprint += ntod (); @@ -179,7 +183,8 @@ int flex_main (int argc, char *argv[]) ("-s option given but default rule can be matched"), rule_linenum[default_rule]); - comment("START of m4 controls\n"); + bend->comment(bend, "START of m4 controls"); + bend->newline(bend); // mode switches for yy_trans_info specification // nultrans @@ -197,10 +202,10 @@ int flex_main (int argc, char *argv[]) visible_define ( "M4_MODE_NO_NULTRANS_FULLSPD"); } - comment("END of m4 controls\n"); - out ("\n"); + bend->comment(bend, "END of m4 controls"); + bend->newline(bend); - comment("START of Flex-generated definitions\n"); + bend->comment(bend, "START of Flex-generated definitions"); out_str_dec ("M4_HOOK_CONST_DEFINE_UINT(%s, %d)", "YY_NUM_RULES", num_rules); out_str_dec ("M4_HOOK_CONST_DEFINE_STATE(%s, %d)", "YY_END_OF_BUFFER", num_rules + 1); out_str_dec ("M4_HOOK_CONST_DEFINE_STATE(%s, %d)", "YY_JAMBASE", jambase); @@ -210,7 +215,7 @@ int flex_main (int argc, char *argv[]) * enough to hold the biggest offset. */ out_str ("M4_HOOK_SET_OFFSET_TYPE(%s)", optimize_pack(tblend + numecs + 1)->name); - comment("END of Flex-generated definitions\n"); + bend->comment(bend, "END of Flex-generated definitions"); skelout (true); /* %% [2.0] - tables get dumped here */ @@ -219,36 +224,38 @@ int flex_main (int argc, char *argv[]) skelout (true); /* %% [3.0] - mode-dependent static declarations get dumped here */ - out (&action_array[defs1_offset]); + bend->verbatim(bend, &action_array[defs1_offset]); + bend->newline(bend); line_directive_out (stdout, NULL, linenum); skelout (true); /* %% [4.0] - various random yylex internals get dumped here */ /* Copy prolog to output file. */ - out (&action_array[prolog_offset]); + bend->verbatim(bend, &action_array[prolog_offset]); + bend->newline(bend); line_directive_out (stdout, NULL, linenum); skelout (true); /* %% [5.0] - main loop of matching-engine code gets dumped here */ /* Copy actions to output file. */ - out (&action_array[action_offset]); + bend->verbatim(bend, &action_array[action_offset]); + bend->newline(bend); line_directive_out (stdout, NULL, linenum); /* generate cases for any missing EOF rules */ for (i = 1; i <= lastsc; ++i) if (!sceof[i]) { - out_str ("M4_HOOK_EOF_STATE_CASE_ARM(%s)", scname[i]); - outc('\n'); - out ("M4_HOOK_EOF_STATE_CASE_FALLTHROUGH"); - outc('\n'); + bend->format_eof_state_case_arm(bend, scname[i]); + bend->eof_state_case_fallthrough(bend); + bend->newline(bend); did_eof_rule = true; } if (did_eof_rule) { - out ("M4_HOOK_EOF_STATE_CASE_TERMINATE"); + bend->eof_state_case_terminate(bend); } skelout (true); @@ -258,13 +265,15 @@ int flex_main (int argc, char *argv[]) line_directive_out (stdout, infilename, linenum); if (sectnum == 3) { - OUT_BEGIN_CODE (); + bend->verbatim(bend, "m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl"); + bend->newline(bend); if (!ctrl.no_section3_escape) fputs("[[", stdout); (void) flexscan (); /* copy remainder of input to output */ if (!ctrl.no_section3_escape) fputs("]]", stdout); - OUT_END_CODE (); + bend->verbatim(bend, "]])"); + bend->newline(bend); } /* Note, flexend does not return. It exits with its argument @@ -1198,6 +1207,7 @@ void readin (void) { char buf[256]; flex_backend_id_t backend; + const struct flex_backend_t *bend = NULL; line_directive_out(NULL, infilename, linenum); @@ -1222,6 +1232,8 @@ void readin (void) initialize_output_filters(); + bend = get_backend(); + yyout = stdout; if (tablesext) @@ -1273,11 +1285,13 @@ void readin (void) skelout(false); /* [0.0] Make hook macros available, silently */ - comment("A lexical scanner generated by flex\n"); + bend->comment(bend, "A lexical scanner generated by flex"); + bend->newline(bend); /* Dump the %top code. */ if( top_buf.elts) - outn((char*) top_buf.elts); + bend->verbatim(bend, (char*) top_buf.elts); + bend->newline(bend); /* Place a bogus line directive, it will be fixed in the filter. */ line_directive_out(NULL, NULL, 0); @@ -1305,7 +1319,8 @@ void readin (void) /* Dump the user defined preproc directives. */ if (userdef_buf.elts) - outn ((char *) (userdef_buf.elts)); + bend->verbatim(bend, (char *) (userdef_buf.elts)); + bend->newline(bend); /* If the user explicitly requested posix compatibility by specifying the * posix-compat option, then we check for conflicting options. However, if @@ -1422,9 +1437,11 @@ void readin (void) // that historically used to be generated by C code in flex // itself; by shoving all this stuff out to the skeleton file // we make it easier to retarget the code generation. - snprintf(buf, sizeof(buf), "Target: %s\n", ctrl.backend_name); - comment(buf); - comment("START of m4 controls\n"); + snprintf(buf, sizeof(buf), "Target: %s", ctrl.backend_name); + bend->comment(bend, buf); + bend->newline(bend); + bend->comment(bend, "START of m4 controls"); + bend->newline(bend); /* Define the start condition macros. */ { @@ -1681,8 +1698,8 @@ void readin (void) else visible_define ( "M4_MODE_NO_REWRITE"); - comment("END of m4 controls\n"); - out ("\n"); + bend->comment(bend, "END of m4 controls"); + bend->newline(bend); } /* set_up_initial_allocations - allocate memory for internal tables */ diff --git a/src/misc.c b/src/misc.c index 4f203d364..f6c4b6f2a 100644 --- a/src/misc.c +++ b/src/misc.c @@ -160,6 +160,8 @@ int cclcmp (const void *a, const void *b) void dataend (const char *endit) { + const struct flex_backend_t *bend = get_backend(); + /* short circuit any output */ if (gentables) { @@ -168,7 +170,7 @@ void dataend (const char *endit) /* add terminator for initialization; { for vi */ if (endit) - outn (endit); + bend->verbatim(bend, endit); } dataline = 0; datapos = 0; @@ -179,16 +181,19 @@ void dataend (const char *endit) void dataflush (void) { - assert (gentables); + const struct flex_backend_t *bend = get_backend(); + if (!gentables) + return; + if (datapos > 0) - outc ('\n'); + bend->newline(bend); if (++dataline >= NUMDATALINES) { /* Put out a blank line so that the table is grouped into * large blocks that enable the user to find elements easily. */ - outc ('\n'); + bend->newline(bend); dataline = 0; } @@ -283,25 +288,25 @@ void mark_prolog (void) */ void mk2data (int value) { + const struct flex_backend_t *bend = get_backend(); + /* short circuit any output */ if (!gentables) return; if (datapos >= NUMDATAITEMS) { - outc (','); + bend->column_separator(bend); dataflush (); } if (datapos == 0) - /* Indent. */ - out (" "); - + bend->indent(bend); else - outc (','); + bend->column_separator(bend); ++datapos; - out_dec ("%5d", value); + bend->format_data_table_entry(bend, value); } @@ -312,23 +317,25 @@ void mk2data (int value) */ void mkdata (int value) { + const struct flex_backend_t *bend = get_backend(); + /* short circuit any output */ if (!gentables) return; if (datapos >= NUMDATAITEMS) { - outc (','); + bend->column_separator(bend); dataflush (); } if (datapos == 0) - /* Indent. */ - out (" "); + bend->indent(bend); else - outc (','); + bend->column_separator(bend); + ++datapos; - out_dec ("%5d", value); + bend->format_data_table_entry(bend, value); } @@ -422,12 +429,6 @@ unsigned char myesc (unsigned char array[]) /* out - various flavors of outputting a (possibly formatted) string for the * generated scanner, keeping track of the line count. */ - -void out (const char *str) -{ - fputs (str, stdout); -} - void out_dec (const char *fmt, int n) { fprintf (stdout, fmt, n); @@ -453,17 +454,6 @@ void out_str_dec (const char *fmt, const char str[], int n) fprintf (stdout,fmt, str, n); } -void outc (int c) -{ - fputc (c, stdout); -} - -void outn (const char *str) -{ - fputs (str,stdout); - fputc('\n',stdout); -} - /** Print "m4_define( [[def]], [[val]])m4_dnl\n". * @param def The m4 symbol to define. * @param val The definition; may be NULL. @@ -564,21 +554,22 @@ void *reallocate_array (void *array, int size, size_t element_size) void transition_struct_out (int element_v, int element_n) { + const struct flex_backend_t *bend = get_backend(); /* short circuit any output */ if (!gentables) return; out_dec2 ("M4_HOOK_TABLE_OPENER[[%4d]],[[%4d]]M4_HOOK_TABLE_CONTINUE", element_v, element_n); - outc ('\n'); + bend->newline(bend); datapos += TRANS_STRUCT_PRINT_LENGTH; if (datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH) { - outc ('\n'); + bend->newline(bend); if (++dataline % 10 == 0) - outc ('\n'); + bend->newline(bend); datapos = 0; } @@ -624,20 +615,4 @@ char *chomp (char *str) return str; } -void comment(const char *txt) -{ - char buf[MAXLINE]; - bool eol; - const struct flex_backend_t *bend = get_backend(); - - strncpy(buf, txt, MAXLINE-1); - eol = buf[strlen(buf)-1] == '\n'; - - if (eol) - buf[strlen(buf)-1] = '\0'; - bend->comment(bend, buf); - if (eol) - bend->newline(bend); -} - diff --git a/src/skeletons.c b/src/skeletons.c index 49ea8b7f2..d7cf7a839 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -315,8 +315,10 @@ void skelout (bool announce) } } - else if (do_copy) - outn (buf); + else if (do_copy) { + backend->verbatim(backend, buf); + backend->newline(backend); + } } /* end while */ } diff --git a/src/skeletons.h b/src/skeletons.h index a97f19f07..df59a7fcb 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -64,10 +64,11 @@ struct flex_backend_t { void (*open_table) ( const struct flex_backend_t *b ); void (*continue_table) ( const struct flex_backend_t *b ); void (*close_table) ( const struct flex_backend_t *b ); - void (*relativize) ( const struct flex_backend_t *b, const char *s ); + void (*verbatim) ( const struct flex_backend_t *b, const char *s ); + void (*format_data_table_entry) ( const struct flex_backend_t *b, int t ); void (*format_state_table_entry) ( const struct flex_backend_t *b, int t ); void (*format_normal_state_case_arm) ( const struct flex_backend_t *b, int c ); - void (*format_eof_state_case_arm) ( const struct flex_backend_t *b, int c ); + void (*format_eof_state_case_arm) ( const struct flex_backend_t *b, const char *const c ); void (*eof_state_case_fallthrough) ( const struct flex_backend_t *b ); void (*eof_state_case_terminate) ( const struct flex_backend_t *b ); void (*take_yytext) ( const struct flex_backend_t *b ); @@ -96,9 +97,5 @@ struct flex_backend_t { const struct flex_backend_t *get_backend(void); -/* For blocking out code from the header file. */ -// #define OUT_BEGIN_CODE() outn("m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl") -// #define OUT_END_CODE() outn("]])") - #endif /* FLEX_SKELETONS_H */ From 1ade8dc12ac8ab5525563f68b0fc7847235f9c6d Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Wed, 5 Feb 2025 17:27:45 -0500 Subject: [PATCH 18/37] feat: Improve comments --- src/flexdef.h | 6 +++--- src/skeletons.c | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/flexdef.h b/src/flexdef.h index 070fd1d6f..7c86cc591 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -1014,9 +1014,9 @@ typedef enum flex_backend_id { FLEX_BACKEND_CPP = 0, FLEX_BACKEND_C99, FLEX_BACKEND_GO, - FLEX_BACKEND_ID_MAX /* Only add new backend names above this line. - /* FLEX_BACKEND_ID_MAX sets the size of the backend array - /* and backend stack. */ + FLEX_BACKEND_ID_MAX /* Only add new backend names above this line. */ + /* FLEX_BACKEND_ID_MAX sets the size of the backend array */ + /* and backend stack. */ } flex_backend_id_t; /* Initialize backends */ diff --git a/src/skeletons.c b/src/skeletons.c index d7cf7a839..47c933e8d 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -42,12 +42,16 @@ #include "cpp-backend.h" const char *c99_skel[] = { +/* FIXME: Refactor like cpp-backend when c99 backend is ready. #include "c99-flex.h" +*/ 0, }; const char *go_skel[] = { +/* FIXME: Refactor like cpp-backend when Go backend is ready. #include "go-flex.h" +*/ 0, }; From e68c4413815da1deb4cd41f89f5420e4633e1134 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Wed, 5 Feb 2025 22:23:05 -0500 Subject: [PATCH 19/37] feat: Refactor out_m4_define away --- src/cpp-backend.c | 64 ++++++++++++++++++++- src/dfa.c | 20 +++---- src/flexdef.h | 2 +- src/gen.c | 144 +++++++++++++++++++++++----------------------- src/main.c | 5 +- src/misc.c | 17 ++---- src/skeletons.h | 7 +++ 7 files changed, 160 insertions(+), 99 deletions(-) diff --git a/src/cpp-backend.c b/src/cpp-backend.c index a0af6af00..a509cddf2 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -52,6 +52,18 @@ static const char * cpp_get_int16_type ( const struct flex_backend_t *b ) { return "flex_int16_t"; } +/* Emit the name of the datatype used in the NULTRANS table. + The datatype of the table depends on various option settings + and the skeleton in use. + */ +static const char * cpp_get_state_type ( const struct flex_backend_t *b ) { + /* cpp-flex.skl defines transition states as pointers to + struct yy_trans_info when the FULLSPD option is enabled. + Otherwise, it just uses the int32 type. + */ + return (ctrl.fullspd) ? "struct yy_trans_info*" : b->get_int32_type(b); +} + /* TODO: Indent? */ static void cpp_open_block_comment ( const struct flex_backend_t *b ) { fputs("/* ", stdout); @@ -182,7 +194,8 @@ static void cpp_close_table ( const struct flex_backend_t *b ) { Can also emit a bare string. */ static void cpp_verbatim ( const struct flex_backend_t *b, const char *s ) { - fputs(s, stdout); + if (s) + fputs(s, stdout); } /* Format an entry into a data table. */ @@ -367,6 +380,48 @@ static void cpp_format_yyreject ( const struct flex_backend_t *b ) { fputs("yyreject()", stdout); } +/* Define a symbol used by the output filter system. + Optionally, leave the definition open to encompass a block of verbatim output. +*/ +static void cpp_filter_define_name ( const struct flex_backend_t *b, const char *n, const int leave_open ) { + b->verbatim(b, "m4_define([["); + b->verbatim(b, n); + b->verbatim(b, "]], [["); + if (leave_open) + b->verbatim(b, "m4_dnl"); + else + b->verbatim(b, "]])m4_dnl"); + b->newline(b); +} + +/* Close a filter symbol definition that was left open by a call to filter_define_name. + Optionally, provide a final string of verbatim output to emit before closing the definition block. +*/ +static void cpp_filter_define_close (const struct flex_backend_t *b, const char *v) { + b->verbatim(b, v); + b->verbatim(b, "]])m4_dnl"); + b->newline(b); +} + +/* Define a variable used by the output filter system. + Provide a string value the filter will substitue for the variable when it is encountered + later in the output. +*/ +static void cpp_filter_define_vars ( const struct flex_backend_t *b, const char *n, const char *v ) { + b->filter_define_name(b, n, true); + b->filter_define_close(b, v); +} + +/* Define a variable used by the output filter system. + Provide a numeric value the filter will substitue for the variable when it is encountered + later in the output. +*/ +static void cpp_filter_define_vard ( const struct flex_backend_t *b, const char *n, const int v ) { + b->filter_define_name(b, n, true); + fprintf(stdout, "%d", v); + b->filter_define_close(b, NULL); +} + /* Construct the cpp_backend method table. This follows the definition in skeletons.h. cpp-backends.h provides a handle to this structure with external linkage. @@ -380,6 +435,7 @@ struct flex_backend_t cpp_backend = { .indent_level = 0, .get_int32_type = cpp_get_int32_type, .get_int16_type = cpp_get_int16_type, + .get_state_type = cpp_get_state_type, .open_block_comment = cpp_open_block_comment, .close_block_comment = cpp_close_block_comment, .comment = cpp_comment, @@ -422,6 +478,10 @@ struct flex_backend_t cpp_backend = { .format_fatal_error = cpp_format_fatal_error, .echo = cpp_echo, .format_yyterminate = cpp_format_yyterminate, - .format_yyreject = cpp_format_yyreject + .format_yyreject = cpp_format_yyreject, + .filter_define_name = cpp_filter_define_name, + .filter_define_close = cpp_filter_define_close, + .filter_define_vars = cpp_filter_define_vars, + .filter_define_vard = cpp_filter_define_vard }; diff --git a/src/dfa.c b/src/dfa.c index 1b1cf2854..c04bdeaac 100644 --- a/src/dfa.c +++ b/src/dfa.c @@ -507,14 +507,14 @@ size_t ntod (void) struct packtype_t *ptype = optimize_pack(0); /* Note: Used when ctrl.fulltbl is on. Alternately defined elsewhere */ - out_str ("m4_define([[M4_HOOK_NXT_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_NXT_ROWS]], [[%d]])", num_full_table_rows); - bend->verbatim(bend, "m4_define([[M4_HOOK_NXT_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_NXT_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_NXT_ROWS", num_full_table_rows); + bend->filter_define_name(bend, "M4_HOOK_NXT_BODY", true); bend->newline(bend); - bend->verbatim(bend, "M4_HOOK_TABLE_OPENER"); + bend->open_table(bend); bend->newline(bend); if (gentables) - bend->verbatim(bend, "M4_HOOK_TABLE_OPENER"); + bend->open_table(bend); bend->newline(bend); /* Generate 0 entries for state #0. */ @@ -525,7 +525,7 @@ size_t ntod (void) if (gentables) { dataflush (); - bend->verbatim(bend, "M4_HOOK_TABLE_CONTINUE"); + bend->continue_table(bend); bend->newline(bend); } } @@ -681,7 +681,7 @@ size_t ntod (void) yynxt_tbl->td_lolen * sizeof (flex_int32_t)); if (gentables) - bend->verbatim(bend, "M4_HOOK_TABLE_OPENER"); + bend->open_table(bend); bend->newline(bend); /* Supply array's 0-element. */ @@ -707,7 +707,7 @@ size_t ntod (void) if (gentables) { dataflush (); - bend->verbatim(bend, "M4_HOOK_TABLE_CONTINUE"); + bend->continue_table(bend); bend->newline(bend); } } @@ -741,9 +741,9 @@ size_t ntod (void) } if (ctrl.fulltbl) { - dataend ("M4_HOOK_TABLE_CLOSER"); + dataend (true); bend->comment(bend, "body"); - bend->verbatim(bend, "]])"); + bend->filter_define_close(bend, NULL); /* End of NXT_BODY */ bend->newline(bend); if (tablesext) { yytbl_data_compress (yynxt_tbl); diff --git a/src/flexdef.h b/src/flexdef.h index 7c86cc591..24bf96e1d 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -841,7 +841,7 @@ extern char *xstrdup(const char *); extern int cclcmp(const void *, const void *); /* Finish up a block of data declarations. */ -extern void dataend(const char *); +extern void dataend(const int endit); /* Flush generated data statements. */ extern void dataflush(void); diff --git a/src/gen.c b/src/gen.c index 38fd344b2..0bd4d5585 100644 --- a/src/gen.c +++ b/src/gen.c @@ -97,9 +97,9 @@ static void geneoltbl (void) bend->verbatim(bend, "m4_ifdef( [[M4_MODE_YYLINENO]],[["); bend->newline(bend); - out_str ("m4_define([[M4_HOOK_EOLTABLE_TYPE]], [[%s]])\n", ptype->name); - out_dec ("m4_define([[M4_HOOK_EOLTABLE_SIZE]], [[%d]])", num_rules + 1); - bend->verbatim(bend, "m4_define([[M4_HOOK_EOLTABLE_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_EOLTABLE_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_EOLTABLE_SIZE", num_rules + 1); + bend->filter_define_name(bend, "M4_HOOK_EOLTABLE_BODY", true); bend->newline(bend); if (gentables) { @@ -112,9 +112,9 @@ static void geneoltbl (void) } } footprint += num_rules * ptype->width; - bend->verbatim(bend, "]])"); + bend->filter_define_close(bend, NULL); /* End EOLTABLE_BODY */ bend->newline(bend); - bend->verbatim(bend, "]])"); + bend->verbatim(bend, "]])"); /* End m4_ifdef( [[M4_MODE_YYLINENO]]...*/ bend->newline(bend); } @@ -257,8 +257,8 @@ static void genctbl(void) const struct flex_backend_t *bend = get_backend(); /* Table of verify for transition and offset to next state. */ - out_dec ("m4_define([[M4_HOOK_TRANSTABLE_SIZE]], [[%d]])", tblend + 2 + 1); - bend->verbatim(bend, "m4_define([[M4_HOOK_TRANSTABLE_BODY]], [[m4_dnl"); + bend->filter_define_vard(bend, "M4_HOOK_TRANSTABLE_SIZE", tblend + 2 + 1); + bend->filter_define_name(bend, "M4_HOOK_TRANSTABLE_BODY", true); bend->newline(bend); /* We want the transition to be represented as the offset to the @@ -326,19 +326,19 @@ static void genctbl(void) transition_struct_out (chk[tblend + 1], nxt[tblend + 1]); transition_struct_out (chk[tblend + 2], nxt[tblend + 2]); - bend->verbatim(bend, "]])"); + bend->filter_define_close(bend, NULL); /* End TRANSTABLE_BODY */ bend->newline(bend); footprint += sizeof(struct yy_trans_info) * (tblend + 2 + 1); - out_dec ("m4_define([[M4_HOOK_STARTTABLE_SIZE]], [[%d]])", lastsc * 2 + 1); + bend->filter_define_vard(bend, "M4_HOOK_STARTTABLE_SIZE", lastsc * 2 + 1); if (gentables) { - bend->verbatim(bend, "m4_define([[M4_HOOK_STARTTABLE_BODY]], [[m4_dnl"); + bend->filter_define_name(bend, "M4_HOOK_STARTTABLE_BODY", true); bend->newline(bend); for (i = 0; i <= lastsc * 2; ++i) - out_dec ("M4_HOOK_STATE_ENTRY_FORMAT(%d)", base[i]); + bend->format_state_table_entry(bend, base[i]); - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End STARTTABLE_BODY */ bend->newline(bend); footprint += sizeof(struct yy_trans_info *) * (lastsc * 2 + 1); } @@ -381,8 +381,8 @@ static void genecs(void) int numrows; const struct flex_backend_t *bend = get_backend(); - out_dec ("m4_define([[M4_HOOK_ECSTABLE_SIZE]], [[%d]])", ctrl.csize); - bend->verbatim(bend, "m4_define([[M4_HOOK_ECSTABLE_BODY]], [[m4_dnl"); + bend->filter_define_vard(bend, "M4_HOOK_ECSTABLE_SIZE", ctrl.csize); + bend->filter_define_name(bend, "M4_HOOK_ECSTABLE_BODY", true); bend->newline(bend); for (ch = 1; ch < ctrl.csize; ++ch) { @@ -390,8 +390,8 @@ static void genecs(void) mkdata (ecgroup[ch]); } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End ECSTABLE_BODY */ bend->newline(bend); footprint += sizeof(YY_CHAR) * ctrl.csize; @@ -461,11 +461,11 @@ static void genftbl(void) dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; - bend->verbatim(bend, "m4_define([[M4_HOOK_NEED_ACCEPT]], 1)"); + bend->filter_define_vard(bend, "M4_HOOK_NEED_ACCEPT", 1); bend->newline(bend); - out_str ("m4_define([[M4_HOOK_ACCEPT_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_ACCEPT_SIZE]], [[%d]])", lastdfa + 1); - bend->verbatim(bend, "m4_define([[M4_HOOK_ACCEPT_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_ACCEPT_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_ACCEPT_SIZE", lastdfa + 1); + bend->filter_define_name(bend, "M4_HOOK_ACCEPT_BODY", true); bend->newline(bend); for (i = 1; i <= lastdfa; ++i) { @@ -478,8 +478,8 @@ static void genftbl(void) i, anum); } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End ACCEPT_BODY*/ bend->newline(bend); footprint += (lastdfa + 1) * ptype->width; @@ -535,7 +535,7 @@ static void gentabs(void) ptype = optimize_pack(sz); out_str ("m4_define([[M4_HOOK_ACCLIST_TYPE]], [[%s]])", ptype->name); out_dec ("m4_define([[M4_HOOK_ACCLIST_SIZE]], [[%d]])", sz); - bend->verbatim(bend, "m4_define([[M4_HOOK_ACCLIST_BODY]], [[m4_dnl"); + bend->filter_define_name(bend, "M4_HOOK_ACCLIST_BODY", true); bend->newline(bend); yyacclist_tbl = calloc(1,sizeof(struct yytbl_data)); @@ -599,8 +599,8 @@ static void gentabs(void) /* add accepting number for the "jam" state */ acc_array[i] = j; - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End ACCLIST_BODY*/ bend->newline(bend); footprint += sz * ptype->width; if (tablesext) { @@ -645,11 +645,11 @@ static void gentabs(void) /* Note that this table is alternately defined if ctrl.fulltbl */ ptype = optimize_pack(sz); - bend->verbatim(bend, "m4_define([[M4_HOOK_NEED_ACCEPT]], 1)"); + bend->filter_define_vard(bend, "M4_HOOK_NEED_ACCEPT", 1); bend->newline(bend); - out_str ("m4_define([[M4_HOOK_ACCEPT_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_ACCEPT_SIZE]], [[%d]])", sz); - bend->verbatim(bend, "m4_define([[M4_HOOK_ACCEPT_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_ACCEPT_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_ACCEPT_SIZE", sz); + bend->filter_define_name(bend, "M4_HOOK_ACCEPT_BODY", true); bend->newline(bend); yyacc_tbl = calloc(1, sizeof (struct yytbl_data)); @@ -678,8 +678,8 @@ static void gentabs(void) yyacc_data[yyacc_curr++] = acc_array[i]; } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End ACCEPT_BODY*/ bend->newline(bend); footprint += sz * ptype->width; @@ -723,8 +723,8 @@ static void gentabs(void) if (env.trace) fputs (_("\n\nMeta-Equivalence Classes:\n"), stderr); - out_dec ("m4_define([[M4_HOOK_MECSTABLE_SIZE]], [[%d]])", numecs+1); - bend->verbatim(bend, "m4_define([[M4_HOOK_MECSTABLE_BODY]], [[m4_dnl"); + bend->filter_define_vard(bend, "M4_HOOK_MECSTABLE_SIZE", numecs+1); + bend->filter_define_name(bend, "M4_HOOK_MECSTABLE_BODY", true); bend->newline(bend); for (i = 1; i <= numecs; ++i) { @@ -736,8 +736,8 @@ static void gentabs(void) yymecs_data[i] = ABS (tecbck[i]); } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End MECSTABLE_BODY */ bend->newline(bend); footprint += sizeof(YY_CHAR) * (numecs + 1); if (tablesext) { @@ -755,9 +755,9 @@ static void gentabs(void) /* Begin generating yy_base */ sz = total_states + 1; ptype = optimize_pack(sz); - out_str ("m4_define([[M4_HOOK_BASE_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_BASE_SIZE]], [[%d]])", sz); - bend->verbatim(bend, "m4_define([[M4_HOOK_BASE_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_BASE_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_BASE_SIZE", sz); + bend->filter_define_name(bend, "M4_HOOK_BASE_BODY", true); bend->newline(bend); yybase_tbl = calloc (1, sizeof (struct yytbl_data)); @@ -797,8 +797,8 @@ static void gentabs(void) def[i] = jamstate; } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End BASE_BODY */ bend->newline(bend); footprint += sz * ptype->width; @@ -814,9 +814,9 @@ static void gentabs(void) /* Begin generating yy_def */ ptype = optimize_pack(total_states + 1); - out_str ("m4_define([[M4_HOOK_DEF_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_DEF_SIZE]], [[%d]])", total_states + 1); - bend->verbatim(bend, "m4_define([[M4_HOOK_DEF_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_DEF_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_DEF_SIZE", total_states + 1); + bend->filter_define_name(bend, "M4_HOOK_DEF_BODY", true); bend->newline(bend); yydef_tbl = calloc(1, sizeof (struct yytbl_data)); @@ -830,8 +830,8 @@ static void gentabs(void) yydef_data[i] = def[i]; } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End DEF_BODY */ bend->newline(bend); footprint += (total_states + 1) * ptype->width; @@ -849,9 +849,9 @@ static void gentabs(void) /* Note: Used when !ctrl.fulltbl && !ctrl.fullspd). * (Alternately defined when ctrl.fullspd) */ - out_str ("m4_define([[M4_HOOK_YYNXT_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_YYNXT_SIZE]], [[%d]])", tblend + 1); - bend->verbatim(bend, "m4_define([[M4_HOOK_YYNXT_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_YYNXT_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_YYNXT_SIZE", tblend + 1); + bend->filter_define_name(bend, "M4_HOOK_YYNXT_BODY", true); bend->newline(bend); yynxt_tbl = calloc (1, sizeof (struct yytbl_data)); @@ -871,8 +871,8 @@ static void gentabs(void) yynxt_data[i] = nxt[i]; } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End YYNXT_BODY */ bend->newline(bend); footprint += ptype->width * (tblend + 1); @@ -887,9 +887,9 @@ static void gentabs(void) /* Begin generating yy_chk */ ptype = optimize_pack(tblend + 1); - out_str ("m4_define([[M4_HOOK_CHK_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_CHK_SIZE]], [[%d]])", tblend + 1); - bend->verbatim(bend, "m4_define([[M4_HOOK_CHK_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_CHK_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_CHK_SIZE", tblend + 1); + bend->filter_define_name(bend, "M4_HOOK_CHK_BODY", true); bend->newline(bend); yychk_tbl = calloc (1, sizeof (struct yytbl_data)); @@ -906,8 +906,8 @@ static void gentabs(void) yychk_data[i] = chk[i]; } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End CHK_BODY */ bend->newline(bend); footprint += ptype->width * (tblend + 1); @@ -928,7 +928,7 @@ void visible_define (const char *symname) { const struct flex_backend_t *bend = get_backend(); - out_m4_define(symname, NULL); + bend->filter_define_name(bend, symname, false); bend->comment(bend, symname); bend->newline(bend); } @@ -938,7 +938,7 @@ void visible_define_str (const char *symname, const char *val) char buf[128]; const struct flex_backend_t *bend = get_backend(); - out_m4_define(symname, val); + bend->filter_define_vars(bend, symname, val); snprintf(buf, sizeof(buf), "%s = %s", symname, val); bend->comment(bend, buf); bend->newline(bend); @@ -946,11 +946,10 @@ void visible_define_str (const char *symname, const char *val) void visible_define_int (const char *symname, const int val) { - char nbuf[24], buf[128]; + char buf[128]; const struct flex_backend_t *bend = get_backend(); - snprintf(nbuf, sizeof(nbuf), "%d", val); - out_m4_define(symname, nbuf); + bend->filter_define_vard(bend, symname, val); snprintf(buf, sizeof(buf), "%s = %d", symname, val); bend->comment(bend, buf); bend->newline(bend); @@ -1083,9 +1082,9 @@ void make_tables (void) flex_int32_t *yynultrans_data = 0; /* Begin generating yy_NUL_trans */ - out_str ("m4_define([[M4_HOOK_NULTRANS_TYPE]], [[%s]])", (ctrl.fullspd) ? "struct yy_trans_info*" : "M4_HOOK_INT32"); - out_dec ("m4_define([[M4_HOOK_NULTRANS_SIZE]], [[%d]])", lastdfa + 1); - bend->verbatim(bend, "m4_define([[M4_HOOK_NULTRANS_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_NULTRANS_TYPE", bend->get_state_type(bend)); + bend->filter_define_vard(bend, "M4_HOOK_NULTRANS_SIZE", lastdfa + 1); + bend->filter_define_name(bend, "M4_HOOK_NULTRANS_BODY", true); bend->newline(bend); yynultrans_tbl = calloc(1, sizeof (struct yytbl_data)); @@ -1113,9 +1112,12 @@ void make_tables (void) } } - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End NULTRANS_BODY */ bend->newline(bend); + /* footprint is only used to print an estimated table size in a user-requested summary. + There's a C assumtption in the calculation here, but it doesn't affect the scanner. + */ footprint += (lastdfa + 1) * (ctrl.fullspd ? sizeof(struct yy_trans_info *) : sizeof(int32_t)); if (tablesext) { yytbl_data_compress (yynultrans_tbl); @@ -1138,15 +1140,15 @@ void make_tables (void) * in the table metering. */ struct packtype_t *ptype = optimize_pack(num_rules); - out_str ("m4_define([[M4_HOOK_DEBUGTABLE_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_DEBUGTABLE_SIZE]], [[%d]])", num_rules); - bend->verbatim(bend, "m4_define([[M4_HOOK_DEBUGTABLE_BODY]], [[m4_dnl"); + bend->filter_define_vars(bend, "M4_HOOK_DEBUGTABLE_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_DEBUGTABLE_SIZE", num_rules); + bend->filter_define_name(bend, "M4_HOOK_DEBUGTABLE_BODY", true); bend->newline(bend); for (i = 1; i < num_rules; ++i) mkdata (rule_linenum[i]); - dataend (NULL); - bend->verbatim(bend, "]])"); + dataend (false); + bend->filter_define_close(bend, NULL); /* End DEBUGTABLE_BODY */ bend->newline(bend); } } diff --git a/src/main.c b/src/main.c index 99112bd2c..f6f36d54d 100644 --- a/src/main.c +++ b/src/main.c @@ -1444,6 +1444,7 @@ void readin (void) bend->newline(bend); /* Define the start condition macros. */ + /* FIXME: Refactor to use filter_define_name and format_state_const. */ { struct Buf tmpbuf; int i; @@ -1461,7 +1462,7 @@ void readin (void) free(str); } // FIXME: Not dumped visibly because we plan to do away with the indirection - out_m4_define("M4_YY_SC_DEFS", tmpbuf.elts); + bend->filter_define_vars(bend, "M4_YY_SC_DEFS", (const char *)(tmpbuf.elts)); buf_destroy(&tmpbuf); } @@ -1582,7 +1583,7 @@ void readin (void) if (ctrl.yyclass != NULL) { visible_define ( "M4_MODE_YYCLASS"); - out_m4_define("M4_YY_CLASS_NAME", ctrl.yyclass); + bend->filter_define_vars(bend, "M4_YY_CLASS_NAME", ctrl.yyclass); } if (ctrl.ddebug) diff --git a/src/misc.c b/src/misc.c index f6c4b6f2a..6b54b61e5 100644 --- a/src/misc.c +++ b/src/misc.c @@ -158,19 +158,20 @@ int cclcmp (const void *a, const void *b) /* dataend - finish up a block of data declarations */ -void dataend (const char *endit) +void dataend (const int endit) { const struct flex_backend_t *bend = get_backend(); /* short circuit any output */ if (gentables) { + /* Pretty print the end of the current data line. */ if (datapos > 0) dataflush (); - /* add terminator for initialization; { for vi */ + /* Optionally, close the table. */ if (endit) - bend->verbatim(bend, endit); + bend->close_table(bend); } dataline = 0; datapos = 0; @@ -454,16 +455,6 @@ void out_str_dec (const char *fmt, const char str[], int n) fprintf (stdout,fmt, str, n); } -/** Print "m4_define( [[def]], [[val]])m4_dnl\n". - * @param def The m4 symbol to define. - * @param val The definition; may be NULL. - */ -void out_m4_define (const char* def, const char* val) -{ - const char * fmt = "m4_define( [[%s]], [[%s]])m4_dnl\n"; - fprintf(stdout, fmt, def, val?val:""); -} - /* readable_form - return the the human-readable form of a character * diff --git a/src/skeletons.h b/src/skeletons.h index df59a7fcb..33e5f034b 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -36,6 +36,8 @@ #ifndef FLEX_SKELETONS_H #define FLEX_SKELETONS_H 1 +#include "flexdef.h" + bool push_backend(flex_backend_id_t); flex_backend_id_t pop_backend(void); flex_backend_id_t top_backend(void); @@ -50,6 +52,7 @@ struct flex_backend_t { unsigned int indent_level; const char * (*get_int32_type) ( const struct flex_backend_t *b ); const char * (*get_int16_type) ( const struct flex_backend_t *b ); + const char * (*get_state_type) ( const struct flex_backend_t *b ); void (*open_block_comment) ( const struct flex_backend_t *b ); void (*close_block_comment) ( const struct flex_backend_t *b ); void (*comment) ( const struct flex_backend_t *b, const char *c ); @@ -93,6 +96,10 @@ struct flex_backend_t { void (*echo) ( const struct flex_backend_t *b ); void (*format_yyterminate) ( const struct flex_backend_t *b, const char *d ); void (*format_yyreject) ( const struct flex_backend_t *b ); + void (*filter_define_name) ( const struct flex_backend_t *b, const char *n, const int leave_open ); + void (*filter_define_close) (const struct flex_backend_t *b, const char *v); + void (*filter_define_vars) ( const struct flex_backend_t *b, const char *n, const char *v ); + void (*filter_define_vard) ( const struct flex_backend_t *b, const char *n, const int v ); }; const struct flex_backend_t *get_backend(void); From 768a4ab0d17c83f4443156721777ae212f363d35 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Wed, 5 Feb 2025 22:28:02 -0500 Subject: [PATCH 20/37] feat: Refactor YY_SC_DEFS emission --- src/main.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/main.c b/src/main.c index f6f36d54d..f7c55e180 100644 --- a/src/main.c +++ b/src/main.c @@ -1444,26 +1444,14 @@ void readin (void) bend->newline(bend); /* Define the start condition macros. */ - /* FIXME: Refactor to use filter_define_name and format_state_const. */ { - struct Buf tmpbuf; - int i; - buf_init(&tmpbuf, sizeof(char)); + int i = 0; + // FIXME: Not dumped visibly because we plan to do away with the indirection + bend->filter_define_name(bend, "M4_YY_SC_DEFS", true); for (i = 1; i <= lastsc; i++) { - char *str, *fmt = "M4_HOOK_CONST_DEFINE_STATE(%s, %d)"; - size_t strsz; - - strsz = strlen(fmt) + strlen(scname[i]) + (size_t)(1 + ceil (log10(i))) + 2; - str = malloc(strsz); - if (!str) - flexfatal(_("allocation of macro definition failed")); - snprintf(str, strsz, fmt, scname[i], i - 1); - buf_strappend(&tmpbuf, str); - free(str); + bend->format_state_const(bend, scname[i], i-1); } - // FIXME: Not dumped visibly because we plan to do away with the indirection - bend->filter_define_vars(bend, "M4_YY_SC_DEFS", (const char *)(tmpbuf.elts)); - buf_destroy(&tmpbuf); + bend->filter_define_close(bend, NULL); /* End YY_SC_DEFS */ } if (ctrl.bison_bridge_lval) From 444d622205b355800b6f0a0d217178f53e106e83 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Wed, 5 Feb 2025 22:32:46 -0500 Subject: [PATCH 21/37] feat: Refactor out_m4_define away --- src/flexdef.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/flexdef.h b/src/flexdef.h index 24bf96e1d..5954dc698 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -915,7 +915,6 @@ extern void out_dec2(const char *, int, int); extern void out_hex(const char *, unsigned int); extern void out_str(const char *, const char *); extern void out_str_dec(const char *, const char *, int); -extern void out_m4_define(const char* def, const char* val); /* Return a printable version of the given character, which might be * 8-bit. From 8f7a1d3daf6e1f0ef2d3169ecb1a2542b091f30c Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Wed, 5 Feb 2025 22:44:08 -0500 Subject: [PATCH 22/37] feat: Refactor out_str_dec away --- src/cpp-backend.c | 8 ++++++++ src/flexdef.h | 1 - src/main.c | 10 +++++----- src/misc.c | 5 ----- src/skeletons.h | 1 + 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/cpp-backend.c b/src/cpp-backend.c index a509cddf2..b86236eb8 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -287,6 +287,13 @@ static void cpp_format_state_const ( const struct flex_backend_t *b, const char fprintf(stdout, "#define %s %d\n", n, s); } +/* Define a size constant. + TODO: It would be better if s were unsigned, but Flex currently counts in signed ints. +*/ +static void cpp_format_size_const ( const struct flex_backend_t *b, const char *n, const int s ) { + fprintf(stdout, "#define %s %d\n", n, s); +} + /* Define a uint constant. */ static void cpp_format_uint_const ( const struct flex_backend_t *b, const char *n, const unsigned int u ) { fprintf(stdout, "#define %s %u\n", n, u); @@ -465,6 +472,7 @@ struct flex_backend_t cpp_backend = { .format_line_forward = cpp_format_line_forward, .format_byte_const = cpp_format_byte_const, .format_state_const = cpp_format_state_const, + .format_size_const = cpp_format_size_const, .format_uint_const = cpp_format_uint_const, .format_bool_const = cpp_format_bool_const, .format_const = cpp_format_const, diff --git a/src/flexdef.h b/src/flexdef.h index 5954dc698..46028da9c 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -914,7 +914,6 @@ extern void out_dec(const char *, int); extern void out_dec2(const char *, int, int); extern void out_hex(const char *, unsigned int); extern void out_str(const char *, const char *); -extern void out_str_dec(const char *, const char *, int); /* Return a printable version of the given character, which might be * 8-bit. diff --git a/src/main.c b/src/main.c index f7c55e180..89e3e07b6 100644 --- a/src/main.c +++ b/src/main.c @@ -206,11 +206,11 @@ int flex_main (int argc, char *argv[]) bend->newline(bend); bend->comment(bend, "START of Flex-generated definitions"); - out_str_dec ("M4_HOOK_CONST_DEFINE_UINT(%s, %d)", "YY_NUM_RULES", num_rules); - out_str_dec ("M4_HOOK_CONST_DEFINE_STATE(%s, %d)", "YY_END_OF_BUFFER", num_rules + 1); - out_str_dec ("M4_HOOK_CONST_DEFINE_STATE(%s, %d)", "YY_JAMBASE", jambase); - out_str_dec ("M4_HOOK_CONST_DEFINE_STATE(%s, %d)", "YY_JAMSTATE", jamstate); - out_str_dec ("M4_HOOK_CONST_DEFINE_BYTE(%s, %d)", "YY_NUL_EC", NUL_ec); + bend->format_size_const(bend, "YY_NUM_RULES", num_rules); + bend->format_state_const(bend, "YY_END_OF_BUFFER", num_rules + 1); + bend->format_state_const(bend, "YY_JAMBASE", jambase); + bend->format_state_const(bend, "YY_JAMSTATE", jamstate); + bend->format_byte_const(bend, "YY_NUL_EC", NUL_ec); /* Need to define the transet type as a size large * enough to hold the biggest offset. */ diff --git a/src/misc.c b/src/misc.c index 6b54b61e5..0d5016ecc 100644 --- a/src/misc.c +++ b/src/misc.c @@ -450,11 +450,6 @@ void out_str (const char *fmt, const char str[]) fprintf (stdout,fmt, str); } -void out_str_dec (const char *fmt, const char str[], int n) -{ - fprintf (stdout,fmt, str, n); -} - /* readable_form - return the the human-readable form of a character * diff --git a/src/skeletons.h b/src/skeletons.h index 33e5f034b..63fe08f61 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -82,6 +82,7 @@ struct flex_backend_t { void (*format_line_forward) ( const struct flex_backend_t *b, int l ); void (*format_byte_const) ( const struct flex_backend_t *b, const char *n, const int c ); void (*format_state_const) ( const struct flex_backend_t *b, const char *n, const int s ); + void (*format_size_const) ( const struct flex_backend_t *b, const char *n, const int s ); void (*format_uint_const) ( const struct flex_backend_t *b, const char *n, const unsigned int u ); void (*format_bool_const) ( const struct flex_backend_t *b, const char *n, const int t ); void (*format_const) ( const struct flex_backend_t *b, const char *n, const char *v ); From d20a7bcf0deaef1f6225249aaf7129f15e98c33a Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Wed, 5 Feb 2025 22:46:50 -0500 Subject: [PATCH 23/37] feat: Remove out_hex It was unused. --- src/flexdef.h | 1 - src/misc.c | 5 ----- 2 files changed, 6 deletions(-) diff --git a/src/flexdef.h b/src/flexdef.h index 46028da9c..8c8dbbc54 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -912,7 +912,6 @@ extern unsigned char myesc(unsigned char[]); /* Output a (possibly-formatted) string to the generated scanner. */ extern void out_dec(const char *, int); extern void out_dec2(const char *, int, int); -extern void out_hex(const char *, unsigned int); extern void out_str(const char *, const char *); /* Return a printable version of the given character, which might be diff --git a/src/misc.c b/src/misc.c index 0d5016ecc..aba2672ad 100644 --- a/src/misc.c +++ b/src/misc.c @@ -440,11 +440,6 @@ void out_dec2 (const char *fmt, int n1, int n2) fprintf (stdout, fmt, n1, n2); } -void out_hex (const char *fmt, unsigned int x) -{ - fprintf (stdout, fmt, x); -} - void out_str (const char *fmt, const char str[]) { fprintf (stdout,fmt, str); From 2ce5caa571e3df7262786a8f5be68defa8d4c025 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 08:59:23 -0500 Subject: [PATCH 24/37] feat: Remove out_dec --- src/flexdef.h | 1 - src/gen.c | 11 +++++------ src/main.c | 2 +- src/misc.c | 5 ----- 4 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/flexdef.h b/src/flexdef.h index 8c8dbbc54..64f723d3f 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -910,7 +910,6 @@ extern int myctoi(const char *); extern unsigned char myesc(unsigned char[]); /* Output a (possibly-formatted) string to the generated scanner. */ -extern void out_dec(const char *, int); extern void out_dec2(const char *, int, int); extern void out_str(const char *, const char *); diff --git a/src/gen.c b/src/gen.c index 0bd4d5585..d24617c3b 100644 --- a/src/gen.c +++ b/src/gen.c @@ -104,7 +104,8 @@ static void geneoltbl (void) if (gentables) { for (i = 1; i <= num_rules; i++) { - out_dec ("%d, ", rule_has_nl[i] ? 1 : 0); + bend->format_data_table_entry(bend, rule_has_nl[i] ? 1 : 0); + bend->column_separator(bend); /* format nicely, 20 numbers per line. */ if ((i % 20) == 19) bend->newline(bend); @@ -533,8 +534,8 @@ static void gentabs(void) sz = MAX (numas, 1) + 1; ptype = optimize_pack(sz); - out_str ("m4_define([[M4_HOOK_ACCLIST_TYPE]], [[%s]])", ptype->name); - out_dec ("m4_define([[M4_HOOK_ACCLIST_SIZE]], [[%d]])", sz); + bend->filter_define_vars(bend, "M4_HOOK_ACCLIST_TYPE", ptype->name); + bend->filter_define_vard(bend, "M4_HOOK_ACCLIST_SIZE", sz); bend->filter_define_name(bend, "M4_HOOK_ACCLIST_BODY", true); bend->newline(bend); @@ -1100,9 +1101,7 @@ void make_tables (void) for (i = 1; i <= lastdfa; ++i) { if ((yynultrans_tbl->td_flags & YYTD_PTRANS) != 0) { - // Only works in very C-like languages - out_dec (" &yy_transition[%d],\n", - base[i]); + bend->format_state_table_entry(bend, base[i]); yynultrans_data[i] = base[i]; } else { diff --git a/src/main.c b/src/main.c index 89e3e07b6..68b39b510 100644 --- a/src/main.c +++ b/src/main.c @@ -1315,7 +1315,7 @@ void readin (void) * than a constant declaration because in C a const is * not const enough to be a static array bound. */ - out_dec ("m4_define([[YYLMAX]], [[%d]])\n", ctrl.yylmax); + bend->filter_define_vard(bend, "YYLMAX", ctrl.yylmax); /* Dump the user defined preproc directives. */ if (userdef_buf.elts) diff --git a/src/misc.c b/src/misc.c index aba2672ad..3a5ad8954 100644 --- a/src/misc.c +++ b/src/misc.c @@ -430,11 +430,6 @@ unsigned char myesc (unsigned char array[]) /* out - various flavors of outputting a (possibly formatted) string for the * generated scanner, keeping track of the line count. */ -void out_dec (const char *fmt, int n) -{ - fprintf (stdout, fmt, n); -} - void out_dec2 (const char *fmt, int n1, int n2) { fprintf (stdout, fmt, n1, n2); From cd9e319562e5720b00ae7ab41bb80b8acf99b7f1 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 09:07:54 -0500 Subject: [PATCH 25/37] feat: Remove out_dec2 --- src/flexdef.h | 1 - src/misc.c | 11 +++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/flexdef.h b/src/flexdef.h index 64f723d3f..6c500966f 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -910,7 +910,6 @@ extern int myctoi(const char *); extern unsigned char myesc(unsigned char[]); /* Output a (possibly-formatted) string to the generated scanner. */ -extern void out_dec2(const char *, int, int); extern void out_str(const char *, const char *); /* Return a printable version of the given character, which might be diff --git a/src/misc.c b/src/misc.c index 3a5ad8954..d6f0724a6 100644 --- a/src/misc.c +++ b/src/misc.c @@ -430,11 +430,6 @@ unsigned char myesc (unsigned char array[]) /* out - various flavors of outputting a (possibly formatted) string for the * generated scanner, keeping track of the line count. */ -void out_dec2 (const char *fmt, int n1, int n2) -{ - fprintf (stdout, fmt, n1, n2); -} - void out_str (const char *fmt, const char str[]) { fprintf (stdout,fmt, str); @@ -536,7 +531,11 @@ void transition_struct_out (int element_v, int element_n) if (!gentables) return; - out_dec2 ("M4_HOOK_TABLE_OPENER[[%4d]],[[%4d]]M4_HOOK_TABLE_CONTINUE", element_v, element_n); + bend->open_table(bend); + bend->format_data_table_entry(bend, element_v); + bend->column_separator(bend); + bend->format_data_table_entry(bend, element_n); + bend->continue_table(bend); bend->newline(bend); datapos += TRANS_STRUCT_PRINT_LENGTH; From c11a706abf732ccb47e1104857ffd0d127ff677f Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 09:36:15 -0500 Subject: [PATCH 26/37] feat: Remove out_str --- src/cpp-backend.c | 22 ++++++++- src/gen.c | 63 +++++++++++++------------- src/main.c | 112 +++++++++++++++++++++++----------------------- src/misc.c | 9 ---- src/skeletons.h | 1 + 5 files changed, 110 insertions(+), 97 deletions(-) diff --git a/src/cpp-backend.c b/src/cpp-backend.c index b86236eb8..65a579418 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -429,6 +429,25 @@ static void cpp_filter_define_vard ( const struct flex_backend_t *b, const char b->filter_define_close(b, NULL); } +/* Format a macro replacement through the output filter system. + Filter macros are defined like variables. The syntax for defining a filter macro depends on the + filter chain in use. + + This example assumes the M4 filter chain where: every variable is a macro; the tokens following + the name are substituted for the macro name; if the first token following the name is an OPAREN, + it is followed by a comma-delimited list of positional parameters that are themselves substituded + into the text after the next CPAREN in place of the tokens '$1', '$2', etc. + + Flex's own filter macros only use one positional argument, currently. +*/ +static void cpp_filter_call_macro ( const struct flex_backend_t *b, const char *n, const char *v ) { + b->verbatim(b, n); + b->verbatim(b, "( "); + b->verbatim(b, v); + b->verbatim(b, " )"); + b->newline(b); +} + /* Construct the cpp_backend method table. This follows the definition in skeletons.h. cpp-backends.h provides a handle to this structure with external linkage. @@ -490,6 +509,7 @@ struct flex_backend_t cpp_backend = { .filter_define_name = cpp_filter_define_name, .filter_define_close = cpp_filter_define_close, .filter_define_vars = cpp_filter_define_vars, - .filter_define_vard = cpp_filter_define_vard + .filter_define_vard = cpp_filter_define_vard, + .filter_call_macro = cpp_filter_call_macro }; diff --git a/src/gen.c b/src/gen.c index d24617c3b..605b4222e 100644 --- a/src/gen.c +++ b/src/gen.c @@ -133,9 +133,10 @@ static struct yytbl_data *mkctbl (void) struct yytbl_data *tbl = 0; flex_int32_t *tdata = 0, curr = 0; int end_of_buffer_action = num_rules + 1; + const struct flex_backend_t *backend = get_backend(); struct packtype_t *ptype = optimize_pack(tblend + 2 + 1); - out_str ("m4_define([[M4_HOOK_MKCTBL_TYPE]], [[%s]])", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_MKCTBL_TYPE", ptype->name); tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (tbl, YYTD_ID_TRANSITION); @@ -964,7 +965,7 @@ void make_tables (void) char buf[128]; int i; struct yytbl_data *yynultrans_tbl = NULL; - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); /* This is where we REALLY begin generating the tables. */ @@ -1007,7 +1008,7 @@ void make_tables (void) tbl = mkftbl (); yytbl_data_compress (tbl); ptype = optimize_pack(tbl->td_lolen); - out_str ("m4_define([[M4_HOOK_ACCEPT_TYPE]], [[%s]])", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", ptype->name); if (yytbl_data_fwrite (&tableswr, tbl) < 0) flexerror (_("Could not write ftbl")); yytbl_data_destroy (tbl); @@ -1029,27 +1030,27 @@ void make_tables (void) } snprintf(buf, sizeof(buf), "footprint: %ld bytes", footprint); - bend->comment(bend, buf); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); snprintf(buf, sizeof(buf), "tblend: %d", tblend); - bend->comment(bend, buf); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); snprintf(buf, sizeof(buf), "numecs: %d", numecs); - bend->comment(bend, buf); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); snprintf(buf, sizeof(buf), "num_rules: %d", num_rules); - bend->comment(bend, buf); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); snprintf(buf, sizeof(buf), "lastdfa: %d", lastdfa); - bend->comment(bend, buf); - bend->newline(bend); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); + backend->newline(backend); // Only at this point do we know if the automaton has backups. // Some m4 conditionals require this information. - bend->comment(bend, "m4 controls begin"); - bend->newline(bend); + backend->comment(backend, "m4 controls begin"); + backend->newline(backend); if (num_backing_up > 0) visible_define ( "M4_MODE_HAS_BACKING_UP"); @@ -1060,8 +1061,8 @@ void make_tables (void) if ((num_backing_up > 0 && !reject) && (ctrl.fullspd || ctrl.fulltbl)) visible_define ( "M4_MODE_NULTRANS_WRAP"); - bend->comment(bend, "m4 controls end"); - bend->newline(bend); + backend->comment(backend, "m4 controls end"); + backend->newline(backend); if (ctrl.do_yylineno) { @@ -1083,10 +1084,10 @@ void make_tables (void) flex_int32_t *yynultrans_data = 0; /* Begin generating yy_NUL_trans */ - bend->filter_define_vars(bend, "M4_HOOK_NULTRANS_TYPE", bend->get_state_type(bend)); - bend->filter_define_vard(bend, "M4_HOOK_NULTRANS_SIZE", lastdfa + 1); - bend->filter_define_name(bend, "M4_HOOK_NULTRANS_BODY", true); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_NULTRANS_TYPE", backend->get_state_type(backend)); + backend->filter_define_vard(backend, "M4_HOOK_NULTRANS_SIZE", lastdfa + 1); + backend->filter_define_name(backend, "M4_HOOK_NULTRANS_BODY", true); + backend->newline(backend); yynultrans_tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (yynultrans_tbl, YYTD_ID_NUL_TRANS); @@ -1101,7 +1102,7 @@ void make_tables (void) for (i = 1; i <= lastdfa; ++i) { if ((yynultrans_tbl->td_flags & YYTD_PTRANS) != 0) { - bend->format_state_table_entry(bend, base[i]); + backend->format_state_table_entry(backend, base[i]); yynultrans_data[i] = base[i]; } else { @@ -1112,8 +1113,8 @@ void make_tables (void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End NULTRANS_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End NULTRANS_BODY */ + backend->newline(backend); /* footprint is only used to print an estimated table size in a user-requested summary. There's a C assumtption in the calculation here, but it doesn't affect the scanner. */ @@ -1139,15 +1140,15 @@ void make_tables (void) * in the table metering. */ struct packtype_t *ptype = optimize_pack(num_rules); - bend->filter_define_vars(bend, "M4_HOOK_DEBUGTABLE_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_DEBUGTABLE_SIZE", num_rules); - bend->filter_define_name(bend, "M4_HOOK_DEBUGTABLE_BODY", true); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_DEBUGTABLE_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_DEBUGTABLE_SIZE", num_rules); + backend->filter_define_name(backend, "M4_HOOK_DEBUGTABLE_BODY", true); + backend->newline(backend); for (i = 1; i < num_rules; ++i) mkdata (rule_linenum[i]); dataend (false); - bend->filter_define_close(bend, NULL); /* End DEBUGTABLE_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End DEBUGTABLE_BODY */ + backend->newline(backend); } } diff --git a/src/main.c b/src/main.c index 68b39b510..db21f083f 100644 --- a/src/main.c +++ b/src/main.c @@ -136,7 +136,7 @@ int flex_main (int argc, char *argv[]) { int i, exit_status, child_status; int did_eof_rule = false; - const struct flex_backend_t *bend = NULL; + const struct flex_backend_t *backend = NULL; /* Set a longjmp target. Yes, I know it's a hack, but it gets worse: The * return value of setjmp, if non-zero, is the desired exit code PLUS ONE. @@ -168,7 +168,7 @@ int flex_main (int argc, char *argv[]) readin (); - bend = get_backend(); + backend = get_backend(); skelout (true); /* %% [1.0] DFA */ footprint += ntod (); @@ -183,8 +183,8 @@ int flex_main (int argc, char *argv[]) ("-s option given but default rule can be matched"), rule_linenum[default_rule]); - bend->comment(bend, "START of m4 controls"); - bend->newline(bend); + backend->comment(backend, "START of m4 controls"); + backend->newline(backend); // mode switches for yy_trans_info specification // nultrans @@ -202,20 +202,20 @@ int flex_main (int argc, char *argv[]) visible_define ( "M4_MODE_NO_NULTRANS_FULLSPD"); } - bend->comment(bend, "END of m4 controls"); - bend->newline(bend); - - bend->comment(bend, "START of Flex-generated definitions"); - bend->format_size_const(bend, "YY_NUM_RULES", num_rules); - bend->format_state_const(bend, "YY_END_OF_BUFFER", num_rules + 1); - bend->format_state_const(bend, "YY_JAMBASE", jambase); - bend->format_state_const(bend, "YY_JAMSTATE", jamstate); - bend->format_byte_const(bend, "YY_NUL_EC", NUL_ec); + backend->comment(backend, "END of m4 controls"); + backend->newline(backend); + + backend->comment(backend, "START of Flex-generated definitions"); + backend->format_size_const(backend, "YY_NUM_RULES", num_rules); + backend->format_state_const(backend, "YY_END_OF_BUFFER", num_rules + 1); + backend->format_state_const(backend, "YY_JAMBASE", jambase); + backend->format_state_const(backend, "YY_JAMSTATE", jamstate); + backend->format_byte_const(backend, "YY_NUL_EC", NUL_ec); /* Need to define the transet type as a size large * enough to hold the biggest offset. */ - out_str ("M4_HOOK_SET_OFFSET_TYPE(%s)", optimize_pack(tblend + numecs + 1)->name); - bend->comment(bend, "END of Flex-generated definitions"); + backend->filter_call_macro(backend, "M4_HOOK_SET_OFFSET_TYPE", optimize_pack(tblend + numecs + 1)->name); + backend->comment(backend, "END of Flex-generated definitions"); skelout (true); /* %% [2.0] - tables get dumped here */ @@ -224,38 +224,38 @@ int flex_main (int argc, char *argv[]) skelout (true); /* %% [3.0] - mode-dependent static declarations get dumped here */ - bend->verbatim(bend, &action_array[defs1_offset]); - bend->newline(bend); + backend->verbatim(backend, &action_array[defs1_offset]); + backend->newline(backend); line_directive_out (stdout, NULL, linenum); skelout (true); /* %% [4.0] - various random yylex internals get dumped here */ /* Copy prolog to output file. */ - bend->verbatim(bend, &action_array[prolog_offset]); - bend->newline(bend); + backend->verbatim(backend, &action_array[prolog_offset]); + backend->newline(backend); line_directive_out (stdout, NULL, linenum); skelout (true); /* %% [5.0] - main loop of matching-engine code gets dumped here */ /* Copy actions to output file. */ - bend->verbatim(bend, &action_array[action_offset]); - bend->newline(bend); + backend->verbatim(backend, &action_array[action_offset]); + backend->newline(backend); line_directive_out (stdout, NULL, linenum); /* generate cases for any missing EOF rules */ for (i = 1; i <= lastsc; ++i) if (!sceof[i]) { - bend->format_eof_state_case_arm(bend, scname[i]); - bend->eof_state_case_fallthrough(bend); - bend->newline(bend); + backend->format_eof_state_case_arm(backend, scname[i]); + backend->eof_state_case_fallthrough(backend); + backend->newline(backend); did_eof_rule = true; } if (did_eof_rule) { - bend->eof_state_case_terminate(bend); + backend->eof_state_case_terminate(backend); } skelout (true); @@ -265,15 +265,15 @@ int flex_main (int argc, char *argv[]) line_directive_out (stdout, infilename, linenum); if (sectnum == 3) { - bend->verbatim(bend, "m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl"); - bend->newline(bend); + backend->verbatim(backend, "m4_ifdef( [[M4_YY_IN_HEADER]],,[[m4_dnl"); + backend->newline(backend); if (!ctrl.no_section3_escape) fputs("[[", stdout); (void) flexscan (); /* copy remainder of input to output */ if (!ctrl.no_section3_escape) fputs("]]", stdout); - bend->verbatim(bend, "]])"); - bend->newline(bend); + backend->verbatim(backend, "]])"); + backend->newline(backend); } /* Note, flexend does not return. It exits with its argument @@ -1206,8 +1206,8 @@ void flexinit (int argc, char **argv) void readin (void) { char buf[256]; - flex_backend_id_t backend; - const struct flex_backend_t *bend = NULL; + flex_backend_id_t backend_id; + const struct flex_backend_t *backend = NULL; line_directive_out(NULL, infilename, linenum); @@ -1225,14 +1225,14 @@ void readin (void) * when %option emit was evaluated; this catches command-line * optiins and the default case. */ - backend = backend_by_name(ctrl.emit); - if ( backend != top_backend() ) + backend_id = backend_by_name(ctrl.emit); + if ( backend_id != top_backend() ) /* only push a new backend if it's not already the top */ - push_backend(backend); + push_backend(backend_id); initialize_output_filters(); - bend = get_backend(); + backend = get_backend(); yyout = stdout; @@ -1285,42 +1285,42 @@ void readin (void) skelout(false); /* [0.0] Make hook macros available, silently */ - bend->comment(bend, "A lexical scanner generated by flex"); - bend->newline(bend); + backend->comment(backend, "A lexical scanner generated by flex"); + backend->newline(backend); /* Dump the %top code. */ if( top_buf.elts) - bend->verbatim(bend, (char*) top_buf.elts); - bend->newline(bend); + backend->verbatim(backend, (char*) top_buf.elts); + backend->newline(backend); /* Place a bogus line directive, it will be fixed in the filter. */ line_directive_out(NULL, NULL, 0); /* User may want to set the scanner prototype */ if (ctrl.yydecl != NULL) { - out_str ("M4_HOOK_SET_YY_DECL(%s)\n", ctrl.yydecl); + backend->filter_call_macro(backend, "M4_HOOK_SET_YY_DECL", ctrl.yydecl); } if (ctrl.userinit != NULL) { - out_str ("M4_HOOK_SET_USERINIT(%s)\n", ctrl.userinit); + backend->filter_call_macro(backend, "M4_HOOK_SET_USERINIT", ctrl.userinit); } if (ctrl.preaction != NULL) { - out_str ("M4_HOOK_SET_PREACTION(%s)\n", ctrl.preaction); + backend->filter_call_macro(backend, "M4_HOOK_SET_PREACTION", ctrl.preaction); } if (ctrl.postaction != NULL) { - out_str ("M4_HOOK_SET_POSTACTION(%s)\n", ctrl.postaction); + backend->filter_call_macro(backend, "M4_HOOK_SET_POSTACTION", ctrl.postaction); } /* This has to be a straight textual substitution rather * than a constant declaration because in C a const is * not const enough to be a static array bound. */ - bend->filter_define_vard(bend, "YYLMAX", ctrl.yylmax); + backend->filter_define_vard(backend, "YYLMAX", ctrl.yylmax); /* Dump the user defined preproc directives. */ if (userdef_buf.elts) - bend->verbatim(bend, (char *) (userdef_buf.elts)); - bend->newline(bend); + backend->verbatim(backend, (char *) (userdef_buf.elts)); + backend->newline(backend); /* If the user explicitly requested posix compatibility by specifying the * posix-compat option, then we check for conflicting options. However, if @@ -1438,20 +1438,20 @@ void readin (void) // itself; by shoving all this stuff out to the skeleton file // we make it easier to retarget the code generation. snprintf(buf, sizeof(buf), "Target: %s", ctrl.backend_name); - bend->comment(bend, buf); - bend->newline(bend); - bend->comment(bend, "START of m4 controls"); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); + backend->comment(backend, "START of m4 controls"); + backend->newline(backend); /* Define the start condition macros. */ { int i = 0; // FIXME: Not dumped visibly because we plan to do away with the indirection - bend->filter_define_name(bend, "M4_YY_SC_DEFS", true); + backend->filter_define_name(backend, "M4_YY_SC_DEFS", true); for (i = 1; i <= lastsc; i++) { - bend->format_state_const(bend, scname[i], i-1); + backend->format_state_const(backend, scname[i], i-1); } - bend->filter_define_close(bend, NULL); /* End YY_SC_DEFS */ + backend->filter_define_close(backend, NULL); /* End YY_SC_DEFS */ } if (ctrl.bison_bridge_lval) @@ -1571,7 +1571,7 @@ void readin (void) if (ctrl.yyclass != NULL) { visible_define ( "M4_MODE_YYCLASS"); - bend->filter_define_vars(bend, "M4_YY_CLASS_NAME", ctrl.yyclass); + backend->filter_define_vars(backend, "M4_YY_CLASS_NAME", ctrl.yyclass); } if (ctrl.ddebug) @@ -1687,8 +1687,8 @@ void readin (void) else visible_define ( "M4_MODE_NO_REWRITE"); - bend->comment(bend, "END of m4 controls"); - bend->newline(bend); + backend->comment(backend, "END of m4 controls"); + backend->newline(backend); } /* set_up_initial_allocations - allocate memory for internal tables */ diff --git a/src/misc.c b/src/misc.c index d6f0724a6..78b46ba67 100644 --- a/src/misc.c +++ b/src/misc.c @@ -427,15 +427,6 @@ unsigned char myesc (unsigned char array[]) } -/* out - various flavors of outputting a (possibly formatted) string for the - * generated scanner, keeping track of the line count. - */ -void out_str (const char *fmt, const char str[]) -{ - fprintf (stdout,fmt, str); -} - - /* readable_form - return the the human-readable form of a character * * The returned string is in static storage. diff --git a/src/skeletons.h b/src/skeletons.h index 63fe08f61..54023f196 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -101,6 +101,7 @@ struct flex_backend_t { void (*filter_define_close) (const struct flex_backend_t *b, const char *v); void (*filter_define_vars) ( const struct flex_backend_t *b, const char *n, const char *v ); void (*filter_define_vard) ( const struct flex_backend_t *b, const char *n, const int v ); + void (*filter_call_macro) ( const struct flex_backend_t *b, const char *n, const char *v ); }; const struct flex_backend_t *get_backend(void); From cf14bad038ec46c9269e3d8b5e60aa9d201885c8 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 09:44:11 -0500 Subject: [PATCH 27/37] feat: Name backend handle more clearly --- src/dfa.c | 36 +++++----- src/flexdef.h | 3 - src/gen.c | 196 +++++++++++++++++++++++++------------------------- 3 files changed, 116 insertions(+), 119 deletions(-) diff --git a/src/dfa.c b/src/dfa.c index c04bdeaac..b799d85fe 100644 --- a/src/dfa.c +++ b/src/dfa.c @@ -384,7 +384,7 @@ size_t ntod (void) int symlist[CSIZE + 1]; int num_start_states; int todo_head, todo_next; - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); struct yytbl_data *yynxt_tbl = 0; flex_int32_t *yynxt_data = 0, yynxt_curr = 0; @@ -507,15 +507,15 @@ size_t ntod (void) struct packtype_t *ptype = optimize_pack(0); /* Note: Used when ctrl.fulltbl is on. Alternately defined elsewhere */ - bend->filter_define_vars(bend, "M4_HOOK_NXT_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_NXT_ROWS", num_full_table_rows); - bend->filter_define_name(bend, "M4_HOOK_NXT_BODY", true); - bend->newline(bend); - bend->open_table(bend); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_NXT_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_NXT_ROWS", num_full_table_rows); + backend->filter_define_name(backend, "M4_HOOK_NXT_BODY", true); + backend->newline(backend); + backend->open_table(backend); + backend->newline(backend); if (gentables) - bend->open_table(bend); - bend->newline(bend); + backend->open_table(backend); + backend->newline(backend); /* Generate 0 entries for state #0. */ for (i = 0; i < num_full_table_rows; ++i) { @@ -525,8 +525,8 @@ size_t ntod (void) if (gentables) { dataflush (); - bend->continue_table(bend); - bend->newline(bend); + backend->continue_table(backend); + backend->newline(backend); } } @@ -681,8 +681,8 @@ size_t ntod (void) yynxt_tbl->td_lolen * sizeof (flex_int32_t)); if (gentables) - bend->open_table(bend); - bend->newline(bend); + backend->open_table(backend); + backend->newline(backend); /* Supply array's 0-element. */ if (ds == end_of_buffer_state) { @@ -707,8 +707,8 @@ size_t ntod (void) if (gentables) { dataflush (); - bend->continue_table(bend); - bend->newline(bend); + backend->continue_table(backend); + backend->newline(backend); } } @@ -742,9 +742,9 @@ size_t ntod (void) if (ctrl.fulltbl) { dataend (true); - bend->comment(bend, "body"); - bend->filter_define_close(bend, NULL); /* End of NXT_BODY */ - bend->newline(bend); + backend->comment(backend, "body"); + backend->filter_define_close(backend, NULL); /* End of NXT_BODY */ + backend->newline(backend); if (tablesext) { yytbl_data_compress (yynxt_tbl); if (yytbl_data_fwrite (&tableswr, yynxt_tbl) < 0) diff --git a/src/flexdef.h b/src/flexdef.h index 6c500966f..72b386780 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -909,9 +909,6 @@ extern int myctoi(const char *); /* Return character corresponding to escape sequence. */ extern unsigned char myesc(unsigned char[]); -/* Output a (possibly-formatted) string to the generated scanner. */ -extern void out_str(const char *, const char *); - /* Return a printable version of the given character, which might be * 8-bit. */ diff --git a/src/gen.c b/src/gen.c index 605b4222e..96d12d3ad 100644 --- a/src/gen.c +++ b/src/gen.c @@ -93,30 +93,30 @@ static void geneoltbl (void) { int i; struct packtype_t *ptype = optimize_pack(num_rules); - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); - bend->verbatim(bend, "m4_ifdef( [[M4_MODE_YYLINENO]],[["); - bend->newline(bend); - bend->filter_define_vars(bend, "M4_HOOK_EOLTABLE_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_EOLTABLE_SIZE", num_rules + 1); - bend->filter_define_name(bend, "M4_HOOK_EOLTABLE_BODY", true); - bend->newline(bend); + backend->verbatim(backend, "m4_ifdef( [[M4_MODE_YYLINENO]],[["); + backend->newline(backend); + backend->filter_define_vars(backend, "M4_HOOK_EOLTABLE_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_EOLTABLE_SIZE", num_rules + 1); + backend->filter_define_name(backend, "M4_HOOK_EOLTABLE_BODY", true); + backend->newline(backend); if (gentables) { for (i = 1; i <= num_rules; i++) { - bend->format_data_table_entry(bend, rule_has_nl[i] ? 1 : 0); - bend->column_separator(bend); + backend->format_data_table_entry(backend, rule_has_nl[i] ? 1 : 0); + backend->column_separator(backend); /* format nicely, 20 numbers per line. */ if ((i % 20) == 19) - bend->newline(bend); - bend->indent(bend); + backend->newline(backend); + backend->indent(backend); } } footprint += num_rules * ptype->width; - bend->filter_define_close(bend, NULL); /* End EOLTABLE_BODY */ - bend->newline(bend); - bend->verbatim(bend, "]])"); /* End m4_ifdef( [[M4_MODE_YYLINENO]]...*/ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End EOLTABLE_BODY */ + backend->newline(backend); + backend->verbatim(backend, "]])"); /* End m4_ifdef( [[M4_MODE_YYLINENO]]...*/ + backend->newline(backend); } @@ -256,12 +256,12 @@ static void genctbl(void) { int i; int end_of_buffer_action = num_rules + 1; - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); /* Table of verify for transition and offset to next state. */ - bend->filter_define_vard(bend, "M4_HOOK_TRANSTABLE_SIZE", tblend + 2 + 1); - bend->filter_define_name(bend, "M4_HOOK_TRANSTABLE_BODY", true); - bend->newline(bend); + backend->filter_define_vard(backend, "M4_HOOK_TRANSTABLE_SIZE", tblend + 2 + 1); + backend->filter_define_name(backend, "M4_HOOK_TRANSTABLE_BODY", true); + backend->newline(backend); /* We want the transition to be represented as the offset to the * next state, not the actual state number, which is what it currently @@ -328,20 +328,20 @@ static void genctbl(void) transition_struct_out (chk[tblend + 1], nxt[tblend + 1]); transition_struct_out (chk[tblend + 2], nxt[tblend + 2]); - bend->filter_define_close(bend, NULL); /* End TRANSTABLE_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End TRANSTABLE_BODY */ + backend->newline(backend); footprint += sizeof(struct yy_trans_info) * (tblend + 2 + 1); - bend->filter_define_vard(bend, "M4_HOOK_STARTTABLE_SIZE", lastsc * 2 + 1); + backend->filter_define_vard(backend, "M4_HOOK_STARTTABLE_SIZE", lastsc * 2 + 1); if (gentables) { - bend->filter_define_name(bend, "M4_HOOK_STARTTABLE_BODY", true); - bend->newline(bend); + backend->filter_define_name(backend, "M4_HOOK_STARTTABLE_BODY", true); + backend->newline(backend); for (i = 0; i <= lastsc * 2; ++i) - bend->format_state_table_entry(bend, base[i]); + backend->format_state_table_entry(backend, base[i]); dataend (false); - bend->filter_define_close(bend, NULL); /* End STARTTABLE_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End STARTTABLE_BODY */ + backend->newline(backend); footprint += sizeof(struct yy_trans_info *) * (lastsc * 2 + 1); } @@ -381,11 +381,11 @@ static void genecs(void) { int ch, row; int numrows; - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); - bend->filter_define_vard(bend, "M4_HOOK_ECSTABLE_SIZE", ctrl.csize); - bend->filter_define_name(bend, "M4_HOOK_ECSTABLE_BODY", true); - bend->newline(bend); + backend->filter_define_vard(backend, "M4_HOOK_ECSTABLE_SIZE", ctrl.csize); + backend->filter_define_name(backend, "M4_HOOK_ECSTABLE_BODY", true); + backend->newline(backend); for (ch = 1; ch < ctrl.csize; ++ch) { ecgroup[ch] = ABS (ecgroup[ch]); @@ -393,8 +393,8 @@ static void genecs(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End ECSTABLE_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End ECSTABLE_BODY */ + backend->newline(backend); footprint += sizeof(YY_CHAR) * ctrl.csize; if (env.trace) { @@ -459,16 +459,16 @@ static void genftbl(void) int i; int end_of_buffer_action = num_rules + 1; struct packtype_t *ptype = optimize_pack(num_rules + 1); - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; - bend->filter_define_vard(bend, "M4_HOOK_NEED_ACCEPT", 1); - bend->newline(bend); - bend->filter_define_vars(bend, "M4_HOOK_ACCEPT_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_ACCEPT_SIZE", lastdfa + 1); - bend->filter_define_name(bend, "M4_HOOK_ACCEPT_BODY", true); - bend->newline(bend); + backend->filter_define_vard(backend, "M4_HOOK_NEED_ACCEPT", 1); + backend->newline(backend); + backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_ACCEPT_SIZE", lastdfa + 1); + backend->filter_define_name(backend, "M4_HOOK_ACCEPT_BODY", true); + backend->newline(backend); for (i = 1; i <= lastdfa; ++i) { int anum = dfaacc[i].dfaacc_state; @@ -481,8 +481,8 @@ static void genftbl(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End ACCEPT_BODY*/ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End ACCEPT_BODY*/ + backend->newline(backend); footprint += (lastdfa + 1) * ptype->width; if (ctrl.useecs) @@ -505,7 +505,7 @@ static void gentabs(void) *yynxt_data = 0, *yychk_data = 0, *yyacclist_data=0; flex_int32_t yybase_curr = 0, yyacclist_curr=0,yyacc_curr=0; struct packtype_t *ptype; - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); acc_array = allocate_integer_array (current_max_dfas); nummt = 0; @@ -535,10 +535,10 @@ static void gentabs(void) sz = MAX (numas, 1) + 1; ptype = optimize_pack(sz); - bend->filter_define_vars(bend, "M4_HOOK_ACCLIST_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_ACCLIST_SIZE", sz); - bend->filter_define_name(bend, "M4_HOOK_ACCLIST_BODY", true); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_ACCLIST_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_ACCLIST_SIZE", sz); + backend->filter_define_name(backend, "M4_HOOK_ACCLIST_BODY", true); + backend->newline(backend); yyacclist_tbl = calloc(1,sizeof(struct yytbl_data)); yytbl_data_init (yyacclist_tbl, YYTD_ID_ACCLIST); @@ -602,8 +602,8 @@ static void gentabs(void) acc_array[i] = j; dataend (false); - bend->filter_define_close(bend, NULL); /* End ACCLIST_BODY*/ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End ACCLIST_BODY*/ + backend->newline(backend); footprint += sz * ptype->width; if (tablesext) { yytbl_data_compress (yyacclist_tbl); @@ -647,12 +647,12 @@ static void gentabs(void) /* Note that this table is alternately defined if ctrl.fulltbl */ ptype = optimize_pack(sz); - bend->filter_define_vard(bend, "M4_HOOK_NEED_ACCEPT", 1); - bend->newline(bend); - bend->filter_define_vars(bend, "M4_HOOK_ACCEPT_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_ACCEPT_SIZE", sz); - bend->filter_define_name(bend, "M4_HOOK_ACCEPT_BODY", true); - bend->newline(bend); + backend->filter_define_vard(backend, "M4_HOOK_NEED_ACCEPT", 1); + backend->newline(backend); + backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_ACCEPT_SIZE", sz); + backend->filter_define_name(backend, "M4_HOOK_ACCEPT_BODY", true); + backend->newline(backend); yyacc_tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (yyacc_tbl, YYTD_ID_ACCEPT); @@ -681,8 +681,8 @@ static void gentabs(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End ACCEPT_BODY*/ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End ACCEPT_BODY*/ + backend->newline(backend); footprint += sz * ptype->width; if (tablesext) { @@ -725,9 +725,9 @@ static void gentabs(void) if (env.trace) fputs (_("\n\nMeta-Equivalence Classes:\n"), stderr); - bend->filter_define_vard(bend, "M4_HOOK_MECSTABLE_SIZE", numecs+1); - bend->filter_define_name(bend, "M4_HOOK_MECSTABLE_BODY", true); - bend->newline(bend); + backend->filter_define_vard(backend, "M4_HOOK_MECSTABLE_SIZE", numecs+1); + backend->filter_define_name(backend, "M4_HOOK_MECSTABLE_BODY", true); + backend->newline(backend); for (i = 1; i <= numecs; ++i) { if (env.trace) @@ -739,8 +739,8 @@ static void gentabs(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End MECSTABLE_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End MECSTABLE_BODY */ + backend->newline(backend); footprint += sizeof(YY_CHAR) * (numecs + 1); if (tablesext) { yytbl_data_compress (yymeta_tbl); @@ -757,10 +757,10 @@ static void gentabs(void) /* Begin generating yy_base */ sz = total_states + 1; ptype = optimize_pack(sz); - bend->filter_define_vars(bend, "M4_HOOK_BASE_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_BASE_SIZE", sz); - bend->filter_define_name(bend, "M4_HOOK_BASE_BODY", true); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_BASE_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_BASE_SIZE", sz); + backend->filter_define_name(backend, "M4_HOOK_BASE_BODY", true); + backend->newline(backend); yybase_tbl = calloc (1, sizeof (struct yytbl_data)); yytbl_data_init (yybase_tbl, YYTD_ID_BASE); @@ -800,8 +800,8 @@ static void gentabs(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End BASE_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End BASE_BODY */ + backend->newline(backend); footprint += sz * ptype->width; if (tablesext) { @@ -816,10 +816,10 @@ static void gentabs(void) /* Begin generating yy_def */ ptype = optimize_pack(total_states + 1); - bend->filter_define_vars(bend, "M4_HOOK_DEF_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_DEF_SIZE", total_states + 1); - bend->filter_define_name(bend, "M4_HOOK_DEF_BODY", true); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_DEF_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_DEF_SIZE", total_states + 1); + backend->filter_define_name(backend, "M4_HOOK_DEF_BODY", true); + backend->newline(backend); yydef_tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (yydef_tbl, YYTD_ID_DEF); @@ -833,8 +833,8 @@ static void gentabs(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End DEF_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End DEF_BODY */ + backend->newline(backend); footprint += (total_states + 1) * ptype->width; if (tablesext) { @@ -851,10 +851,10 @@ static void gentabs(void) /* Note: Used when !ctrl.fulltbl && !ctrl.fullspd). * (Alternately defined when ctrl.fullspd) */ - bend->filter_define_vars(bend, "M4_HOOK_YYNXT_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_YYNXT_SIZE", tblend + 1); - bend->filter_define_name(bend, "M4_HOOK_YYNXT_BODY", true); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_YYNXT_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_YYNXT_SIZE", tblend + 1); + backend->filter_define_name(backend, "M4_HOOK_YYNXT_BODY", true); + backend->newline(backend); yynxt_tbl = calloc (1, sizeof (struct yytbl_data)); yytbl_data_init (yynxt_tbl, YYTD_ID_NXT); @@ -874,8 +874,8 @@ static void gentabs(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End YYNXT_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End YYNXT_BODY */ + backend->newline(backend); footprint += ptype->width * (tblend + 1); if (tablesext) { @@ -889,10 +889,10 @@ static void gentabs(void) /* Begin generating yy_chk */ ptype = optimize_pack(tblend + 1); - bend->filter_define_vars(bend, "M4_HOOK_CHK_TYPE", ptype->name); - bend->filter_define_vard(bend, "M4_HOOK_CHK_SIZE", tblend + 1); - bend->filter_define_name(bend, "M4_HOOK_CHK_BODY", true); - bend->newline(bend); + backend->filter_define_vars(backend, "M4_HOOK_CHK_TYPE", ptype->name); + backend->filter_define_vard(backend, "M4_HOOK_CHK_SIZE", tblend + 1); + backend->filter_define_name(backend, "M4_HOOK_CHK_BODY", true); + backend->newline(backend); yychk_tbl = calloc (1, sizeof (struct yytbl_data)); yytbl_data_init (yychk_tbl, YYTD_ID_CHK); @@ -909,8 +909,8 @@ static void gentabs(void) } dataend (false); - bend->filter_define_close(bend, NULL); /* End CHK_BODY */ - bend->newline(bend); + backend->filter_define_close(backend, NULL); /* End CHK_BODY */ + backend->newline(backend); footprint += ptype->width * (tblend + 1); if (tablesext) { @@ -928,33 +928,33 @@ static void gentabs(void) void visible_define (const char *symname) { - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); - bend->filter_define_name(bend, symname, false); - bend->comment(bend, symname); - bend->newline(bend); + backend->filter_define_name(backend, symname, false); + backend->comment(backend, symname); + backend->newline(backend); } void visible_define_str (const char *symname, const char *val) { char buf[128]; - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); - bend->filter_define_vars(bend, symname, val); + backend->filter_define_vars(backend, symname, val); snprintf(buf, sizeof(buf), "%s = %s", symname, val); - bend->comment(bend, buf); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); } void visible_define_int (const char *symname, const int val) { char buf[128]; - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); - bend->filter_define_vard(bend, symname, val); + backend->filter_define_vard(backend, symname, val); snprintf(buf, sizeof(buf), "%s = %d", symname, val); - bend->comment(bend, buf); - bend->newline(bend); + backend->comment(backend, buf); + backend->newline(backend); } /* make_tables - generate transition tables From 39ab94c41f14b256ef5623df6fb09735cd01d816 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 09:47:26 -0500 Subject: [PATCH 28/37] feat: Name backend handle more clearly --- src/misc.c | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/misc.c b/src/misc.c index 78b46ba67..6d1ca6778 100644 --- a/src/misc.c +++ b/src/misc.c @@ -160,7 +160,7 @@ int cclcmp (const void *a, const void *b) void dataend (const int endit) { - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); /* short circuit any output */ if (gentables) { @@ -171,7 +171,7 @@ void dataend (const int endit) /* Optionally, close the table. */ if (endit) - bend->close_table(bend); + backend->close_table(backend); } dataline = 0; datapos = 0; @@ -182,19 +182,19 @@ void dataend (const int endit) void dataflush (void) { - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); if (!gentables) return; if (datapos > 0) - bend->newline(bend); + backend->newline(backend); if (++dataline >= NUMDATALINES) { /* Put out a blank line so that the table is grouped into * large blocks that enable the user to find elements easily. */ - bend->newline(bend); + backend->newline(backend); dataline = 0; } @@ -253,9 +253,9 @@ void lerr_fatal (const char *msg, ...) /* line_directive_out - spit out a "#line" statement or equivalent */ void line_directive_out (FILE *output_file, char *path, int linenum) { - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); - bend->line_directive_out(bend, output_file, path, linenum); + backend->line_directive_out(backend, output_file, path, linenum); } @@ -289,25 +289,25 @@ void mark_prolog (void) */ void mk2data (int value) { - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); /* short circuit any output */ if (!gentables) return; if (datapos >= NUMDATAITEMS) { - bend->column_separator(bend); + backend->column_separator(backend); dataflush (); } if (datapos == 0) - bend->indent(bend); + backend->indent(backend); else - bend->column_separator(bend); + backend->column_separator(backend); ++datapos; - bend->format_data_table_entry(bend, value); + backend->format_data_table_entry(backend, value); } @@ -318,25 +318,25 @@ void mk2data (int value) */ void mkdata (int value) { - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); /* short circuit any output */ if (!gentables) return; if (datapos >= NUMDATAITEMS) { - bend->column_separator(bend); + backend->column_separator(backend); dataflush (); } if (datapos == 0) - bend->indent(bend); + backend->indent(backend); else - bend->column_separator(bend); + backend->column_separator(backend); ++datapos; - bend->format_data_table_entry(bend, value); + backend->format_data_table_entry(backend, value); } @@ -516,26 +516,26 @@ void *reallocate_array (void *array, int size, size_t element_size) void transition_struct_out (int element_v, int element_n) { - const struct flex_backend_t *bend = get_backend(); + const struct flex_backend_t *backend = get_backend(); /* short circuit any output */ if (!gentables) return; - bend->open_table(bend); - bend->format_data_table_entry(bend, element_v); - bend->column_separator(bend); - bend->format_data_table_entry(bend, element_n); - bend->continue_table(bend); - bend->newline(bend); + backend->open_table(backend); + backend->format_data_table_entry(backend, element_v); + backend->column_separator(backend); + backend->format_data_table_entry(backend, element_n); + backend->continue_table(backend); + backend->newline(backend); datapos += TRANS_STRUCT_PRINT_LENGTH; if (datapos >= 79 - TRANS_STRUCT_PRINT_LENGTH) { - bend->newline(bend); + backend->newline(backend); if (++dataline % 10 == 0) - bend->newline(bend); + backend->newline(backend); datapos = 0; } From 9850f90f99304a9b97c0039f1ee314d06abc6ad1 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 10:08:49 -0500 Subject: [PATCH 29/37] feat: Refactor use of optimize_pack output --- src/cpp-backend.c | 10 ++++++++++ src/dfa.c | 2 +- src/gen.c | 22 +++++++++++----------- src/main.c | 2 +- src/skeletons.h | 1 + 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/cpp-backend.c b/src/cpp-backend.c index 65a579418..635aec23f 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -64,6 +64,15 @@ static const char * cpp_get_state_type ( const struct flex_backend_t *b ) { return (ctrl.fullspd) ? "struct yy_trans_info*" : b->get_int32_type(b); } +static const char * cpp_get_packed_type (const struct flex_backend_t *b, struct packtype_t *p) { + switch(p->width) { + case 32: return b->get_int32_type(b); + case 16: return b->get_int16_type(b); + default: flexerror("unsupported packed data width requested\n"); + break; + } +} + /* TODO: Indent? */ static void cpp_open_block_comment ( const struct flex_backend_t *b ) { fputs("/* ", stdout); @@ -462,6 +471,7 @@ struct flex_backend_t cpp_backend = { .get_int32_type = cpp_get_int32_type, .get_int16_type = cpp_get_int16_type, .get_state_type = cpp_get_state_type, + .get_packed_type= cpp_get_packed_type, .open_block_comment = cpp_open_block_comment, .close_block_comment = cpp_close_block_comment, .comment = cpp_comment, diff --git a/src/dfa.c b/src/dfa.c index b799d85fe..346b67836 100644 --- a/src/dfa.c +++ b/src/dfa.c @@ -507,7 +507,7 @@ size_t ntod (void) struct packtype_t *ptype = optimize_pack(0); /* Note: Used when ctrl.fulltbl is on. Alternately defined elsewhere */ - backend->filter_define_vars(backend, "M4_HOOK_NXT_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_NXT_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_NXT_ROWS", num_full_table_rows); backend->filter_define_name(backend, "M4_HOOK_NXT_BODY", true); backend->newline(backend); diff --git a/src/gen.c b/src/gen.c index 96d12d3ad..8dd3378ef 100644 --- a/src/gen.c +++ b/src/gen.c @@ -97,7 +97,7 @@ static void geneoltbl (void) backend->verbatim(backend, "m4_ifdef( [[M4_MODE_YYLINENO]],[["); backend->newline(backend); - backend->filter_define_vars(backend, "M4_HOOK_EOLTABLE_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_EOLTABLE_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_EOLTABLE_SIZE", num_rules + 1); backend->filter_define_name(backend, "M4_HOOK_EOLTABLE_BODY", true); backend->newline(backend); @@ -136,7 +136,7 @@ static struct yytbl_data *mkctbl (void) const struct flex_backend_t *backend = get_backend(); struct packtype_t *ptype = optimize_pack(tblend + 2 + 1); - backend->filter_define_vars(backend, "M4_HOOK_MKCTBL_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_MKCTBL_TYPE", backend->get_packed_type(backend, ptype)); tbl = calloc(1, sizeof (struct yytbl_data)); yytbl_data_init (tbl, YYTD_ID_TRANSITION); @@ -465,7 +465,7 @@ static void genftbl(void) backend->filter_define_vard(backend, "M4_HOOK_NEED_ACCEPT", 1); backend->newline(backend); - backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_ACCEPT_SIZE", lastdfa + 1); backend->filter_define_name(backend, "M4_HOOK_ACCEPT_BODY", true); backend->newline(backend); @@ -535,7 +535,7 @@ static void gentabs(void) sz = MAX (numas, 1) + 1; ptype = optimize_pack(sz); - backend->filter_define_vars(backend, "M4_HOOK_ACCLIST_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_ACCLIST_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_ACCLIST_SIZE", sz); backend->filter_define_name(backend, "M4_HOOK_ACCLIST_BODY", true); backend->newline(backend); @@ -649,7 +649,7 @@ static void gentabs(void) ptype = optimize_pack(sz); backend->filter_define_vard(backend, "M4_HOOK_NEED_ACCEPT", 1); backend->newline(backend); - backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_ACCEPT_SIZE", sz); backend->filter_define_name(backend, "M4_HOOK_ACCEPT_BODY", true); backend->newline(backend); @@ -757,7 +757,7 @@ static void gentabs(void) /* Begin generating yy_base */ sz = total_states + 1; ptype = optimize_pack(sz); - backend->filter_define_vars(backend, "M4_HOOK_BASE_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_BASE_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_BASE_SIZE", sz); backend->filter_define_name(backend, "M4_HOOK_BASE_BODY", true); backend->newline(backend); @@ -816,7 +816,7 @@ static void gentabs(void) /* Begin generating yy_def */ ptype = optimize_pack(total_states + 1); - backend->filter_define_vars(backend, "M4_HOOK_DEF_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_DEF_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_DEF_SIZE", total_states + 1); backend->filter_define_name(backend, "M4_HOOK_DEF_BODY", true); backend->newline(backend); @@ -851,7 +851,7 @@ static void gentabs(void) /* Note: Used when !ctrl.fulltbl && !ctrl.fullspd). * (Alternately defined when ctrl.fullspd) */ - backend->filter_define_vars(backend, "M4_HOOK_YYNXT_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_YYNXT_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_YYNXT_SIZE", tblend + 1); backend->filter_define_name(backend, "M4_HOOK_YYNXT_BODY", true); backend->newline(backend); @@ -889,7 +889,7 @@ static void gentabs(void) /* Begin generating yy_chk */ ptype = optimize_pack(tblend + 1); - backend->filter_define_vars(backend, "M4_HOOK_CHK_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_CHK_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_CHK_SIZE", tblend + 1); backend->filter_define_name(backend, "M4_HOOK_CHK_BODY", true); backend->newline(backend); @@ -1008,7 +1008,7 @@ void make_tables (void) tbl = mkftbl (); yytbl_data_compress (tbl); ptype = optimize_pack(tbl->td_lolen); - backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_ACCEPT_TYPE", backend->get_packed_type(backend, ptype)); if (yytbl_data_fwrite (&tableswr, tbl) < 0) flexerror (_("Could not write ftbl")); yytbl_data_destroy (tbl); @@ -1140,7 +1140,7 @@ void make_tables (void) * in the table metering. */ struct packtype_t *ptype = optimize_pack(num_rules); - backend->filter_define_vars(backend, "M4_HOOK_DEBUGTABLE_TYPE", ptype->name); + backend->filter_define_vars(backend, "M4_HOOK_DEBUGTABLE_TYPE", backend->get_packed_type(backend, ptype)); backend->filter_define_vard(backend, "M4_HOOK_DEBUGTABLE_SIZE", num_rules); backend->filter_define_name(backend, "M4_HOOK_DEBUGTABLE_BODY", true); backend->newline(backend); diff --git a/src/main.c b/src/main.c index db21f083f..58a458b9c 100644 --- a/src/main.c +++ b/src/main.c @@ -214,7 +214,7 @@ int flex_main (int argc, char *argv[]) /* Need to define the transet type as a size large * enough to hold the biggest offset. */ - backend->filter_call_macro(backend, "M4_HOOK_SET_OFFSET_TYPE", optimize_pack(tblend + numecs + 1)->name); + backend->filter_call_macro(backend, "M4_HOOK_SET_OFFSET_TYPE", backend->get_packed_type(backend, optimize_pack(tblend + numecs + 1))); backend->comment(backend, "END of Flex-generated definitions"); skelout (true); /* %% [2.0] - tables get dumped here */ diff --git a/src/skeletons.h b/src/skeletons.h index 54023f196..5999b1be2 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -53,6 +53,7 @@ struct flex_backend_t { const char * (*get_int32_type) ( const struct flex_backend_t *b ); const char * (*get_int16_type) ( const struct flex_backend_t *b ); const char * (*get_state_type) ( const struct flex_backend_t *b ); + const char * (*get_packed_type) (const struct flex_backend_t *b, struct packtype_t *p); void (*open_block_comment) ( const struct flex_backend_t *b ); void (*close_block_comment) ( const struct flex_backend_t *b ); void (*comment) ( const struct flex_backend_t *b, const char *c ); From 2c8fac189d6a6754ee108fe32b4bf74615fa09ab Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 14:37:18 -0500 Subject: [PATCH 30/37] feat: Add C99 backend --- src/Makefile.am | 2 + src/c99-backend.c | 525 ++++++++++++++++++++++++++++++++++++++++++++++ src/c99-backend.h | 47 +++++ 3 files changed, 574 insertions(+) create mode 100644 src/c99-backend.c create mode 100644 src/c99-backend.h diff --git a/src/Makefile.am b/src/Makefile.am index 9f64d94d8..1dde5b58a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -66,6 +66,8 @@ COMMON_SOURCES = \ ccl.c \ cpp-backend.c \ cpp-backend.h \ + c99-backend.c \ + c99-backend.h \ dfa.c \ ecs.c \ filter.c \ diff --git a/src/c99-backend.c b/src/c99-backend.c new file mode 100644 index 000000000..bc59722d7 --- /dev/null +++ b/src/c99-backend.c @@ -0,0 +1,525 @@ +/* c99-backend.c - C99 backend file for flex */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* 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 "flexdef.h" +#include "c99-backend.h" + +const int C99_BACKEND_MAX_INDENT = 256; + +const char *c99_skel[] = { +#include "c99-flex.h" +0 +}; + +/* For C99, emit the typedef names from stdint.h */ +const char * c99_get_int32_type ( const struct flex_backend_t *b ) { + return "int32_t"; +} + +/* For C99, emit the typedef names from stdint.h */ +static const char * c99_get_int16_type ( const struct flex_backend_t *b ) { + return "int16_t"; +} + +/* Emit the name of the datatype used in the NULTRANS table. + The datatype of the table depends on various option settings + and the skeleton in use. + */ +static const char * c99_get_state_type ( const struct flex_backend_t *b ) { + /* cpp-flex.skl defines transition states as pointers to + struct yy_trans_info when the FULLSPD option is enabled. + Otherwise, it just uses the int32 type. + */ + return (ctrl.fullspd) ? "struct yy_trans_info*" : b->get_int32_type(b); +} + +static const char * c99_get_packed_type (const struct flex_backend_t *b, struct packtype_t *p) { + switch(p->width) { + case 32: return b->get_int32_type(b); + case 16: return b->get_int16_type(b); + default: flexerror("unsupported packed data width requested\n"); + break; + } +} + +/* TODO: Indent? */ +static void c99_open_block_comment ( const struct flex_backend_t *b ) { + fputs("/* ", stdout); +} + +/* TODO: Indent? */ +static void c99_close_block_comment ( const struct flex_backend_t *b ) { + fputs(" */", stdout); +} + +static void c99_comment ( const struct flex_backend_t *b, const char *c ) { + b->indent(b); + fprintf(stdout, "/* %s */", c); +} + +static void c99_record_separator ( const struct flex_backend_t *b ) { + /* Expected to ocurr at the end of a line, so I'm not indenting. */ + fputs("},\n", stdout); +} + +static void c99_column_separator ( const struct flex_backend_t *b ){ + /* Expected to ocurr at the end of a line, so don't indent. */ + fputs(", ", stdout); +} + +static void c99_newline ( const struct flex_backend_t *b ) { + /* Expected to ocurr at the end of a line, so don't indent. */ + fputs("\n", stdout); +} + +static void c99_increase_indent ( const struct flex_backend_t *b ) { + if ( b->indent_level < C99_BACKEND_MAX_INDENT ) { + /* ++ will require more parens to clarify */ + ((struct flex_backend_t *)b)->indent_level += 1; + } +} + +static void c99_decrease_indent ( const struct flex_backend_t *b ) { + if (b->indent_level > 0) { + /* -- will require more parens to clarify */ + ((struct flex_backend_t *)b)->indent_level -= 1; + } +} + +static void c99_indent ( const struct flex_backend_t *b ) { + int i = 0; + while ( i < b->indent_level ) { + fputs("\t", stdout); + ++i; + } +} + +/* Return a format string appropriate for the skeleton language. + The format string will perform an equivalent function to the CPP line directive. + That is, it will tell target language compiler what .l source line the target source + corresponds to when the compiler generates warnings and errors. + + This method does not provide the arguments to the format string. It just provides the string. +*/ +static const char * c99_get_trace_line_format ( const struct flex_backend_t *b ) { + return "#line %d \"%s\"\n"; +} + + +/* Combine the format string from *_get_trace_line_format with its arguments. */ +static void c99_line_directive_out ( const struct flex_backend_t * b, FILE *output_file, char *path, int linenum ) { + char directive[MAXLINE*2], filename[MAXLINE]; + char *s1, *s2, *s3; + + if (!ctrl.gen_line_dirs) { + return; + } + + /* char *infilename is in the global namespace */ + s1 = (path != NULL) ? path : infilename; + + if ((path != NULL) && !s1) { + s1 = ""; + } + + s2 = filename; + s3 = &filename[sizeof (filename) - 2]; + + while (s2 < s3 && *s1) { + if (*s1 == '\\' || *s1 == '"') { + /* Escape the '\' or '"' */ + *s2++ = '\\'; + } + + *s2++ = *s1++; + } + + *s2 = '\0'; + + if (path != NULL) { + snprintf (directive, sizeof(directive), b->get_trace_line_format(b), linenum, filename); + } else { + snprintf (directive, sizeof(directive), b->get_trace_line_format(b), 0, filename); + } + + /* If output_file is nil then we should put the directive in + * the accumulated actions. + */ + if (output_file) { + fputs (directive, output_file); + } + else { + add_action (directive); + } +} + +/* TODO: indent? */ +static void c99_open_table ( const struct flex_backend_t *b ) { + fputs("{", stdout); +} + +static void c99_continue_table ( const struct flex_backend_t *b ) { + /* Expected to ocurr at the end of a line, so don't indent. */ + fputs("},\n", stdout); +} + +/* TODO: indent? */ +static void c99_close_table ( const struct flex_backend_t *b ) { + fputs("};\n", stdout); +} + +/* Intended to emit a macro call in C/CXX. + Can also emit a bare string. + */ +static void c99_verbatim ( const struct flex_backend_t *b, const char *s ) { + if (s) + fputs(s, stdout); +} + +/* Format an entry into a data table. */ +static void c99_format_data_table_entry ( const struct flex_backend_t * b, int t ) { + /* Expected to occur in a block format, so don't indent. */ + fprintf(stdout, "%5d", t); +} + +/* Format an entry from the transition table into the state table. */ +static void c99_format_state_table_entry ( const struct flex_backend_t * b, int t ) { + b->indent(b); + fprintf(stdout, "&yy_transition[%d],\n", t); +} + +/* Generate a case for the main state switch (in C/CXX). + Other target languages may use another selection syntax. Basically, each arm matches + the character under examination, treated as a number. +*/ +static void c99_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { + b->indent(b); + fprintf(stdout, "case %d: ", c); +} + +/* Generate the special case arm for EOF. + This lives in the body of yyinput and determines whether/when to switch to the next buffer. +*/ +static void c99_format_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { + b->indent(b); + fprintf(stdout, "case YY_STATE_EOF(%s): ", c); +} + +/* Generate the special action FALLTHROUGH. + This is just a comment in C/CXX, but a few languages require a keyword for fallthrough logic. +*/ +static void c99_eof_state_case_fallthrough ( const struct flex_backend_t *b ) { + b->indent(b); + b->comment(b, "FALLTHROUGH"); +} + +/* Generate the special action terminate. */ +static void c99_eof_state_case_terminate ( const struct flex_backend_t *b ) { + b->indent(b); + fputs("yyterminate();\n", stdout); +} + +/* Generate the action preamble. */ +static void c99_take_yytext ( const struct flex_backend_t *b ) { + b->indent(b); + fputs("YY_DO_BEFORE_ACTION; /* set up yytext */", stdout); +} + +/* Generate the action postamble. */ +static void c99_release_yytext ( const struct flex_backend_t *b ) { + b->indent(b); + fputs( "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */", stdout); +} + +/* Generate the buffer rewind sub-action. */ +static void c99_format_char_rewind ( const struct flex_backend_t *b, int c ) { + b->indent(b); + fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp -= %d;", c); +} + +/* Generate the line rewind sub-action. */ +static void c99_format_line_rewind ( const struct flex_backend_t *b, int l ) { + b->indent(b); + fprintf(stdout, "YY_LINENO_REWIND_TO(yy_cp - %d);", l); +} + +/* Generate the buffer skip sub-action. */ +static void c99_format_char_forward ( const struct flex_backend_t *b, int c ) { + b->indent(b); + fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;", c); +} + +/* Generate the line skip sub-action. */ +static void c99_format_line_forward ( const struct flex_backend_t *b, int l ) { + b->indent(b); + fprintf(stdout, "YY_LINENO_REWIND_TO(yy_bp + %d);", l); +} + +/* Define a byte-width constant. */ +static void c99_format_byte_const ( const struct flex_backend_t *b, const char *n, const int c ) { + fprintf(stdout, "#define %s %d\n", n, c); +} + +/* Define a state constant. */ +static void c99_format_state_const ( const struct flex_backend_t *b, const char *n, const int s ) { + fprintf(stdout, "#define %s %d\n", n, s); +} + +/* Define a size constant. + TODO: It would be better if s were unsigned, but Flex currently counts in signed ints. +*/ +static void c99_format_size_const ( const struct flex_backend_t *b, const char *n, const int s ) { + fprintf(stdout, "#define %s %d\n", n, s); +} + +/* Define a uint constant. */ +static void c99_format_uint_const ( const struct flex_backend_t *b, const char *n, const unsigned int u ) { + fprintf(stdout, "#define %s %u\n", n, u); +} + +/* Define a boolean constant. */ +static void c99_format_bool_const ( const struct flex_backend_t *b, const char *n, const int t ){ + fprintf(stdout, "#define %s %d\n", n, t); +} + +/* Define a string constant. */ +static void c99_format_const ( const struct flex_backend_t *b, const char *n, const char *v ) { + fprintf(stdout, "#define %s %s\n", n, v); +} + +/* Define a constant used by the skeleton. */ +static void c99_format_offset_type ( const struct flex_backend_t *b, const char *t ) { + b->format_const(b, "YY_OFFSET_TYPE", t); +} + +/* Define a constant used by the skeleton. */ +static void c99_format_yy_decl ( const struct flex_backend_t *b, const char *d ) { + b->format_const(b, "YY_DECL", d); +} + +/* Define a constant used by the skeleton. */ +static void c99_format_userinit ( const struct flex_backend_t *b, const char *d ) { + b->format_const(b, "YY_USER_INIT", d); +} + +/* Inject the rule_setup macro call where needed. */ +static void c99_format_rule_setup ( const struct flex_backend_t *b ) { + b->verbatim(b, "YY_RULE_SETUP"); + b->newline(b); +} + +/* Define the user_action constant, if needed. */ +static void c99_format_user_preaction ( const struct flex_backend_t *b, const char *d ) { + b->format_const(b, "YY_USER_ACTION", d); +} + +/* End a state case arm, optionally inserting user postactions. + + TODO: Why can't this use YY_STATE_CASE_BREAK from format_user_postaction? +*/ +static void c99_format_state_case_break ( const struct flex_backend_t *b ) { + b->indent(b); + if (!ctrl.postaction) { + fputs("/*LINTED*/break;", stdout); + } + else { + fputs(ctrl.postaction, stdout); + } +} + +/* Generate the definition of the STATE_CASE_BREAK end of action. */ +static void c99_format_user_postaction ( const struct flex_backend_t *b, const char *d ) { + if (d != NULL) { + b->format_const(b, "YY_STATE_CASE_BREAK", d); + } + else { + b->format_const(b, "YY_STATE_CASE_BREAK", "/*LINTED*/break;"); + } +} + +/* Generate the fatal_error action. */ +static void c99_format_fatal_error ( const struct flex_backend_t *b, const char *e ) { + b->indent(b); + fprintf(stdout, "yypanic(%s M4_YY_CALL_LAST_ARG);", e); +} + +/* Generate the echo action. */ +static void c99_echo ( const struct flex_backend_t *b ) { + b->indent(b); + fputs("yyecho();", stdout); +} + +/* Generate the definition of the terminate special action. */ +static void c99_format_yyterminate ( const struct flex_backend_t *b, const char *d ) { + if (d != NULL) { + b->format_const(b, "yyterminate", d); + } + else { + b->format_const(b, "yyterminate", "return NULL"); + } +} + +/* Generate the reject special action. */ +static void c99_format_yyreject ( const struct flex_backend_t *b ) { + b->indent(b); + fputs("yyreject()", stdout); +} + +/* Define a symbol used by the output filter system. + Optionally, leave the definition open to encompass a block of verbatim output. +*/ +static void c99_filter_define_name ( const struct flex_backend_t *b, const char *n, const int leave_open ) { + b->verbatim(b, "m4_define([["); + b->verbatim(b, n); + b->verbatim(b, "]], [["); + if (leave_open) + b->verbatim(b, "m4_dnl"); + else + b->verbatim(b, "]])m4_dnl"); + b->newline(b); +} + +/* Close a filter symbol definition that was left open by a call to filter_define_name. + Optionally, provide a final string of verbatim output to emit before closing the definition block. +*/ +static void c99_filter_define_close (const struct flex_backend_t *b, const char *v) { + b->verbatim(b, v); + b->verbatim(b, "]])m4_dnl"); + b->newline(b); +} + +/* Define a variable used by the output filter system. + Provide a string value the filter will substitue for the variable when it is encountered + later in the output. +*/ +static void c99_filter_define_vars ( const struct flex_backend_t *b, const char *n, const char *v ) { + b->filter_define_name(b, n, true); + b->filter_define_close(b, v); +} + +/* Define a variable used by the output filter system. + Provide a numeric value the filter will substitue for the variable when it is encountered + later in the output. +*/ +static void c99_filter_define_vard ( const struct flex_backend_t *b, const char *n, const int v ) { + b->filter_define_name(b, n, true); + fprintf(stdout, "%d", v); + b->filter_define_close(b, NULL); +} + +/* Format a macro replacement through the output filter system. + Filter macros are defined like variables. The syntax for defining a filter macro depends on the + filter chain in use. + + This example assumes the M4 filter chain where: every variable is a macro; the tokens following + the name are substituted for the macro name; if the first token following the name is an OPAREN, + it is followed by a comma-delimited list of positional parameters that are themselves substituded + into the text after the next CPAREN in place of the tokens '$1', '$2', etc. + + Flex's own filter macros only use one positional argument, currently. +*/ +static void c99_filter_call_macro ( const struct flex_backend_t *b, const char *n, const char *v ) { + b->verbatim(b, n); + b->verbatim(b, "( "); + b->verbatim(b, v); + b->verbatim(b, " )"); + b->newline(b); +} + +/* Construct the c99_backend method table. + This follows the definition in skeletons.h. + cpp-backends.h provides a handle to this structure with external linkage. + skeletons.c imports that handle to access these methods. + That module makes this implementation available to others as an opaque singleton. + + Note that indentation level is managed indepentently for each backend. +*/ +struct flex_backend_t c99_backend = { + .skel = c99_skel, + .indent_level = 0, + .get_int32_type = c99_get_int32_type, + .get_int16_type = c99_get_int16_type, + .get_state_type = c99_get_state_type, + .get_packed_type= c99_get_packed_type, + .open_block_comment = c99_open_block_comment, + .close_block_comment = c99_close_block_comment, + .comment = c99_comment, + .record_separator = c99_record_separator, + .column_separator = c99_column_separator, + .newline = c99_newline, + .increase_indent = c99_increase_indent, + .decrease_indent = c99_decrease_indent, + .indent = c99_indent, + .get_trace_line_format = c99_get_trace_line_format, + .line_directive_out = c99_line_directive_out, + .open_table = c99_open_table, + .continue_table = c99_continue_table, + .close_table = c99_close_table, + .verbatim = c99_verbatim, + .format_data_table_entry = c99_format_data_table_entry, + .format_state_table_entry = c99_format_state_table_entry, + .format_normal_state_case_arm = c99_format_normal_state_case_arm, + .format_eof_state_case_arm = c99_format_eof_state_case_arm, + .eof_state_case_fallthrough = c99_eof_state_case_fallthrough, + .eof_state_case_terminate = c99_eof_state_case_terminate, + .take_yytext = c99_take_yytext, + .release_yytext = c99_release_yytext, + .format_char_rewind = c99_format_char_rewind, + .format_line_rewind = c99_format_line_rewind, + .format_char_forward = c99_format_char_forward, + .format_line_forward = c99_format_line_forward, + .format_byte_const = c99_format_byte_const, + .format_state_const = c99_format_state_const, + .format_size_const = c99_format_size_const, + .format_uint_const = c99_format_uint_const, + .format_bool_const = c99_format_bool_const, + .format_const = c99_format_const, + .format_offset_type = c99_format_offset_type, + .format_yy_decl = c99_format_yy_decl, + .format_userinit = c99_format_userinit, + .format_rule_setup = c99_format_rule_setup, + .format_user_preaction = c99_format_user_preaction, + .format_state_case_break = c99_format_state_case_break, + .format_user_postaction = c99_format_user_postaction, + .format_fatal_error = c99_format_fatal_error, + .echo = c99_echo, + .format_yyterminate = c99_format_yyterminate, + .format_yyreject = c99_format_yyreject, + .filter_define_name = c99_filter_define_name, + .filter_define_close = c99_filter_define_close, + .filter_define_vars = c99_filter_define_vars, + .filter_define_vard = c99_filter_define_vard, + .filter_call_macro = c99_filter_call_macro +}; + diff --git a/src/c99-backend.h b/src/c99-backend.h new file mode 100644 index 000000000..da524831b --- /dev/null +++ b/src/c99-backend.h @@ -0,0 +1,47 @@ +/* c99-backend.h - C99 backend header file for flex */ + +/* Copyright (c) 1990 The Regents of the University of California. */ +/* All rights reserved. */ + +/* This code is derived from software contributed to Berkeley by */ +/* Vern Paxson. */ + +/* The United States Government has rights in this work pursuant */ +/* to contract no. DE-AC03-76SF00098 between the United States */ +/* Department of Energy and the University of California. */ + +/* 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. */ + + +#ifndef FLEX_C99_BACKEND_H +#define FLEX_C99_BACKEND_H 1 + +#include "skeletons.h" + +extern const char *c99_skel[]; + +extern const int C99_BACKEND_MAX_INDENT; + +extern struct flex_backend_t c99_backend; + + +#endif /* FLEX_C99_BACKEND_H */ From e7180365d59106ade17ad9f5477069d5ad068883 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 14:38:08 -0500 Subject: [PATCH 31/37] feat: Add C99 backend --- src/c99-flex.skl | 27 +++++++++++++++++++++----- src/skeletons.c | 50 +++++++++++++++++++++++++++--------------------- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/c99-flex.skl b/src/c99-flex.skl index 9efbadad6..2e57a8595 100644 --- a/src/c99-flex.skl +++ b/src/c99-flex.skl @@ -81,7 +81,7 @@ m4_define([[M4_HOOK_SET_PREACTION]], [[m4_define([[YY_USER_ACTION]], [[$1]])]]) m4_define([[M4_HOOK_STATE_CASE_BREAK]], [[/*LINTED*/break;]]) m4_define([[M4_HOOK_SET_POSTACTION]], [[m4_define([[M4_HOOK_STATE_CASE_BREAK]], [[$1]])]]) m4_define([[M4_HOOK_FATAL_ERROR]], [[yypanic($1, yyscanner);]]) -m4_define([[M4_HOOK_ECHO]], [[yyecho(yyscanner);]]) +m4_define([[M4_HOOK_ECHO]], [[yyecho();]]) m4_define([[yyterminate]], m4_ifdef([[M4_MODE_YYTERMINATE]], [[M4_MODE_YYTERMINATE /* $1 */]], [[return YY_NULL /* $1 */]])) @@ -548,6 +548,17 @@ m4_ifdef( [[]], [[ ]]) }; /* end struct yyguts_t */ +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyscanner->yyin_r +#define yyout yyscanner->yyout_r +#define yyextra yyscanner->yyextra_r +#define yyleng yyscanner->yyleng_r +#define yytext yyscanner->yytext_r +#define yylineno (yy_current_buffer(yyscanner)->bs_yylineno) +#define yycolumn (yy_current_buffer(yyscanner)->bs_yycolumn) +#define yyflexdebug yyscanner->yyflexdebug_r + m4_ifdef( [[M4_YY_BISON_LVAL]], [[ /* This must go here because YYSTYPE and YYLTYPE are included @@ -920,12 +931,16 @@ int yystart(yyscan_t yyscanner) { /* This used to be an fputs(), but since the string might contain NULs, * we now use fwrite(). */ -void yyecho(yyscan_t yyscanner) { +void yyecho_r(yyscan_t yyscanner) { fwrite(yyscanner->yytext_r, (size_t) yyscanner->yyleng_r, 1, yyscanner->yyout_r); } +#define yyecho() yyecho_r(yyscanner) + m4_ifdef( [[M4_YY_NO_YYUNPUT]],, [[ -void yyunput(char c, yyscan_t yyscanner) +#define yyunput(c) yyunput_r(c, yyscanner) + +void yyunput_r(char c, yyscan_t yyscanner) { char *yy_cp; @@ -974,7 +989,7 @@ m4_ifdef( [[M4_MODE_YYLINENO]], %# magic functions, so yy_get_next_buffer() won't need a forward declaration. m4_ifdef([[M4_MODE_YYMORE_USED]], [[ m4_ifdef( [[M4_MODE_YYTEXT_IS_ARRAY]], [[ -void yymore(yyscan_t yyscanner) {yyscanner->yy_more_offset = strlen(yyscanner->yytext_r);} +void yymore_r(yyscan_t yyscanner) {yyscanner->yy_more_offset = strlen(yyscanner->yytext_r);} m4_define([[YY_MORE_ADJ]], [[0]]) m4_define([[YY_RESTORE_YY_MORE_OFFSET]], [[{ yyscanner->yy_more_offset = yyscanner->yy_prev_more_offset; @@ -983,12 +998,14 @@ yyscanner->yyleng_r -= yyscanner->yy_more_offset; ]]) ]]) m4_ifdef( [[M4_MODE_NO_YYTEXT_IS_ARRAY]], [[ -void yymore(yyscan_t yyscanner) {yyscanner->yy_more_flag = true;} +void yymore_r(yyscan_t yyscanner) {yyscanner->yy_more_flag = true;} m4_define([[YY_MORE_ADJ]], [[yyscanner->yy_more_len]]) m4_define([[YY_RESTORE_YY_MORE_OFFSET]], [[]]) ]]) ]]) +#define yymore() yymore_r(yyscanner) + m4_ifdef([[M4_MODE_NO_YYMORE_USED]], [[ m4_define([[YY_MORE_ADJ]], [[0]]) m4_define([[YY_RESTORE_YY_MORE_OFFSET]], [[]]) diff --git a/src/skeletons.c b/src/skeletons.c index 47c933e8d..366bb69b1 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -41,12 +41,7 @@ #include "cpp-backend.h" -const char *c99_skel[] = { -/* FIXME: Refactor like cpp-backend when c99 backend is ready. -#include "c99-flex.h" -*/ - 0, -}; +#include "c99-backend.h" const char *go_skel[] = { /* FIXME: Refactor like cpp-backend when Go backend is ready. @@ -130,12 +125,14 @@ const struct flex_backend_t *get_backend(void) { /* Initialize backends */ void init_backends( void ) { backends[FLEX_BACKEND_CPP] = cpp_backend; - backends[FLEX_BACKEND_C99].skel=c99_skel; + backends[FLEX_BACKEND_C99] = c99_backend; backends[FLEX_BACKEND_GO].skel=go_skel; backends[FLEX_BACKEND_ID_MAX] = (struct flex_backend_t){NULL}; } /* Functions for querying skeleton properties. */ +const char *_skel_property(const flex_backend_id_t backend_id, const char *propname); +static bool _boneseeker(const flex_backend_id_t backend_id, const char *bone); /* TODO: What does this mean now? */ bool is_default_backend(void) @@ -145,11 +142,15 @@ bool is_default_backend(void) /* Search for a string in the skeleton prolog, where macros are defined. */ -static bool boneseeker(const char *bone) +static bool boneseeker(const char *bone) { + return _boneseeker(top_backend(), bone); +} + +static bool _boneseeker(const flex_backend_id_t backend_id, const char *bone) { int i; - const struct flex_backend_t *backend = get_backend(); + const struct flex_backend_t *backend = &backends[backend_id]; for (i = 0; backend->skel[i] != NULL; i++) { const char *line = backend->skel[i]; @@ -164,38 +165,39 @@ static bool boneseeker(const char *bone) flex_backend_id_t backend_by_name(const char *name) { const char *prefix_property; - flex_backend_id_t backend = FLEX_BACKEND_DEFAULT, i = FLEX_BACKEND_DEFAULT; + flex_backend_id_t backend_id = FLEX_BACKEND_DEFAULT, i = FLEX_BACKEND_DEFAULT; if (name != NULL) { if (strcmp(name, "nr") == 0) { - backend = FLEX_BACKEND_CPP; + backend_id = FLEX_BACKEND_CPP; ctrl.reentrant = false; goto backend_ok; } if (strcmp(name, "r") == 0) { - backend = FLEX_BACKEND_CPP; + backend_id = FLEX_BACKEND_CPP; ctrl.reentrant = true; goto backend_ok; } for (i = 0; backends[i].skel != NULL && i < FLEX_BACKEND_ID_MAX; ++i) { - if (strcasecmp(skel_property("M4_PROPERTY_BACKEND_NAME"), name) == 0) - backend = i; + if (strcasecmp(_skel_property(i, "M4_PROPERTY_BACKEND_NAME"), name) == 0) { + backend_id = i; goto backend_ok; + } } flexerror(_("no such back end")); return FLEX_BACKEND_ID_MAX; } backend_ok: ctrl.rewrite = !is_default_backend(); - ctrl.backend_name = xstrdup(skel_property("M4_PROPERTY_BACKEND_NAME")); - ctrl.traceline_re = xstrdup(skel_property("M4_PROPERTY_TRACE_LINE_REGEXP")); - ctrl.traceline_template = xstrdup(skel_property("M4_PROPERTY_TRACE_LINE_TEMPLATE")); - ctrl.have_state_entry_format = boneseeker("m4_define([[M4_HOOK_STATE_ENTRY_FORMAT]]"); - prefix_property = skel_property("M4_PROPERTY_PREFIX"); + ctrl.backend_name = xstrdup(_skel_property(backend_id, "M4_PROPERTY_BACKEND_NAME")); + ctrl.traceline_re = xstrdup(_skel_property(backend_id, "M4_PROPERTY_TRACE_LINE_REGEXP")); + ctrl.traceline_template = xstrdup(_skel_property(backend_id, "M4_PROPERTY_TRACE_LINE_TEMPLATE")); + ctrl.have_state_entry_format = _boneseeker(backend_id, "m4_define([[M4_HOOK_STATE_ENTRY_FORMAT]]"); + prefix_property = _skel_property(backend_id, "M4_PROPERTY_PREFIX"); if (prefix_property != NULL) ctrl.prefix = xstrdup(prefix_property); flex_init_regex(ctrl.traceline_re); - return backend; + return backend_id; } const char *suffix (void) @@ -218,12 +220,16 @@ const char *suffix (void) * definition must be single-line. Don't call this a second time before * stashing away the previous return, we cheat with static buffers. */ -const char *skel_property(const char *propname) +const char *skel_property(const char *propname){ + return _skel_property(top_backend(), propname); +} + +const char *_skel_property(const flex_backend_id_t backend_id, const char *propname) { int i; static char name[256], value[256], *np, *vp;; const char *cp; - const struct flex_backend_t *backend = get_backend(); + const struct flex_backend_t *backend = &backends[backend_id]; for (i = 0; backend->skel[i] != NULL; i++) { const char *line = backend->skel[i]; From 20899a9e63cd47b313c7d558855ee1e3a680d4c2 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Thu, 6 Feb 2025 14:40:56 -0500 Subject: [PATCH 32/37] revert: 3a368c0 and 91982ad Those changes were made to fix failing tests, but the tests were acutally failing because the backend was missing. --- tests/alloc_extra_c99.l | 1 - tests/alloc_extra_r | Bin 0 -> 53984 bytes tests/alloc_extra_r.c | 2366 +++++++++++++++++++++++++++ tests/mem_c99.l | 1 - tests/prefix_c99.l | 1 - tests/state_buf.direct | Bin 0 -> 160624 bytes tests/state_buf.direct.cc | 2316 ++++++++++++++++++++++++++ tests/state_buf_multiple.direct | Bin 0 -> 192216 bytes tests/state_buf_multiple.direct.cc | 2322 ++++++++++++++++++++++++++ tests/string_c99.l | 1 - tests/testmaker.m4 | 1 - tests/yyextra_c99.l | 1 - tests/yywrap_r.i3 | Bin 0 -> 55032 bytes tests/yywrap_r.i3.c | 2433 ++++++++++++++++++++++++++++ 14 files changed, 9437 insertions(+), 6 deletions(-) create mode 100755 tests/alloc_extra_r create mode 100644 tests/alloc_extra_r.c create mode 100755 tests/state_buf.direct create mode 100644 tests/state_buf.direct.cc create mode 100755 tests/state_buf_multiple.direct create mode 100644 tests/state_buf_multiple.direct.cc create mode 100755 tests/yywrap_r.i3 create mode 100644 tests/yywrap_r.i3.c diff --git a/tests/alloc_extra_c99.l b/tests/alloc_extra_c99.l index 72bcde781..d99a4ca06 100644 --- a/tests/alloc_extra_c99.l +++ b/tests/alloc_extra_c99.l @@ -51,7 +51,6 @@ static void check_extra ( yyscan_t scanner ); %option 8bit %option nounput nomain noyywrap nodefault noinput %option warn -%option reentrant %option extra-type="struct Check *" %option noyyalloc diff --git a/tests/alloc_extra_r b/tests/alloc_extra_r new file mode 100755 index 0000000000000000000000000000000000000000..fbb0b7368e8872d86db97e8590517e242ca97b8c GIT binary patch literal 53984 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 Ap8x;= literal 0 HcmV?d00001 diff --git a/tests/alloc_extra_r.c b/tests/alloc_extra_r.c new file mode 100644 index 000000000..5ecbbdccc --- /dev/null +++ b/tests/alloc_extra_r.c @@ -0,0 +1,2366 @@ + +/* A lexical scanner generated by flex */ + +/* Target: C/C++ */ +/* START of m4 controls */ +/* struct Check * = struct Check * */ +/* 0 = 0 */ +/* */ +/* 0 = 0 */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* test = test */ +/* */ +/* */ +/* */ +/* */ +/* END of m4 controls */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +#ifdef yy_create_buffer +#define test_create_buffer_ALREADY_DEFINED +#else +#define yy_create_buffer test_create_buffer +#endif + +#ifdef yy_delete_buffer +#define test_delete_buffer_ALREADY_DEFINED +#else +#define yy_delete_buffer test_delete_buffer +#endif + +#ifdef yy_scan_buffer +#define test_scan_buffer_ALREADY_DEFINED +#else +#define yy_scan_buffer test_scan_buffer +#endif + +#ifdef yy_scan_string +#define test_scan_string_ALREADY_DEFINED +#else +#define yy_scan_string test_scan_string +#endif + +#ifdef yy_scan_bytes +#define test_scan_bytes_ALREADY_DEFINED +#else +#define yy_scan_bytes test_scan_bytes +#endif + +#ifdef yy_init_buffer +#define test_init_buffer_ALREADY_DEFINED +#else +#define yy_init_buffer test_init_buffer +#endif + +#ifdef yy_flush_buffer +#define test_flush_buffer_ALREADY_DEFINED +#else +#define yy_flush_buffer test_flush_buffer +#endif + +#ifdef yy_load_buffer_state +#define test_load_buffer_state_ALREADY_DEFINED +#else +#define yy_load_buffer_state test_load_buffer_state +#endif + +#ifdef yy_switch_to_buffer +#define test_switch_to_buffer_ALREADY_DEFINED +#else +#define yy_switch_to_buffer test_switch_to_buffer +#endif + +#ifdef yypush_buffer_state +#define testpush_buffer_state_ALREADY_DEFINED +#else +#define yypush_buffer_state testpush_buffer_state +#endif + +#ifdef yypop_buffer_state +#define testpop_buffer_state_ALREADY_DEFINED +#else +#define yypop_buffer_state testpop_buffer_state +#endif + +#ifdef yyensure_buffer_stack +#define testensure_buffer_stack_ALREADY_DEFINED +#else +#define yyensure_buffer_stack testensure_buffer_stack +#endif + +#ifdef yylex +#define testlex_ALREADY_DEFINED +#else +#define yylex testlex +#endif + +#ifdef yyrestart +#define testrestart_ALREADY_DEFINED +#else +#define yyrestart testrestart +#endif + +#ifdef yylex_init +#define testlex_init_ALREADY_DEFINED +#else +#define yylex_init testlex_init +#endif + +#ifdef yylex_init_extra +#define testlex_init_extra_ALREADY_DEFINED +#else +#define yylex_init_extra testlex_init_extra +#endif + +#ifdef yylex_destroy +#define testlex_destroy_ALREADY_DEFINED +#else +#define yylex_destroy testlex_destroy +#endif + +#ifdef yyget_debug +#define testget_debug_ALREADY_DEFINED +#else +#define yyget_debug testget_debug +#endif + +#ifdef yyset_debug +#define testset_debug_ALREADY_DEFINED +#else +#define yyset_debug testset_debug +#endif + +#ifdef yyget_extra +#define testget_extra_ALREADY_DEFINED +#else +#define yyget_extra testget_extra +#endif + +#ifdef yyset_extra +#define testset_extra_ALREADY_DEFINED +#else +#define yyset_extra testset_extra +#endif + +#ifdef yyget_in +#define testget_in_ALREADY_DEFINED +#else +#define yyget_in testget_in +#endif + +#ifdef yyset_in +#define testset_in_ALREADY_DEFINED +#else +#define yyset_in testset_in +#endif + +#ifdef yyget_out +#define testget_out_ALREADY_DEFINED +#else +#define yyget_out testget_out +#endif + +#ifdef yyset_out +#define testset_out_ALREADY_DEFINED +#else +#define yyset_out testset_out +#endif + +#ifdef yyget_leng +#define testget_leng_ALREADY_DEFINED +#else +#define yyget_leng testget_leng +#endif + +#ifdef yyget_text +#define testget_text_ALREADY_DEFINED +#else +#define yyget_text testget_text +#endif + +#ifdef yyget_lineno +#define testget_lineno_ALREADY_DEFINED +#else +#define yyget_lineno testget_lineno +#endif + +#ifdef yyset_lineno +#define testset_lineno_ALREADY_DEFINED +#else +#define yyset_lineno testset_lineno +#endif + +#ifdef yyget_column +#define testget_column_ALREADY_DEFINED +#else +#define yyget_column testget_column +#endif + +#ifdef yyset_column +#define testset_column_ALREADY_DEFINED +#else +#define yyset_column testset_column +#endif + +#ifdef yywrap +#define testwrap_ALREADY_DEFINED +#else +#define yywrap testwrap +#endif + +#ifdef yyalloc +#define testalloc_ALREADY_DEFINED +#else +#define yyalloc testalloc +#endif + +#ifdef yyrealloc +#define testrealloc_ALREADY_DEFINED +#else +#define yyrealloc testrealloc +#endif + +#ifdef yyfree +#define testfree_ALREADY_DEFINED +#else +#define yyfree testfree +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ + +/* Feature test macros. Flex uses functions that require a minimum set of + * macros defined. As defining some macros may hide function declarations that + * user code might use, be conservative and respect user's definitions as much + * as possible. In glibc, feature test macros may not be all set up until one + * of the libc header (that includes ) is included. This creates + * a circular dependency when we check the macros. is the safest + * header we can include and does not declare too many functions we don't need. + */ +#if !defined(__GNU_LIBRARY__) && defined(__STDC__) +#include +#endif +#if !(defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_POSIX_SOURCE)) +# define _POSIX_C_SOURCE 1 /* Required for fileno() */ +# define _POSIX_SOURCE 1 +#endif +#include +#include +#include +#include + +/* end standard C headers. */ + +/* begin standard C++ headers. */ + +/* flex integer type definitions */ + +#ifndef YYFLEX_INTTYPES_DEFINED +#define YYFLEX_INTTYPES_DEFINED + +/* Prefer C99 integer types if available. */ + +# if defined(__cplusplus) && __cplusplus >= 201103L +#include +# define YYFLEX_USE_STDINT +# endif +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +/* Include and not because Solaris 2.6 has the former + * and not the latter. + */ +#include +# define YYFLEX_USE_STDINT +# else +# if defined(_MSC_VER) && _MSC_VER >= 1600 +/* Visual C++ 2010 does not define __STDC_VERSION__ and has but not + * . + */ +#include +# define YYFLEX_USE_STDINT +# endif +# endif +# ifdef YYFLEX_USE_STDINT +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 unsigned char flex_uint8_t; +typedef short int flex_int16_t; +typedef unsigned short int flex_uint16_t; +# ifdef __STDC__ +typedef signed char flex_int8_t; +/* ISO C only requires at least 16 bits for int. */ +# ifdef __cplusplus +#include +# else +#include +# endif +# if UINT_MAX >= 4294967295 +# define YYFLEX_INT32_DEFINED +typedef int flex_int32_t; +typedef unsigned int flex_uint32_t; +# endif +# else +typedef char flex_int8_t; +# endif +# ifndef YYFLEX_INT32_DEFINED +typedef long int flex_int32_t; +typedef unsigned long int flex_uint32_t; +# endif +# endif +#endif /* YYFLEX_INTTYPES_DEFINED */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. + */ +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yyflexdebug yyg->yyflexdebug_r + +/* 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 yybegin(s) yyg->yy_start = 1 + 2 * (s) +/* Legacy interface */ +#define BEGIN yyg->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 yystart() ((yyg->yy_start - 1) / 2) +/* Legacy interfaces */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin , 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, + * plus the start state, plus the two end-of-buffer byte states. + */ +#define YY_STATE_BUF_EXTRA_SPACE 3 +#define YY_STATE_BUF_SIZE (YY_BUF_SIZE + YY_STATE_BUF_EXTRA_SPACE) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *yybuffer; +/* Legacy interface */ +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +#define yyunput(c) yyunput_r( c, yyg->yytext_ptr , yyscanner ) +/* Legacy interface */ +#define unput(c) yyunput_r( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yyatbol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* 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() ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) +/* Legacy interface */ +#define YY_CURRENT_BUFFER yy_current_buffer() +/* 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 yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void yyrestart ( FILE *input_file , yyscan_t yyscanner ); +void yy_switch_to_buffer ( yybuffer new_buffer , yyscan_t yyscanner ); +yybuffer yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); +void yy_delete_buffer ( yybuffer b , yyscan_t yyscanner ); +void yy_flush_buffer ( yybuffer b , yyscan_t yyscanner ); +void yypush_buffer_state ( yybuffer new_buffer , yyscan_t yyscanner ); +void yypop_buffer_state ( 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 ( yybuffer b, FILE *file , yyscan_t yyscanner ); +#define yy_flush_current_buffer() yy_flush_buffer( yy_current_buffer() , yyscanner) +#define YY_FLUSH_BUFFER yy_flush_current_buffer() + +yybuffer yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); +yybuffer yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); +yybuffer yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); + +void *yyalloc ( yy_size_t , yyscan_t yyscanner ); +void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); +void yyfree ( void * , yyscan_t yyscanner ); + +#define yy_new_buffer yy_create_buffer +#define yy_set_interactive(is_interactive) { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +} +#define yysetbol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} +#define yyatbol() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +/* Legacy interface */ +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +#define yy_set_bol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} + +/* Begin user sect3 */ + +#define testwrap(yyscanner) (/*CONSTCOND*/1) + +#define YY_SKIP_YYWRAP + +typedef flex_uint8_t YY_CHAR; + +typedef int yy_state_type; + +/* Watch out: yytext_ptr is a variable when yytext is an array, + * but it's a macro when yytext is a pointer. + */ + +#define yytext_ptr yytext_r + +/* %% [1.5] DFA */ +/* START of m4 controls */ +/* */ +/* */ +/* */ +/* END of m4 controls */ +/* START of Flex-generated definitions */#define YY_NUM_RULES 2 +#define YY_END_OF_BUFFER 3 +#define YY_JAMBASE 5 +#define YY_JAMSTATE 6 +#define YY_NUL_EC 1 +#define YY_OFFSET_TYPE flex_int16_t + +/* END of Flex-generated definitions */ + +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 yynoreturn yypanic ( const char* msg , yyscan_t yyscanner ); + +struct yy_trans_info + { + /* We require that yy_verify and yy_nxt must be of the same size int. */ + + /* We generate a bogus 'struct yy_trans_info' data type + * so we can guarantee that it is always declared in the skel. + * This is so we can compile "sizeof(struct yy_trans_info)" + * in any scanner. + */ + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + + }; + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + do { \ + yyg->yytext_ptr = yy_bp; \ + \ + yyleng = (int) (yy_cp - yy_bp); \ + \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + \ + yyg->yy_c_buf_p = yy_cp; \ + } while(0) + +/* %% [2.0] data tables for the DFA are inserted here */ + +/* footprint: 884 bytes */ +/* tblend: 8 */ +/* numecs: 3 */ +/* num_rules: 2 */ +/* lastdfa: 5 */ + +/* m4 controls begin */ +/* */ +/* */ +/* m4 controls end */ + +static const flex_int16_t yy_accept[7] = { 0, + + 0, 0, 3, 1, 1, 0 +}; + +/* Character equivalence-class mapping */ +static const YY_CHAR yy_ec[256] = { 0, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 +}; + +/* Character meta-equivalence-class mappings */ +static const YY_CHAR yy_meta[4] = { 0, + + 1, 1, 1 +}; + +static const flex_int16_t yy_base[7] = { 0, + + 0, 0, 4, 5, 5, 5 +}; + +static const flex_int16_t yy_def[7] = { 0, + + 6, 1, 6, 6, 6, 0 +}; + +static const flex_int16_t yy_nxt[9] = { 0, + + 4, 4, 5, 6, 3, 6, 6, 6 +}; + +static const flex_int16_t yy_chk[9] = { 0, + + 1, 1, 1, 3, 6, 6, 6, 6 +}; + +/* The intent behind this definition is that it'll catch + * any uses of yyreject() which flex missed. + */ +#define yyreject() reject_used_but_not_detected +#define REJECT reject_used_but_not_detected + +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET + +/* %% [3.0] static declarations conditional on mode switches go here */ +/* + * 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 file to build "scanner.c". */ +/* This tests that we can use "yyextra". + We buffer all input into a growable array, then print it. + We run diff on the input and output. +*/ + +#include +#include +#include "config.h" + +/* We'll store the entire input in this buffer, growing as necessary. */ +struct Check { + char foo; + char *bar; + char qux; +}; + +/* Save char into junk array at next position. */ +static void check_extra ( yyscan_t scanner ); + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ + +#include + +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t { + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + yybuffer * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yyflexdebug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + +}; /* end struct yyguts_t */ + +static int yy_init_globals ( yyscan_t yyscanner ); + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( yyscan_t yyscanner ); + +int yyget_debug ( yyscan_t yyscanner ); + +void yyset_debug ( int debug_flag , yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); + +FILE *yyget_in ( yyscan_t yyscanner ); + +void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); + +FILE *yyget_out ( yyscan_t yyscanner ); + +void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); + + int yyget_leng ( yyscan_t yyscanner ); + +char *yyget_text ( yyscan_t yyscanner ); + +int yyget_lineno ( yyscan_t yyscanner ); + +void yyset_lineno ( int _line_number , yyscan_t yyscanner ); + +int yyget_column ( yyscan_t yyscanner ); + +void yyset_column ( int _column_no , yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap ( yyscan_t yyscanner ); +#else +extern int yywrap ( yyscan_t yyscanner ); +#endif +#endif + +#ifndef YY_NO_YYUNPUT + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +#endif + +#define YY_NO_YYINPUT 1 + +#ifndef YY_NO_YYINPUT + +static int yyinput ( yyscan_t yyscanner ); +#ifndef __cplusplus +#define input yyinput +#endif + +#endif + +/* + * Amount of stuff to slurp up with each read. + * We assume the stdio library has already + * chosen a fit size foe whatever platform + * we're running on. + */ +#define YY_READ_BUF_SIZE BUFSIZ + +/* Size of default input buffer. We want to be able to fit two + * OS-level reads, but efficiency gains as the buffer size + * increases fall off after that + */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE (2 * YY_READ_BUF_SIZE) +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef yyecho + +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define yyecho() do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) + +#endif +/* Legacy interface */ +#define ECHO yyecho() + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yypanic (const char* msg , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Report a fatal error. Legacy interface. */ +#ifndef YY_FATAL_ERROR + +#define YY_FATAL_ERROR(msg) yypanic( msg , yyscanner) + +#endif + +/* Legacy interface */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) do {result = yyread(buf, max_size , yyscanner);} while (0) + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ + +static int yyread(char *buf, size_t max_size , yyscan_t yyscanner) { + + int result; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) { + int c = '*'; + yy_size_t n; + for ( n = 0; n < max_size && + (c = getc( yyin )) != EOF && c != '\n'; ++n ) { + buf[n] = (char) c; + } + if ( c == '\n' ) { + buf[n++] = (char) c; + } + if ( c == EOF && ferror( yyin ) ) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + } + result = n; + } else { + errno=0; + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) { + if( errno != EINTR) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + break; + } + errno=0; + clearerr(yyin); + } + } + + return result; +} +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (yyscan_t yyscanner); + +#define YY_DECL int yylex (yyscan_t yyscanner) + +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL { + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( !yyg->yy_init ) { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) { + yyg->yy_start = 1; /* first start state */ + } + if ( ! yyin ) { + + yyin = stdin; + + } + if ( ! yyout ) { + + yyout = stdout; + + } + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + } + + yy_load_buffer_state( yyscanner ); + } + + /* open scope of user declarationns */ + { +/* %% [4.0] user's declarations go here */ + + while ( /*CONSTCOND*/1 ) { /* loops until end-of-file is reached */ + + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + /* Generate the code to find the start state. */ + + yy_current_state = yyg->yy_start; + + /* Set up for storing up states. */ + + yy_match: + /* Generate the code to find the next match. */ + + do { + + int yy_c = *(yy_ec+YY_SC_TO_UI(*yy_cp)); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + /* Generate code to keep backing-up information. */ + + if ( yy_accept[yy_current_state] ) { + + yyg->yy_last_accepting_state = yy_current_state; + yyg->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]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + ++yy_cp; + + } + while ( yy_base[yy_current_state] != YY_JAMBASE ); + + yy_find_action: + /* code to find the action number goes here */ + + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) { /* have to back up */ + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->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 = yyg->yy_hold_char; + + /* Backing-up info for compressed tables is taken \after/ */ + /* yy_cp has been incremented for the next state. */ + yy_cp = yyg->yy_last_accepting_cpos; + + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +/* %% [5.0] user actions get inserted here */ + case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP + +{ check_extra (yyscanner); } + /*LINTED*/break; + case 2: +YY_RULE_SETUP + +yypanic("flex scanner jammed" , yyscanner); + /*LINTED*/break; + +case YY_STATE_EOF(INITIAL): /* FALLTHROUGH */ +yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer() and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->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() 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 = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } else { + + /* Still need to initialize yy_cp, though + * yy_current_state was set up by + * yy_get_previous_state(). + */ + yy_cp = yyg->yy_c_buf_p; + + goto yy_find_action; + } + } else { /* not a NUL */ + switch ( yy_get_next_buffer( yyscanner ) ) { + case EOB_ACT_END_OF_FILE: + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( yywrap( yyscanner ) ) { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(yystart()); + goto do_action; + } else { + if ( ! yyg->yy_did_buffer_switch_on_eof ) { + YY_NEW_FILE; + } + } + break; + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } /* end EOB inner switch */ + } /* end if */ + break; + } /* case YY_END_OF_BUFFER */ + default: + YY_FATAL_ERROR("fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer (yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = yyg->yytext_ptr; + int number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) { + YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { + /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->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) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); + + for ( i = 0; i < number_to_move; ++i ) { + *(dest++) = *(source++); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) { + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + } else { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + yybuffer b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) { + b->yy_buf_size += b->yy_buf_size / 8; + } else { + b->yy_buf_size *= 2; + } + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + } else { + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + } + if ( ! b->yy_ch_buf ) { + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + } + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) { + num_to_read = YY_READ_BUF_SIZE; + } + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) { + if ( number_to_move == YY_MORE_ADJ ) { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin , yyscanner); + } else { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } else { + ret_val = EOB_ACT_CONTINUE_SCAN; + } + if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1) + 2; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner) + +{ + yy_state_type yy_current_state; + char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Generate the code to find the start state. */ + + yy_current_state = yyg->yy_start; + + /* Set up for storing up states. */ + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) { + /* Generate the code to find the next state. */ + + int yy_c = (*yy_cp ? *(yy_ec+YY_SC_TO_UI(*yy_cp)) : YY_NUL_EC); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + /* Generate code to keep backing-up information. */ + + if ( yy_accept[yy_current_state] ) { + + yyg->yy_last_accepting_state = yy_current_state; + yyg->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]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) + +{ + int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + /* Generate code for handling NUL's, if needed. */ + + /* First, deal with backing up and setting up yy_cp if the scanner + * finds that it should JAM on the NUL. + * + * Only generate a definition for "yy_cp" if we'll generate code + * that uses it. Otherwise lint and the like complain. + */ + char *yy_cp = yyg->yy_c_buf_p; + + int yy_c = YY_NUL_EC; + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + /* Generate code to keep backing-up information. */ + + if ( yy_accept[yy_current_state] ) { + + yyg->yy_last_accepting_state = yy_current_state; + yyg->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]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + +yy_is_jam = (yy_current_state == YY_JAMSTATE); + + (void)yyg; + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_YYINPUT +int yyinput (yyscan_t yyscanner) + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->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 ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + } else { + /* need more input */ + int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); + ++yyg->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. */ + yyrestart( yyin , yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + if ( yywrap( yyscanner ) ) { + return 0; + } + if ( ! yyg->yy_did_buffer_switch_on_eof ) { + YY_NEW_FILE; + } + return yyinput(yyscanner); + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + return c; +} + +#endif /* ifndef YY_NO_YYINPUT */ + +/** 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 yyrestart (FILE * input_file , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + } + + yy_init_buffer( YY_CURRENT_BUFFER_LVALUE, input_file , yyscanner); + 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. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + +void yy_switch_to_buffer (yybuffer new_buffer , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (yyscanner); + if ( yy_current_buffer() == new_buffer ) { + return; + } + if ( yy_current_buffer() ) { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->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. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void yy_load_buffer_state (yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + + yyg->yy_hold_char = *yyg->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. + */ + +yybuffer yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) + +{ + yybuffer b; + + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + if ( b->yy_ch_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file , yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * @param yyscanner The scanner object. + */ + +void yy_delete_buffer (yybuffer b , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( b == NULL ) { + return; + } + if ( b == yy_current_buffer() ) { /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (yybuffer) 0; + } + if ( b->yy_is_our_buffer ) { + yyfree( (void *) b->yy_ch_buf , yyscanner ); + } + yyfree( (void *) b , yyscanner ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + +static void yy_init_buffer (yybuffer b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_flush_buffer( b , yyscanner); + + b->yy_input_file = file; + + /* b->yy_input_file should never by NULL but we'll handle it cleanly + * on the off chance. + */ + if (b->yy_input_file == NULL){ + b->yy_fill_buffer = 0; + } else { + b->yy_fill_buffer = 1; + } + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != yy_current_buffer()) { + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c yy_current_buffer(). + * @param yyscanner The scanner object. + */ + +void yy_flush_buffer (yybuffer b , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( b == NULL ) { + return; + } + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yyatbol = 1; + b->yy_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 yypush_buffer_state (yybuffer new_buffer , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) { + return; + } + yyensure_buffer_stack(yyscanner); + + /* This block is copied from yy_switch_to_buffer. */ + if ( yy_current_buffer() != NULL ) { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (yy_current_buffer()) { + yyg->yy_buffer_stack_top++; + } + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( yyscanner ); + yyg->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 yypop_buffer_state (yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (yy_current_buffer() == NULL) { + return; + } + yy_delete_buffer(yy_current_buffer() , yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) { + --yyg->yy_buffer_stack_top; + } + if (yy_current_buffer() != NULL) { + yy_load_buffer_state( yyscanner ); + yyg->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) + +{ + yy_size_t num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (yyg->yy_buffer_stack == NULL) { + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( yyg->yy_buffer_stack == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1) { + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if (yyg->yy_buffer_stack == NULL) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->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. + */ +yybuffer yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + yybuffer b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) { + /* They forgot to leave room for the EOB's. */ + return NULL; + } + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + } + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yyatbol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b , yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @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 + * yy_scan_bytes() instead. + */ +yybuffer yy_scan_string (const char * yystr , yyscan_t yyscanner) +{ + + return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +yybuffer yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) { + yybuffer b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n , yyscanner ); + if ( buf == 0 ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + } + for ( i = 0; i < _yybytes_len; ++i ) { + buf[i] = yybytes[i]; + } + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n , yyscanner); + if ( b == NULL ) { + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + } + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +/* 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] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int yyget_lineno (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (yy_current_buffer() == NULL) { + return 0; + } + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int yyget_column (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (yy_current_buffer() == NULL) { + return 0; + } + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_in (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_out (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int yyget_leng (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *yyget_text (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_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 yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param _line_number line number + * @param yyscanner The scanner object. + */ +void yyset_lineno (int _line_number , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (yy_current_buffer() == NULL ) { + YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + } + + yylineno = _line_number; +} + +/** Set the current column. + * @param _column_no column number + * @param yyscanner The scanner object. + */ +void yyset_column (int _column_no , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (yy_current_buffer() == NULL ) { + YY_FATAL_ERROR( "yyset_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 yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = _out_str ; +} + +int yyget_debug (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyflexdebug; +} + +void yyset_debug (int _bdebug , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyflexdebug = _bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ +int yylex_init(yyscan_t* ptr_yy_globals) { + if (ptr_yy_globals == NULL) { + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL) { + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ +int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) { + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL) { + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL) { + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = NULL; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(yy_current_buffer()) { + yypop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + yyfree(yyg->yy_buffer_stack , yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + yyfree( yyg->yy_start_stack , yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner , yyscanner ); + yyscanner = NULL; + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + int i; + for ( i = 0; i < n; ++i ) { + s1[i] = s2[i]; + } +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (const char * s , yyscan_t yyscanner) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +int main(void); + +int +main (void) +{ + yyscan_t scanner; + struct Check check; + + check.foo = 'a'; + check.bar = NULL; + check.qux = 'z'; + + testlex_init_extra(&check, &scanner); + testset_in(stdin, scanner); + testset_out(stdout, scanner); + + /* Test to confirm that testalloc was called from + * testlex_init_extra with the testextra argument. + */ + check_extra(scanner); + + testlex(scanner); + + testlex_destroy(scanner); + return 0; +} + +void *testalloc(size_t size, yyscan_t scanner) +{ + struct Check *check; + check = testget_extra(scanner); + + if (!check->bar) + check->bar = "Hello World"; + + check_extra(scanner); + + return malloc(size); +} + +/* Save char into junk array at next position. */ +static void check_extra(yyscan_t scanner) +{ + struct Check *check; + check = testget_extra(scanner); + + if (check->foo != 'a') { + fprintf(stderr, "foo is not 'a'\n"); + exit(1); + } + if (strcmp(check->bar, "Hello World") != 0) { + fprintf(stderr, "bar is not Hello World\n"); + exit(1); + } + if (check->qux != 'z') { + fprintf(stderr, "qux is not 'z'\n"); + exit(1); + } +} + diff --git a/tests/mem_c99.l b/tests/mem_c99.l index a47c1b35e..d6ec025c4 100644 --- a/tests/mem_c99.l +++ b/tests/mem_c99.l @@ -44,7 +44,6 @@ void yyfree ( void *, yyscan_t yyscanner ); %option emit="c99" bufsize=8 %option 8bit -%option reentrant %option nounput nomain noyywrap noinput noyy_top_state %option warn stack nodefault %option noyyalloc noyyrealloc noyyfree diff --git a/tests/prefix_c99.l b/tests/prefix_c99.l index dbebebb71..8f484cc8d 100644 --- a/tests/prefix_c99.l +++ b/tests/prefix_c99.l @@ -33,7 +33,6 @@ %option 8bit prefix="FOO" %option nounput nomain noyywrap noinput %option warn -%option reentrant %% diff --git a/tests/state_buf.direct b/tests/state_buf.direct new file mode 100755 index 0000000000000000000000000000000000000000..73b02d6aed79c40e949ca8e2447d4b33b3cb2a01 GIT binary patch literal 160624 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

-wEGqh}$^X$@F< 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 literal 0 HcmV?d00001 diff --git a/tests/state_buf.direct.cc b/tests/state_buf.direct.cc new file mode 100644 index 000000000..edc264e1c --- /dev/null +++ b/tests/state_buf.direct.cc @@ -0,0 +1,2316 @@ + +/* A lexical scanner generated by flex */ + +/* Target: C/C++ */ +/* START of m4 controls */ +/* 0 = 0 */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* test = test */ +/* */ +/* END of m4 controls */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +#ifdef yy_create_buffer +#define test_create_buffer_ALREADY_DEFINED +#else +#define yy_create_buffer test_create_buffer +#endif + +#ifdef yy_delete_buffer +#define test_delete_buffer_ALREADY_DEFINED +#else +#define yy_delete_buffer test_delete_buffer +#endif + +#ifdef yy_scan_buffer +#define test_scan_buffer_ALREADY_DEFINED +#else +#define yy_scan_buffer test_scan_buffer +#endif + +#ifdef yy_scan_string +#define test_scan_string_ALREADY_DEFINED +#else +#define yy_scan_string test_scan_string +#endif + +#ifdef yy_scan_bytes +#define test_scan_bytes_ALREADY_DEFINED +#else +#define yy_scan_bytes test_scan_bytes +#endif + +#ifdef yy_init_buffer +#define test_init_buffer_ALREADY_DEFINED +#else +#define yy_init_buffer test_init_buffer +#endif + +#ifdef yy_flush_buffer +#define test_flush_buffer_ALREADY_DEFINED +#else +#define yy_flush_buffer test_flush_buffer +#endif + +#ifdef yy_load_buffer_state +#define test_load_buffer_state_ALREADY_DEFINED +#else +#define yy_load_buffer_state test_load_buffer_state +#endif + +#ifdef yy_switch_to_buffer +#define test_switch_to_buffer_ALREADY_DEFINED +#else +#define yy_switch_to_buffer test_switch_to_buffer +#endif + +#ifdef yypush_buffer_state +#define testpush_buffer_state_ALREADY_DEFINED +#else +#define yypush_buffer_state testpush_buffer_state +#endif + +#ifdef yypop_buffer_state +#define testpop_buffer_state_ALREADY_DEFINED +#else +#define yypop_buffer_state testpop_buffer_state +#endif + +#ifdef yyensure_buffer_stack +#define testensure_buffer_stack_ALREADY_DEFINED +#else +#define yyensure_buffer_stack testensure_buffer_stack +#endif + +#ifdef yylex +#define testlex_ALREADY_DEFINED +#else +#define yylex testlex +#endif + +#ifdef yyrestart +#define testrestart_ALREADY_DEFINED +#else +#define yyrestart testrestart +#endif + +#ifdef yylex_init +#define testlex_init_ALREADY_DEFINED +#else +#define yylex_init testlex_init +#endif + +#ifdef yylex_init_extra +#define testlex_init_extra_ALREADY_DEFINED +#else +#define yylex_init_extra testlex_init_extra +#endif + +#ifdef yylex_destroy +#define testlex_destroy_ALREADY_DEFINED +#else +#define yylex_destroy testlex_destroy +#endif + +#ifdef yyget_debug +#define testget_debug_ALREADY_DEFINED +#else +#define yyget_debug testget_debug +#endif + +#ifdef yyset_debug +#define testset_debug_ALREADY_DEFINED +#else +#define yyset_debug testset_debug +#endif + +#ifdef yyget_extra +#define testget_extra_ALREADY_DEFINED +#else +#define yyget_extra testget_extra +#endif + +#ifdef yyset_extra +#define testset_extra_ALREADY_DEFINED +#else +#define yyset_extra testset_extra +#endif + +#ifdef yyget_in +#define testget_in_ALREADY_DEFINED +#else +#define yyget_in testget_in +#endif + +#ifdef yyset_in +#define testset_in_ALREADY_DEFINED +#else +#define yyset_in testset_in +#endif + +#ifdef yyget_out +#define testget_out_ALREADY_DEFINED +#else +#define yyget_out testget_out +#endif + +#ifdef yyset_out +#define testset_out_ALREADY_DEFINED +#else +#define yyset_out testset_out +#endif + +#ifdef yyget_leng +#define testget_leng_ALREADY_DEFINED +#else +#define yyget_leng testget_leng +#endif + +#ifdef yyget_text +#define testget_text_ALREADY_DEFINED +#else +#define yyget_text testget_text +#endif + +#ifdef yyget_lineno +#define testget_lineno_ALREADY_DEFINED +#else +#define yyget_lineno testget_lineno +#endif + +#ifdef yyset_lineno +#define testset_lineno_ALREADY_DEFINED +#else +#define yyset_lineno testset_lineno +#endif + +#ifdef yywrap +#define testwrap_ALREADY_DEFINED +#else +#define yywrap testwrap +#endif + +#ifdef yyalloc +#define testalloc_ALREADY_DEFINED +#else +#define yyalloc testalloc +#endif + +#ifdef yyrealloc +#define testrealloc_ALREADY_DEFINED +#else +#define yyrealloc testrealloc +#endif + +#ifdef yyfree +#define testfree_ALREADY_DEFINED +#else +#define yyfree testfree +#endif + +#ifdef yytext +#define testtext_ALREADY_DEFINED +#else +#define yytext testtext +#endif + +#ifdef yyleng +#define testleng_ALREADY_DEFINED +#else +#define yyleng testleng +#endif + +#ifdef yyin +#define testin_ALREADY_DEFINED +#else +#define yyin testin +#endif + +#ifdef yyout +#define testout_ALREADY_DEFINED +#else +#define yyout testout +#endif + +#ifdef yyflexdebug +#define testflexdebug_ALREADY_DEFINED +#else +#define yyflexdebug testflexdebug +#endif + +#ifdef yylineno +#define testlineno_ALREADY_DEFINED +#else +#define yylineno testlineno +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ + +/* Feature test macros. Flex uses functions that require a minimum set of + * macros defined. As defining some macros may hide function declarations that + * user code might use, be conservative and respect user's definitions as much + * as possible. In glibc, feature test macros may not be all set up until one + * of the libc header (that includes ) is included. This creates + * a circular dependency when we check the macros. is the safest + * header we can include and does not declare too many functions we don't need. + */ +#if !defined(__GNU_LIBRARY__) && defined(__STDC__) +#include +#endif +#if !(defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_POSIX_SOURCE)) +# define _POSIX_C_SOURCE 1 /* Required for fileno() */ +# define _POSIX_SOURCE 1 +#endif +#include +#include +#include +#include + +/* end standard C headers. */ + +/* begin standard C++ headers. */ + +/* flex integer type definitions */ + +#ifndef YYFLEX_INTTYPES_DEFINED +#define YYFLEX_INTTYPES_DEFINED + +/* Prefer C99 integer types if available. */ + +# if defined(__cplusplus) && __cplusplus >= 201103L +#include +# define YYFLEX_USE_STDINT +# endif +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +/* Include and not because Solaris 2.6 has the former + * and not the latter. + */ +#include +# define YYFLEX_USE_STDINT +# else +# if defined(_MSC_VER) && _MSC_VER >= 1600 +/* Visual C++ 2010 does not define __STDC_VERSION__ and has but not + * . + */ +#include +# define YYFLEX_USE_STDINT +# endif +# endif +# ifdef YYFLEX_USE_STDINT +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 unsigned char flex_uint8_t; +typedef short int flex_int16_t; +typedef unsigned short int flex_uint16_t; +# ifdef __STDC__ +typedef signed char flex_int8_t; +/* ISO C only requires at least 16 bits for int. */ +# ifdef __cplusplus +#include +# else +#include +# endif +# if UINT_MAX >= 4294967295 +# define YYFLEX_INT32_DEFINED +typedef int flex_int32_t; +typedef unsigned int flex_uint32_t; +# endif +# else +typedef char flex_int8_t; +# endif +# ifndef YYFLEX_INT32_DEFINED +typedef long int flex_int32_t; +typedef unsigned long int flex_uint32_t; +# endif +# endif +#endif /* YYFLEX_INTTYPES_DEFINED */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. + */ +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define yybegin(s) (yy_start) = 1 + 2 * (s) +/* Legacy interface */ +#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 yystart() (((yy_start) - 1) / 2) +/* Legacy interfaces */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) +#define YY_END_OF_BUFFER_CHAR 0 + +/* The state buf must be large enough to hold one state per character in the main buffer, + * plus the start state, plus the two end-of-buffer byte states. + */ +#define YY_STATE_BUF_EXTRA_SPACE 3 +#define YY_STATE_BUF_SIZE (YY_BUF_SIZE + YY_STATE_BUF_EXTRA_SPACE) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *yybuffer; +/* Legacy interface */ +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +#define yyunput(c) yyunput_r( c, (yytext_ptr) ) +/* Legacy interface */ +#define unput(c) yyunput_r( c, (yytext_ptr) ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yyatbol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static yybuffer * yy_buffer_stack = NULL; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define yy_current_buffer() ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) +/* Legacy interface */ +#define YY_CURRENT_BUFFER yy_current_buffer() +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = NULL; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( yybuffer new_buffer ); +yybuffer yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( yybuffer b ); +void yy_flush_buffer ( yybuffer b ); +void yypush_buffer_state ( yybuffer new_buffer ); +void yypop_buffer_state ( void ); + +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( yybuffer b, FILE *file ); +#define yy_flush_current_buffer() yy_flush_buffer( yy_current_buffer() ) +#define YY_FLUSH_BUFFER yy_flush_current_buffer() + +yybuffer yy_scan_buffer ( char *base, yy_size_t size ); +yybuffer yy_scan_string ( const char *yy_str ); +yybuffer yy_scan_bytes ( const char *bytes, int len ); + +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); + +#define yy_new_buffer yy_create_buffer +#define yy_set_interactive(is_interactive) { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +} +#define yysetbol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} +#define yyatbol() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +/* Legacy interface */ +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +#define yy_set_bol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} + +/* Begin user sect3 */ + +#define testwrap() (/*CONSTCOND*/1) + +#define YY_SKIP_YYWRAP + +typedef flex_uint8_t YY_CHAR; + +FILE *yyin = NULL, *yyout = NULL; + +typedef int yy_state_type; + +extern int yylineno; +int yylineno = 1; + +/* Watch out: yytext_ptr is a variable when yytext is an array, + * but it's a macro when yytext is a pointer. + */ + +extern char *yytext; + +#ifdef yytext_ptr +#undef yytext_ptr +#endif +#define yytext_ptr yytext + +/* %% [1.5] DFA */ +/* START of m4 controls */ +/* */ +/* */ +/* */ +/* END of m4 controls */ +/* START of Flex-generated definitions */#define YY_NUM_RULES 2 +#define YY_END_OF_BUFFER 3 +#define YY_JAMBASE 60 +#define YY_JAMSTATE 32 +#define YY_NUL_EC 1 +#define YY_OFFSET_TYPE flex_int16_t + +/* END of Flex-generated definitions */ + +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yypanic ( const char* msg ); + +struct yy_trans_info + { + /* We require that yy_verify and yy_nxt must be of the same size int. */ + + /* We generate a bogus 'struct yy_trans_info' data type + * so we can guarantee that it is always declared in the skel. + * This is so we can compile "sizeof(struct yy_trans_info)" + * in any scanner. + */ + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + + }; + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + do { \ + (yytext_ptr) = yy_bp; \ + \ + yyleng = (int) (yy_cp - yy_bp); \ + \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + \ + (yy_c_buf_p) = yy_cp; \ + } while(0) + +extern int yyflexdebug; +int yyflexdebug = 0; +/* Legacy interface */ +#ifndef yy_flex_debug +#define yy_flex_debug yyflexdebug +#endif + +/* %% [2.0] data tables for the DFA are inserted here */ + +/* footprint: 4471 bytes */ +/* tblend: 66 */ +/* numecs: 6 */ +/* num_rules: 2 */ +/* lastdfa: 31 */ + +/* m4 controls begin */ +/* */ +/* m4 controls end */ + +static const flex_int16_t yy_accept[34] = { 0, + + 1, 1, 1, 2, 3, 5, 5, 6, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 10, 11, 11 +}; + +/* Character equivalence-class mapping */ +static const YY_CHAR yy_ec[256] = { 0, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 3, 1, 1, 1, 1, 1, 1, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, + 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 1, 1, 1, 1, 5, 1, 5, 5, 5, 5, + + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 +}; + +/* Character meta-equivalence-class mappings */ +static const YY_CHAR yy_meta[7] = { 0, + + 1, 2, 1, 1, 1, 1 +}; + +static const flex_int16_t yy_acclist[11] = { 0, + + 3, 2, 2, 16385, 16385, 16385, 8193, 8193, 8193, 8193 +}; + +static const flex_int16_t yy_base[42] = { 0, + + 54, 53, 57, 60, 0, 4, 51, 0, 6, 8, + 49, 10, 51, 12, 0, 50, 14, 16, 18, 46, + 20, 22, 24, 26, 0, 28, 45, 30, 44, 0, + 0, 60, 33, 35, 37, 0, 39, 41, 43, 45, + 47 +}; + +static const flex_int16_t yy_def[42] = { 0, + + 33, 33, 32, 32, 32, 34, 5, 5, 34, 35, + 9, 35, 36, 37, 9, 36, 38, 37, 39, 18, + 38, 40, 39, 41, 18, 40, 26, 41, 28, 26, + 28, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32 +}; + +static const flex_int16_t yy_nxt[67] = { 0, + + 16, 6, 32, 7, 8, 10, 11, 10, 11, 13, + 14, 13, 14, 19, 20, 13, 22, 19, 20, 13, + 24, 13, 22, 19, 27, 13, 24, 19, 29, 19, + 27, 19, 29, 4, 4, 9, 9, 12, 12, 18, + 18, 21, 21, 23, 23, 26, 26, 28, 28, 31, + 30, 25, 17, 17, 15, 7, 32, 5, 5, 3, + 32, 32, 32, 32, 32, 32 +}; + +static const flex_int16_t yy_chk[67] = { 0, + + 36, 5, 0, 5, 5, 6, 6, 9, 9, 10, + 10, 12, 12, 14, 14, 17, 17, 18, 18, 19, + 19, 21, 21, 22, 22, 23, 23, 24, 24, 26, + 26, 28, 28, 33, 33, 34, 34, 35, 35, 37, + 37, 38, 38, 39, 39, 40, 40, 41, 41, 29, + 27, 20, 16, 13, 11, 7, 3, 2, 1, 32, + 32, 32, 32, 32, 32, 32 +}; + +#define YY_TRAILING_MASK 0x2000 +#define YY_TRAILING_HEAD_MASK 0x4000 + +/* Declare state buffer variables. */ +static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +static size_t yy_state_buf_max=0; +static char *yy_full_match; +static int yy_lp; + +static int yy_looking_for_trail_begin = 0; +static int yy_full_lp; +static int *yy_full_state; + +#define yyreject() \ +{ \ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ + \ +(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ +(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ +yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ + \ +++(yy_lp); \ +goto find_rule; \ +} +#define REJECT yyreject() + +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET + +char *yytext; + +/* %% [3.0] static declarations conditional on mode switches go here */ +/* + * 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.cc". + The scanner tests that we correctly initialize the state buffer + for long input buffers owned by code that calls yylex. + + This tests guards against reversions to CVE-2006-0459, + in particular when variable trailing context rules are used. + */ +#include +#include +#include + +#define ECHO +/** + * Balanced Bracketed Content. + * May not contain bracket, but if it does then it is balanced. + */ + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ + +#include + +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( void ); + +int yyget_debug ( void ); + +void yyset_debug ( int debug_flag ); + +YY_EXTRA_TYPE yyget_extra ( void ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in ( void ); + +void yyset_in ( FILE * _in_str ); + +FILE *yyget_out ( void ); + +void yyset_out ( FILE * _out_str ); + + int yyget_leng ( void ); + +char *yyget_text ( void ); + +int yyget_lineno ( void ); + +void yyset_lineno ( int _line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap ( void ); +#else +extern int yywrap ( void ); +#endif +#endif + +#ifndef YY_NO_YYUNPUT + + static void yyunput_r ( int c, char *buf_ptr ); + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * ); +#endif + +#ifndef YY_NO_YYINPUT + +static int yyinput ( void ); +#ifndef __cplusplus +#define input yyinput +#endif + +#endif + +/* + * Amount of stuff to slurp up with each read. + * We assume the stdio library has already + * chosen a fit size foe whatever platform + * we're running on. + */ +#define YY_READ_BUF_SIZE BUFSIZ + +/* Size of default input buffer. We want to be able to fit two + * OS-level reads, but efficiency gains as the buffer size + * increases fall off after that + */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE (2 * YY_READ_BUF_SIZE) +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef yyecho + +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define yyecho() do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) + +#endif +/* Legacy interface */ +#define ECHO yyecho() + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yypanic (const char* msg ) { + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Report a fatal error. Legacy interface. */ +#ifndef YY_FATAL_ERROR + +#define YY_FATAL_ERROR(msg) yypanic( msg ) + +#endif + +/* Legacy interface */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) do {result = yyread(buf, max_size );} while (0) + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ + +static int yyread(char *buf, size_t max_size ) { + + int result; + + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) { + int c = '*'; + yy_size_t n; + for ( n = 0; n < max_size && + (c = getc( yyin )) != EOF && c != '\n'; ++n ) { + buf[n] = (char) c; + } + if ( c == '\n' ) { + buf[n++] = (char) c; + } + if ( c == EOF && ferror( yyin ) ) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + } + result = n; + } else { + errno=0; + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) { + if( errno != EINTR) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + break; + } + errno=0; + clearerr(yyin); + } + } + + return result; +} +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) + +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL { + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) { + (yy_start) = 1; /* first start state */ + } + if ( ! yyin ) { + + yyin = stdin; + + } + if ( ! yyout ) { + + yyout = stdout; + + } + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + /* Create the reject buffer large enough to save one state per allowed character. + * If the reject buffer already exists, keep using it. + */ + if ( ! (yy_state_buf) ) { + (yy_state_buf) = (yy_state_type *)yyalloc( ((YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) * sizeof(yy_state_type)) ); + if ( ! (yy_state_buf) ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + (yy_state_buf_max) = (YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE); + } + + yy_load_buffer_state( ); + } + + /* open scope of user declarationns */ + { +/* %% [4.0] user's declarations go here */ + + while ( /*CONSTCOND*/1 ) { /* loops until end-of-file is reached */ + + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + /* Generate the code to find the start state. */ + + yy_current_state = (yy_start); + + /* Set up for storing up states. */ + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + yy_match: + /* Generate the code to find the next match. */ + + do { + + int yy_c = *(yy_ec+YY_SC_TO_UI(*yy_cp)); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { + yy_current_state = (int) yy_def[yy_current_state]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + *(yy_state_ptr)++ = yy_current_state; + ++yy_cp; + + } + while ( yy_base[yy_current_state] != YY_JAMBASE ); + + yy_find_action: + /* code to find the action number goes here */ + + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) { /* loop until we find out what rule we matched */ + if ((yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1]) { + yy_act = yy_acclist[(yy_lp)]; + + if ((yy_act & YY_TRAILING_HEAD_MASK) != 0 || (yy_looking_for_trail_begin)) { + if (yy_act == (yy_looking_for_trail_begin)) { + (yy_looking_for_trail_begin) = 0; + yy_act &= ~YY_TRAILING_HEAD_MASK; + break; + } + } else if (( yy_act & YY_TRAILING_MASK) != 0) { + (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; + (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; + + } else { + (yy_full_match) = yy_cp; + (yy_full_state) = (yy_state_ptr); + (yy_full_lp) = (yy_lp); + break; + } + ++(yy_lp); + goto find_rule; + + } + + --yy_cp; + + /* We could consolidate the following two lines with those at + * the beginning, but at the cost of complaints that we're + * branching inside a loop. + */ + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; + } /* close for */ + + YY_DO_BEFORE_ACTION; + + do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) { /* beginning of action switch */ + +/* %% [5.0] user actions get inserted here */ + case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP + +{ + return 1234; +} + /*LINTED*/break; + case 2: +YY_RULE_SETUP + +yyecho(); + /*LINTED*/break; + +case YY_STATE_EOF(INITIAL): /* FALLTHROUGH */ +yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer() and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } else { + + /* Still need to initialize yy_cp, though + * yy_current_state was set up by + * yy_get_previous_state(). + */ + yy_cp = (yy_c_buf_p); + + goto yy_find_action; + } + } else { /* not a NUL */ + switch ( yy_get_next_buffer( ) ) { + case EOB_ACT_END_OF_FILE: + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(yystart()); + goto do_action; + } else { + if ( ! (yy_did_buffer_switch_on_eof) ) { + YY_NEW_FILE; + } + } + break; + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } /* end EOB inner switch */ + } /* end if */ + break; + } /* case YY_END_OF_BUFFER */ + default: + YY_FATAL_ERROR("fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer (void) + +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) { + YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { + /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } else { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); + + for ( i = 0; i < number_to_move; ++i ) { + *(dest++) = *(source++); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) { + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + } else { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ + + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses yyreject()" ); + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) { + num_to_read = YY_READ_BUF_SIZE; + } + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) { + if ( number_to_move == YY_MORE_ADJ ) { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } else { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } else { + ret_val = EOB_ACT_CONTINUE_SCAN; + } + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1) + 2; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state (void) + +{ + yy_state_type yy_current_state; + char *yy_cp; + + /* Generate the code to find the start state. */ + + yy_current_state = (yy_start); + + /* Set up for storing up states. */ + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { + /* Generate the code to find the next state. */ + + int yy_c = (*yy_cp ? *(yy_ec+YY_SC_TO_UI(*yy_cp)) : YY_NUL_EC); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { + yy_current_state = (int) yy_def[yy_current_state]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) + +{ + int yy_is_jam; + /* Generate code for handling NUL's, if needed. */ + + /* First, deal with backing up and setting up yy_cp if the scanner + * finds that it should JAM on the NUL. + * + * Only generate a definition for "yy_cp" if we'll generate code + * that uses it. Otherwise lint and the like complain. + */ + + int yy_c = YY_NUL_EC; + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { + yy_current_state = (int) yy_def[yy_current_state]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + +yy_is_jam = (yy_current_state == YY_JAMSTATE); + + /* Only stack this state if it's a transition we + * actually make. If we stack it on a jam, then + * the state stack and yy_c_buf_p get out of sync. + */ + if ( ! yy_is_jam ) { + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_YYUNPUT +static void yyunput_r (int c, char * yy_bp ) + +{ + char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { + /* need to shift things up to make room */ + /* +2 for EOB chars. */ + int number_to_move = (yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) { + *--dest = *--source; + } + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#endif /* ifndef YY_NO_YYINPUT */ + +#ifndef YY_NO_YYINPUT +int yyinput (void) + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + } else { + /* need more input */ + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + if ( yywrap( ) ) { + return 0; + } + if ( ! (yy_did_buffer_switch_on_eof) ) { + YY_NEW_FILE; + } + return yyinput(); + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } + } + } + + 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_YYINPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + +void yyrestart (FILE * input_file ) + +{ + + size_t new_size = 0; + yy_state_type *new_state_buf = 0; + + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + yy_init_buffer( YY_CURRENT_BUFFER_LVALUE, input_file ); + yy_load_buffer_state( ); + + /* Ensure the reject state buffer is large enough. + */ + if ( (yy_state_buf_max) < (yy_size_t) (yy_current_buffer()->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = yy_current_buffer()->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type *)yyrealloc( (yy_state_buf), (new_size * sizeof(yy_state_type)) ); + + if ( new_state_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + else { + (yy_state_buf) = new_state_buf; + (yy_state_buf_max) = new_size; + } + } + + /* 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; +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + +void yy_switch_to_buffer (yybuffer new_buffer ) + +{ + + size_t new_size = 0; + yy_state_type *new_state_buf = 0; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( yy_current_buffer() == new_buffer ) { + return; + } + if ( yy_current_buffer() ) { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* Ensure the reject state buffer is large enough. + */ + if ( (yy_state_buf_max) < (yy_size_t) (YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type *)yyrealloc( (yy_state_buf), (new_size * sizeof(yy_state_type)) ); + + if ( new_state_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + else { + (yy_state_buf) = new_state_buf; + (yy_state_buf_max) = new_size; + } + } + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) + +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + +yybuffer yy_create_buffer (FILE * file, int size ) + +{ + yybuffer b; + + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); + if ( b->yy_ch_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + +void yy_delete_buffer (yybuffer b ) + +{ + + if ( b == NULL ) { + return; + } + if ( b == yy_current_buffer() ) { /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (yybuffer) 0; + } + if ( b->yy_is_our_buffer ) { + yyfree( (void *) b->yy_ch_buf ); + } + yyfree( (void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + +static void yy_init_buffer (yybuffer b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer( b ); + + b->yy_input_file = file; + + /* b->yy_input_file should never by NULL but we'll handle it cleanly + * on the off chance. + */ + if (b->yy_input_file == NULL){ + b->yy_fill_buffer = 0; + } else { + b->yy_fill_buffer = 1; + } + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != yy_current_buffer()) { + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c yy_current_buffer(). + * + */ + +void yy_flush_buffer (yybuffer b ) + +{ + if ( b == NULL ) { + return; + } + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yyatbol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer() ) { + yy_load_buffer_state( ); + } +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ + +void yypush_buffer_state (yybuffer new_buffer ) + +{ + if (new_buffer == NULL) { + return; + } + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( yy_current_buffer() != NULL ) { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (yy_current_buffer()) { + (yy_buffer_stack_top)++; + } + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ + +void yypop_buffer_state (void) + +{ + if (yy_current_buffer() == NULL) { + return; + } + yy_delete_buffer(yy_current_buffer() ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) { + --(yy_buffer_stack_top); + } + if (yy_current_buffer() != NULL) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ + +static void yyensure_buffer_stack (void) + +{ + yy_size_t num_to_alloc; + + if ((yy_buffer_stack) == NULL) { + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( (yy_buffer_stack == NULL) ) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1) { + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ((yy_buffer_stack) == NULL) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +yybuffer yy_scan_buffer (char * base, yy_size_t size ) +{ + yybuffer b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) { + /* They forgot to leave room for the EOB's. */ + return NULL; + } + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + } + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yyatbol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +yybuffer yy_scan_string (const char * yystr ) +{ + + return yy_scan_bytes( yystr, (int) strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +yybuffer yy_scan_bytes (const char * yybytes, int _yybytes_len ) { + yybuffer b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); + if ( buf == 0 ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + } + for ( i = 0; i < _yybytes_len; ++i ) { + buf[i] = yybytes[i]; + } + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( b == NULL ) { + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + } + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) { + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) { + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) { + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) { + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) { + return yytext; +} + +/** Set the current line number. + * @param _line_number line number + * + */ +void yyset_lineno (int _line_number ) { + + yylineno = _line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str ) { + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str ) { + yyout = _out_str ; +} + +int yyget_debug (void) { + return yyflexdebug; +} + +void yyset_debug (int _bdebug ) { + yyflexdebug = _bdebug ; +} + +static int yy_init_globals (void) { + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = NULL; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = NULL; + (yy_init) = 0; + (yy_start) = 0; + + (yy_state_buf) = 0; + (yy_state_ptr) = 0; + (yy_state_buf_max) = 0; + (yy_full_match) = 0; + (yy_lp) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) { + + /* Pop the buffer stack, destroying each element. */ + while(yy_current_buffer()) { + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + yyfree ( (yy_state_buf) ); + (yy_state_buf) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, const char * s2, int n ) { + + int i; + for ( i = 0; i < n; ++i ) { + s1[i] = s2[i]; + } +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (const char * s ) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) { + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size ) { + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr ) { + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +std::vector readFile(const char* filename) +{ + std::vector contents; + std::ifstream in(filename, std::ios::in | std::ios::binary); + if (in) + { + in.seekg(0, std::ios::end); + size_t size = static_cast(in.tellg()); + contents.resize(size + 2); + in.seekg(0, std::ios::beg); + in.read(contents.data(), size); + in.close(); + + contents[size + 0] = '\0'; + contents[size + 1] = '\0'; + } + else { + std::cerr << "*** Error: std::ifstream(" << filename << ") failed." << std::endl; + exit(-1); + } + return contents; +} + +int main(int argc, char** argv) +{ + if ( argc != 2 ) { + std::cerr << "*** Error: Must specify one filename." << std::endl; + exit(-1); + } + + std::vector stm = readFile( argv[1] ); + test_scan_buffer(stm.data(), stm.size()); + + testlex(); + + return 0; // All went well. +} + diff --git a/tests/state_buf_multiple.direct b/tests/state_buf_multiple.direct new file mode 100755 index 0000000000000000000000000000000000000000..63030d4a186740f36c512ef1f7305f808e6215c0 GIT binary patch literal 192216 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 literal 0 HcmV?d00001 diff --git a/tests/state_buf_multiple.direct.cc b/tests/state_buf_multiple.direct.cc new file mode 100644 index 000000000..4907940ed --- /dev/null +++ b/tests/state_buf_multiple.direct.cc @@ -0,0 +1,2322 @@ + +/* A lexical scanner generated by flex */ + +/* Target: C/C++ */ +/* START of m4 controls */ +/* 0 = 0 */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* test = test */ +/* */ +/* END of m4 controls */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +#ifdef yy_create_buffer +#define test_create_buffer_ALREADY_DEFINED +#else +#define yy_create_buffer test_create_buffer +#endif + +#ifdef yy_delete_buffer +#define test_delete_buffer_ALREADY_DEFINED +#else +#define yy_delete_buffer test_delete_buffer +#endif + +#ifdef yy_scan_buffer +#define test_scan_buffer_ALREADY_DEFINED +#else +#define yy_scan_buffer test_scan_buffer +#endif + +#ifdef yy_scan_string +#define test_scan_string_ALREADY_DEFINED +#else +#define yy_scan_string test_scan_string +#endif + +#ifdef yy_scan_bytes +#define test_scan_bytes_ALREADY_DEFINED +#else +#define yy_scan_bytes test_scan_bytes +#endif + +#ifdef yy_init_buffer +#define test_init_buffer_ALREADY_DEFINED +#else +#define yy_init_buffer test_init_buffer +#endif + +#ifdef yy_flush_buffer +#define test_flush_buffer_ALREADY_DEFINED +#else +#define yy_flush_buffer test_flush_buffer +#endif + +#ifdef yy_load_buffer_state +#define test_load_buffer_state_ALREADY_DEFINED +#else +#define yy_load_buffer_state test_load_buffer_state +#endif + +#ifdef yy_switch_to_buffer +#define test_switch_to_buffer_ALREADY_DEFINED +#else +#define yy_switch_to_buffer test_switch_to_buffer +#endif + +#ifdef yypush_buffer_state +#define testpush_buffer_state_ALREADY_DEFINED +#else +#define yypush_buffer_state testpush_buffer_state +#endif + +#ifdef yypop_buffer_state +#define testpop_buffer_state_ALREADY_DEFINED +#else +#define yypop_buffer_state testpop_buffer_state +#endif + +#ifdef yyensure_buffer_stack +#define testensure_buffer_stack_ALREADY_DEFINED +#else +#define yyensure_buffer_stack testensure_buffer_stack +#endif + +#ifdef yylex +#define testlex_ALREADY_DEFINED +#else +#define yylex testlex +#endif + +#ifdef yyrestart +#define testrestart_ALREADY_DEFINED +#else +#define yyrestart testrestart +#endif + +#ifdef yylex_init +#define testlex_init_ALREADY_DEFINED +#else +#define yylex_init testlex_init +#endif + +#ifdef yylex_init_extra +#define testlex_init_extra_ALREADY_DEFINED +#else +#define yylex_init_extra testlex_init_extra +#endif + +#ifdef yylex_destroy +#define testlex_destroy_ALREADY_DEFINED +#else +#define yylex_destroy testlex_destroy +#endif + +#ifdef yyget_debug +#define testget_debug_ALREADY_DEFINED +#else +#define yyget_debug testget_debug +#endif + +#ifdef yyset_debug +#define testset_debug_ALREADY_DEFINED +#else +#define yyset_debug testset_debug +#endif + +#ifdef yyget_extra +#define testget_extra_ALREADY_DEFINED +#else +#define yyget_extra testget_extra +#endif + +#ifdef yyset_extra +#define testset_extra_ALREADY_DEFINED +#else +#define yyset_extra testset_extra +#endif + +#ifdef yyget_in +#define testget_in_ALREADY_DEFINED +#else +#define yyget_in testget_in +#endif + +#ifdef yyset_in +#define testset_in_ALREADY_DEFINED +#else +#define yyset_in testset_in +#endif + +#ifdef yyget_out +#define testget_out_ALREADY_DEFINED +#else +#define yyget_out testget_out +#endif + +#ifdef yyset_out +#define testset_out_ALREADY_DEFINED +#else +#define yyset_out testset_out +#endif + +#ifdef yyget_leng +#define testget_leng_ALREADY_DEFINED +#else +#define yyget_leng testget_leng +#endif + +#ifdef yyget_text +#define testget_text_ALREADY_DEFINED +#else +#define yyget_text testget_text +#endif + +#ifdef yyget_lineno +#define testget_lineno_ALREADY_DEFINED +#else +#define yyget_lineno testget_lineno +#endif + +#ifdef yyset_lineno +#define testset_lineno_ALREADY_DEFINED +#else +#define yyset_lineno testset_lineno +#endif + +#ifdef yywrap +#define testwrap_ALREADY_DEFINED +#else +#define yywrap testwrap +#endif + +#ifdef yyalloc +#define testalloc_ALREADY_DEFINED +#else +#define yyalloc testalloc +#endif + +#ifdef yyrealloc +#define testrealloc_ALREADY_DEFINED +#else +#define yyrealloc testrealloc +#endif + +#ifdef yyfree +#define testfree_ALREADY_DEFINED +#else +#define yyfree testfree +#endif + +#ifdef yytext +#define testtext_ALREADY_DEFINED +#else +#define yytext testtext +#endif + +#ifdef yyleng +#define testleng_ALREADY_DEFINED +#else +#define yyleng testleng +#endif + +#ifdef yyin +#define testin_ALREADY_DEFINED +#else +#define yyin testin +#endif + +#ifdef yyout +#define testout_ALREADY_DEFINED +#else +#define yyout testout +#endif + +#ifdef yyflexdebug +#define testflexdebug_ALREADY_DEFINED +#else +#define yyflexdebug testflexdebug +#endif + +#ifdef yylineno +#define testlineno_ALREADY_DEFINED +#else +#define yylineno testlineno +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ + +/* Feature test macros. Flex uses functions that require a minimum set of + * macros defined. As defining some macros may hide function declarations that + * user code might use, be conservative and respect user's definitions as much + * as possible. In glibc, feature test macros may not be all set up until one + * of the libc header (that includes ) is included. This creates + * a circular dependency when we check the macros. is the safest + * header we can include and does not declare too many functions we don't need. + */ +#if !defined(__GNU_LIBRARY__) && defined(__STDC__) +#include +#endif +#if !(defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_POSIX_SOURCE)) +# define _POSIX_C_SOURCE 1 /* Required for fileno() */ +# define _POSIX_SOURCE 1 +#endif +#include +#include +#include +#include + +/* end standard C headers. */ + +/* begin standard C++ headers. */ + +/* flex integer type definitions */ + +#ifndef YYFLEX_INTTYPES_DEFINED +#define YYFLEX_INTTYPES_DEFINED + +/* Prefer C99 integer types if available. */ + +# if defined(__cplusplus) && __cplusplus >= 201103L +#include +# define YYFLEX_USE_STDINT +# endif +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +/* Include and not because Solaris 2.6 has the former + * and not the latter. + */ +#include +# define YYFLEX_USE_STDINT +# else +# if defined(_MSC_VER) && _MSC_VER >= 1600 +/* Visual C++ 2010 does not define __STDC_VERSION__ and has but not + * . + */ +#include +# define YYFLEX_USE_STDINT +# endif +# endif +# ifdef YYFLEX_USE_STDINT +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 unsigned char flex_uint8_t; +typedef short int flex_int16_t; +typedef unsigned short int flex_uint16_t; +# ifdef __STDC__ +typedef signed char flex_int8_t; +/* ISO C only requires at least 16 bits for int. */ +# ifdef __cplusplus +#include +# else +#include +# endif +# if UINT_MAX >= 4294967295 +# define YYFLEX_INT32_DEFINED +typedef int flex_int32_t; +typedef unsigned int flex_uint32_t; +# endif +# else +typedef char flex_int8_t; +# endif +# ifndef YYFLEX_INT32_DEFINED +typedef long int flex_int32_t; +typedef unsigned long int flex_uint32_t; +# endif +# endif +#endif /* YYFLEX_INTTYPES_DEFINED */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. + */ +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define yybegin(s) (yy_start) = 1 + 2 * (s) +/* Legacy interface */ +#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 yystart() (((yy_start) - 1) / 2) +/* Legacy interfaces */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) +#define YY_END_OF_BUFFER_CHAR 0 + +/* The state buf must be large enough to hold one state per character in the main buffer, + * plus the start state, plus the two end-of-buffer byte states. + */ +#define YY_STATE_BUF_EXTRA_SPACE 3 +#define YY_STATE_BUF_SIZE (YY_BUF_SIZE + YY_STATE_BUF_EXTRA_SPACE) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *yybuffer; +/* Legacy interface */ +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +#define yyunput(c) yyunput_r( c, (yytext_ptr) ) +/* Legacy interface */ +#define unput(c) yyunput_r( c, (yytext_ptr) ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yyatbol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static yybuffer * yy_buffer_stack = NULL; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define yy_current_buffer() ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) +/* Legacy interface */ +#define YY_CURRENT_BUFFER yy_current_buffer() +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = NULL; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( yybuffer new_buffer ); +yybuffer yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( yybuffer b ); +void yy_flush_buffer ( yybuffer b ); +void yypush_buffer_state ( yybuffer new_buffer ); +void yypop_buffer_state ( void ); + +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( yybuffer b, FILE *file ); +#define yy_flush_current_buffer() yy_flush_buffer( yy_current_buffer() ) +#define YY_FLUSH_BUFFER yy_flush_current_buffer() + +yybuffer yy_scan_buffer ( char *base, yy_size_t size ); +yybuffer yy_scan_string ( const char *yy_str ); +yybuffer yy_scan_bytes ( const char *bytes, int len ); + +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); + +#define yy_new_buffer yy_create_buffer +#define yy_set_interactive(is_interactive) { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +} +#define yysetbol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} +#define yyatbol() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +/* Legacy interface */ +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +#define yy_set_bol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} + +/* Begin user sect3 */ + +#define testwrap() (/*CONSTCOND*/1) + +#define YY_SKIP_YYWRAP + +typedef flex_uint8_t YY_CHAR; + +FILE *yyin = NULL, *yyout = NULL; + +typedef int yy_state_type; + +extern int yylineno; +int yylineno = 1; + +/* Watch out: yytext_ptr is a variable when yytext is an array, + * but it's a macro when yytext is a pointer. + */ + +extern char *yytext; + +#ifdef yytext_ptr +#undef yytext_ptr +#endif +#define yytext_ptr yytext + +/* %% [1.5] DFA */ +/* START of m4 controls */ +/* */ +/* */ +/* */ +/* END of m4 controls */ +/* START of Flex-generated definitions */#define YY_NUM_RULES 2 +#define YY_END_OF_BUFFER 3 +#define YY_JAMBASE 60 +#define YY_JAMSTATE 32 +#define YY_NUL_EC 1 +#define YY_OFFSET_TYPE flex_int16_t + +/* END of Flex-generated definitions */ + +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yypanic ( const char* msg ); + +struct yy_trans_info + { + /* We require that yy_verify and yy_nxt must be of the same size int. */ + + /* We generate a bogus 'struct yy_trans_info' data type + * so we can guarantee that it is always declared in the skel. + * This is so we can compile "sizeof(struct yy_trans_info)" + * in any scanner. + */ + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + + }; + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + do { \ + (yytext_ptr) = yy_bp; \ + \ + yyleng = (int) (yy_cp - yy_bp); \ + \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + \ + (yy_c_buf_p) = yy_cp; \ + } while(0) + +extern int yyflexdebug; +int yyflexdebug = 0; +/* Legacy interface */ +#ifndef yy_flex_debug +#define yy_flex_debug yyflexdebug +#endif + +/* %% [2.0] data tables for the DFA are inserted here */ + +/* footprint: 4471 bytes */ +/* tblend: 66 */ +/* numecs: 6 */ +/* num_rules: 2 */ +/* lastdfa: 31 */ + +/* m4 controls begin */ +/* */ +/* m4 controls end */ + +static const flex_int16_t yy_accept[34] = { 0, + + 1, 1, 1, 2, 3, 5, 5, 6, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 10, 11, 11 +}; + +/* Character equivalence-class mapping */ +static const YY_CHAR yy_ec[256] = { 0, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 3, 1, 1, 1, 1, 1, 1, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, + 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 1, 1, 1, 1, 5, 1, 5, 5, 5, 5, + + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 6, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 +}; + +/* Character meta-equivalence-class mappings */ +static const YY_CHAR yy_meta[7] = { 0, + + 1, 2, 1, 1, 1, 1 +}; + +static const flex_int16_t yy_acclist[11] = { 0, + + 3, 2, 2, 16385, 16385, 16385, 8193, 8193, 8193, 8193 +}; + +static const flex_int16_t yy_base[42] = { 0, + + 54, 53, 57, 60, 0, 4, 51, 0, 6, 8, + 49, 10, 51, 12, 0, 50, 14, 16, 18, 46, + 20, 22, 24, 26, 0, 28, 45, 30, 44, 0, + 0, 60, 33, 35, 37, 0, 39, 41, 43, 45, + 47 +}; + +static const flex_int16_t yy_def[42] = { 0, + + 33, 33, 32, 32, 32, 34, 5, 5, 34, 35, + 9, 35, 36, 37, 9, 36, 38, 37, 39, 18, + 38, 40, 39, 41, 18, 40, 26, 41, 28, 26, + 28, 0, 32, 32, 32, 32, 32, 32, 32, 32, + 32 +}; + +static const flex_int16_t yy_nxt[67] = { 0, + + 16, 6, 32, 7, 8, 10, 11, 10, 11, 13, + 14, 13, 14, 19, 20, 13, 22, 19, 20, 13, + 24, 13, 22, 19, 27, 13, 24, 19, 29, 19, + 27, 19, 29, 4, 4, 9, 9, 12, 12, 18, + 18, 21, 21, 23, 23, 26, 26, 28, 28, 31, + 30, 25, 17, 17, 15, 7, 32, 5, 5, 3, + 32, 32, 32, 32, 32, 32 +}; + +static const flex_int16_t yy_chk[67] = { 0, + + 36, 5, 0, 5, 5, 6, 6, 9, 9, 10, + 10, 12, 12, 14, 14, 17, 17, 18, 18, 19, + 19, 21, 21, 22, 22, 23, 23, 24, 24, 26, + 26, 28, 28, 33, 33, 34, 34, 35, 35, 37, + 37, 38, 38, 39, 39, 40, 40, 41, 41, 29, + 27, 20, 16, 13, 11, 7, 3, 2, 1, 32, + 32, 32, 32, 32, 32, 32 +}; + +#define YY_TRAILING_MASK 0x2000 +#define YY_TRAILING_HEAD_MASK 0x4000 + +/* Declare state buffer variables. */ +static yy_state_type *yy_state_buf=0, *yy_state_ptr=0; +static size_t yy_state_buf_max=0; +static char *yy_full_match; +static int yy_lp; + +static int yy_looking_for_trail_begin = 0; +static int yy_full_lp; +static int *yy_full_state; + +#define yyreject() \ +{ \ +*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \ +yy_cp = (yy_full_match); /* restore poss. backed-over text */ \ + \ +(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \ +(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \ +yy_current_state = *(yy_state_ptr); /* restore curr. state */ \ + \ +++(yy_lp); \ +goto find_rule; \ +} +#define REJECT yyreject() + +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET + +char *yytext; + +/* %% [3.0] static declarations conditional on mode switches go here */ +/* + * 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.cc". + The scanner tests that we correctly initialize the state buffer + for long input buffers owned by code that calls yylex. + + This tests guards against reversions to CVE-2006-0459, + in particular when variable trailing context rules are used. + */ +#include +#include +#include + +#define ECHO +/** + * Balanced Bracketed Content. + * May not contain bracket, but if it does then it is balanced. + */ + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ + +#include + +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( void ); + +int yyget_debug ( void ); + +void yyset_debug ( int debug_flag ); + +YY_EXTRA_TYPE yyget_extra ( void ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in ( void ); + +void yyset_in ( FILE * _in_str ); + +FILE *yyget_out ( void ); + +void yyset_out ( FILE * _out_str ); + + int yyget_leng ( void ); + +char *yyget_text ( void ); + +int yyget_lineno ( void ); + +void yyset_lineno ( int _line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap ( void ); +#else +extern int yywrap ( void ); +#endif +#endif + +#ifndef YY_NO_YYUNPUT + + static void yyunput_r ( int c, char *buf_ptr ); + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * ); +#endif + +#ifndef YY_NO_YYINPUT + +static int yyinput ( void ); +#ifndef __cplusplus +#define input yyinput +#endif + +#endif + +/* + * Amount of stuff to slurp up with each read. + * We assume the stdio library has already + * chosen a fit size foe whatever platform + * we're running on. + */ +#define YY_READ_BUF_SIZE BUFSIZ + +/* Size of default input buffer. We want to be able to fit two + * OS-level reads, but efficiency gains as the buffer size + * increases fall off after that + */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE (2 * YY_READ_BUF_SIZE) +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef yyecho + +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define yyecho() do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) + +#endif +/* Legacy interface */ +#define ECHO yyecho() + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yypanic (const char* msg ) { + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Report a fatal error. Legacy interface. */ +#ifndef YY_FATAL_ERROR + +#define YY_FATAL_ERROR(msg) yypanic( msg ) + +#endif + +/* Legacy interface */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) do {result = yyread(buf, max_size );} while (0) + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ + +static int yyread(char *buf, size_t max_size ) { + + int result; + + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) { + int c = '*'; + yy_size_t n; + for ( n = 0; n < max_size && + (c = getc( yyin )) != EOF && c != '\n'; ++n ) { + buf[n] = (char) c; + } + if ( c == '\n' ) { + buf[n++] = (char) c; + } + if ( c == EOF && ferror( yyin ) ) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + } + result = n; + } else { + errno=0; + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) { + if( errno != EINTR) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + break; + } + errno=0; + clearerr(yyin); + } + } + + return result; +} +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) + +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL { + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) { + (yy_start) = 1; /* first start state */ + } + if ( ! yyin ) { + + yyin = stdin; + + } + if ( ! yyout ) { + + yyout = stdout; + + } + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + /* Create the reject buffer large enough to save one state per allowed character. + * If the reject buffer already exists, keep using it. + */ + if ( ! (yy_state_buf) ) { + (yy_state_buf) = (yy_state_type *)yyalloc( ((YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) * sizeof(yy_state_type)) ); + if ( ! (yy_state_buf) ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + (yy_state_buf_max) = (YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE); + } + + yy_load_buffer_state( ); + } + + /* open scope of user declarationns */ + { +/* %% [4.0] user's declarations go here */ + + while ( /*CONSTCOND*/1 ) { /* loops until end-of-file is reached */ + + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + /* Generate the code to find the start state. */ + + yy_current_state = (yy_start); + + /* Set up for storing up states. */ + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + yy_match: + /* Generate the code to find the next match. */ + + do { + + int yy_c = *(yy_ec+YY_SC_TO_UI(*yy_cp)); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { + yy_current_state = (int) yy_def[yy_current_state]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + *(yy_state_ptr)++ = yy_current_state; + ++yy_cp; + + } + while ( yy_base[yy_current_state] != YY_JAMBASE ); + + yy_find_action: + /* code to find the action number goes here */ + + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) { /* loop until we find out what rule we matched */ + if ((yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1]) { + yy_act = yy_acclist[(yy_lp)]; + + if ((yy_act & YY_TRAILING_HEAD_MASK) != 0 || (yy_looking_for_trail_begin)) { + if (yy_act == (yy_looking_for_trail_begin)) { + (yy_looking_for_trail_begin) = 0; + yy_act &= ~YY_TRAILING_HEAD_MASK; + break; + } + } else if (( yy_act & YY_TRAILING_MASK) != 0) { + (yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK; + (yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK; + + } else { + (yy_full_match) = yy_cp; + (yy_full_state) = (yy_state_ptr); + (yy_full_lp) = (yy_lp); + break; + } + ++(yy_lp); + goto find_rule; + + } + + --yy_cp; + + /* We could consolidate the following two lines with those at + * the beginning, but at the cost of complaints that we're + * branching inside a loop. + */ + yy_current_state = *--(yy_state_ptr); + (yy_lp) = yy_accept[yy_current_state]; + } /* close for */ + + YY_DO_BEFORE_ACTION; + + do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) { /* beginning of action switch */ + +/* %% [5.0] user actions get inserted here */ + case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP + +{ + return 1234; +} + /*LINTED*/break; + case 2: +YY_RULE_SETUP + +yyecho(); + /*LINTED*/break; + +case YY_STATE_EOF(INITIAL): /* FALLTHROUGH */ +yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer() and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } else { + + /* Still need to initialize yy_cp, though + * yy_current_state was set up by + * yy_get_previous_state(). + */ + yy_cp = (yy_c_buf_p); + + goto yy_find_action; + } + } else { /* not a NUL */ + switch ( yy_get_next_buffer( ) ) { + case EOB_ACT_END_OF_FILE: + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(yystart()); + goto do_action; + } else { + if ( ! (yy_did_buffer_switch_on_eof) ) { + YY_NEW_FILE; + } + } + break; + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } /* end EOB inner switch */ + } /* end if */ + break; + } /* case YY_END_OF_BUFFER */ + default: + YY_FATAL_ERROR("fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer (void) + +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) { + YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { + /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } else { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); + + for ( i = 0; i < number_to_move; ++i ) { + *(dest++) = *(source++); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) { + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + } else { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ + + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses yyreject()" ); + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) { + num_to_read = YY_READ_BUF_SIZE; + } + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) { + if ( number_to_move == YY_MORE_ADJ ) { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } else { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } else { + ret_val = EOB_ACT_CONTINUE_SCAN; + } + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1) + 2; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state (void) + +{ + yy_state_type yy_current_state; + char *yy_cp; + + /* Generate the code to find the start state. */ + + yy_current_state = (yy_start); + + /* Set up for storing up states. */ + + (yy_state_ptr) = (yy_state_buf); + *(yy_state_ptr)++ = yy_current_state; + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { + /* Generate the code to find the next state. */ + + int yy_c = (*yy_cp ? *(yy_ec+YY_SC_TO_UI(*yy_cp)) : YY_NUL_EC); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { + yy_current_state = (int) yy_def[yy_current_state]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) + +{ + int yy_is_jam; + /* Generate code for handling NUL's, if needed. */ + + /* First, deal with backing up and setting up yy_cp if the scanner + * finds that it should JAM on the NUL. + * + * Only generate a definition for "yy_cp" if we'll generate code + * that uses it. Otherwise lint and the like complain. + */ + + int yy_c = YY_NUL_EC; + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { + yy_current_state = (int) yy_def[yy_current_state]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + +yy_is_jam = (yy_current_state == YY_JAMSTATE); + + /* Only stack this state if it's a transition we + * actually make. If we stack it on a jam, then + * the state stack and yy_c_buf_p get out of sync. + */ + if ( ! yy_is_jam ) { + *(yy_state_ptr)++ = yy_current_state; + } + + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_YYUNPUT +static void yyunput_r (int c, char * yy_bp ) + +{ + char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { + /* need to shift things up to make room */ + /* +2 for EOB chars. */ + int number_to_move = (yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) { + *--dest = *--source; + } + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#endif /* ifndef YY_NO_YYINPUT */ + +#ifndef YY_NO_YYINPUT +int yyinput (void) + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + } else { + /* need more input */ + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + if ( yywrap( ) ) { + return 0; + } + if ( ! (yy_did_buffer_switch_on_eof) ) { + YY_NEW_FILE; + } + return yyinput(); + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } + } + } + + 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_YYINPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + +void yyrestart (FILE * input_file ) + +{ + + size_t new_size = 0; + yy_state_type *new_state_buf = 0; + + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + yy_init_buffer( YY_CURRENT_BUFFER_LVALUE, input_file ); + yy_load_buffer_state( ); + + /* Ensure the reject state buffer is large enough. + */ + if ( (yy_state_buf_max) < (yy_size_t) (yy_current_buffer()->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = yy_current_buffer()->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type *)yyrealloc( (yy_state_buf), (new_size * sizeof(yy_state_type)) ); + + if ( new_state_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + else { + (yy_state_buf) = new_state_buf; + (yy_state_buf_max) = new_size; + } + } + + /* 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; +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + +void yy_switch_to_buffer (yybuffer new_buffer ) + +{ + + size_t new_size = 0; + yy_state_type *new_state_buf = 0; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( yy_current_buffer() == new_buffer ) { + return; + } + if ( yy_current_buffer() ) { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* Ensure the reject state buffer is large enough. + */ + if ( (yy_state_buf_max) < (yy_size_t) (YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE) ) { + new_size = YY_CURRENT_BUFFER_LVALUE->yy_buf_size + YY_STATE_BUF_EXTRA_SPACE; + new_state_buf = (yy_state_type *)yyrealloc( (yy_state_buf), (new_size * sizeof(yy_state_type)) ); + + if ( new_state_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); + } + else { + (yy_state_buf) = new_state_buf; + (yy_state_buf_max) = new_size; + } + } + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) + +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + +yybuffer yy_create_buffer (FILE * file, int size ) + +{ + yybuffer b; + + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); + if ( b->yy_ch_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + +void yy_delete_buffer (yybuffer b ) + +{ + + if ( b == NULL ) { + return; + } + if ( b == yy_current_buffer() ) { /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (yybuffer) 0; + } + if ( b->yy_is_our_buffer ) { + yyfree( (void *) b->yy_ch_buf ); + } + yyfree( (void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + +static void yy_init_buffer (yybuffer b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer( b ); + + b->yy_input_file = file; + + /* b->yy_input_file should never by NULL but we'll handle it cleanly + * on the off chance. + */ + if (b->yy_input_file == NULL){ + b->yy_fill_buffer = 0; + } else { + b->yy_fill_buffer = 1; + } + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != yy_current_buffer()) { + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c yy_current_buffer(). + * + */ + +void yy_flush_buffer (yybuffer b ) + +{ + if ( b == NULL ) { + return; + } + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yyatbol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer() ) { + yy_load_buffer_state( ); + } +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ + +void yypush_buffer_state (yybuffer new_buffer ) + +{ + if (new_buffer == NULL) { + return; + } + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( yy_current_buffer() != NULL ) { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (yy_current_buffer()) { + (yy_buffer_stack_top)++; + } + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ + +void yypop_buffer_state (void) + +{ + if (yy_current_buffer() == NULL) { + return; + } + yy_delete_buffer(yy_current_buffer() ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) { + --(yy_buffer_stack_top); + } + if (yy_current_buffer() != NULL) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ + +static void yyensure_buffer_stack (void) + +{ + yy_size_t num_to_alloc; + + if ((yy_buffer_stack) == NULL) { + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( (yy_buffer_stack == NULL) ) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1) { + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ((yy_buffer_stack) == NULL) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +yybuffer yy_scan_buffer (char * base, yy_size_t size ) +{ + yybuffer b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) { + /* They forgot to leave room for the EOB's. */ + return NULL; + } + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + } + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yyatbol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +yybuffer yy_scan_string (const char * yystr ) +{ + + return yy_scan_bytes( yystr, (int) strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +yybuffer yy_scan_bytes (const char * yybytes, int _yybytes_len ) { + yybuffer b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); + if ( buf == 0 ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + } + for ( i = 0; i < _yybytes_len; ++i ) { + buf[i] = yybytes[i]; + } + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( b == NULL ) { + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + } + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) { + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) { + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) { + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) { + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) { + return yytext; +} + +/** Set the current line number. + * @param _line_number line number + * + */ +void yyset_lineno (int _line_number ) { + + yylineno = _line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str ) { + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str ) { + yyout = _out_str ; +} + +int yyget_debug (void) { + return yyflexdebug; +} + +void yyset_debug (int _bdebug ) { + yyflexdebug = _bdebug ; +} + +static int yy_init_globals (void) { + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = NULL; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = NULL; + (yy_init) = 0; + (yy_start) = 0; + + (yy_state_buf) = 0; + (yy_state_ptr) = 0; + (yy_state_buf_max) = 0; + (yy_full_match) = 0; + (yy_lp) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) { + + /* Pop the buffer stack, destroying each element. */ + while(yy_current_buffer()) { + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + yyfree ( (yy_state_buf) ); + (yy_state_buf) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, const char * s2, int n ) { + + int i; + for ( i = 0; i < n; ++i ) { + s1[i] = s2[i]; + } +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (const char * s ) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) { + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size ) { + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr ) { + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +std::vector readFile(const char* filename) +{ + std::vector contents; + std::ifstream in(filename, std::ios::in | std::ios::binary); + if (in) + { + in.seekg(0, std::ios::end); + size_t size = static_cast(in.tellg()); + contents.resize(size + 2); + in.seekg(0, std::ios::beg); + in.read(contents.data(), size); + in.close(); + + contents[size + 0] = '\0'; + contents[size + 1] = '\0'; + } + else { + std::cerr << "*** Error: std::ifstream(" << filename << ") failed." << std::endl; + exit(-1); + } + return contents; +} + +int main(int argc, char** argv) +{ + if ( argc != 2 ) { + std::cerr << "*** Error: Must specify one filename." << std::endl; + exit(-1); + } + + std::vector stm = readFile( argv[1] ); + test_scan_buffer(stm.data(), stm.size()); + + testlex(); + + std::vector stm2(stm); + stm2.insert(stm2.end(), stm.begin(), stm.end()); + test_scan_buffer(stm2.data(), stm2.size()); + + testlex(); + + return 0; // All went well. +} + diff --git a/tests/string_c99.l b/tests/string_c99.l index 33d9cdeaa..d8eabfc35 100644 --- a/tests/string_c99.l +++ b/tests/string_c99.l @@ -36,7 +36,6 @@ %option 8bit prefix="test" %option nounput nomain nodefault noyywrap noinput %option warn -%option reentrant %% diff --git a/tests/testmaker.m4 b/tests/testmaker.m4 index ea495b2a9..bddbd445f 100644 --- a/tests/testmaker.m4 +++ b/tests/testmaker.m4 @@ -92,7 +92,6 @@ define(`M4_TEST_PREAMBLE', `dnl #include "config.h" #include %} -%option reentrant ')dnl close preamble define(`M4_TEST_DO', `$1;') define(`M4_TEST_FAILMESSAGE', `fprintf(stderr,"TEST FAILED: %d:\"%s\".\n", yylineno, yytext); exit(1);') diff --git a/tests/yyextra_c99.l b/tests/yyextra_c99.l index 66e2b4b45..448688246 100644 --- a/tests/yyextra_c99.l +++ b/tests/yyextra_c99.l @@ -50,7 +50,6 @@ static void append_char (char c, yyscan_t scanner ); %option 8bit prefix="test" %option nounput nomain noyywrap nodefault noyyinput %option warn -%option reentrant %option extra-type="struct Buffer *" %% diff --git a/tests/yywrap_r.i3 b/tests/yywrap_r.i3 new file mode 100755 index 0000000000000000000000000000000000000000..3a6eef56e7690eafb07706dc7a0c6d409a40a6cb GIT binary patch literal 55032 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 C)^TwF literal 0 HcmV?d00001 diff --git a/tests/yywrap_r.i3.c b/tests/yywrap_r.i3.c new file mode 100644 index 000000000..49bc8e151 --- /dev/null +++ b/tests/yywrap_r.i3.c @@ -0,0 +1,2433 @@ + +/* A lexical scanner generated by flex */ + +/* Target: C/C++ */ +/* START of m4 controls */ +/* 0 = 0 */ +/* */ +/* 0 = 0 */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* test = test */ +/* */ +/* */ +/* END of m4 controls */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +#ifdef yy_create_buffer +#define test_create_buffer_ALREADY_DEFINED +#else +#define yy_create_buffer test_create_buffer +#endif + +#ifdef yy_delete_buffer +#define test_delete_buffer_ALREADY_DEFINED +#else +#define yy_delete_buffer test_delete_buffer +#endif + +#ifdef yy_scan_buffer +#define test_scan_buffer_ALREADY_DEFINED +#else +#define yy_scan_buffer test_scan_buffer +#endif + +#ifdef yy_scan_string +#define test_scan_string_ALREADY_DEFINED +#else +#define yy_scan_string test_scan_string +#endif + +#ifdef yy_scan_bytes +#define test_scan_bytes_ALREADY_DEFINED +#else +#define yy_scan_bytes test_scan_bytes +#endif + +#ifdef yy_init_buffer +#define test_init_buffer_ALREADY_DEFINED +#else +#define yy_init_buffer test_init_buffer +#endif + +#ifdef yy_flush_buffer +#define test_flush_buffer_ALREADY_DEFINED +#else +#define yy_flush_buffer test_flush_buffer +#endif + +#ifdef yy_load_buffer_state +#define test_load_buffer_state_ALREADY_DEFINED +#else +#define yy_load_buffer_state test_load_buffer_state +#endif + +#ifdef yy_switch_to_buffer +#define test_switch_to_buffer_ALREADY_DEFINED +#else +#define yy_switch_to_buffer test_switch_to_buffer +#endif + +#ifdef yypush_buffer_state +#define testpush_buffer_state_ALREADY_DEFINED +#else +#define yypush_buffer_state testpush_buffer_state +#endif + +#ifdef yypop_buffer_state +#define testpop_buffer_state_ALREADY_DEFINED +#else +#define yypop_buffer_state testpop_buffer_state +#endif + +#ifdef yyensure_buffer_stack +#define testensure_buffer_stack_ALREADY_DEFINED +#else +#define yyensure_buffer_stack testensure_buffer_stack +#endif + +#ifdef yylex +#define testlex_ALREADY_DEFINED +#else +#define yylex testlex +#endif + +#ifdef yyrestart +#define testrestart_ALREADY_DEFINED +#else +#define yyrestart testrestart +#endif + +#ifdef yylex_init +#define testlex_init_ALREADY_DEFINED +#else +#define yylex_init testlex_init +#endif + +#ifdef yylex_init_extra +#define testlex_init_extra_ALREADY_DEFINED +#else +#define yylex_init_extra testlex_init_extra +#endif + +#ifdef yylex_destroy +#define testlex_destroy_ALREADY_DEFINED +#else +#define yylex_destroy testlex_destroy +#endif + +#ifdef yyget_debug +#define testget_debug_ALREADY_DEFINED +#else +#define yyget_debug testget_debug +#endif + +#ifdef yyset_debug +#define testset_debug_ALREADY_DEFINED +#else +#define yyset_debug testset_debug +#endif + +#ifdef yyget_extra +#define testget_extra_ALREADY_DEFINED +#else +#define yyget_extra testget_extra +#endif + +#ifdef yyset_extra +#define testset_extra_ALREADY_DEFINED +#else +#define yyset_extra testset_extra +#endif + +#ifdef yyget_in +#define testget_in_ALREADY_DEFINED +#else +#define yyget_in testget_in +#endif + +#ifdef yyset_in +#define testset_in_ALREADY_DEFINED +#else +#define yyset_in testset_in +#endif + +#ifdef yyget_out +#define testget_out_ALREADY_DEFINED +#else +#define yyget_out testget_out +#endif + +#ifdef yyset_out +#define testset_out_ALREADY_DEFINED +#else +#define yyset_out testset_out +#endif + +#ifdef yyget_leng +#define testget_leng_ALREADY_DEFINED +#else +#define yyget_leng testget_leng +#endif + +#ifdef yyget_text +#define testget_text_ALREADY_DEFINED +#else +#define yyget_text testget_text +#endif + +#ifdef yyget_lineno +#define testget_lineno_ALREADY_DEFINED +#else +#define yyget_lineno testget_lineno +#endif + +#ifdef yyset_lineno +#define testset_lineno_ALREADY_DEFINED +#else +#define yyset_lineno testset_lineno +#endif + +#ifdef yyget_column +#define testget_column_ALREADY_DEFINED +#else +#define yyget_column testget_column +#endif + +#ifdef yyset_column +#define testset_column_ALREADY_DEFINED +#else +#define yyset_column testset_column +#endif + +#ifdef yywrap +#define testwrap_ALREADY_DEFINED +#else +#define yywrap testwrap +#endif + +#ifdef yyalloc +#define testalloc_ALREADY_DEFINED +#else +#define yyalloc testalloc +#endif + +#ifdef yyrealloc +#define testrealloc_ALREADY_DEFINED +#else +#define yyrealloc testrealloc +#endif + +#ifdef yyfree +#define testfree_ALREADY_DEFINED +#else +#define yyfree testfree +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ + +/* Feature test macros. Flex uses functions that require a minimum set of + * macros defined. As defining some macros may hide function declarations that + * user code might use, be conservative and respect user's definitions as much + * as possible. In glibc, feature test macros may not be all set up until one + * of the libc header (that includes ) is included. This creates + * a circular dependency when we check the macros. is the safest + * header we can include and does not declare too many functions we don't need. + */ +#if !defined(__GNU_LIBRARY__) && defined(__STDC__) +#include +#endif +#if !(defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_POSIX_SOURCE)) +# define _POSIX_C_SOURCE 1 /* Required for fileno() */ +# define _POSIX_SOURCE 1 +#endif +#include +#include +#include +#include + +/* end standard C headers. */ + +/* begin standard C++ headers. */ + +/* flex integer type definitions */ + +#ifndef YYFLEX_INTTYPES_DEFINED +#define YYFLEX_INTTYPES_DEFINED + +/* Prefer C99 integer types if available. */ + +# if defined(__cplusplus) && __cplusplus >= 201103L +#include +# define YYFLEX_USE_STDINT +# endif +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +/* Include and not because Solaris 2.6 has the former + * and not the latter. + */ +#include +# define YYFLEX_USE_STDINT +# else +# if defined(_MSC_VER) && _MSC_VER >= 1600 +/* Visual C++ 2010 does not define __STDC_VERSION__ and has but not + * . + */ +#include +# define YYFLEX_USE_STDINT +# endif +# endif +# ifdef YYFLEX_USE_STDINT +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 unsigned char flex_uint8_t; +typedef short int flex_int16_t; +typedef unsigned short int flex_uint16_t; +# ifdef __STDC__ +typedef signed char flex_int8_t; +/* ISO C only requires at least 16 bits for int. */ +# ifdef __cplusplus +#include +# else +#include +# endif +# if UINT_MAX >= 4294967295 +# define YYFLEX_INT32_DEFINED +typedef int flex_int32_t; +typedef unsigned int flex_uint32_t; +# endif +# else +typedef char flex_int8_t; +# endif +# ifndef YYFLEX_INT32_DEFINED +typedef long int flex_int32_t; +typedef unsigned long int flex_uint32_t; +# endif +# endif +#endif /* YYFLEX_INTTYPES_DEFINED */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. + */ +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) + are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yyflexdebug yyg->yyflexdebug_r + +/* 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 yybegin(s) yyg->yy_start = 1 + 2 * (s) +/* Legacy interface */ +#define BEGIN yyg->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 yystart() ((yyg->yy_start - 1) / 2) +/* Legacy interfaces */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin , 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, + * plus the start state, plus the two end-of-buffer byte states. + */ +#define YY_STATE_BUF_EXTRA_SPACE 3 +#define YY_STATE_BUF_SIZE (YY_BUF_SIZE + YY_STATE_BUF_EXTRA_SPACE) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *yybuffer; +/* Legacy interface */ +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl ) { \ + if ( yytext[yyl] == '\n' ) { \ + --yylineno;\ + } \ + } \ + }while(0) + #define YY_LINENO_REWIND_TO(dst) \ + do {\ + const char *p;\ + for ( p = yy_cp-1; p >= (dst); --p) { \ + if ( *p == '\n' ) { \ + --yylineno;\ + } \ + } \ + }while(0) + +/* 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 = yyg->yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +#define yyunput(c) yyunput_r( c, yyg->yytext_ptr , yyscanner ) +/* Legacy interface */ +#define unput(c) yyunput_r( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yyatbol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* 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() ( yyg->yy_buffer_stack \ + ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ + : NULL) +/* Legacy interface */ +#define YY_CURRENT_BUFFER yy_current_buffer() +/* 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 yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void yyrestart ( FILE *input_file , yyscan_t yyscanner ); +void yy_switch_to_buffer ( yybuffer new_buffer , yyscan_t yyscanner ); +yybuffer yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); +void yy_delete_buffer ( yybuffer b , yyscan_t yyscanner ); +void yy_flush_buffer ( yybuffer b , yyscan_t yyscanner ); +void yypush_buffer_state ( yybuffer new_buffer , yyscan_t yyscanner ); +void yypop_buffer_state ( 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 ( yybuffer b, FILE *file , yyscan_t yyscanner ); +#define yy_flush_current_buffer() yy_flush_buffer( yy_current_buffer() , yyscanner) +#define YY_FLUSH_BUFFER yy_flush_current_buffer() + +yybuffer yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); +yybuffer yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); +yybuffer yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); + +void *yyalloc ( yy_size_t , yyscan_t yyscanner ); +void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); +void yyfree ( void * , yyscan_t yyscanner ); + +#define yy_new_buffer yy_create_buffer +#define yy_set_interactive(is_interactive) { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +} +#define yysetbol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} +#define yyatbol() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +/* Legacy interface */ +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yyatbol) +#define yy_set_bol(at_bol) \ + { \ + if ( yy_current_buffer() == NULL ) { \ + yyensure_buffer_stack (yyscanner); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yyatbol = at_bol; \ +} + +/* Begin user sect3 */ + +typedef flex_uint8_t YY_CHAR; + +typedef int yy_state_type; + +/* Watch out: yytext_ptr is a variable when yytext is an array, + * but it's a macro when yytext is a pointer. + */ + +#define yytext_ptr yytext_r + +/* %% [1.5] DFA */ +/* START of m4 controls */ +/* */ +/* */ +/* */ +/* END of m4 controls */ +/* START of Flex-generated definitions */#define YY_NUM_RULES 2 +#define YY_END_OF_BUFFER 3 +#define YY_JAMBASE 4 +#define YY_JAMSTATE 6 +#define YY_NUL_EC 1 +#define YY_OFFSET_TYPE flex_int16_t + +/* END of Flex-generated definitions */ + +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 yynoreturn yypanic ( const char* msg , yyscan_t yyscanner ); + +struct yy_trans_info + { + /* We require that yy_verify and yy_nxt must be of the same size int. */ + + /* We generate a bogus 'struct yy_trans_info' data type + * so we can guarantee that it is always declared in the skel. + * This is so we can compile "sizeof(struct yy_trans_info)" + * in any scanner. + */ + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + + }; + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + do { \ + yyg->yytext_ptr = yy_bp; \ + \ + yyleng = (int) (yy_cp - yy_bp); \ + \ + yyg->yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + \ + yyg->yy_c_buf_p = yy_cp; \ + } while(0) + +/* %% [2.0] data tables for the DFA are inserted here */ + +/* footprint: 819 bytes */ +/* tblend: 6 */ +/* numecs: 2 */ +/* num_rules: 2 */ +/* lastdfa: 5 */ + +/* m4 controls begin */ +/* */ +/* */ +/* m4 controls end */ + +/* Table of booleans, true if rule could match eol. */ +static const flex_int16_t yy_rule_can_match_eol[3] = { 0, + + 0, 0, }; + +static const flex_int16_t yy_accept[7] = { 0, + + 0, 0, 3, 1, 2, 0 +}; + +/* Character equivalence-class mapping */ +static const YY_CHAR 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 +}; + +/* Character meta-equivalence-class mappings */ +static const YY_CHAR yy_meta[3] = { 0, + + 1, 1 +}; + +static const flex_int16_t yy_base[7] = { 0, + + 0, 0, 3, 4, 4, 4 +}; + +static const flex_int16_t yy_def[7] = { 0, + + 6, 1, 6, 6, 6, 0 +}; + +static const flex_int16_t yy_nxt[7] = { 0, + + 4, 5, 6, 3, 6, 6 +}; + +static const flex_int16_t yy_chk[7] = { 0, + + 1, 1, 3, 6, 6, 6 +}; + +/* The intent behind this definition is that it'll catch + * any uses of yyreject() which flex missed. + */ +#define yyreject() reject_used_but_not_detected +#define REJECT reject_used_but_not_detected + +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET + +/* %% [3.0] static declarations conditional on mode switches go here */ +/* + * 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.cc". + The scanner tests that we correctly manage the state of the buffer + when the scanner called yyinput from user actions. + + This tests guards against reversions to Issue 525. + */ +#include +#include +#include + +#define MAX_FILES 10 +#define MAX_LENGTH 100 +char files[MAX_FILES][MAX_LENGTH] = { 0 }; +int filecounter = 0; + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ + +#include + +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t { + /* User-defined. Not touched by flex. */ + YY_EXTRA_TYPE yyextra_r; + + /* The rest are the same as the globals declared in the non-reentrant scanner. */ + FILE *yyin_r, *yyout_r; + size_t yy_buffer_stack_top; /**< index of top of stack. */ + size_t yy_buffer_stack_max; /**< capacity of stack. */ + yybuffer * yy_buffer_stack; /**< Stack as an array. */ + char yy_hold_char; + int yy_n_chars; + int yyleng_r; + char *yy_c_buf_p; + int yy_init; + int yy_start; + int yy_did_buffer_switch_on_eof; + int yy_start_stack_ptr; + int yy_start_stack_depth; + int *yy_start_stack; + yy_state_type yy_last_accepting_state; + char* yy_last_accepting_cpos; + + int yylineno_r; + int yyflexdebug_r; + + char *yytext_r; + int yy_more_flag; + int yy_more_len; + +}; /* end struct yyguts_t */ + +static int yy_init_globals ( yyscan_t yyscanner ); + +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( yyscan_t yyscanner ); + +int yyget_debug ( yyscan_t yyscanner ); + +void yyset_debug ( int debug_flag , yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); + +FILE *yyget_in ( yyscan_t yyscanner ); + +void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); + +FILE *yyget_out ( yyscan_t yyscanner ); + +void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); + + int yyget_leng ( yyscan_t yyscanner ); + +char *yyget_text ( yyscan_t yyscanner ); + +int yyget_lineno ( yyscan_t yyscanner ); + +void yyset_lineno ( int _line_number , yyscan_t yyscanner ); + +int yyget_column ( yyscan_t yyscanner ); + +void yyset_column ( int _column_no , yyscan_t yyscanner ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap ( yyscan_t yyscanner ); +#else +extern int yywrap ( yyscan_t yyscanner ); +#endif +#endif + +#ifndef YY_NO_YYUNPUT + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * , yyscan_t yyscanner); +#endif + +#ifndef YY_NO_YYINPUT + +static int yyinput ( yyscan_t yyscanner ); +#ifndef __cplusplus +#define input yyinput +#endif + +#endif + +/* + * Amount of stuff to slurp up with each read. + * We assume the stdio library has already + * chosen a fit size foe whatever platform + * we're running on. + */ +#define YY_READ_BUF_SIZE BUFSIZ + +/* Size of default input buffer. We want to be able to fit two + * OS-level reads, but efficiency gains as the buffer size + * increases fall off after that + */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE (2 * YY_READ_BUF_SIZE) +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef yyecho + +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define yyecho() do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) + +#endif +/* Legacy interface */ +#define ECHO yyecho() + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yypanic (const char* msg , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Report a fatal error. Legacy interface. */ +#ifndef YY_FATAL_ERROR + +#define YY_FATAL_ERROR(msg) yypanic( msg , yyscanner) + +#endif + +/* Legacy interface */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) do {result = yyread(buf, max_size , yyscanner);} while (0) + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ + +static int yyread(char *buf, size_t max_size , yyscan_t yyscanner) { + + int result; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) { + int c = '*'; + yy_size_t n; + for ( n = 0; n < max_size && + (c = getc( yyin )) != EOF && c != '\n'; ++n ) { + buf[n] = (char) c; + } + if ( c == '\n' ) { + buf[n++] = (char) c; + } + if ( c == EOF && ferror( yyin ) ) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + } + result = n; + } else { + errno=0; + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) { + if( errno != EINTR) { + YY_FATAL_ERROR( "input in flex scanner failed" ); + break; + } + errno=0; + clearerr(yyin); + } + } + + return result; +} +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (yyscan_t yyscanner); + +#define YY_DECL int yylex (yyscan_t yyscanner) + +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL { + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( !yyg->yy_init ) { + yyg->yy_init = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yyg->yy_start ) { + yyg->yy_start = 1; /* first start state */ + } + if ( ! yyin ) { + + yyin = stdin; + + } + if ( ! yyout ) { + + yyout = stdout; + + } + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + } + + yy_load_buffer_state( yyscanner ); + } + + /* open scope of user declarationns */ + { +/* %% [4.0] user's declarations go here */ + + while ( /*CONSTCOND*/1 ) { /* loops until end-of-file is reached */ + + yy_cp = yyg->yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yyg->yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + /* Generate the code to find the start state. */ + + yy_current_state = yyg->yy_start; + + /* Set up for storing up states. */ + + yy_match: + /* Generate the code to find the next match. */ + + do { + + int yy_c = *(yy_ec+YY_SC_TO_UI(*yy_cp)); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + /* Generate code to keep backing-up information. */ + + if ( yy_accept[yy_current_state] ) { + + yyg->yy_last_accepting_state = yy_current_state; + yyg->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]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + ++yy_cp; + + } + while ( yy_base[yy_current_state] != YY_JAMBASE ); + + yy_find_action: + /* code to find the action number goes here */ + + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) { /* have to back up */ + yy_cp = yyg->yy_last_accepting_cpos; + yy_current_state = yyg->yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { + int yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) { + if ( yytext[yyl] == '\n' ) { + + do{ yylineno++; + yycolumn=0; + }while(0) +; + + } + } + } + + 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 = yyg->yy_hold_char; + + /* Backing-up info for compressed tables is taken \after/ */ + /* yy_cp has been incremented for the next state. */ + yy_cp = yyg->yy_last_accepting_cpos; + + yy_current_state = yyg->yy_last_accepting_state; + goto yy_find_action; + +/* %% [5.0] user actions get inserted here */ + case 1: +YY_RULE_SETUP + +{ ECHO; + char c; + for (unsigned int i = 0; + i < 1000; + ++i) { + c = yyinput (yyscanner); + if (c == 0) + if (filecounter <= 0) + yyterminate(); + } + } + /*LINTED*/break; + case YY_STATE_EOF(INITIAL): +{ yyterminate(); } + /*LINTED*/break; + case 2: +YY_RULE_SETUP + +yypanic("flex scanner jammed" , yyscanner); + /*LINTED*/break; + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yyg->yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer() and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yyg->yy_c_buf_p = yyg->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() 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 = yyg->yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) { + /* Consume the NUL. */ + yy_cp = ++yyg->yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } else { + + /* Still need to initialize yy_cp, though + * yy_current_state was set up by + * yy_get_previous_state(). + */ + yy_cp = yyg->yy_c_buf_p; + + goto yy_find_action; + } + } else { /* not a NUL */ + switch ( yy_get_next_buffer( yyscanner ) ) { + case EOB_ACT_END_OF_FILE: + yyg->yy_did_buffer_switch_on_eof = 0; + + if ( yywrap( yyscanner ) ) { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(yystart()); + goto do_action; + } else { + if ( ! yyg->yy_did_buffer_switch_on_eof ) { + YY_NEW_FILE; + } + } + break; + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = + yyg->yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yyg->yy_c_buf_p = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + + yy_current_state = yy_get_previous_state( yyscanner ); + + yy_cp = yyg->yy_c_buf_p; + yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } /* end EOB inner switch */ + } /* end if */ + break; + } /* case YY_END_OF_BUFFER */ + default: + YY_FATAL_ERROR("fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer (yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = yyg->yytext_ptr; + int number_to_move, i; + int ret_val; + + if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) { + YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { + /* Don't try to fill the buffer, so this is an EOF. */ + if ( yyg->yy_c_buf_p - yyg->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) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); + + for ( i = 0; i < number_to_move; ++i ) { + *(dest++) = *(source++); + } + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) { + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + } else { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + yybuffer b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) (yyg->yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) { + b->yy_buf_size += b->yy_buf_size / 8; + } else { + b->yy_buf_size *= 2; + } + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + } else { + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + } + if ( ! b->yy_ch_buf ) { + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + } + yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) { + num_to_read = YY_READ_BUF_SIZE; + } + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + yyg->yy_n_chars, num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + if ( yyg->yy_n_chars == 0 ) { + if ( number_to_move == YY_MORE_ADJ ) { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin , yyscanner); + } else { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } else { + ret_val = EOB_ACT_CONTINUE_SCAN; + } + if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1) + 2; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + yyg->yy_n_chars += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner) + +{ + yy_state_type yy_current_state; + char *yy_cp; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Generate the code to find the start state. */ + + yy_current_state = yyg->yy_start; + + /* Set up for storing up states. */ + + for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) { + /* Generate the code to find the next state. */ + + int yy_c = (*yy_cp ? *(yy_ec+YY_SC_TO_UI(*yy_cp)) : YY_NUL_EC); + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + /* Generate code to keep backing-up information. */ + + if ( yy_accept[yy_current_state] ) { + + yyg->yy_last_accepting_state = yy_current_state; + yyg->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]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) + +{ + int yy_is_jam; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ + /* Generate code for handling NUL's, if needed. */ + + /* First, deal with backing up and setting up yy_cp if the scanner + * finds that it should JAM on the NUL. + * + * Only generate a definition for "yy_cp" if we'll generate code + * that uses it. Otherwise lint and the like complain. + */ + char *yy_cp = yyg->yy_c_buf_p; + + int yy_c = YY_NUL_EC; + /* Save the backing-up info \before/ computing the next state + * because we always compute one more state than needed - we + * always proceed until we reach a jam state + */ + + /* Generate code to keep backing-up information. */ + + if ( yy_accept[yy_current_state] ) { + + yyg->yy_last_accepting_state = yy_current_state; + yyg->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]; + + /* We've arranged it so that templates are never chained + * to one another. This means we can afford to make a + * very simple test to see if we need to convert to + * yy_c's meta-equivalence class without worrying + * about erroneously looking up the meta-equivalence + * class twice + */ + + /* lastdfa + 2 == YY_JAMSTATE + 1 is the beginning of the templates */ + if (yy_current_state >= YY_JAMSTATE + 1) { + yy_c = yy_meta[yy_c]; + } + + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + +yy_is_jam = (yy_current_state == YY_JAMSTATE); + + (void)yyg; + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_YYINPUT +int yyinput (yyscan_t yyscanner) + +{ + int c; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + *yyg->yy_c_buf_p = yyg->yy_hold_char; + + if ( *yyg->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 ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { + /* This was really a NUL. */ + *yyg->yy_c_buf_p = '\0'; + } else { + /* need more input */ + int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); + ++yyg->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. */ + yyrestart( yyin , yyscanner); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + if ( yywrap( yyscanner ) ) { + return 0; + } + if ( ! yyg->yy_did_buffer_switch_on_eof ) { + YY_NEW_FILE; + } + return yyinput(yyscanner); + + case EOB_ACT_CONTINUE_SCAN: + yyg->yy_c_buf_p = yyg->yytext_ptr + offset; + break; + default: + YY_FATAL_ERROR("unexpected return value from yy_get_next_buffer()"); + } + } + } + + c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ + *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ + yyg->yy_hold_char = *++yyg->yy_c_buf_p; + + if ( c == '\n' ) { + + do{ yylineno++; + yycolumn=0; + }while(0) +; + } + + return c; +} + +#endif /* ifndef YY_NO_YYINPUT */ + +/** 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 yyrestart (FILE * input_file , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( yy_current_buffer() == NULL ) { + yyensure_buffer_stack (yyscanner); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); + } + + yy_init_buffer( YY_CURRENT_BUFFER_LVALUE, input_file , yyscanner); + 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. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ + +void yy_switch_to_buffer (yybuffer new_buffer , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (yyscanner); + if ( yy_current_buffer() == new_buffer ) { + return; + } + if ( yy_current_buffer() ) { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->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. + */ + yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void yy_load_buffer_state (yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + + yyg->yy_hold_char = *yyg->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. + */ + +yybuffer yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) + +{ + yybuffer b; + + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); + if ( b->yy_ch_buf == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + } + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file , yyscanner); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * @param yyscanner The scanner object. + */ + +void yy_delete_buffer (yybuffer b , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if ( b == NULL ) { + return; + } + if ( b == yy_current_buffer() ) { /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (yybuffer) 0; + } + if ( b->yy_is_our_buffer ) { + yyfree( (void *) b->yy_ch_buf , yyscanner ); + } + yyfree( (void *) b , yyscanner ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + +static void yy_init_buffer (yybuffer b, FILE * file , yyscan_t yyscanner) + +{ + int oerrno = errno; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + yy_flush_buffer( b , yyscanner); + + b->yy_input_file = file; + + /* b->yy_input_file should never by NULL but we'll handle it cleanly + * on the off chance. + */ + if (b->yy_input_file == NULL){ + b->yy_fill_buffer = 0; + } else { + b->yy_fill_buffer = 1; + } + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != yy_current_buffer()) { + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c yy_current_buffer(). + * @param yyscanner The scanner object. + */ + +void yy_flush_buffer (yybuffer b , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if ( b == NULL ) { + return; + } + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yyatbol = 1; + b->yy_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 yypush_buffer_state (yybuffer new_buffer , yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (new_buffer == NULL) { + return; + } + yyensure_buffer_stack(yyscanner); + + /* This block is copied from yy_switch_to_buffer. */ + if ( yy_current_buffer() != NULL ) { + /* Flush out information for old buffer. */ + *yyg->yy_c_buf_p = yyg->yy_hold_char; + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; + } + + /* Only push if top exists. Otherwise, replace top. */ + if (yy_current_buffer()) { + yyg->yy_buffer_stack_top++; + } + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( yyscanner ); + yyg->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 yypop_buffer_state (yyscan_t yyscanner) + +{ + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + if (yy_current_buffer() == NULL) { + return; + } + yy_delete_buffer(yy_current_buffer() , yyscanner); + YY_CURRENT_BUFFER_LVALUE = NULL; + if (yyg->yy_buffer_stack_top > 0) { + --yyg->yy_buffer_stack_top; + } + if (yy_current_buffer() != NULL) { + yy_load_buffer_state( yyscanner ); + yyg->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) + +{ + yy_size_t num_to_alloc; + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (yyg->yy_buffer_stack == NULL) { + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if ( yyg->yy_buffer_stack == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + yyg->yy_buffer_stack_max = num_to_alloc; + yyg->yy_buffer_stack_top = 0; + return; + } + + if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1) { + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = yyg->yy_buffer_stack_max + grow_size; + yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc + (yyg->yy_buffer_stack, + num_to_alloc * sizeof(struct yy_buffer_state*) + , yyscanner); + if (yyg->yy_buffer_stack == NULL) { + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + } + /* zero only the new slots.*/ + memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); + yyg->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. + */ +yybuffer yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) +{ + yybuffer b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) { + /* They forgot to leave room for the EOB's. */ + return NULL; + } + b = (yybuffer) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); + if ( b == NULL ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + } + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yyatbol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b , yyscanner ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @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 + * yy_scan_bytes() instead. + */ +yybuffer yy_scan_string (const char * yystr , yyscan_t yyscanner) +{ + + return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +yybuffer yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) { + yybuffer b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n , yyscanner ); + if ( buf == 0 ) { + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + } + for ( i = 0; i < _yybytes_len; ++i ) { + buf[i] = yybytes[i]; + } + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n , yyscanner); + if ( b == NULL ) { + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + } + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +/* 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] = yyg->yy_hold_char; \ + yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ + yyg->yy_hold_char = *yyg->yy_c_buf_p; \ + *yyg->yy_c_buf_p = '\0'; \ + yyleng = yyless_macro_arg; \ + } while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int yyget_lineno (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (yy_current_buffer() == NULL) { + return 0; + } + + return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int yyget_column (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + if (yy_current_buffer() == NULL) { + return 0; + } + + return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_in (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_out (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int yyget_leng (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *yyget_text (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_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 yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyextra = user_defined ; +} + +/** Set the current line number. + * @param _line_number line number + * @param yyscanner The scanner object. + */ +void yyset_lineno (int _line_number , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* lineno is only valid if an input buffer exists. */ + if (yy_current_buffer() == NULL ) { + YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); + } + + yylineno = _line_number; +} + +/** Set the current column. + * @param _column_no column number + * @param yyscanner The scanner object. + */ +void yyset_column (int _column_no , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* column is only valid if an input buffer exists. */ + if (yy_current_buffer() == NULL ) { + YY_FATAL_ERROR( "yyset_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 yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyout = _out_str ; +} + +int yyget_debug (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + return yyflexdebug; +} + +void yyset_debug (int _bdebug , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + yyflexdebug = _bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ +int yylex_init(yyscan_t* ptr_yy_globals) { + if (ptr_yy_globals == NULL) { + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + + if (*ptr_yy_globals == NULL) { + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + return yy_init_globals ( *ptr_yy_globals ); +} + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ +int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) { + struct yyguts_t dummy_yyguts; + + yyset_extra (yy_user_defined, &dummy_yyguts); + + if (ptr_yy_globals == NULL) { + errno = EINVAL; + return 1; + } + + *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); + + if (*ptr_yy_globals == NULL) { + errno = ENOMEM; + return 1; + } + + /* By setting to 0xAA, we expose bugs in + yy_init_globals. Leave at 0x00 for releases. */ + memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + + yyset_extra (yy_user_defined, *ptr_yy_globals); + + return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + yyg->yy_buffer_stack = NULL; + yyg->yy_buffer_stack_top = 0; + yyg->yy_buffer_stack_max = 0; + yyg->yy_c_buf_p = NULL; + yyg->yy_init = 0; + yyg->yy_start = 0; + + yyg->yy_start_stack_ptr = 0; + yyg->yy_start_stack_depth = 0; + yyg->yy_start_stack = NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + + /* Pop the buffer stack, destroying each element. */ + while(yy_current_buffer()) { + yypop_buffer_state(yyscanner); + } + + /* Destroy the stack itself. */ + yyfree(yyg->yy_buffer_stack , yyscanner); + yyg->yy_buffer_stack = NULL; + + /* Destroy the start condition stack. */ + yyfree( yyg->yy_start_stack , yyscanner ); + yyg->yy_start_stack = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( yyscanner); + + /* Destroy the main struct (reentrant only). */ + yyfree ( yyscanner , yyscanner ); + yyscanner = NULL; + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + int i; + for ( i = 0; i < n; ++i ) { + s1[i] = s2[i]; + } +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (const char * s , yyscan_t yyscanner) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr , yyscan_t yyscanner) { + struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + (void)yyg; + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +size_t readFile(const char* filename, char* buffer) +{ + size_t size, result; + FILE *in; + + in = fopen(filename, "rb"); + if (in) + { + fseek(in, 0, SEEK_END); + size = (size_t)ftell(in); + size = size>(MAX_LENGTH-2)?(MAX_LENGTH-2):size; + rewind(in); + result = fread(buffer, sizeof(char), size, in); + fclose(in); + if ( result != size) { + fprintf(stderr, "*** Error: fread(%s) failed.\n", filename); + exit(-1); + } + else { + buffer[size + 0] = '\0'; + buffer[size + 1] = '\0'; + } + } + else { + fprintf(stderr, "*** Error: fopen(%s) failed.\n", filename); + exit(-1); + } + + return (size + 2); +} + +int testwrap (yyscan_t yyscanner) +{ + if ( --filecounter >= 0 ) { + + fprintf(stderr, "*** INFO: Wrapping to file %d.\n", filecounter); + + test_scan_buffer(files[filecounter], MAX_LENGTH, yyscanner); + + return 0; + } + return 1; +} + +int main (int argc, char* argv[]) +{ + yyscan_t scanner; + + if ( argc < 2) { + printf("*** Error: Must specify at least one filename.\n"); + exit(-1); + } + for (int i = 1; i < argc && i <= MAX_FILES; i++) { + readFile(argv[i], files[i-1]); + ++filecounter; + } + + testlex_init(&scanner); + if ( !testwrap(scanner) ) + { + testlex(scanner); + } + testlex_destroy(scanner); + + return 0; +} + +#ifdef __cplusplus +} +#endif /* __cplusplus */ From 0b4c26420221fa1be4ba91df5ad6c8c75e5b2fdc Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Sun, 9 Feb 2025 19:04:11 -0500 Subject: [PATCH 33/37] feat: Refactor format string getters out of emission code for use in parser actions. --- src/c99-backend.c | 119 +++++++++++++++++++++++++++++++++++++++------ src/cpp-backend.c | 120 ++++++++++++++++++++++++++++++++++++++++------ src/parse.y | 21 +++++--- src/skeletons.h | 14 +++++- 4 files changed, 237 insertions(+), 37 deletions(-) diff --git a/src/c99-backend.c b/src/c99-backend.c index bc59722d7..17f4e01ba 100644 --- a/src/c99-backend.c +++ b/src/c99-backend.c @@ -223,17 +223,36 @@ static void c99_format_state_table_entry ( const struct flex_backend_t * b, int Other target languages may use another selection syntax. Basically, each arm matches the character under examination, treated as a number. */ +static const char * c99_get_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { + static const char *format = "case %d: "; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit a case for the main state switch. +*/ static void c99_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { b->indent(b); - fprintf(stdout, "case %d: ", c); + fputs(b->get_normal_state_case_arm(b, c), stdout); } /* Generate the special case arm for EOF. This lives in the body of yyinput and determines whether/when to switch to the next buffer. */ +static const char * c99_get_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { + static const char *format = "case YY_STATE_EOF(%s): "; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit the special case arm for EOF. */ static void c99_format_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { b->indent(b); - fprintf(stdout, "case YY_STATE_EOF(%s): ", c); + fputs(b->get_eof_state_case_arm(b, c), stdout); } /* Generate the special action FALLTHROUGH. @@ -251,39 +270,87 @@ static void c99_eof_state_case_terminate ( const struct flex_backend_t *b ) { } /* Generate the action preamble. */ -static void c99_take_yytext ( const struct flex_backend_t *b ) { +static const char * c99_get_take_yytext( const struct flex_backend_t *b ) { + static const char *directive = "YY_DO_BEFORE_ACTION; /* set up yytext */"; + return directive; +}; + +/* Emit the action preamble. */ +static void c99_format_take_yytext ( const struct flex_backend_t *b ) { b->indent(b); - fputs("YY_DO_BEFORE_ACTION; /* set up yytext */", stdout); + fputs(b->get_take_yytext(b), stdout); } /* Generate the action postamble. */ -static void c99_release_yytext ( const struct flex_backend_t *b ) { +static const char * c99_get_release_yytext( const struct flex_backend_t *b ) { + static const char *directive = "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */"; + return directive; +}; + +/* Emit the action postamble. */ +static void c99_format_release_yytext ( const struct flex_backend_t *b ) { b->indent(b); - fputs( "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */", stdout); + fputs( b->get_release_yytext(b), stdout); } /* Generate the buffer rewind sub-action. */ +static const char * c99_get_char_rewind( const struct flex_backend_t *b, int c ) { + static const char *format = "YY_G(yy_c_buf_p) = yy_cp -= %d;"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit the buffer rewind sub-action. */ static void c99_format_char_rewind ( const struct flex_backend_t *b, int c ) { b->indent(b); - fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp -= %d;", c); + fputs(b->get_char_rewind(b, c), stdout); } /* Generate the line rewind sub-action. */ +static const char * c99_get_line_rewind( const struct flex_backend_t *b, int l ) { + static const char *format = "YY_LINENO_REWIND_TO(yy_cp - %d);"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, l); + return directive; +} + +/* Emit the line rewind sub-action. */ static void c99_format_line_rewind ( const struct flex_backend_t *b, int l ) { b->indent(b); - fprintf(stdout, "YY_LINENO_REWIND_TO(yy_cp - %d);", l); + fputs(b->get_line_rewind(b,l), stdout); } /* Generate the buffer skip sub-action. */ +static const char * c99_get_char_forward( const struct flex_backend_t *b, int c ) { + static const char *format = "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit the buffer skip sub-action. */ static void c99_format_char_forward ( const struct flex_backend_t *b, int c ) { b->indent(b); - fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;", c); + fputs(b->get_char_forward(b, c), stdout); +} + +/* Generate the line skip sub-action. */ +static const char * c99_get_line_forward( const struct flex_backend_t *b, int l ) { + static const char *format = "YY_LINENO_REWIND_TO(yy_bp + %d);"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, l); + return directive; } /* Generate the line skip sub-action. */ static void c99_format_line_forward ( const struct flex_backend_t *b, int l ) { b->indent(b); - fprintf(stdout, "YY_LINENO_REWIND_TO(yy_bp + %d);", l); + fputs(b->get_line_forward(b,l), stdout); } /* Define a byte-width constant. */ @@ -333,9 +400,16 @@ static void c99_format_userinit ( const struct flex_backend_t *b, const char *d b->format_const(b, "YY_USER_INIT", d); } +/* Inject the rule_setup macro call where needed. */ +static const char * c99_get_rule_setup ( const struct flex_backend_t *b ) { + static const char *directive = "YY_RULE_SETUP"; + + return directive; +} + /* Inject the rule_setup macro call where needed. */ static void c99_format_rule_setup ( const struct flex_backend_t *b ) { - b->verbatim(b, "YY_RULE_SETUP"); + fputs(b->get_rule_setup(b), stdout); b->newline(b); } @@ -375,9 +449,16 @@ static void c99_format_fatal_error ( const struct flex_backend_t *b, const char } /* Generate the echo action. */ +static const char * c99_get_echo ( const struct flex_backend_t *b ) { + static const char *directive = "yyecho();"; + + return directive; +} + +/* Emit the echo action. */ static void c99_echo ( const struct flex_backend_t *b ) { b->indent(b); - fputs("yyecho();", stdout); + fputs(b->get_echo(b), stdout); } /* Generate the definition of the terminate special action. */ @@ -489,15 +570,23 @@ struct flex_backend_t c99_backend = { .verbatim = c99_verbatim, .format_data_table_entry = c99_format_data_table_entry, .format_state_table_entry = c99_format_state_table_entry, + .get_normal_state_case_arm = c99_get_normal_state_case_arm, .format_normal_state_case_arm = c99_format_normal_state_case_arm, + .get_eof_state_case_arm = c99_get_eof_state_case_arm, .format_eof_state_case_arm = c99_format_eof_state_case_arm, .eof_state_case_fallthrough = c99_eof_state_case_fallthrough, .eof_state_case_terminate = c99_eof_state_case_terminate, - .take_yytext = c99_take_yytext, - .release_yytext = c99_release_yytext, + .get_take_yytext = c99_get_take_yytext, + .format_take_yytext = c99_format_take_yytext, + .get_release_yytext = c99_get_release_yytext, + .format_release_yytext = c99_format_release_yytext, + .get_char_rewind = c99_get_char_rewind, .format_char_rewind = c99_format_char_rewind, + .get_line_rewind = c99_get_line_rewind, .format_line_rewind = c99_format_line_rewind, + .get_char_forward = c99_get_char_forward, .format_char_forward = c99_format_char_forward, + .get_line_forward = c99_get_line_forward, .format_line_forward = c99_format_line_forward, .format_byte_const = c99_format_byte_const, .format_state_const = c99_format_state_const, @@ -508,11 +597,13 @@ struct flex_backend_t c99_backend = { .format_offset_type = c99_format_offset_type, .format_yy_decl = c99_format_yy_decl, .format_userinit = c99_format_userinit, + .get_rule_setup = c99_get_rule_setup, .format_rule_setup = c99_format_rule_setup, .format_user_preaction = c99_format_user_preaction, .format_state_case_break = c99_format_state_case_break, .format_user_postaction = c99_format_user_postaction, .format_fatal_error = c99_format_fatal_error, + .get_echo = c99_get_echo, .echo = c99_echo, .format_yyterminate = c99_format_yyterminate, .format_yyreject = c99_format_yyreject, diff --git a/src/cpp-backend.c b/src/cpp-backend.c index 635aec23f..2a6670d93 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -223,17 +223,36 @@ static void cpp_format_state_table_entry ( const struct flex_backend_t * b, int Other target languages may use another selection syntax. Basically, each arm matches the character under examination, treated as a number. */ +static const char * cpp_get_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { + static const char *format = "case %d: "; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit a case for the main state switch. +*/ static void cpp_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { b->indent(b); - fprintf(stdout, "case %d: ", c); + fputs(b->get_normal_state_case_arm(b, c), stdout); } /* Generate the special case arm for EOF. This lives in the body of yyinput and determines whether/when to switch to the next buffer. */ +static const char * cpp_get_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { + static const char *format = "case YY_STATE_EOF(%s): "; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit the special case arm for EOF. */ static void cpp_format_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { b->indent(b); - fprintf(stdout, "case YY_STATE_EOF(%s): ", c); + fputs(b->get_eof_state_case_arm(b, c), stdout); } /* Generate the special action FALLTHROUGH. @@ -242,6 +261,7 @@ static void cpp_format_eof_state_case_arm ( const struct flex_backend_t *b, cons static void cpp_eof_state_case_fallthrough ( const struct flex_backend_t *b ) { b->indent(b); b->comment(b, "FALLTHROUGH"); + b->newline(b); } /* Generate the special action terminate. */ @@ -251,39 +271,87 @@ static void cpp_eof_state_case_terminate ( const struct flex_backend_t *b ) { } /* Generate the action preamble. */ -static void cpp_take_yytext ( const struct flex_backend_t *b ) { +static const char * cpp_get_take_yytext( const struct flex_backend_t *b ) { + static const char *directive = "YY_DO_BEFORE_ACTION; /* set up yytext */"; + return directive; +}; + +/* Emit the action preamble. */ +static void cpp_format_take_yytext ( const struct flex_backend_t *b ) { b->indent(b); - fputs("YY_DO_BEFORE_ACTION; /* set up yytext */", stdout); + fputs(b->get_take_yytext(b), stdout); } /* Generate the action postamble. */ -static void cpp_release_yytext ( const struct flex_backend_t *b ) { +static const char * cpp_get_release_yytext( const struct flex_backend_t *b ) { + static const char *directive = "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */"; + return directive; +}; + +/* Emit the action postamble. */ +static void cpp_format_release_yytext ( const struct flex_backend_t *b ) { b->indent(b); - fputs( "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */", stdout); + fputs( b->get_release_yytext(b), stdout); } /* Generate the buffer rewind sub-action. */ +static const char * cpp_get_char_rewind( const struct flex_backend_t *b, int c ) { + static const char *format = "YY_G(yy_c_buf_p) = yy_cp -= %d;"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit the buffer rewind sub-action. */ static void cpp_format_char_rewind ( const struct flex_backend_t *b, int c ) { b->indent(b); - fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp -= %d;", c); + fputs(b->get_char_rewind(b, c), stdout); } /* Generate the line rewind sub-action. */ +static const char * cpp_get_line_rewind( const struct flex_backend_t *b, int l ) { + static const char *format = "YY_LINENO_REWIND_TO(yy_cp - %d);"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, l); + return directive; +} + +/* Emit the line rewind sub-action. */ static void cpp_format_line_rewind ( const struct flex_backend_t *b, int l ) { b->indent(b); - fprintf(stdout, "YY_LINENO_REWIND_TO(yy_cp - %d);", l); + fputs(b->get_line_rewind(b,l), stdout); } /* Generate the buffer skip sub-action. */ +static const char * cpp_get_char_forward( const struct flex_backend_t *b, int c ) { + static const char *format = "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, c); + return directive; +} + +/* Emit the buffer skip sub-action. */ static void cpp_format_char_forward ( const struct flex_backend_t *b, int c ) { b->indent(b); - fprintf(stdout, "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;", c); + fputs(b->get_char_forward(b, c), stdout); +} + +/* Generate the line skip sub-action. */ +static const char * cpp_get_line_forward( const struct flex_backend_t *b, int l ) { + static const char *format = "YY_LINENO_REWIND_TO(yy_bp + %d);"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, l); + return directive; } /* Generate the line skip sub-action. */ static void cpp_format_line_forward ( const struct flex_backend_t *b, int l ) { b->indent(b); - fprintf(stdout, "YY_LINENO_REWIND_TO(yy_bp + %d);", l); + fputs(b->get_line_forward(b,l), stdout); } /* Define a byte-width constant. */ @@ -333,9 +401,16 @@ static void cpp_format_userinit ( const struct flex_backend_t *b, const char *d b->format_const(b, "YY_USER_INIT", d); } +/* Inject the rule_setup macro call where needed. */ +static const char * cpp_get_rule_setup ( const struct flex_backend_t *b ) { + static const char *directive = "YY_RULE_SETUP"; + + return directive; +} + /* Inject the rule_setup macro call where needed. */ static void cpp_format_rule_setup ( const struct flex_backend_t *b ) { - b->verbatim(b, "YY_RULE_SETUP"); + fputs(b->get_rule_setup(b), stdout); b->newline(b); } @@ -375,9 +450,16 @@ static void cpp_format_fatal_error ( const struct flex_backend_t *b, const char } /* Generate the echo action. */ +static const char * cpp_get_echo ( const struct flex_backend_t *b ) { + static const char *directive = "yyecho();"; + + return directive; +} + +/* Emit the echo action. */ static void cpp_echo ( const struct flex_backend_t *b ) { b->indent(b); - fputs("yyecho();", stdout); + fputs(b->get_echo(b), stdout); } /* Generate the definition of the terminate special action. */ @@ -489,15 +571,23 @@ struct flex_backend_t cpp_backend = { .verbatim = cpp_verbatim, .format_data_table_entry = cpp_format_data_table_entry, .format_state_table_entry = cpp_format_state_table_entry, + .get_normal_state_case_arm = cpp_get_normal_state_case_arm, .format_normal_state_case_arm = cpp_format_normal_state_case_arm, + .get_eof_state_case_arm = cpp_get_eof_state_case_arm, .format_eof_state_case_arm = cpp_format_eof_state_case_arm, .eof_state_case_fallthrough = cpp_eof_state_case_fallthrough, .eof_state_case_terminate = cpp_eof_state_case_terminate, - .take_yytext = cpp_take_yytext, - .release_yytext = cpp_release_yytext, + .get_take_yytext = cpp_get_take_yytext, + .format_take_yytext = cpp_format_take_yytext, + .get_release_yytext = cpp_get_release_yytext, + .format_release_yytext = cpp_format_release_yytext, + .get_char_rewind = cpp_get_char_rewind, .format_char_rewind = cpp_format_char_rewind, + .get_line_rewind = cpp_get_line_rewind, .format_line_rewind = cpp_format_line_rewind, + .get_char_forward = cpp_get_char_forward, .format_char_forward = cpp_format_char_forward, + .get_line_forward = cpp_get_line_forward, .format_line_forward = cpp_format_line_forward, .format_byte_const = cpp_format_byte_const, .format_state_const = cpp_format_state_const, @@ -508,11 +598,13 @@ struct flex_backend_t cpp_backend = { .format_offset_type = cpp_format_offset_type, .format_yy_decl = cpp_format_yy_decl, .format_userinit = cpp_format_userinit, + .get_rule_setup = cpp_get_rule_setup, .format_rule_setup = cpp_format_rule_setup, .format_user_preaction = cpp_format_user_preaction, .format_state_case_break = cpp_format_state_case_break, .format_user_postaction = cpp_format_user_postaction, .format_fatal_error = cpp_format_fatal_error, + .get_echo = cpp_get_echo, .echo = cpp_echo, .format_yyterminate = cpp_format_yyterminate, .format_yyreject = cpp_format_yyreject, diff --git a/src/parse.y b/src/parse.y index 80e7f0977..d7039cdc3 100644 --- a/src/parse.y +++ b/src/parse.y @@ -66,6 +66,7 @@ #include "flexdef.h" #include "tables.h" +#include "skeletons.h" int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen; static int currccl; @@ -79,6 +80,8 @@ static int madeany = false; /* whether we've made the '.' character class */ static int ccldot, cclany; int previous_continued_action; /* whether the previous rule's action was '|' */ +static const struct flex_backend_t *backend = NULL; + #define format_warn3(fmt, a1, a2) \ do{ \ char fw3_msg[MAXLINE];\ @@ -117,6 +120,10 @@ int previous_continued_action; /* whether the previous rule's action was '|' */ %} +%initial-action { + backend = get_backend(); +}; + %% goal : initlex sect1 sect1end sect2 initforrule { /* add default rule */ @@ -143,7 +150,7 @@ goal : initlex sect1 sect1end sect2 initforrule add_action( "M4_HOOK_FATAL_ERROR(\"flex scanner jammed\")"); else { - add_action("M4_HOOK_ECHO"); + add_action( backend->get_echo(backend) ); } add_action( "\n\tM4_HOOK_STATE_CASE_BREAK\n" ); @@ -978,7 +985,6 @@ string : string CHAR void build_eof_action(void) { int i; - char action_text[MAXLINE]; for ( i = 1; i <= scon_stk_ptr; ++i ) { @@ -991,12 +997,13 @@ void build_eof_action(void) { sceof[scon_stk[i]] = true; - if (previous_continued_action /* && previous action was regular */) - add_action("YY_RULE_SETUP\n"); + if (previous_continued_action /* && previous action was regular */) { + add_action( backend->get_rule_setup(backend) ); + add_action( "\n" ); + } - snprintf( action_text, sizeof(action_text), "M4_HOOK_EOF_STATE_CASE_ARM(%s)\n", - scname[scon_stk[i]] ); - add_action( action_text ); + add_action( backend->get_eof_state_case_arm(backend, scname[scon_stk[i]]) ); + add_action( "\n" ); } } diff --git a/src/skeletons.h b/src/skeletons.h index 5999b1be2..ac75f7507 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -71,15 +71,23 @@ struct flex_backend_t { void (*verbatim) ( const struct flex_backend_t *b, const char *s ); void (*format_data_table_entry) ( const struct flex_backend_t *b, int t ); void (*format_state_table_entry) ( const struct flex_backend_t *b, int t ); + const char * (*get_normal_state_case_arm) ( const struct flex_backend_t *b, int c ); void (*format_normal_state_case_arm) ( const struct flex_backend_t *b, int c ); + const char * (*get_eof_state_case_arm) ( const struct flex_backend_t *b, const char *const c ); void (*format_eof_state_case_arm) ( const struct flex_backend_t *b, const char *const c ); void (*eof_state_case_fallthrough) ( const struct flex_backend_t *b ); void (*eof_state_case_terminate) ( const struct flex_backend_t *b ); - void (*take_yytext) ( const struct flex_backend_t *b ); - void (*release_yytext) ( const struct flex_backend_t *b ); + const char * (*get_take_yytext) ( const struct flex_backend_t *b ); + void (*format_take_yytext) ( const struct flex_backend_t *b ); + const char * (*get_release_yytext) ( const struct flex_backend_t *b ); + void (*format_release_yytext) ( const struct flex_backend_t *b ); + const char * (*get_char_rewind) ( const struct flex_backend_t *b, int c ); void (*format_char_rewind) ( const struct flex_backend_t *b, int c ); + const char * (*get_line_rewind) ( const struct flex_backend_t *b, int l ); void (*format_line_rewind) ( const struct flex_backend_t *b, int l ); + const char * (*get_char_forward) ( const struct flex_backend_t *b, int c ); void (*format_char_forward) ( const struct flex_backend_t *b, int c ); + const char * (*get_line_forward) ( const struct flex_backend_t *b, int l ); void (*format_line_forward) ( const struct flex_backend_t *b, int l ); void (*format_byte_const) ( const struct flex_backend_t *b, const char *n, const int c ); void (*format_state_const) ( const struct flex_backend_t *b, const char *n, const int s ); @@ -90,11 +98,13 @@ struct flex_backend_t { void (*format_offset_type) ( const struct flex_backend_t *b, const char *t ); void (*format_yy_decl) ( const struct flex_backend_t *b, const char *d ); void (*format_userinit) ( const struct flex_backend_t *b, const char *d ); + const char * (*get_rule_setup) ( const struct flex_backend_t *b ); void (*format_rule_setup) ( const struct flex_backend_t *b ); void (*format_user_preaction) ( const struct flex_backend_t *b, const char *d ); void (*format_state_case_break) ( const struct flex_backend_t *b ); void (*format_user_postaction) ( const struct flex_backend_t *b, const char *d ); void (*format_fatal_error) ( const struct flex_backend_t *b, const char *e ); + const char * (*get_echo) ( const struct flex_backend_t *b ); void (*echo) ( const struct flex_backend_t *b ); void (*format_yyterminate) ( const struct flex_backend_t *b, const char *d ); void (*format_yyreject) ( const struct flex_backend_t *b ); From 5a0ccbb3719480a9c3fd6f040c1f71117c913cf1 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 10 Feb 2025 17:56:39 -0500 Subject: [PATCH 34/37] feat: Refactor common emitter code into skeletons.c --- src/c99-backend.c | 299 +++++++++++----------------------------------- src/cpp-backend.c | 299 +++++++++++----------------------------------- src/skeletons.c | 243 +++++++++++++++++++++++++++++++++++++ src/skeletons.h | 54 +++++++++ 4 files changed, 438 insertions(+), 457 deletions(-) diff --git a/src/c99-backend.c b/src/c99-backend.c index 17f4e01ba..abb1c1d9d 100644 --- a/src/c99-backend.c +++ b/src/c99-backend.c @@ -83,9 +83,12 @@ static void c99_close_block_comment ( const struct flex_backend_t *b ) { fputs(" */", stdout); } -static void c99_comment ( const struct flex_backend_t *b, const char *c ) { - b->indent(b); - fprintf(stdout, "/* %s */", c); +static const char * c99_get_comment ( const struct flex_backend_t *b, const char *c ) { + static const char *format = "/* %s */"; + static char directive[MAXLINE*2] = "\0"; + + snprintf(directive, sizeof(directive), format, c); + return directive; } static void c99_record_separator ( const struct flex_backend_t *b ) { @@ -136,54 +139,6 @@ static const char * c99_get_trace_line_format ( const struct flex_backend_t *b ) return "#line %d \"%s\"\n"; } - -/* Combine the format string from *_get_trace_line_format with its arguments. */ -static void c99_line_directive_out ( const struct flex_backend_t * b, FILE *output_file, char *path, int linenum ) { - char directive[MAXLINE*2], filename[MAXLINE]; - char *s1, *s2, *s3; - - if (!ctrl.gen_line_dirs) { - return; - } - - /* char *infilename is in the global namespace */ - s1 = (path != NULL) ? path : infilename; - - if ((path != NULL) && !s1) { - s1 = ""; - } - - s2 = filename; - s3 = &filename[sizeof (filename) - 2]; - - while (s2 < s3 && *s1) { - if (*s1 == '\\' || *s1 == '"') { - /* Escape the '\' or '"' */ - *s2++ = '\\'; - } - - *s2++ = *s1++; - } - - *s2 = '\0'; - - if (path != NULL) { - snprintf (directive, sizeof(directive), b->get_trace_line_format(b), linenum, filename); - } else { - snprintf (directive, sizeof(directive), b->get_trace_line_format(b), 0, filename); - } - - /* If output_file is nil then we should put the directive in - * the accumulated actions. - */ - if (output_file) { - fputs (directive, output_file); - } - else { - add_action (directive); - } -} - /* TODO: indent? */ static void c99_open_table ( const struct flex_backend_t *b ) { fputs("{", stdout); @@ -199,14 +154,6 @@ static void c99_close_table ( const struct flex_backend_t *b ) { fputs("};\n", stdout); } -/* Intended to emit a macro call in C/CXX. - Can also emit a bare string. - */ -static void c99_verbatim ( const struct flex_backend_t *b, const char *s ) { - if (s) - fputs(s, stdout); -} - /* Format an entry into a data table. */ static void c99_format_data_table_entry ( const struct flex_backend_t * b, int t ) { /* Expected to occur in a block format, so don't indent. */ @@ -231,13 +178,6 @@ static const char * c99_get_normal_state_case_arm ( const struct flex_backend_t return directive; } -/* Emit a case for the main state switch. -*/ -static void c99_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { - b->indent(b); - fputs(b->get_normal_state_case_arm(b, c), stdout); -} - /* Generate the special case arm for EOF. This lives in the body of yyinput and determines whether/when to switch to the next buffer. */ @@ -249,12 +189,6 @@ static const char * c99_get_eof_state_case_arm ( const struct flex_backend_t *b, return directive; } -/* Emit the special case arm for EOF. */ -static void c99_format_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { - b->indent(b); - fputs(b->get_eof_state_case_arm(b, c), stdout); -} - /* Generate the special action FALLTHROUGH. This is just a comment in C/CXX, but a few languages require a keyword for fallthrough logic. */ @@ -273,24 +207,12 @@ static void c99_eof_state_case_terminate ( const struct flex_backend_t *b ) { static const char * c99_get_take_yytext( const struct flex_backend_t *b ) { static const char *directive = "YY_DO_BEFORE_ACTION; /* set up yytext */"; return directive; -}; - -/* Emit the action preamble. */ -static void c99_format_take_yytext ( const struct flex_backend_t *b ) { - b->indent(b); - fputs(b->get_take_yytext(b), stdout); } /* Generate the action postamble. */ static const char * c99_get_release_yytext( const struct flex_backend_t *b ) { static const char *directive = "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */"; return directive; -}; - -/* Emit the action postamble. */ -static void c99_format_release_yytext ( const struct flex_backend_t *b ) { - b->indent(b); - fputs( b->get_release_yytext(b), stdout); } /* Generate the buffer rewind sub-action. */ @@ -302,12 +224,6 @@ static const char * c99_get_char_rewind( const struct flex_backend_t *b, int c ) return directive; } -/* Emit the buffer rewind sub-action. */ -static void c99_format_char_rewind ( const struct flex_backend_t *b, int c ) { - b->indent(b); - fputs(b->get_char_rewind(b, c), stdout); -} - /* Generate the line rewind sub-action. */ static const char * c99_get_line_rewind( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_cp - %d);"; @@ -317,12 +233,6 @@ static const char * c99_get_line_rewind( const struct flex_backend_t *b, int l ) return directive; } -/* Emit the line rewind sub-action. */ -static void c99_format_line_rewind ( const struct flex_backend_t *b, int l ) { - b->indent(b); - fputs(b->get_line_rewind(b,l), stdout); -} - /* Generate the buffer skip sub-action. */ static const char * c99_get_char_forward( const struct flex_backend_t *b, int c ) { static const char *format = "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;"; @@ -332,12 +242,6 @@ static const char * c99_get_char_forward( const struct flex_backend_t *b, int c return directive; } -/* Emit the buffer skip sub-action. */ -static void c99_format_char_forward ( const struct flex_backend_t *b, int c ) { - b->indent(b); - fputs(b->get_char_forward(b, c), stdout); -} - /* Generate the line skip sub-action. */ static const char * c99_get_line_forward( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_bp + %d);"; @@ -347,12 +251,6 @@ static const char * c99_get_line_forward( const struct flex_backend_t *b, int l return directive; } -/* Generate the line skip sub-action. */ -static void c99_format_line_forward ( const struct flex_backend_t *b, int l ) { - b->indent(b); - fputs(b->get_line_forward(b,l), stdout); -} - /* Define a byte-width constant. */ static void c99_format_byte_const ( const struct flex_backend_t *b, const char *n, const int c ) { fprintf(stdout, "#define %s %d\n", n, c); @@ -381,8 +279,12 @@ static void c99_format_bool_const ( const struct flex_backend_t *b, const char * } /* Define a string constant. */ -static void c99_format_const ( const struct flex_backend_t *b, const char *n, const char *v ) { - fprintf(stdout, "#define %s %s\n", n, v); +static const char * c99_get_const ( const struct flex_backend_t *b, const char *n, const char *v ) { + static const char *format = "#define %s %s\n"; + static char directive[MAXLINE*2] = "\0"; + + snprintf(directive, sizeof(directive), format, n, v); + return directive; } /* Define a constant used by the skeleton. */ @@ -400,52 +302,48 @@ static void c99_format_userinit ( const struct flex_backend_t *b, const char *d b->format_const(b, "YY_USER_INIT", d); } -/* Inject the rule_setup macro call where needed. */ +/* Generate the rule_setup preamble. */ static const char * c99_get_rule_setup ( const struct flex_backend_t *b ) { static const char *directive = "YY_RULE_SETUP"; - return directive; } -/* Inject the rule_setup macro call where needed. */ -static void c99_format_rule_setup ( const struct flex_backend_t *b ) { - fputs(b->get_rule_setup(b), stdout); - b->newline(b); -} - -/* Define the user_action constant, if needed. */ -static void c99_format_user_preaction ( const struct flex_backend_t *b, const char *d ) { - b->format_const(b, "YY_USER_ACTION", d); +/* Generate the user_action constant, if needed. */ +static const char * c99_get_user_preaction ( const struct flex_backend_t *b, const char *d ) { + return b->get_const(b, "YY_USER_ACTION", d); } /* End a state case arm, optionally inserting user postactions. TODO: Why can't this use YY_STATE_CASE_BREAK from format_user_postaction? */ -static void c99_format_state_case_break ( const struct flex_backend_t *b ) { - b->indent(b); +static const char * c99_get_state_case_break ( const struct flex_backend_t *b ) { + static const char *directive = "/*LINTED*/break;"; if (!ctrl.postaction) { - fputs("/*LINTED*/break;", stdout); + return directive; } else { - fputs(ctrl.postaction, stdout); + return ctrl.postaction; } } /* Generate the definition of the STATE_CASE_BREAK end of action. */ -static void c99_format_user_postaction ( const struct flex_backend_t *b, const char *d ) { +static const char * c99_get_user_postaction ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { - b->format_const(b, "YY_STATE_CASE_BREAK", d); + return b->get_const(b, "YY_STATE_CASE_BREAK", d); } else { - b->format_const(b, "YY_STATE_CASE_BREAK", "/*LINTED*/break;"); + return b->get_const(b, "YY_STATE_CASE_BREAK", "/*LINTED*/break;"); } } /* Generate the fatal_error action. */ -static void c99_format_fatal_error ( const struct flex_backend_t *b, const char *e ) { - b->indent(b); - fprintf(stdout, "yypanic(%s M4_YY_CALL_LAST_ARG);", e); +static const char * c99_get_fatal_error ( const struct flex_backend_t *b, const char *e ) { + static const char *format = "yypanic(%s M4_YY_CALL_LAST_ARG);"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, e); + return directive; } /* Generate the echo action. */ @@ -455,87 +353,20 @@ static const char * c99_get_echo ( const struct flex_backend_t *b ) { return directive; } -/* Emit the echo action. */ -static void c99_echo ( const struct flex_backend_t *b ) { - b->indent(b); - fputs(b->get_echo(b), stdout); -} - /* Generate the definition of the terminate special action. */ -static void c99_format_yyterminate ( const struct flex_backend_t *b, const char *d ) { +static const char * c99_get_yyterminate ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { - b->format_const(b, "yyterminate", d); + return b->get_const(b, "yyterminate", d); } else { - b->format_const(b, "yyterminate", "return NULL"); + return b->get_const(b, "yyterminate", "return NULL"); } } /* Generate the reject special action. */ -static void c99_format_yyreject ( const struct flex_backend_t *b ) { - b->indent(b); - fputs("yyreject()", stdout); -} - -/* Define a symbol used by the output filter system. - Optionally, leave the definition open to encompass a block of verbatim output. -*/ -static void c99_filter_define_name ( const struct flex_backend_t *b, const char *n, const int leave_open ) { - b->verbatim(b, "m4_define([["); - b->verbatim(b, n); - b->verbatim(b, "]], [["); - if (leave_open) - b->verbatim(b, "m4_dnl"); - else - b->verbatim(b, "]])m4_dnl"); - b->newline(b); -} - -/* Close a filter symbol definition that was left open by a call to filter_define_name. - Optionally, provide a final string of verbatim output to emit before closing the definition block. -*/ -static void c99_filter_define_close (const struct flex_backend_t *b, const char *v) { - b->verbatim(b, v); - b->verbatim(b, "]])m4_dnl"); - b->newline(b); -} - -/* Define a variable used by the output filter system. - Provide a string value the filter will substitue for the variable when it is encountered - later in the output. -*/ -static void c99_filter_define_vars ( const struct flex_backend_t *b, const char *n, const char *v ) { - b->filter_define_name(b, n, true); - b->filter_define_close(b, v); -} - -/* Define a variable used by the output filter system. - Provide a numeric value the filter will substitue for the variable when it is encountered - later in the output. -*/ -static void c99_filter_define_vard ( const struct flex_backend_t *b, const char *n, const int v ) { - b->filter_define_name(b, n, true); - fprintf(stdout, "%d", v); - b->filter_define_close(b, NULL); -} - -/* Format a macro replacement through the output filter system. - Filter macros are defined like variables. The syntax for defining a filter macro depends on the - filter chain in use. - - This example assumes the M4 filter chain where: every variable is a macro; the tokens following - the name are substituted for the macro name; if the first token following the name is an OPAREN, - it is followed by a comma-delimited list of positional parameters that are themselves substituded - into the text after the next CPAREN in place of the tokens '$1', '$2', etc. - - Flex's own filter macros only use one positional argument, currently. -*/ -static void c99_filter_call_macro ( const struct flex_backend_t *b, const char *n, const char *v ) { - b->verbatim(b, n); - b->verbatim(b, "( "); - b->verbatim(b, v); - b->verbatim(b, " )"); - b->newline(b); +static const char * c99_get_yyreject ( const struct flex_backend_t *b ) { + static const char *directive = "yyreject()"; + return directive; } /* Construct the c99_backend method table. @@ -552,10 +383,11 @@ struct flex_backend_t c99_backend = { .get_int32_type = c99_get_int32_type, .get_int16_type = c99_get_int16_type, .get_state_type = c99_get_state_type, - .get_packed_type= c99_get_packed_type, + .get_packed_type = c99_get_packed_type, .open_block_comment = c99_open_block_comment, .close_block_comment = c99_close_block_comment, - .comment = c99_comment, + .get_comment = c99_get_comment, + .comment = _format_comment, .record_separator = c99_record_separator, .column_separator = c99_column_separator, .newline = c99_newline, @@ -563,54 +395,61 @@ struct flex_backend_t c99_backend = { .decrease_indent = c99_decrease_indent, .indent = c99_indent, .get_trace_line_format = c99_get_trace_line_format, - .line_directive_out = c99_line_directive_out, + .line_directive_out = _format_line_directive_out, .open_table = c99_open_table, .continue_table = c99_continue_table, .close_table = c99_close_table, - .verbatim = c99_verbatim, + .verbatim = _verbatim, .format_data_table_entry = c99_format_data_table_entry, .format_state_table_entry = c99_format_state_table_entry, .get_normal_state_case_arm = c99_get_normal_state_case_arm, - .format_normal_state_case_arm = c99_format_normal_state_case_arm, + .format_normal_state_case_arm = _format_normal_state_case_arm, .get_eof_state_case_arm = c99_get_eof_state_case_arm, - .format_eof_state_case_arm = c99_format_eof_state_case_arm, + .format_eof_state_case_arm = _format_eof_state_case_arm, .eof_state_case_fallthrough = c99_eof_state_case_fallthrough, .eof_state_case_terminate = c99_eof_state_case_terminate, .get_take_yytext = c99_get_take_yytext, - .format_take_yytext = c99_format_take_yytext, + .format_take_yytext = _format_take_yytext, .get_release_yytext = c99_get_release_yytext, - .format_release_yytext = c99_format_release_yytext, + .format_release_yytext = _format_release_yytext, .get_char_rewind = c99_get_char_rewind, - .format_char_rewind = c99_format_char_rewind, + .format_char_rewind = _format_char_rewind, .get_line_rewind = c99_get_line_rewind, - .format_line_rewind = c99_format_line_rewind, + .format_line_rewind = _format_line_rewind, .get_char_forward = c99_get_char_forward, - .format_char_forward = c99_format_char_forward, + .format_char_forward = _format_char_forward, .get_line_forward = c99_get_line_forward, - .format_line_forward = c99_format_line_forward, + .format_line_forward = _format_line_forward, .format_byte_const = c99_format_byte_const, .format_state_const = c99_format_state_const, .format_size_const = c99_format_size_const, .format_uint_const = c99_format_uint_const, .format_bool_const = c99_format_bool_const, - .format_const = c99_format_const, + .get_const = c99_get_const, + .format_const = _format_const, .format_offset_type = c99_format_offset_type, .format_yy_decl = c99_format_yy_decl, .format_userinit = c99_format_userinit, .get_rule_setup = c99_get_rule_setup, - .format_rule_setup = c99_format_rule_setup, - .format_user_preaction = c99_format_user_preaction, - .format_state_case_break = c99_format_state_case_break, - .format_user_postaction = c99_format_user_postaction, - .format_fatal_error = c99_format_fatal_error, + .format_rule_setup = _format_rule_setup, + .get_user_preaction = c99_get_user_preaction, + .format_user_preaction = _format_user_preaction, + .get_state_case_break = c99_get_state_case_break, + .format_state_case_break = _format_state_case_break, + .get_user_postaction = c99_get_user_postaction, + .format_user_postaction = _format_user_postaction, + .get_fatal_error = c99_get_fatal_error, + .format_fatal_error = _format_fatal_error, .get_echo = c99_get_echo, - .echo = c99_echo, - .format_yyterminate = c99_format_yyterminate, - .format_yyreject = c99_format_yyreject, - .filter_define_name = c99_filter_define_name, - .filter_define_close = c99_filter_define_close, - .filter_define_vars = c99_filter_define_vars, - .filter_define_vard = c99_filter_define_vard, - .filter_call_macro = c99_filter_call_macro + .echo = _echo, + .get_yyterminate = c99_get_yyterminate, + .format_yyterminate = _format_yyterminate, + .get_yyreject = c99_get_yyreject, + .format_yyreject = _format_yyreject, + .filter_define_name = _filter_define_name, + .filter_define_close = _filter_define_close, + .filter_define_vars = _filter_define_vars, + .filter_define_vard = _filter_define_vard, + .filter_call_macro = _filter_call_macro }; diff --git a/src/cpp-backend.c b/src/cpp-backend.c index 2a6670d93..8d272413b 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -83,9 +83,12 @@ static void cpp_close_block_comment ( const struct flex_backend_t *b ) { fputs(" */", stdout); } -static void cpp_comment ( const struct flex_backend_t *b, const char *c ) { - b->indent(b); - fprintf(stdout, "/* %s */", c); +static const char * cpp_get_comment ( const struct flex_backend_t *b, const char *c ) { + static const char *format = "/* %s */"; + static char directive[MAXLINE*2] = "\0"; + + snprintf(directive, sizeof(directive), format, c); + return directive; } static void cpp_record_separator ( const struct flex_backend_t *b ) { @@ -136,54 +139,6 @@ static const char * cpp_get_trace_line_format ( const struct flex_backend_t *b ) return "#line %d \"%s\"\n"; } - -/* Combine the format string from *_get_trace_line_format with its arguments. */ -static void cpp_line_directive_out ( const struct flex_backend_t * b, FILE *output_file, char *path, int linenum ) { - char directive[MAXLINE*2], filename[MAXLINE]; - char *s1, *s2, *s3; - - if (!ctrl.gen_line_dirs) { - return; - } - - /* char *infilename is in the global namespace */ - s1 = (path != NULL) ? path : infilename; - - if ((path != NULL) && !s1) { - s1 = ""; - } - - s2 = filename; - s3 = &filename[sizeof (filename) - 2]; - - while (s2 < s3 && *s1) { - if (*s1 == '\\' || *s1 == '"') { - /* Escape the '\' or '"' */ - *s2++ = '\\'; - } - - *s2++ = *s1++; - } - - *s2 = '\0'; - - if (path != NULL) { - snprintf (directive, sizeof(directive), b->get_trace_line_format(b), linenum, filename); - } else { - snprintf (directive, sizeof(directive), b->get_trace_line_format(b), 0, filename); - } - - /* If output_file is nil then we should put the directive in - * the accumulated actions. - */ - if (output_file) { - fputs (directive, output_file); - } - else { - add_action (directive); - } -} - /* TODO: indent? */ static void cpp_open_table ( const struct flex_backend_t *b ) { fputs("{", stdout); @@ -199,14 +154,6 @@ static void cpp_close_table ( const struct flex_backend_t *b ) { fputs("};\n", stdout); } -/* Intended to emit a macro call in C/CXX. - Can also emit a bare string. - */ -static void cpp_verbatim ( const struct flex_backend_t *b, const char *s ) { - if (s) - fputs(s, stdout); -} - /* Format an entry into a data table. */ static void cpp_format_data_table_entry ( const struct flex_backend_t * b, int t ) { /* Expected to occur in a block format, so don't indent. */ @@ -231,13 +178,6 @@ static const char * cpp_get_normal_state_case_arm ( const struct flex_backend_t return directive; } -/* Emit a case for the main state switch. -*/ -static void cpp_format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { - b->indent(b); - fputs(b->get_normal_state_case_arm(b, c), stdout); -} - /* Generate the special case arm for EOF. This lives in the body of yyinput and determines whether/when to switch to the next buffer. */ @@ -274,24 +214,12 @@ static void cpp_eof_state_case_terminate ( const struct flex_backend_t *b ) { static const char * cpp_get_take_yytext( const struct flex_backend_t *b ) { static const char *directive = "YY_DO_BEFORE_ACTION; /* set up yytext */"; return directive; -}; - -/* Emit the action preamble. */ -static void cpp_format_take_yytext ( const struct flex_backend_t *b ) { - b->indent(b); - fputs(b->get_take_yytext(b), stdout); } /* Generate the action postamble. */ static const char * cpp_get_release_yytext( const struct flex_backend_t *b ) { static const char *directive = "*yy_cp = YY_G(yy_hold_char); /* undo effects of setting up yytext */"; return directive; -}; - -/* Emit the action postamble. */ -static void cpp_format_release_yytext ( const struct flex_backend_t *b ) { - b->indent(b); - fputs( b->get_release_yytext(b), stdout); } /* Generate the buffer rewind sub-action. */ @@ -303,12 +231,6 @@ static const char * cpp_get_char_rewind( const struct flex_backend_t *b, int c ) return directive; } -/* Emit the buffer rewind sub-action. */ -static void cpp_format_char_rewind ( const struct flex_backend_t *b, int c ) { - b->indent(b); - fputs(b->get_char_rewind(b, c), stdout); -} - /* Generate the line rewind sub-action. */ static const char * cpp_get_line_rewind( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_cp - %d);"; @@ -318,12 +240,6 @@ static const char * cpp_get_line_rewind( const struct flex_backend_t *b, int l ) return directive; } -/* Emit the line rewind sub-action. */ -static void cpp_format_line_rewind ( const struct flex_backend_t *b, int l ) { - b->indent(b); - fputs(b->get_line_rewind(b,l), stdout); -} - /* Generate the buffer skip sub-action. */ static const char * cpp_get_char_forward( const struct flex_backend_t *b, int c ) { static const char *format = "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;"; @@ -333,12 +249,6 @@ static const char * cpp_get_char_forward( const struct flex_backend_t *b, int c return directive; } -/* Emit the buffer skip sub-action. */ -static void cpp_format_char_forward ( const struct flex_backend_t *b, int c ) { - b->indent(b); - fputs(b->get_char_forward(b, c), stdout); -} - /* Generate the line skip sub-action. */ static const char * cpp_get_line_forward( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_bp + %d);"; @@ -348,12 +258,6 @@ static const char * cpp_get_line_forward( const struct flex_backend_t *b, int l return directive; } -/* Generate the line skip sub-action. */ -static void cpp_format_line_forward ( const struct flex_backend_t *b, int l ) { - b->indent(b); - fputs(b->get_line_forward(b,l), stdout); -} - /* Define a byte-width constant. */ static void cpp_format_byte_const ( const struct flex_backend_t *b, const char *n, const int c ) { fprintf(stdout, "#define %s %d\n", n, c); @@ -382,71 +286,71 @@ static void cpp_format_bool_const ( const struct flex_backend_t *b, const char * } /* Define a string constant. */ -static void cpp_format_const ( const struct flex_backend_t *b, const char *n, const char *v ) { - fprintf(stdout, "#define %s %s\n", n, v); +static const char * cpp_get_const ( const struct flex_backend_t *b, const char *n, const char *v ) { + static const char *format = "#define %s %s\n"; + static char directive[MAXLINE*2] = "\0"; + + snprintf(directive, sizeof(directive), format, n, v); + return directive; } /* Define a constant used by the skeleton. */ static void cpp_format_offset_type ( const struct flex_backend_t *b, const char *t ) { - b->format_const(b, "YY_OFFSET_TYPE", t); + fputs(b->get_const(b, "YY_OFFSET_TYPE", t), stdout); } /* Define a constant used by the skeleton. */ static void cpp_format_yy_decl ( const struct flex_backend_t *b, const char *d ) { - b->format_const(b, "YY_DECL", d); + fputs(b->get_const(b, "YY_DECL", d), stdout); } /* Define a constant used by the skeleton. */ static void cpp_format_userinit ( const struct flex_backend_t *b, const char *d ) { - b->format_const(b, "YY_USER_INIT", d); + fputs(b->get_const(b, "YY_USER_INIT", d), stdout); } -/* Inject the rule_setup macro call where needed. */ +/* Generate the rule_setup preamble. */ static const char * cpp_get_rule_setup ( const struct flex_backend_t *b ) { static const char *directive = "YY_RULE_SETUP"; - return directive; } -/* Inject the rule_setup macro call where needed. */ -static void cpp_format_rule_setup ( const struct flex_backend_t *b ) { - fputs(b->get_rule_setup(b), stdout); - b->newline(b); -} - -/* Define the user_action constant, if needed. */ -static void cpp_format_user_preaction ( const struct flex_backend_t *b, const char *d ) { - b->format_const(b, "YY_USER_ACTION", d); +/* Generate the user_action constant, if needed. */ +static const char * cpp_get_user_preaction ( const struct flex_backend_t *b, const char *d ) { + return b->get_const(b, "YY_USER_ACTION", d); } /* End a state case arm, optionally inserting user postactions. TODO: Why can't this use YY_STATE_CASE_BREAK from format_user_postaction? */ -static void cpp_format_state_case_break ( const struct flex_backend_t *b ) { - b->indent(b); +static const char * cpp_get_state_case_break ( const struct flex_backend_t *b ) { + static const char *directive = "/*LINTED*/break;"; if (!ctrl.postaction) { - fputs("/*LINTED*/break;", stdout); + return directive; } else { - fputs(ctrl.postaction, stdout); + return ctrl.postaction; } } /* Generate the definition of the STATE_CASE_BREAK end of action. */ -static void cpp_format_user_postaction ( const struct flex_backend_t *b, const char *d ) { +static const char * cpp_get_user_postaction ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { - b->format_const(b, "YY_STATE_CASE_BREAK", d); + return b->get_const(b, "YY_STATE_CASE_BREAK", d); } else { - b->format_const(b, "YY_STATE_CASE_BREAK", "/*LINTED*/break;"); + return b->get_const(b, "YY_STATE_CASE_BREAK", "/*LINTED*/break;"); } } /* Generate the fatal_error action. */ -static void cpp_format_fatal_error ( const struct flex_backend_t *b, const char *e ) { - b->indent(b); - fprintf(stdout, "yypanic(%s M4_YY_CALL_LAST_ARG);", e); +static const char * cpp_get_fatal_error ( const struct flex_backend_t *b, const char *e ) { + static const char *format = "yypanic(%s M4_YY_CALL_LAST_ARG);"; + static char directive[MAXLINE*2] = "\0"; + + snprintf (directive, sizeof(directive), format, e); + return directive; } /* Generate the echo action. */ @@ -456,87 +360,20 @@ static const char * cpp_get_echo ( const struct flex_backend_t *b ) { return directive; } -/* Emit the echo action. */ -static void cpp_echo ( const struct flex_backend_t *b ) { - b->indent(b); - fputs(b->get_echo(b), stdout); -} - /* Generate the definition of the terminate special action. */ -static void cpp_format_yyterminate ( const struct flex_backend_t *b, const char *d ) { +static const char * cpp_get_yyterminate ( const struct flex_backend_t *b, const char *d ) { if (d != NULL) { - b->format_const(b, "yyterminate", d); + return b->get_const(b, "yyterminate", d); } else { - b->format_const(b, "yyterminate", "return NULL"); + return b->get_const(b, "yyterminate", "return NULL"); } } /* Generate the reject special action. */ -static void cpp_format_yyreject ( const struct flex_backend_t *b ) { - b->indent(b); - fputs("yyreject()", stdout); -} - -/* Define a symbol used by the output filter system. - Optionally, leave the definition open to encompass a block of verbatim output. -*/ -static void cpp_filter_define_name ( const struct flex_backend_t *b, const char *n, const int leave_open ) { - b->verbatim(b, "m4_define([["); - b->verbatim(b, n); - b->verbatim(b, "]], [["); - if (leave_open) - b->verbatim(b, "m4_dnl"); - else - b->verbatim(b, "]])m4_dnl"); - b->newline(b); -} - -/* Close a filter symbol definition that was left open by a call to filter_define_name. - Optionally, provide a final string of verbatim output to emit before closing the definition block. -*/ -static void cpp_filter_define_close (const struct flex_backend_t *b, const char *v) { - b->verbatim(b, v); - b->verbatim(b, "]])m4_dnl"); - b->newline(b); -} - -/* Define a variable used by the output filter system. - Provide a string value the filter will substitue for the variable when it is encountered - later in the output. -*/ -static void cpp_filter_define_vars ( const struct flex_backend_t *b, const char *n, const char *v ) { - b->filter_define_name(b, n, true); - b->filter_define_close(b, v); -} - -/* Define a variable used by the output filter system. - Provide a numeric value the filter will substitue for the variable when it is encountered - later in the output. -*/ -static void cpp_filter_define_vard ( const struct flex_backend_t *b, const char *n, const int v ) { - b->filter_define_name(b, n, true); - fprintf(stdout, "%d", v); - b->filter_define_close(b, NULL); -} - -/* Format a macro replacement through the output filter system. - Filter macros are defined like variables. The syntax for defining a filter macro depends on the - filter chain in use. - - This example assumes the M4 filter chain where: every variable is a macro; the tokens following - the name are substituted for the macro name; if the first token following the name is an OPAREN, - it is followed by a comma-delimited list of positional parameters that are themselves substituded - into the text after the next CPAREN in place of the tokens '$1', '$2', etc. - - Flex's own filter macros only use one positional argument, currently. -*/ -static void cpp_filter_call_macro ( const struct flex_backend_t *b, const char *n, const char *v ) { - b->verbatim(b, n); - b->verbatim(b, "( "); - b->verbatim(b, v); - b->verbatim(b, " )"); - b->newline(b); +static const char * cpp_get_yyreject ( const struct flex_backend_t *b ) { + static const char *directive = "yyreject()"; + return directive; } /* Construct the cpp_backend method table. @@ -553,10 +390,11 @@ struct flex_backend_t cpp_backend = { .get_int32_type = cpp_get_int32_type, .get_int16_type = cpp_get_int16_type, .get_state_type = cpp_get_state_type, - .get_packed_type= cpp_get_packed_type, + .get_packed_type = cpp_get_packed_type, .open_block_comment = cpp_open_block_comment, .close_block_comment = cpp_close_block_comment, - .comment = cpp_comment, + .get_comment = cpp_get_comment, + .comment = _format_comment, .record_separator = cpp_record_separator, .column_separator = cpp_column_separator, .newline = cpp_newline, @@ -564,54 +402,61 @@ struct flex_backend_t cpp_backend = { .decrease_indent = cpp_decrease_indent, .indent = cpp_indent, .get_trace_line_format = cpp_get_trace_line_format, - .line_directive_out = cpp_line_directive_out, + .line_directive_out = _format_line_directive_out, .open_table = cpp_open_table, .continue_table = cpp_continue_table, .close_table = cpp_close_table, - .verbatim = cpp_verbatim, + .verbatim = _verbatim, .format_data_table_entry = cpp_format_data_table_entry, .format_state_table_entry = cpp_format_state_table_entry, .get_normal_state_case_arm = cpp_get_normal_state_case_arm, - .format_normal_state_case_arm = cpp_format_normal_state_case_arm, + .format_normal_state_case_arm = _format_normal_state_case_arm, .get_eof_state_case_arm = cpp_get_eof_state_case_arm, - .format_eof_state_case_arm = cpp_format_eof_state_case_arm, + .format_eof_state_case_arm = _format_eof_state_case_arm, .eof_state_case_fallthrough = cpp_eof_state_case_fallthrough, .eof_state_case_terminate = cpp_eof_state_case_terminate, .get_take_yytext = cpp_get_take_yytext, - .format_take_yytext = cpp_format_take_yytext, + .format_take_yytext = _format_take_yytext, .get_release_yytext = cpp_get_release_yytext, - .format_release_yytext = cpp_format_release_yytext, + .format_release_yytext = _format_release_yytext, .get_char_rewind = cpp_get_char_rewind, - .format_char_rewind = cpp_format_char_rewind, + .format_char_rewind = _format_char_rewind, .get_line_rewind = cpp_get_line_rewind, - .format_line_rewind = cpp_format_line_rewind, + .format_line_rewind = _format_line_rewind, .get_char_forward = cpp_get_char_forward, - .format_char_forward = cpp_format_char_forward, + .format_char_forward = _format_char_forward, .get_line_forward = cpp_get_line_forward, - .format_line_forward = cpp_format_line_forward, + .format_line_forward = _format_line_forward, .format_byte_const = cpp_format_byte_const, .format_state_const = cpp_format_state_const, .format_size_const = cpp_format_size_const, .format_uint_const = cpp_format_uint_const, .format_bool_const = cpp_format_bool_const, - .format_const = cpp_format_const, + .get_const = cpp_get_const, + .format_const = _format_const, .format_offset_type = cpp_format_offset_type, .format_yy_decl = cpp_format_yy_decl, .format_userinit = cpp_format_userinit, .get_rule_setup = cpp_get_rule_setup, - .format_rule_setup = cpp_format_rule_setup, - .format_user_preaction = cpp_format_user_preaction, - .format_state_case_break = cpp_format_state_case_break, - .format_user_postaction = cpp_format_user_postaction, - .format_fatal_error = cpp_format_fatal_error, + .format_rule_setup = _format_rule_setup, + .get_user_preaction = cpp_get_user_preaction, + .format_user_preaction = _format_user_preaction, + .get_state_case_break = cpp_get_state_case_break, + .format_state_case_break = _format_state_case_break, + .get_user_postaction = cpp_get_user_postaction, + .format_user_postaction = _format_user_postaction, + .get_fatal_error = cpp_get_fatal_error, + .format_fatal_error = _format_fatal_error, .get_echo = cpp_get_echo, - .echo = cpp_echo, - .format_yyterminate = cpp_format_yyterminate, - .format_yyreject = cpp_format_yyreject, - .filter_define_name = cpp_filter_define_name, - .filter_define_close = cpp_filter_define_close, - .filter_define_vars = cpp_filter_define_vars, - .filter_define_vard = cpp_filter_define_vard, - .filter_call_macro = cpp_filter_call_macro + .echo = _echo, + .get_yyterminate = cpp_get_yyterminate, + .format_yyterminate = _format_yyterminate, + .get_yyreject = cpp_get_yyreject, + .format_yyreject = _format_yyreject, + .filter_define_name = _filter_define_name, + .filter_define_close = _filter_define_close, + .filter_define_vars = _filter_define_vars, + .filter_define_vard = _filter_define_vard, + .filter_call_macro = _filter_call_macro }; diff --git a/src/skeletons.c b/src/skeletons.c index 366bb69b1..59488c332 100644 --- a/src/skeletons.c +++ b/src/skeletons.c @@ -332,5 +332,248 @@ void skelout (bool announce) } /* end while */ } +/* Combine the format string from *_get_trace_line_format with its arguments. */ +void _format_line_directive_out ( const struct flex_backend_t *b, FILE *output_file, char *path, int linenum ) { + char directive[MAXLINE*2], filename[MAXLINE]; + char *s1, *s2, *s3; + + if (!ctrl.gen_line_dirs) { + return; + } + + /* char *infilename is in the global namespace */ + s1 = (path != NULL) ? path : infilename; + + if ((path != NULL) && !s1) { + s1 = ""; + } + + s2 = filename; + s3 = &filename[sizeof (filename) - 2]; + + while (s2 < s3 && *s1) { + if (*s1 == '\\' || *s1 == '"') { + /* Escape the '\' or '"' */ + *s2++ = '\\'; + } + + *s2++ = *s1++; + } + + *s2 = '\0'; + + if (path != NULL) { + snprintf (directive, sizeof(directive), b->get_trace_line_format(b), linenum, filename); + } else { + snprintf (directive, sizeof(directive), b->get_trace_line_format(b), 0, filename); + } + + /* If output_file is nil then we should put the directive in + * the accumulated actions. + */ + if (output_file) { + fputs (directive, output_file); + } + else { + add_action (directive); + } +} + +void _format_comment ( const struct flex_backend_t *b, const char *const c ) { + b->indent(b); + fputs(b->get_comment(b, c), stdout); +} + +/* +void _format_open_table ( const struct flex_backend_t *b ); + +void _format_continue_table ( const struct flex_backend_t *b ); + +void _format_close_table ( const struct flex_backend_t *b ); +*/ + +/* Intended to emit a macro call in C/CXX. + Can also emit a bare string. + */ +void _verbatim ( const struct flex_backend_t *b, const char *s ) { + if (s) + fputs(s, stdout); + + return; +} + +/* Emit a case for the main state switch. +*/ +void _format_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { + b->indent(b); + fputs(b->get_normal_state_case_arm(b, c), stdout); +} + +/* Emit the special case arm for EOF. */ +void _format_eof_state_case_arm ( const struct flex_backend_t *b, const char *const c ) { + b->indent(b); + fputs(b->get_eof_state_case_arm(b, c), stdout); +} + +/* +void _format_eof_state_case_fallthrough ( const struct flex_backend_t *b ); + +void _format_eof_state_case_terminate ( const struct flex_backend_t *b ); +*/ + +/* Emit the action preamble. */ +void _format_take_yytext ( const struct flex_backend_t *b ) { + b->indent(b); + fputs(b->get_take_yytext(b), stdout); +} + +/* Emit the action postamble. */ +void _format_release_yytext ( const struct flex_backend_t *b ) { + b->indent(b); + fputs( b->get_release_yytext(b), stdout); +} + +/* Emit the buffer rewind sub-action. */ +void _format_char_rewind ( const struct flex_backend_t *b, int c ) { + b->indent(b); + fputs(b->get_char_rewind(b, c), stdout); +} + +/* Emit the line rewind sub-action. */ +void _format_line_rewind ( const struct flex_backend_t *b, int l ) { + b->indent(b); + fputs(b->get_line_rewind(b,l), stdout); +} + +/* Emit the buffer skip sub-action. */ +void _format_char_forward ( const struct flex_backend_t *b, int c ) { + b->indent(b); + fputs(b->get_char_forward(b, c), stdout); +} + +/* Emit the line skip sub-action. */ +void _format_line_forward ( const struct flex_backend_t *b, int l ) { + b->indent(b); + fputs(b->get_line_forward(b,l), stdout); +} + +/* +void _format_yy_decl ( const struct flex_backend_t *b, const char *d ); + +void _format_userinit ( const struct flex_backend_t *b, const char *d ); +*/ + +/* Define a string constant. */ +void _format_const ( const struct flex_backend_t *b, const char *n, const char *v ) { + fputs(b->get_const(b, n, v), stdout); +} + + +/* Inject the rule_setup macro call where needed. */ +void _format_rule_setup ( const struct flex_backend_t *b ) { + fputs(b->get_rule_setup(b), stdout); + b->newline(b); +} + + +/* Emit the user_action constant, if needed. */ +void _format_user_preaction ( const struct flex_backend_t *b, const char *d ) { + fputs(b->get_user_preaction(b, d), stdout); +} + +/* End a state case arm, optionally inserting user postactions. */ +void _format_state_case_break ( const struct flex_backend_t *b ) { + b->indent(b); + b->get_state_case_break(b); +} + +/* Generate the definition of the STATE_CASE_BREAK end of action. */ +void _format_user_postaction ( const struct flex_backend_t *b, const char *d ) { + fputs(b->get_user_postaction(b, d), stdout); +} + +/* Emit the fatal_error action. */ +void _format_fatal_error ( const struct flex_backend_t *b, const char *e ) { + b->indent(b); + fputs(b->get_fatal_error(b, e), stdout); +} + + +/* Emit the echo action. */ +void _echo ( const struct flex_backend_t *b ) { + b->indent(b); + fputs(b->get_echo(b), stdout); +} + +void _format_yyterminate ( const struct flex_backend_t *b, const char *d ) { + fputs(b->get_yyterminate(b, d), stdout); +} + +/* Emit the reject special action. */ +void _format_yyreject ( const struct flex_backend_t *b ) { + b->indent(b); + fputs(b->get_yyreject(b), stdout); +} + +/* Define a symbol used by the output filter system. + Optionally, leave the definition open to encompass a block of verbatim output. +*/ +void _filter_define_name ( const struct flex_backend_t *b, const char *n, const int leave_open ) { + b->verbatim(b, "m4_define([["); + b->verbatim(b, n); + b->verbatim(b, "]], [["); + if (leave_open) + b->verbatim(b, "m4_dnl"); + else + b->verbatim(b, "]])m4_dnl"); + b->newline(b); +} + +/* Close a filter symbol definition that was left open by a call to filter_define_name. + Optionally, provide a final string of verbatim output to emit before closing the definition block. +*/ +void _filter_define_close (const struct flex_backend_t *b, const char *v) { + b->verbatim(b, v); + b->verbatim(b, "]])m4_dnl"); + b->newline(b); +} + +/* Define a variable used by the output filter system. + Provide a string value the filter will substitue for the variable when it is encountered + later in the output. +*/ +void _filter_define_vars ( const struct flex_backend_t *b, const char *n, const char *v ) { + b->filter_define_name(b, n, true); + b->filter_define_close(b, v); +} + +/* Define a variable used by the output filter system. + Provide a numeric value the filter will substitue for the variable when it is encountered + later in the output. +*/ +void _filter_define_vard ( const struct flex_backend_t *b, const char *n, const int v ) { + b->filter_define_name(b, n, true); + fprintf(stdout, "%d", v); + b->filter_define_close(b, NULL); +} + +/* Format a macro replacement through the output filter system. + Filter macros are defined like variables. The syntax for defining a filter macro depends on the + filter chain in use. + + This example assumes the M4 filter chain where: every variable is a macro; the tokens following + the name are substituted for the macro name; if the first token following the name is an OPAREN, + it is followed by a comma-delimited list of positional parameters that are themselves substituded + into the text after the next CPAREN in place of the tokens '$1', '$2', etc. + + Flex's own filter macros only use one positional argument, currently. +*/ +void _filter_call_macro ( const struct flex_backend_t *b, const char *n, const char *v ) { + b->verbatim(b, n); + b->verbatim(b, "( "); + b->verbatim(b, v); + b->verbatim(b, " )"); + b->newline(b); +} /* end */ diff --git a/src/skeletons.h b/src/skeletons.h index ac75f7507..d6bc5efa0 100644 --- a/src/skeletons.h +++ b/src/skeletons.h @@ -56,6 +56,7 @@ struct flex_backend_t { const char * (*get_packed_type) (const struct flex_backend_t *b, struct packtype_t *p); void (*open_block_comment) ( const struct flex_backend_t *b ); void (*close_block_comment) ( const struct flex_backend_t *b ); + const char * (*get_comment) ( const struct flex_backend_t *b, const char *c ); void (*comment) ( const struct flex_backend_t *b, const char *c ); void (*record_separator) ( const struct flex_backend_t *b ); void (*column_separator) ( const struct flex_backend_t *b ); @@ -94,19 +95,26 @@ struct flex_backend_t { void (*format_size_const) ( const struct flex_backend_t *b, const char *n, const int s ); void (*format_uint_const) ( const struct flex_backend_t *b, const char *n, const unsigned int u ); void (*format_bool_const) ( const struct flex_backend_t *b, const char *n, const int t ); + const char * (*get_const) ( const struct flex_backend_t *b, const char *n, const char *v ); void (*format_const) ( const struct flex_backend_t *b, const char *n, const char *v ); void (*format_offset_type) ( const struct flex_backend_t *b, const char *t ); void (*format_yy_decl) ( const struct flex_backend_t *b, const char *d ); void (*format_userinit) ( const struct flex_backend_t *b, const char *d ); const char * (*get_rule_setup) ( const struct flex_backend_t *b ); void (*format_rule_setup) ( const struct flex_backend_t *b ); + const char * (*get_user_preaction) ( const struct flex_backend_t *b, const char *d ); void (*format_user_preaction) ( const struct flex_backend_t *b, const char *d ); + const char * (*get_state_case_break) ( const struct flex_backend_t *b ); void (*format_state_case_break) ( const struct flex_backend_t *b ); + const char * (*get_user_postaction) ( const struct flex_backend_t *b, const char *d ); void (*format_user_postaction) ( const struct flex_backend_t *b, const char *d ); + const char * (*get_fatal_error) ( const struct flex_backend_t *b, const char *e ); void (*format_fatal_error) ( const struct flex_backend_t *b, const char *e ); const char * (*get_echo) ( const struct flex_backend_t *b ); void (*echo) ( const struct flex_backend_t *b ); + const char * (*get_yyterminate) ( const struct flex_backend_t *b, const char *d ); void (*format_yyterminate) ( const struct flex_backend_t *b, const char *d ); + const char * (*get_yyreject) ( const struct flex_backend_t *b ); void (*format_yyreject) ( const struct flex_backend_t *b ); void (*filter_define_name) ( const struct flex_backend_t *b, const char *n, const int leave_open ); void (*filter_define_close) (const struct flex_backend_t *b, const char *v); @@ -117,5 +125,51 @@ struct flex_backend_t { const struct flex_backend_t *get_backend(void); +/* Default implementations for emitter functions */ +void _format_line_directive_out ( const struct flex_backend_t *b, FILE *output_file, char *path, int linenum ); +void _format_comment (const struct flex_backend_t *b, const char *const c); +void _format_open_table ( const struct flex_backend_t *b ); +void _format_continue_table ( const struct flex_backend_t *b ); +void _format_close_table ( const struct flex_backend_t *b ); +void _verbatim ( const struct flex_backend_t *b, const char *s ); +void _format_normal_state_case_arm ( const struct flex_backend_t *b, int c ); +void _format_eof_state_case_arm ( const struct flex_backend_t *b, const char *const c ); +void _format_eof_state_case_fallthrough ( const struct flex_backend_t *b ); +void _format_eof_state_case_terminate ( const struct flex_backend_t *b ); +void _format_take_yytext ( const struct flex_backend_t *b ); +void _format_release_yytext ( const struct flex_backend_t *b ); +void _format_char_rewind ( const struct flex_backend_t *b, int c ); +void _format_line_rewind ( const struct flex_backend_t *b, int l ); +void _format_char_forward ( const struct flex_backend_t *b, int c ); +void _format_line_forward ( const struct flex_backend_t *b, int l ); +/* +void _format_yy_decl ( const struct flex_backend_t *b, const char *d ); +void _format_userinit ( const struct flex_backend_t *b, const char *d ); +*/ +void _format_const ( const struct flex_backend_t *b, const char *n, const char *v ); +void _format_rule_setup ( const struct flex_backend_t *b ); +void _format_user_preaction ( const struct flex_backend_t *b, const char *d ); +void _format_state_case_break ( const struct flex_backend_t *b ); +void _format_user_postaction ( const struct flex_backend_t *b, const char *d ); +void _format_fatal_error ( const struct flex_backend_t *b, const char *e ); +void _echo ( const struct flex_backend_t *b ); +void _format_yyterminate ( const struct flex_backend_t *b, const char *d ); +void _format_yyreject ( const struct flex_backend_t *b ); +/* +void (*format_byte_const) ( const struct flex_backend_t *b, const char *n, const int c ); +void (*format_state_const) ( const struct flex_backend_t *b, const char *n, const int s ); +void (*format_size_const) ( const struct flex_backend_t *b, const char *n, const int s ); +void (*format_uint_const) ( const struct flex_backend_t *b, const char *n, const unsigned int u ); +void (*format_bool_const) ( const struct flex_backend_t *b, const char *n, const int t ); +void (*format_const) ( const struct flex_backend_t *b, const char *n, const char *v ); +void (*format_offset_type) ( const struct flex_backend_t *b, const char *t ); +*/ + +/* Default implementations of filter emitter fuctions */ +void _filter_define_name ( const struct flex_backend_t *b, const char *n, const int leave_open ); +void _filter_define_close (const struct flex_backend_t *b, const char *v); +void _filter_define_vars ( const struct flex_backend_t *b, const char *n, const char *v ); +void _filter_define_vard ( const struct flex_backend_t *b, const char *n, const int v ); +void _filter_call_macro ( const struct flex_backend_t *b, const char *n, const char *v ); #endif /* FLEX_SKELETONS_H */ From 108c9230c4e48200f96b8c3e721ef16828476f6a Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 10 Feb 2025 18:37:14 -0500 Subject: [PATCH 35/37] feat: Replace M4_HOOK with backend calls in parse.y TODO: found a timing issue where parse emits actions using the default backend before the language is set. Either need to provide a delayed action emitter or initialize the backend stack earlier. --- src/c99-backend.c | 28 ++++++++++++++++------------ src/cpp-backend.c | 20 ++++++++++---------- src/parse.y | 7 ++++--- 3 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/c99-backend.c b/src/c99-backend.c index abb1c1d9d..4e48270ec 100644 --- a/src/c99-backend.c +++ b/src/c99-backend.c @@ -85,7 +85,7 @@ static void c99_close_block_comment ( const struct flex_backend_t *b ) { static const char * c99_get_comment ( const struct flex_backend_t *b, const char *c ) { static const char *format = "/* %s */"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf(directive, sizeof(directive), format, c); return directive; @@ -172,7 +172,7 @@ static void c99_format_state_table_entry ( const struct flex_backend_t * b, int */ static const char * c99_get_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { static const char *format = "case %d: "; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -183,7 +183,7 @@ static const char * c99_get_normal_state_case_arm ( const struct flex_backend_t */ static const char * c99_get_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { static const char *format = "case YY_STATE_EOF(%s): "; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -218,7 +218,7 @@ static const char * c99_get_release_yytext( const struct flex_backend_t *b ) { /* Generate the buffer rewind sub-action. */ static const char * c99_get_char_rewind( const struct flex_backend_t *b, int c ) { static const char *format = "YY_G(yy_c_buf_p) = yy_cp -= %d;"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -227,7 +227,7 @@ static const char * c99_get_char_rewind( const struct flex_backend_t *b, int c ) /* Generate the line rewind sub-action. */ static const char * c99_get_line_rewind( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_cp - %d);"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, l); return directive; @@ -236,7 +236,7 @@ static const char * c99_get_line_rewind( const struct flex_backend_t *b, int l ) /* Generate the buffer skip sub-action. */ static const char * c99_get_char_forward( const struct flex_backend_t *b, int c ) { static const char *format = "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -245,7 +245,7 @@ static const char * c99_get_char_forward( const struct flex_backend_t *b, int c /* Generate the line skip sub-action. */ static const char * c99_get_line_forward( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_bp + %d);"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, l); return directive; @@ -281,7 +281,7 @@ static void c99_format_bool_const ( const struct flex_backend_t *b, const char * /* Define a string constant. */ static const char * c99_get_const ( const struct flex_backend_t *b, const char *n, const char *v ) { static const char *format = "#define %s %s\n"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf(directive, sizeof(directive), format, n, v); return directive; @@ -339,8 +339,8 @@ static const char * c99_get_user_postaction ( const struct flex_backend_t *b, co /* Generate the fatal_error action. */ static const char * c99_get_fatal_error ( const struct flex_backend_t *b, const char *e ) { - static const char *format = "yypanic(%s M4_YY_CALL_LAST_ARG);"; - static char directive[MAXLINE*2] = "\0"; + static const char *format = "yypanic(%s, yyscanner);"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, e); return directive; @@ -355,11 +355,15 @@ static const char * c99_get_echo ( const struct flex_backend_t *b ) { /* Generate the definition of the terminate special action. */ static const char * c99_get_yyterminate ( const struct flex_backend_t *b, const char *d ) { + static const char * format = "%s /* yyterminate */"; + static char directive[MAXLINE*2] = {0}; + if (d != NULL) { - return b->get_const(b, "yyterminate", d); + snprintf(directive, sizeof(directive), format, d); + return b->get_const(b, "yyterminate", directive); } else { - return b->get_const(b, "yyterminate", "return NULL"); + return b->get_const(b, "yyterminate", "return NULL /* yyterminate */"); } } diff --git a/src/cpp-backend.c b/src/cpp-backend.c index 8d272413b..1ee8c373d 100644 --- a/src/cpp-backend.c +++ b/src/cpp-backend.c @@ -85,7 +85,7 @@ static void cpp_close_block_comment ( const struct flex_backend_t *b ) { static const char * cpp_get_comment ( const struct flex_backend_t *b, const char *c ) { static const char *format = "/* %s */"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf(directive, sizeof(directive), format, c); return directive; @@ -172,7 +172,7 @@ static void cpp_format_state_table_entry ( const struct flex_backend_t * b, int */ static const char * cpp_get_normal_state_case_arm ( const struct flex_backend_t *b, int c ) { static const char *format = "case %d: "; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -183,7 +183,7 @@ static const char * cpp_get_normal_state_case_arm ( const struct flex_backend_t */ static const char * cpp_get_eof_state_case_arm ( const struct flex_backend_t *b, const char * const c ) { static const char *format = "case YY_STATE_EOF(%s): "; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -225,7 +225,7 @@ static const char * cpp_get_release_yytext( const struct flex_backend_t *b ) { /* Generate the buffer rewind sub-action. */ static const char * cpp_get_char_rewind( const struct flex_backend_t *b, int c ) { static const char *format = "YY_G(yy_c_buf_p) = yy_cp -= %d;"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -234,7 +234,7 @@ static const char * cpp_get_char_rewind( const struct flex_backend_t *b, int c ) /* Generate the line rewind sub-action. */ static const char * cpp_get_line_rewind( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_cp - %d);"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, l); return directive; @@ -243,7 +243,7 @@ static const char * cpp_get_line_rewind( const struct flex_backend_t *b, int l ) /* Generate the buffer skip sub-action. */ static const char * cpp_get_char_forward( const struct flex_backend_t *b, int c ) { static const char *format = "YY_G(yy_c_buf_p) = yy_cp = yy_bp + %d;"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, c); return directive; @@ -252,7 +252,7 @@ static const char * cpp_get_char_forward( const struct flex_backend_t *b, int c /* Generate the line skip sub-action. */ static const char * cpp_get_line_forward( const struct flex_backend_t *b, int l ) { static const char *format = "YY_LINENO_REWIND_TO(yy_bp + %d);"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, l); return directive; @@ -288,7 +288,7 @@ static void cpp_format_bool_const ( const struct flex_backend_t *b, const char * /* Define a string constant. */ static const char * cpp_get_const ( const struct flex_backend_t *b, const char *n, const char *v ) { static const char *format = "#define %s %s\n"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf(directive, sizeof(directive), format, n, v); return directive; @@ -347,7 +347,7 @@ static const char * cpp_get_user_postaction ( const struct flex_backend_t *b, co /* Generate the fatal_error action. */ static const char * cpp_get_fatal_error ( const struct flex_backend_t *b, const char *e ) { static const char *format = "yypanic(%s M4_YY_CALL_LAST_ARG);"; - static char directive[MAXLINE*2] = "\0"; + static char directive[MAXLINE*2] = {0}; snprintf (directive, sizeof(directive), format, e); return directive; @@ -366,7 +366,7 @@ static const char * cpp_get_yyterminate ( const struct flex_backend_t *b, const return b->get_const(b, "yyterminate", d); } else { - return b->get_const(b, "yyterminate", "return NULL"); + return b->get_const(b, "yyterminate", ""); } } diff --git a/src/parse.y b/src/parse.y index d7039cdc3..4ce69609b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -147,13 +147,14 @@ goal : initlex sect1 sect1end sect2 initforrule add_action("]]"); if ( ctrl.spprdflt ) - add_action( - "M4_HOOK_FATAL_ERROR(\"flex scanner jammed\")"); + add_action( backend->get_fatal_error(backend, "\"flex scanner jammed\"") ); else { add_action( backend->get_echo(backend) ); } - add_action( "\n\tM4_HOOK_STATE_CASE_BREAK\n" ); + add_action( "\n\t" ); + add_action( backend->get_state_case_break(backend) ); + add_action( "\n" ); } ; From 3f209cfe3b8cc7baf92b702fc26bcf2382133fb7 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 10 Feb 2025 18:49:45 -0500 Subject: [PATCH 36/37] feat: Set backend in parse.y when ctrl.emit option is recognized. --- src/parse.y | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/parse.y b/src/parse.y index 4ce69609b..550f33db5 100644 --- a/src/parse.y +++ b/src/parse.y @@ -80,6 +80,7 @@ static int madeany = false; /* whether we've made the '.' character class */ static int ccldot, cclany; int previous_continued_action; /* whether the previous rule's action was '|' */ +static flex_backend_id_t backend_id; static const struct flex_backend_t *backend = NULL; #define format_warn3(fmt, a1, a2) \ @@ -231,7 +232,13 @@ option : TOK_OUTFILE '=' NAME | TOK_BUFSIZE '=' TOK_NUMERIC { ctrl.bufsize = nmval; } | TOK_EMIT '=' NAME - { ctrl.emit = xstrdup(nmstr); backend_by_name(ctrl.emit); } + { ctrl.emit = xstrdup(nmstr); + backend_id = backend_by_name(ctrl.emit); + if ( backend_id != top_backend() ) + /* only push a new backend if it's not already the top */ + push_backend(backend_id); + backend = get_backend(); + } | TOK_USERINIT '=' NAME { ctrl.userinit = xstrdup(nmstr); } | TOK_YYTERMINATE '=' NAME From cd56ee74cede6fd483ce6b4ec5c102cc1e2ab741 Mon Sep 17 00:00:00 2001 From: Mightyjo Date: Mon, 10 Feb 2025 18:51:06 -0500 Subject: [PATCH 37/37] feat: Fix conditional blocking around backend setup in parse.y --- src/parse.y | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/parse.y b/src/parse.y index 550f33db5..82172b30d 100644 --- a/src/parse.y +++ b/src/parse.y @@ -234,10 +234,11 @@ option : TOK_OUTFILE '=' NAME | TOK_EMIT '=' NAME { ctrl.emit = xstrdup(nmstr); backend_id = backend_by_name(ctrl.emit); - if ( backend_id != top_backend() ) + if ( backend_id != top_backend() ) { /* only push a new backend if it's not already the top */ push_backend(backend_id); backend = get_backend(); + } } | TOK_USERINIT '=' NAME { ctrl.userinit = xstrdup(nmstr); }