/* Common parts between scan-code.l, scan-gram.l, and scan-skel.l.

   Copyright (C) 2006, 2009-2015, 2018-2019 Free Software Foundation,
   Inc.

   This file is part of Bison, the GNU Compiler Compiler.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef FLEX_PREFIX
# error "FLEX_PREFIX not defined"
#endif

/* Flex full version as a number.  */
#define FLEX_VERSION                    \
  ((YY_FLEX_MAJOR_VERSION) * 1000000    \
   + (YY_FLEX_MINOR_VERSION) * 1000     \
   + (YY_FLEX_SUBMINOR_VERSION))

// Pacify warnings in yy_init_buffer (observed with Flex 2.6.4 and GCC
// 6.4.0 and 7.3.0).
//
// ./src/scan-skel.c: In function 'skel_restart':
// ./src/scan-skel.c:2035:20: error: potential null pointer dereference [-Werror=null-dereference]
//   b->yy_fill_buffer = 1;
//   ~~~~~~~~~~~~~~~~~~^~~
// ./src/scan-skel.c:2031:19: error: potential null pointer dereference [-Werror=null-dereference]
//   b->yy_input_file = file;
//   ~~~~~~~~~~~~~~~~~^~~~~~
#if defined __GNUC__ && ! defined __clang__ && 6 <= __GNUC__
# pragma GCC diagnostic ignored "-Wnull-dereference"
#endif

// Old versions of Flex (2.5.35) generate an incomplete documentation comment.
//
//  In file included from src/scan-code-c.c:3:
//  src/scan-code.c:2198:21: error: empty paragraph passed to '@param' command
//        [-Werror,-Wdocumentation]
//   * @param line_number
//     ~~~~~~~~~~~~~~~~~^
//  1 error generated.
#if FLEX_VERSION <= 20060000 && defined __clang__
# pragma clang diagnostic ignored "-Wdocumentation"
#endif

/* Pacify "gcc -Wmissing-prototypes" when flex 2.5.31 is used.  */
#if FLEX_VERSION <= 2005031
int   FLEX_PREFIX (get_lineno) (void);
FILE *FLEX_PREFIX (get_in) (void);
FILE *FLEX_PREFIX (get_out) (void);
int   FLEX_PREFIX (get_leng) (void);
char *FLEX_PREFIX (get_text) (void);
void  FLEX_PREFIX (set_lineno) (int);
void  FLEX_PREFIX (set_in) (FILE *);
void  FLEX_PREFIX (set_out) (FILE *);
int   FLEX_PREFIX (get_debug) (void);
void  FLEX_PREFIX (set_debug) (int);
int   FLEX_PREFIX (lex_destroy) (void);
#endif

#define last_string    FLEX_PREFIX (last_string)

/* It seems to be a nice "feature" of Flex that one cannot use yytext,
   yyleng etc. when a prefix is given, since there is no longer a
   #define, but rather the token is actually changed in the output.
   However, this is not true for Flex 2.5.4.  */
#ifndef yyleng
# define yyleng  FLEX_PREFIX (leng)
#endif
#ifndef yytext
# define yytext  FLEX_PREFIX (text)
#endif

/* Non-reentrant scanners generated by Flex 2.5.9 and later (and some earlier
   versions according to the Flex manual) leak memory if yylex_destroy is not
   invoked.  However, yylex_destroy is not defined before Flex 2.5.9, so give
   an implementation here that at least appears to work with Flex 2.5.4.  */
#if FLEX_VERSION <= 2005009
# define yylex_destroy() yy_delete_buffer (YY_CURRENT_BUFFER)
#endif

/* OBSTACK_FOR_STRING -- Used to store all the characters that we need to
   keep (to construct ID, STRINGS etc.).  Use the following macros to
   use it.

   Use STRING_GROW to append what has just been matched, and
   STRING_FINISH to end the string (it puts the ending 0).
   STRING_FINISH also stores this string in LAST_STRING, which can be
   used, and which is used by STRING_FREE to free the last string.  */

#ifndef FLEX_NO_OBSTACK

static struct obstack obstack_for_string;

# define STRING_GROW                                    \
  obstack_grow (&obstack_for_string, yytext, yyleng)

# define STRING_FINISH                                  \
  (last_string = obstack_finish0 (&obstack_for_string))

# define STRING_FREE                                    \
  obstack_free (&obstack_for_string, last_string)

#endif
