From b528c7efdc06ec59ce354d9db63a475514884a10 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 26 Nov 2020 07:25:25 -0500 Subject: Improve standards conformance in C99 and Go skeletons. --- src/c99-flex.skl | 19 ++++++++++++------- src/go-flex.skl | 19 ++++++++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/c99-flex.skl b/src/c99-flex.skl index ddf4185..cb7af3c 100644 --- a/src/c99-flex.skl +++ b/src/c99-flex.skl @@ -406,12 +406,17 @@ M4_YY_SC_DEFS typedef struct yy_buffer_state *yybuffer; -%# These are not part of the exported interface and can safewly be renamed -const int EOB_ACT_CONTINUE_SCAN = 0; -const int EOB_ACT_END_OF_FILE = 1; -const int EOB_ACT_LAST_MATCH = 2; -const int YY_BUFFER_NEW = 0; -const int YY_BUFFER_NORMAL = 1; +%# These are not part of the exported interface and can safely be renamed +/* These must be #defines, not const variables, because they're used as case + * arm values. GCC will allow case arm expressions to include references to + * const variables, but this is not standard-conformant and other compilers + * may not. + */ +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 +#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 @@ -422,7 +427,7 @@ const int YY_BUFFER_NORMAL = 1; * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ -const int YY_BUFFER_EOF_PENDING = 2; +#define YY_BUFFER_EOF_PENDING 2 struct yy_buffer_state { FILE *yy_input_file; diff --git a/src/go-flex.skl b/src/go-flex.skl index 41b14d3..50de080 100644 --- a/src/go-flex.skl +++ b/src/go-flex.skl @@ -325,12 +325,17 @@ M4_YY_SC_DEFS typedef struct yy_buffer_state *yybuffer; -%# These are not part of the exported interface and can safely be renamed -const int EOB_ACT_CONTINUE_SCAN = 0; -const int EOB_ACT_END_OF_FILE = 1; -const int EOB_ACT_LAST_MATCH = 2; -const int YY_BUFFER_NEW = 0; -const int YY_BUFFER_NORMAL = 1; +%# These are not part of the exported interface and can safely be renamed. +/* These must be #defines, not const variables, because they're used as case + * arm values. GCC will allow case arm expressions to include references to + * const variables, but this is not standard-conformant and other compilers + * may not. + */ +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 +#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 @@ -341,7 +346,7 @@ const int YY_BUFFER_NORMAL = 1; * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ -const int YY_BUFFER_EOF_PENDING = 2; +#define YY_BUFFER_EOF_PENDING 2 struct yy_buffer_state { FILE *yyInputFile; -- cgit v1.2.1