mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
Merge topic 'automoc-using-depfiles'
aebfbcaa46AutoGen: Use depfiles for the XXX_autogen ninja targetsf765fdea03AutoGen: Use moc's feature to output dependenciesf8c505d4b3Add a parser for GCC-style depfiles Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: Jan Niklas Hasse <jhasse@bixense.com> Merge-request: !4221
This commit is contained in:
@@ -99,6 +99,7 @@ The following individuals and institutions are among the Contributors:
|
||||
* Sebastian Holtermann <sebholt@xwmw.org>
|
||||
* Stephen Kelly <steveire@gmail.com>
|
||||
* Sylvain Joubert <joubert.sy@gmail.com>
|
||||
* The Qt Company Ltd.
|
||||
* Thomas Sondergaard <ts@medical-insight.com>
|
||||
* Tobias Hunger <tobias.hunger@qt.io>
|
||||
* Todd Gamblin <tgamblin@llnl.gov>
|
||||
|
||||
@@ -26,6 +26,9 @@ See :prop_tgt:`AUTOGEN_TARGET_DEPENDS` for reference.
|
||||
By default :prop_tgt:`AUTOMOC_DEPEND_FILTERS` is initialized from
|
||||
:variable:`CMAKE_AUTOMOC_DEPEND_FILTERS`, which is empty by default.
|
||||
|
||||
From Qt 5.15.0 on this variable is ignored as moc is able to output the correct
|
||||
dependencies.
|
||||
|
||||
See the :manual:`cmake-qt(7)` manual for more information on using CMake
|
||||
with Qt.
|
||||
|
||||
|
||||
@@ -134,6 +134,9 @@ set(SRCS
|
||||
LexerParser/cmFortranParser.cxx
|
||||
LexerParser/cmFortranParserTokens.h
|
||||
LexerParser/cmFortranParser.y
|
||||
LexerParser/cmGccDepfileLexer.cxx
|
||||
LexerParser/cmGccDepfileLexer.h
|
||||
LexerParser/cmGccDepfileLexer.in.l
|
||||
LexerParser/cmListFileLexer.c
|
||||
LexerParser/cmListFileLexer.in.l
|
||||
|
||||
@@ -270,6 +273,10 @@ set(SRCS
|
||||
cmFortranParserImpl.cxx
|
||||
cmFSPermissions.cxx
|
||||
cmFSPermissions.h
|
||||
cmGccDepfileLexerHelper.cxx
|
||||
cmGccDepfileLexerHelper.h
|
||||
cmGccDepfileReader.cxx
|
||||
cmGccDepfileReader.h
|
||||
cmGeneratedFileStream.cxx
|
||||
cmGeneratorExpressionContext.cxx
|
||||
cmGeneratorExpressionContext.h
|
||||
|
||||
@@ -16,4 +16,6 @@
|
||||
/cmFortranLexer.h generated
|
||||
/cmFortranParser.cxx generated
|
||||
/cmFortranParserTokens.h generated
|
||||
/cmGccDepfileLexer.cxx generated
|
||||
/cmGccDepfileLexer.h generated
|
||||
/cmListFileLexer.c generated
|
||||
|
||||
@@ -0,0 +1,2210 @@
|
||||
#include "cmStandardLexer.h"
|
||||
|
||||
#define FLEXINT_H 1
|
||||
#define YY_INT_ALIGNED short int
|
||||
|
||||
/* A lexical scanner generated by flex */
|
||||
|
||||
#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 cmGccDepfile_yy_create_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_create_buffer cmGccDepfile_yy_create_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_delete_buffer
|
||||
#define cmGccDepfile_yy_delete_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_delete_buffer cmGccDepfile_yy_delete_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_scan_buffer
|
||||
#define cmGccDepfile_yy_scan_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_scan_buffer cmGccDepfile_yy_scan_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_scan_string
|
||||
#define cmGccDepfile_yy_scan_string_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_scan_string cmGccDepfile_yy_scan_string
|
||||
#endif
|
||||
|
||||
#ifdef yy_scan_bytes
|
||||
#define cmGccDepfile_yy_scan_bytes_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_scan_bytes cmGccDepfile_yy_scan_bytes
|
||||
#endif
|
||||
|
||||
#ifdef yy_init_buffer
|
||||
#define cmGccDepfile_yy_init_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_init_buffer cmGccDepfile_yy_init_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_flush_buffer
|
||||
#define cmGccDepfile_yy_flush_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_flush_buffer cmGccDepfile_yy_flush_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_load_buffer_state
|
||||
#define cmGccDepfile_yy_load_buffer_state_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_load_buffer_state cmGccDepfile_yy_load_buffer_state
|
||||
#endif
|
||||
|
||||
#ifdef yy_switch_to_buffer
|
||||
#define cmGccDepfile_yy_switch_to_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_switch_to_buffer cmGccDepfile_yy_switch_to_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yypush_buffer_state
|
||||
#define cmGccDepfile_yypush_buffer_state_ALREADY_DEFINED
|
||||
#else
|
||||
#define yypush_buffer_state cmGccDepfile_yypush_buffer_state
|
||||
#endif
|
||||
|
||||
#ifdef yypop_buffer_state
|
||||
#define cmGccDepfile_yypop_buffer_state_ALREADY_DEFINED
|
||||
#else
|
||||
#define yypop_buffer_state cmGccDepfile_yypop_buffer_state
|
||||
#endif
|
||||
|
||||
#ifdef yyensure_buffer_stack
|
||||
#define cmGccDepfile_yyensure_buffer_stack_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyensure_buffer_stack cmGccDepfile_yyensure_buffer_stack
|
||||
#endif
|
||||
|
||||
#ifdef yylex
|
||||
#define cmGccDepfile_yylex_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex cmGccDepfile_yylex
|
||||
#endif
|
||||
|
||||
#ifdef yyrestart
|
||||
#define cmGccDepfile_yyrestart_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyrestart cmGccDepfile_yyrestart
|
||||
#endif
|
||||
|
||||
#ifdef yylex_init
|
||||
#define cmGccDepfile_yylex_init_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex_init cmGccDepfile_yylex_init
|
||||
#endif
|
||||
|
||||
#ifdef yylex_init_extra
|
||||
#define cmGccDepfile_yylex_init_extra_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex_init_extra cmGccDepfile_yylex_init_extra
|
||||
#endif
|
||||
|
||||
#ifdef yylex_destroy
|
||||
#define cmGccDepfile_yylex_destroy_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex_destroy cmGccDepfile_yylex_destroy
|
||||
#endif
|
||||
|
||||
#ifdef yyget_debug
|
||||
#define cmGccDepfile_yyget_debug_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_debug cmGccDepfile_yyget_debug
|
||||
#endif
|
||||
|
||||
#ifdef yyset_debug
|
||||
#define cmGccDepfile_yyset_debug_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_debug cmGccDepfile_yyset_debug
|
||||
#endif
|
||||
|
||||
#ifdef yyget_extra
|
||||
#define cmGccDepfile_yyget_extra_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_extra cmGccDepfile_yyget_extra
|
||||
#endif
|
||||
|
||||
#ifdef yyset_extra
|
||||
#define cmGccDepfile_yyset_extra_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_extra cmGccDepfile_yyset_extra
|
||||
#endif
|
||||
|
||||
#ifdef yyget_in
|
||||
#define cmGccDepfile_yyget_in_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_in cmGccDepfile_yyget_in
|
||||
#endif
|
||||
|
||||
#ifdef yyset_in
|
||||
#define cmGccDepfile_yyset_in_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_in cmGccDepfile_yyset_in
|
||||
#endif
|
||||
|
||||
#ifdef yyget_out
|
||||
#define cmGccDepfile_yyget_out_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_out cmGccDepfile_yyget_out
|
||||
#endif
|
||||
|
||||
#ifdef yyset_out
|
||||
#define cmGccDepfile_yyset_out_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_out cmGccDepfile_yyset_out
|
||||
#endif
|
||||
|
||||
#ifdef yyget_leng
|
||||
#define cmGccDepfile_yyget_leng_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_leng cmGccDepfile_yyget_leng
|
||||
#endif
|
||||
|
||||
#ifdef yyget_text
|
||||
#define cmGccDepfile_yyget_text_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_text cmGccDepfile_yyget_text
|
||||
#endif
|
||||
|
||||
#ifdef yyget_lineno
|
||||
#define cmGccDepfile_yyget_lineno_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_lineno cmGccDepfile_yyget_lineno
|
||||
#endif
|
||||
|
||||
#ifdef yyset_lineno
|
||||
#define cmGccDepfile_yyset_lineno_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_lineno cmGccDepfile_yyset_lineno
|
||||
#endif
|
||||
|
||||
#ifdef yyget_column
|
||||
#define cmGccDepfile_yyget_column_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_column cmGccDepfile_yyget_column
|
||||
#endif
|
||||
|
||||
#ifdef yyset_column
|
||||
#define cmGccDepfile_yyset_column_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_column cmGccDepfile_yyset_column
|
||||
#endif
|
||||
|
||||
#ifdef yywrap
|
||||
#define cmGccDepfile_yywrap_ALREADY_DEFINED
|
||||
#else
|
||||
#define yywrap cmGccDepfile_yywrap
|
||||
#endif
|
||||
|
||||
#ifdef yyalloc
|
||||
#define cmGccDepfile_yyalloc_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyalloc cmGccDepfile_yyalloc
|
||||
#endif
|
||||
|
||||
#ifdef yyrealloc
|
||||
#define cmGccDepfile_yyrealloc_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyrealloc cmGccDepfile_yyrealloc
|
||||
#endif
|
||||
|
||||
#ifdef yyfree
|
||||
#define cmGccDepfile_yyfree_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyfree cmGccDepfile_yyfree
|
||||
#endif
|
||||
|
||||
/* First, we deal with platform-specific or compiler-specific issues. */
|
||||
|
||||
/* begin standard C headers. */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* end standard C headers. */
|
||||
|
||||
/* flex integer type definitions */
|
||||
|
||||
#ifndef FLEXINT_H
|
||||
#define FLEXINT_H
|
||||
|
||||
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
|
||||
|
||||
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
||||
|
||||
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
|
||||
* if you want the limit (max/min) macros for int types.
|
||||
*/
|
||||
#ifndef __STDC_LIMIT_MACROS
|
||||
#define __STDC_LIMIT_MACROS 1
|
||||
#endif
|
||||
|
||||
#include <inttypes.h>
|
||||
typedef int8_t flex_int8_t;
|
||||
typedef uint8_t flex_uint8_t;
|
||||
typedef int16_t flex_int16_t;
|
||||
typedef uint16_t flex_uint16_t;
|
||||
typedef int32_t flex_int32_t;
|
||||
typedef uint32_t flex_uint32_t;
|
||||
#else
|
||||
typedef signed char flex_int8_t;
|
||||
typedef short int flex_int16_t;
|
||||
typedef int flex_int32_t;
|
||||
typedef unsigned char flex_uint8_t;
|
||||
typedef unsigned short int flex_uint16_t;
|
||||
typedef unsigned int flex_uint32_t;
|
||||
|
||||
/* Limits of integral types. */
|
||||
#ifndef INT8_MIN
|
||||
#define INT8_MIN (-128)
|
||||
#endif
|
||||
#ifndef INT16_MIN
|
||||
#define INT16_MIN (-32767-1)
|
||||
#endif
|
||||
#ifndef INT32_MIN
|
||||
#define INT32_MIN (-2147483647-1)
|
||||
#endif
|
||||
#ifndef INT8_MAX
|
||||
#define INT8_MAX (127)
|
||||
#endif
|
||||
#ifndef INT16_MAX
|
||||
#define INT16_MAX (32767)
|
||||
#endif
|
||||
#ifndef INT32_MAX
|
||||
#define INT32_MAX (2147483647)
|
||||
#endif
|
||||
#ifndef UINT8_MAX
|
||||
#define UINT8_MAX (255U)
|
||||
#endif
|
||||
#ifndef UINT16_MAX
|
||||
#define UINT16_MAX (65535U)
|
||||
#endif
|
||||
#ifndef UINT32_MAX
|
||||
#define UINT32_MAX (4294967295U)
|
||||
#endif
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
#define SIZE_MAX (~(size_t)0)
|
||||
#endif
|
||||
|
||||
#endif /* ! C99 */
|
||||
|
||||
#endif /* ! FLEXINT_H */
|
||||
|
||||
/* begin standard C++ headers. */
|
||||
|
||||
/* 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 yy_flex_debug yyg->yy_flex_debug_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 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 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
|
||||
|
||||
/* Size of default input buffer. */
|
||||
#ifndef YY_BUF_SIZE
|
||||
#ifdef __ia64__
|
||||
/* On IA-64, the buffer size is 16k, not 8k.
|
||||
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
|
||||
* Ditto for the __ia64__ case accordingly.
|
||||
*/
|
||||
#define YY_BUF_SIZE 32768
|
||||
#else
|
||||
#define YY_BUF_SIZE 16384
|
||||
#endif /* __ia64__ */
|
||||
#endif
|
||||
|
||||
/* The state buf must be large enough to hold one state per character in the main buffer.
|
||||
*/
|
||||
#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
|
||||
|
||||
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
|
||||
#define YY_TYPEDEF_YY_BUFFER_STATE
|
||||
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 unput(c) yyunput( 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 yy_at_bol;
|
||||
|
||||
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)
|
||||
/* 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 ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
|
||||
YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
|
||||
void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
|
||||
void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
|
||||
void yypush_buffer_state ( YY_BUFFER_STATE 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 ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
|
||||
#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)
|
||||
|
||||
YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
|
||||
YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
|
||||
YY_BUFFER_STATE 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 ){ \
|
||||
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 yy_set_bol(at_bol) \
|
||||
{ \
|
||||
if ( ! YY_CURRENT_BUFFER ){\
|
||||
yyensure_buffer_stack (yyscanner); \
|
||||
YY_CURRENT_BUFFER_LVALUE = \
|
||||
yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
|
||||
} \
|
||||
YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
|
||||
}
|
||||
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
|
||||
|
||||
/* Begin user sect3 */
|
||||
|
||||
#define cmGccDepfile_yywrap(yyscanner) (/*CONSTCOND*/1)
|
||||
#define YY_SKIP_YYWRAP
|
||||
typedef flex_uint8_t YY_CHAR;
|
||||
|
||||
typedef int yy_state_type;
|
||||
|
||||
#define yytext_ptr yytext_r
|
||||
|
||||
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 yy_fatal_error ( const char* msg , yyscan_t yyscanner );
|
||||
|
||||
/* Done after the current pattern has been matched and before the
|
||||
* corresponding action - sets up yytext.
|
||||
*/
|
||||
#define YY_DO_BEFORE_ACTION \
|
||||
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;
|
||||
#define YY_NUM_RULES 11
|
||||
#define YY_END_OF_BUFFER 12
|
||||
/* This struct is not used in this scanner,
|
||||
but its presence is necessary. */
|
||||
struct yy_trans_info
|
||||
{
|
||||
flex_int32_t yy_verify;
|
||||
flex_int32_t yy_nxt;
|
||||
};
|
||||
static const flex_int16_t yy_accept[26] =
|
||||
{ 0,
|
||||
0, 0, 12, 10, 8, 6, 10, 9, 10, 10,
|
||||
10, 8, 0, 6, 9, 1, 7, 5, 0, 3,
|
||||
2, 0, 4, 0, 0
|
||||
} ;
|
||||
|
||||
static const YY_CHAR yy_ec[256] =
|
||||
{ 0,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
|
||||
1, 1, 4, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 5, 6, 1, 7, 8, 6, 1, 1, 6,
|
||||
6, 1, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 9, 1, 1,
|
||||
6, 1, 1, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 10, 6, 1, 6, 1, 6, 6, 6, 6,
|
||||
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 1, 6, 6, 1, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
||||
6, 6, 6, 6, 6
|
||||
} ;
|
||||
|
||||
static const YY_CHAR yy_meta[11] =
|
||||
{ 0,
|
||||
1, 2, 1, 1, 2, 1, 1, 1, 1, 3
|
||||
} ;
|
||||
|
||||
static const flex_int16_t yy_base[28] =
|
||||
{ 0,
|
||||
0, 0, 29, 35, 18, 35, 22, 18, 15, 0,
|
||||
8, 12, 16, 35, 11, 35, 0, 35, 13, 35,
|
||||
35, 16, 35, 22, 35, 31, 12
|
||||
} ;
|
||||
|
||||
static const flex_int16_t yy_def[28] =
|
||||
{ 0,
|
||||
25, 1, 25, 25, 26, 25, 25, 25, 25, 27,
|
||||
25, 26, 25, 25, 25, 25, 27, 25, 25, 25,
|
||||
25, 25, 25, 25, 0, 25, 25
|
||||
} ;
|
||||
|
||||
static const flex_int16_t yy_nxt[46] =
|
||||
{ 0,
|
||||
4, 5, 6, 7, 5, 8, 4, 9, 10, 11,
|
||||
18, 19, 20, 17, 21, 18, 15, 22, 18, 19,
|
||||
23, 13, 16, 15, 14, 24, 20, 13, 25, 25,
|
||||
25, 22, 12, 12, 3, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25
|
||||
} ;
|
||||
|
||||
static const flex_int16_t yy_chk[46] =
|
||||
{ 0,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
11, 11, 11, 27, 11, 19, 15, 11, 13, 13,
|
||||
22, 12, 9, 8, 7, 22, 24, 5, 3, 0,
|
||||
0, 24, 26, 26, 25, 25, 25, 25, 25, 25,
|
||||
25, 25, 25, 25, 25
|
||||
} ;
|
||||
|
||||
/* The intent behind this definition is that it'll catch
|
||||
* any uses of REJECT which flex missed.
|
||||
*/
|
||||
#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
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
|
||||
/* IWYU pragma: no_forward_declare yyguts_t */
|
||||
|
||||
#ifndef __clang_analyzer__ /* Suppress clang scan-build warnings */
|
||||
|
||||
#include <cmGccDepfileLexerHelper.h>
|
||||
#include <string>
|
||||
|
||||
#define INITIAL 0
|
||||
|
||||
#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. */
|
||||
YY_BUFFER_STATE * 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 yy_flex_debug_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_UNPUT
|
||||
|
||||
static void yyunput ( int c, char *buf_ptr , yyscan_t yyscanner);
|
||||
|
||||
#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_INPUT
|
||||
#ifdef __cplusplus
|
||||
static int yyinput ( yyscan_t yyscanner );
|
||||
#else
|
||||
static int input ( yyscan_t yyscanner );
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* Amount of stuff to slurp up with each read. */
|
||||
#ifndef YY_READ_BUF_SIZE
|
||||
#ifdef __ia64__
|
||||
/* On IA-64, the buffer size is 16k, not 8k */
|
||||
#define YY_READ_BUF_SIZE 16384
|
||||
#else
|
||||
#define YY_READ_BUF_SIZE 8192
|
||||
#endif /* __ia64__ */
|
||||
#endif
|
||||
|
||||
/* Copy whatever the last rule matched to the standard output. */
|
||||
#ifndef ECHO
|
||||
/* This used to be an fputs(), but since the string might contain NUL's,
|
||||
* we now use fwrite().
|
||||
*/
|
||||
#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
|
||||
#endif
|
||||
|
||||
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
|
||||
* is returned in "result".
|
||||
*/
|
||||
#ifndef YY_INPUT
|
||||
#define YY_INPUT(buf,result,max_size) \
|
||||
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
|
||||
{ \
|
||||
int c = '*'; \
|
||||
int n; \
|
||||
for ( n = 0; n < max_size && \
|
||||
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
|
||||
buf[n] = (char) c; \
|
||||
if ( c == '\n' ) \
|
||||
buf[n++] = (char) c; \
|
||||
if ( c == EOF && ferror( yyin ) ) \
|
||||
YY_FATAL_ERROR( "input in flex scanner failed" ); \
|
||||
result = n; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
errno=0; \
|
||||
while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
|
||||
{ \
|
||||
if( errno != EINTR) \
|
||||
{ \
|
||||
YY_FATAL_ERROR( "input in flex scanner failed" ); \
|
||||
break; \
|
||||
} \
|
||||
errno=0; \
|
||||
clearerr(yyin); \
|
||||
} \
|
||||
}\
|
||||
\
|
||||
|
||||
#endif
|
||||
|
||||
/* 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
|
||||
|
||||
/* Report a fatal error. */
|
||||
#ifndef YY_FATAL_ERROR
|
||||
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
|
||||
#endif
|
||||
|
||||
/* end tables serialization structures and prototypes */
|
||||
|
||||
/* 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
|
||||
|
||||
/* Code executed at the end of each rule. */
|
||||
#ifndef YY_BREAK
|
||||
#define YY_BREAK /*LINTED*/break;
|
||||
#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 ) {
|
||||
yyensure_buffer_stack (yyscanner);
|
||||
YY_CURRENT_BUFFER_LVALUE =
|
||||
yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
|
||||
}
|
||||
|
||||
yy_load_buffer_state( yyscanner );
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
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;
|
||||
|
||||
yy_current_state = yyg->yy_start;
|
||||
yy_match:
|
||||
do
|
||||
{
|
||||
YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
|
||||
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];
|
||||
if ( yy_current_state >= 26 )
|
||||
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] != 35 );
|
||||
|
||||
yy_find_action:
|
||||
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;
|
||||
yy_cp = yyg->yy_last_accepting_cpos;
|
||||
yy_current_state = yyg->yy_last_accepting_state;
|
||||
goto yy_find_action;
|
||||
|
||||
case 1:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// Unescape the dollar sign.
|
||||
yyextra->addToCurrentPath("$");
|
||||
}
|
||||
YY_BREAK
|
||||
case 2:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// Unescape the hash.
|
||||
yyextra->addToCurrentPath("#");
|
||||
}
|
||||
YY_BREAK
|
||||
case 3:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// 2N+1 backslashes plus space -> N backslashes plus space.
|
||||
size_t c = (strlen(yytext) - 1) / 2;
|
||||
std::string s(c, '\\');
|
||||
s.push_back(' ');
|
||||
yyextra->addToCurrentPath(s.c_str());
|
||||
}
|
||||
YY_BREAK
|
||||
case 4:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// 2N backslashes plus space -> 2N backslashes, end of filename.
|
||||
yytext[strlen(yytext) - 1] = 0;
|
||||
yyextra->addToCurrentPath(yytext);
|
||||
yyextra->newDependency();
|
||||
}
|
||||
YY_BREAK
|
||||
case 5:
|
||||
/* rule 5 can match eol */
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// A line continuation ends the current file name.
|
||||
yyextra->newDependency();
|
||||
}
|
||||
YY_BREAK
|
||||
case 6:
|
||||
/* rule 6 can match eol */
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// A newline ends the current file name and the current rule.
|
||||
yyextra->newEntry();
|
||||
}
|
||||
YY_BREAK
|
||||
case 7:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// A colon followed by space ends the rules and starts a new dependency.
|
||||
yyextra->newDependency();
|
||||
}
|
||||
YY_BREAK
|
||||
case 8:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// Rules and dependencies are separated by blocks of whitespace.
|
||||
yyextra->newRuleOrDependency();
|
||||
}
|
||||
YY_BREAK
|
||||
case 9:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// Got a span of plain text.
|
||||
yyextra->addToCurrentPath(yytext);
|
||||
}
|
||||
YY_BREAK
|
||||
case 10:
|
||||
YY_RULE_SETUP
|
||||
{
|
||||
// Got an otherwise unmatched character.
|
||||
yyextra->addToCurrentPath(yytext);
|
||||
}
|
||||
YY_BREAK
|
||||
case 11:
|
||||
YY_RULE_SETUP
|
||||
ECHO;
|
||||
YY_BREAK
|
||||
case YY_STATE_EOF(INITIAL):
|
||||
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
|
||||
{
|
||||
yy_cp = yyg->yy_c_buf_p;
|
||||
goto yy_find_action;
|
||||
}
|
||||
}
|
||||
|
||||
else 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(YY_START);
|
||||
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;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
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 */
|
||||
YY_BUFFER_STATE 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);
|
||||
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;
|
||||
|
||||
yy_current_state = yyg->yy_start;
|
||||
|
||||
for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
|
||||
{
|
||||
YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
|
||||
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];
|
||||
if ( yy_current_state >= 26 )
|
||||
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. */
|
||||
char *yy_cp = yyg->yy_c_buf_p;
|
||||
|
||||
YY_CHAR yy_c = 1;
|
||||
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];
|
||||
if ( yy_current_state >= 26 )
|
||||
yy_c = yy_meta[yy_c];
|
||||
}
|
||||
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
|
||||
yy_is_jam = (yy_current_state == 25);
|
||||
|
||||
(void)yyg;
|
||||
return yy_is_jam ? 0 : yy_current_state;
|
||||
}
|
||||
|
||||
#ifndef YY_NO_UNPUT
|
||||
|
||||
static void yyunput (int c, char * yy_bp , yyscan_t yyscanner)
|
||||
{
|
||||
char *yy_cp;
|
||||
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
|
||||
|
||||
yy_cp = yyg->yy_c_buf_p;
|
||||
|
||||
/* undo effects of setting up yytext */
|
||||
*yy_cp = yyg->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 = yyg->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 =
|
||||
yyg->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;
|
||||
|
||||
yyg->yytext_ptr = yy_bp;
|
||||
yyg->yy_hold_char = *yy_cp;
|
||||
yyg->yy_c_buf_p = yy_cp;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef YY_NO_INPUT
|
||||
#ifdef __cplusplus
|
||||
static int yyinput (yyscan_t yyscanner)
|
||||
#else
|
||||
static int input (yyscan_t yyscanner)
|
||||
#endif
|
||||
|
||||
{
|
||||
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;
|
||||
#ifdef __cplusplus
|
||||
return yyinput(yyscanner);
|
||||
#else
|
||||
return input(yyscanner);
|
||||
#endif
|
||||
}
|
||||
|
||||
case EOB_ACT_CONTINUE_SCAN:
|
||||
yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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_INPUT */
|
||||
|
||||
/** Immediately switch to a different input stream.
|
||||
* @param input_file A readable stream.
|
||||
* @param yyscanner The scanner object.
|
||||
* @note This function does not reset the start condition to @c INITIAL .
|
||||
*/
|
||||
void yyrestart (FILE * input_file , yyscan_t yyscanner)
|
||||
{
|
||||
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
|
||||
|
||||
if ( ! YY_CURRENT_BUFFER ){
|
||||
yyensure_buffer_stack (yyscanner);
|
||||
YY_CURRENT_BUFFER_LVALUE =
|
||||
yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
|
||||
}
|
||||
|
||||
yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
|
||||
yy_load_buffer_state( yyscanner );
|
||||
}
|
||||
|
||||
/** Switch to a different input buffer.
|
||||
* @param new_buffer The new input buffer.
|
||||
* @param yyscanner The scanner object.
|
||||
*/
|
||||
void yy_switch_to_buffer (YY_BUFFER_STATE 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.
|
||||
*/
|
||||
YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
|
||||
{
|
||||
YY_BUFFER_STATE b;
|
||||
|
||||
b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
|
||||
if ( ! b )
|
||||
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 )
|
||||
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 (YY_BUFFER_STATE b , yyscan_t yyscanner)
|
||||
{
|
||||
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
|
||||
|
||||
if ( ! b )
|
||||
return;
|
||||
|
||||
if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
|
||||
YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
|
||||
|
||||
if ( b->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 (YY_BUFFER_STATE 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_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 (YY_BUFFER_STATE b , yyscan_t yyscanner)
|
||||
{
|
||||
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
|
||||
if ( ! b )
|
||||
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->yy_at_bol = 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 (YY_BUFFER_STATE 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 )
|
||||
{
|
||||
/* 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)
|
||||
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) {
|
||||
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) {
|
||||
|
||||
/* 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 )
|
||||
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 )
|
||||
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.
|
||||
*/
|
||||
YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
|
||||
{
|
||||
YY_BUFFER_STATE b;
|
||||
|
||||
if ( size < 2 ||
|
||||
base[size-2] != YY_END_OF_BUFFER_CHAR ||
|
||||
base[size-1] != YY_END_OF_BUFFER_CHAR )
|
||||
/* They forgot to leave room for the EOB's. */
|
||||
return NULL;
|
||||
|
||||
b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
|
||||
if ( ! b )
|
||||
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->yy_at_bol = 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.
|
||||
*/
|
||||
YY_BUFFER_STATE 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.
|
||||
*/
|
||||
YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner)
|
||||
{
|
||||
YY_BUFFER_STATE b;
|
||||
char *buf;
|
||||
yy_size_t n;
|
||||
int i;
|
||||
|
||||
/* Get memory for full buffer, including space for trailing EOB's. */
|
||||
n = (yy_size_t) (_yybytes_len + 2);
|
||||
buf = (char *) yyalloc( n , yyscanner );
|
||||
if ( ! buf )
|
||||
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 )
|
||||
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;
|
||||
}
|
||||
|
||||
#ifndef YY_EXIT_FAILURE
|
||||
#define YY_EXIT_FAILURE 2
|
||||
#endif
|
||||
|
||||
static void yynoreturn yy_fatal_error (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 );
|
||||
}
|
||||
|
||||
/* 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)
|
||||
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)
|
||||
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 )
|
||||
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 )
|
||||
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 yy_flex_debug;
|
||||
}
|
||||
|
||||
void yyset_debug (int _bdebug , yyscan_t yyscanner)
|
||||
{
|
||||
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
|
||||
yy_flex_debug = _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){
|
||||
yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );
|
||||
YY_CURRENT_BUFFER_LVALUE = NULL;
|
||||
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 */
|
||||
}
|
||||
|
||||
#define YYTABLES_NAME "yytables"
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
#endif /* __clang_analyzer__ */
|
||||
@@ -0,0 +1,687 @@
|
||||
#ifndef cmGccDepfile_yyHEADER_H
|
||||
#define cmGccDepfile_yyHEADER_H 1
|
||||
#define cmGccDepfile_yyIN_HEADER 1
|
||||
|
||||
#define FLEXINT_H 1
|
||||
#define YY_INT_ALIGNED short int
|
||||
|
||||
/* A lexical scanner generated by flex */
|
||||
|
||||
#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 cmGccDepfile_yy_create_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_create_buffer cmGccDepfile_yy_create_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_delete_buffer
|
||||
#define cmGccDepfile_yy_delete_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_delete_buffer cmGccDepfile_yy_delete_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_scan_buffer
|
||||
#define cmGccDepfile_yy_scan_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_scan_buffer cmGccDepfile_yy_scan_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_scan_string
|
||||
#define cmGccDepfile_yy_scan_string_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_scan_string cmGccDepfile_yy_scan_string
|
||||
#endif
|
||||
|
||||
#ifdef yy_scan_bytes
|
||||
#define cmGccDepfile_yy_scan_bytes_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_scan_bytes cmGccDepfile_yy_scan_bytes
|
||||
#endif
|
||||
|
||||
#ifdef yy_init_buffer
|
||||
#define cmGccDepfile_yy_init_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_init_buffer cmGccDepfile_yy_init_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_flush_buffer
|
||||
#define cmGccDepfile_yy_flush_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_flush_buffer cmGccDepfile_yy_flush_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yy_load_buffer_state
|
||||
#define cmGccDepfile_yy_load_buffer_state_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_load_buffer_state cmGccDepfile_yy_load_buffer_state
|
||||
#endif
|
||||
|
||||
#ifdef yy_switch_to_buffer
|
||||
#define cmGccDepfile_yy_switch_to_buffer_ALREADY_DEFINED
|
||||
#else
|
||||
#define yy_switch_to_buffer cmGccDepfile_yy_switch_to_buffer
|
||||
#endif
|
||||
|
||||
#ifdef yypush_buffer_state
|
||||
#define cmGccDepfile_yypush_buffer_state_ALREADY_DEFINED
|
||||
#else
|
||||
#define yypush_buffer_state cmGccDepfile_yypush_buffer_state
|
||||
#endif
|
||||
|
||||
#ifdef yypop_buffer_state
|
||||
#define cmGccDepfile_yypop_buffer_state_ALREADY_DEFINED
|
||||
#else
|
||||
#define yypop_buffer_state cmGccDepfile_yypop_buffer_state
|
||||
#endif
|
||||
|
||||
#ifdef yyensure_buffer_stack
|
||||
#define cmGccDepfile_yyensure_buffer_stack_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyensure_buffer_stack cmGccDepfile_yyensure_buffer_stack
|
||||
#endif
|
||||
|
||||
#ifdef yylex
|
||||
#define cmGccDepfile_yylex_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex cmGccDepfile_yylex
|
||||
#endif
|
||||
|
||||
#ifdef yyrestart
|
||||
#define cmGccDepfile_yyrestart_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyrestart cmGccDepfile_yyrestart
|
||||
#endif
|
||||
|
||||
#ifdef yylex_init
|
||||
#define cmGccDepfile_yylex_init_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex_init cmGccDepfile_yylex_init
|
||||
#endif
|
||||
|
||||
#ifdef yylex_init_extra
|
||||
#define cmGccDepfile_yylex_init_extra_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex_init_extra cmGccDepfile_yylex_init_extra
|
||||
#endif
|
||||
|
||||
#ifdef yylex_destroy
|
||||
#define cmGccDepfile_yylex_destroy_ALREADY_DEFINED
|
||||
#else
|
||||
#define yylex_destroy cmGccDepfile_yylex_destroy
|
||||
#endif
|
||||
|
||||
#ifdef yyget_debug
|
||||
#define cmGccDepfile_yyget_debug_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_debug cmGccDepfile_yyget_debug
|
||||
#endif
|
||||
|
||||
#ifdef yyset_debug
|
||||
#define cmGccDepfile_yyset_debug_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_debug cmGccDepfile_yyset_debug
|
||||
#endif
|
||||
|
||||
#ifdef yyget_extra
|
||||
#define cmGccDepfile_yyget_extra_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_extra cmGccDepfile_yyget_extra
|
||||
#endif
|
||||
|
||||
#ifdef yyset_extra
|
||||
#define cmGccDepfile_yyset_extra_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_extra cmGccDepfile_yyset_extra
|
||||
#endif
|
||||
|
||||
#ifdef yyget_in
|
||||
#define cmGccDepfile_yyget_in_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_in cmGccDepfile_yyget_in
|
||||
#endif
|
||||
|
||||
#ifdef yyset_in
|
||||
#define cmGccDepfile_yyset_in_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_in cmGccDepfile_yyset_in
|
||||
#endif
|
||||
|
||||
#ifdef yyget_out
|
||||
#define cmGccDepfile_yyget_out_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_out cmGccDepfile_yyget_out
|
||||
#endif
|
||||
|
||||
#ifdef yyset_out
|
||||
#define cmGccDepfile_yyset_out_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_out cmGccDepfile_yyset_out
|
||||
#endif
|
||||
|
||||
#ifdef yyget_leng
|
||||
#define cmGccDepfile_yyget_leng_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_leng cmGccDepfile_yyget_leng
|
||||
#endif
|
||||
|
||||
#ifdef yyget_text
|
||||
#define cmGccDepfile_yyget_text_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_text cmGccDepfile_yyget_text
|
||||
#endif
|
||||
|
||||
#ifdef yyget_lineno
|
||||
#define cmGccDepfile_yyget_lineno_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_lineno cmGccDepfile_yyget_lineno
|
||||
#endif
|
||||
|
||||
#ifdef yyset_lineno
|
||||
#define cmGccDepfile_yyset_lineno_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_lineno cmGccDepfile_yyset_lineno
|
||||
#endif
|
||||
|
||||
#ifdef yyget_column
|
||||
#define cmGccDepfile_yyget_column_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyget_column cmGccDepfile_yyget_column
|
||||
#endif
|
||||
|
||||
#ifdef yyset_column
|
||||
#define cmGccDepfile_yyset_column_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyset_column cmGccDepfile_yyset_column
|
||||
#endif
|
||||
|
||||
#ifdef yywrap
|
||||
#define cmGccDepfile_yywrap_ALREADY_DEFINED
|
||||
#else
|
||||
#define yywrap cmGccDepfile_yywrap
|
||||
#endif
|
||||
|
||||
#ifdef yyalloc
|
||||
#define cmGccDepfile_yyalloc_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyalloc cmGccDepfile_yyalloc
|
||||
#endif
|
||||
|
||||
#ifdef yyrealloc
|
||||
#define cmGccDepfile_yyrealloc_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyrealloc cmGccDepfile_yyrealloc
|
||||
#endif
|
||||
|
||||
#ifdef yyfree
|
||||
#define cmGccDepfile_yyfree_ALREADY_DEFINED
|
||||
#else
|
||||
#define yyfree cmGccDepfile_yyfree
|
||||
#endif
|
||||
|
||||
/* First, we deal with platform-specific or compiler-specific issues. */
|
||||
|
||||
/* begin standard C headers. */
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* end standard C headers. */
|
||||
|
||||
/* flex integer type definitions */
|
||||
|
||||
#ifndef FLEXINT_H
|
||||
#define FLEXINT_H
|
||||
|
||||
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
|
||||
|
||||
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
||||
|
||||
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
|
||||
* if you want the limit (max/min) macros for int types.
|
||||
*/
|
||||
#ifndef __STDC_LIMIT_MACROS
|
||||
#define __STDC_LIMIT_MACROS 1
|
||||
#endif
|
||||
|
||||
#include <inttypes.h>
|
||||
typedef int8_t flex_int8_t;
|
||||
typedef uint8_t flex_uint8_t;
|
||||
typedef int16_t flex_int16_t;
|
||||
typedef uint16_t flex_uint16_t;
|
||||
typedef int32_t flex_int32_t;
|
||||
typedef uint32_t flex_uint32_t;
|
||||
#else
|
||||
typedef signed char flex_int8_t;
|
||||
typedef short int flex_int16_t;
|
||||
typedef int flex_int32_t;
|
||||
typedef unsigned char flex_uint8_t;
|
||||
typedef unsigned short int flex_uint16_t;
|
||||
typedef unsigned int flex_uint32_t;
|
||||
|
||||
/* Limits of integral types. */
|
||||
#ifndef INT8_MIN
|
||||
#define INT8_MIN (-128)
|
||||
#endif
|
||||
#ifndef INT16_MIN
|
||||
#define INT16_MIN (-32767-1)
|
||||
#endif
|
||||
#ifndef INT32_MIN
|
||||
#define INT32_MIN (-2147483647-1)
|
||||
#endif
|
||||
#ifndef INT8_MAX
|
||||
#define INT8_MAX (127)
|
||||
#endif
|
||||
#ifndef INT16_MAX
|
||||
#define INT16_MAX (32767)
|
||||
#endif
|
||||
#ifndef INT32_MAX
|
||||
#define INT32_MAX (2147483647)
|
||||
#endif
|
||||
#ifndef UINT8_MAX
|
||||
#define UINT8_MAX (255U)
|
||||
#endif
|
||||
#ifndef UINT16_MAX
|
||||
#define UINT16_MAX (65535U)
|
||||
#endif
|
||||
#ifndef UINT32_MAX
|
||||
#define UINT32_MAX (4294967295U)
|
||||
#endif
|
||||
|
||||
#ifndef SIZE_MAX
|
||||
#define SIZE_MAX (~(size_t)0)
|
||||
#endif
|
||||
|
||||
#endif /* ! C99 */
|
||||
|
||||
#endif /* ! FLEXINT_H */
|
||||
|
||||
/* begin standard C++ headers. */
|
||||
|
||||
/* TODO: this is always defined, so inline it */
|
||||
#define yyconst const
|
||||
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3
|
||||
#define yynoreturn __attribute__((__noreturn__))
|
||||
#else
|
||||
#define yynoreturn
|
||||
#endif
|
||||
|
||||
/* 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 yy_flex_debug yyg->yy_flex_debug_r
|
||||
|
||||
/* Size of default input buffer. */
|
||||
#ifndef YY_BUF_SIZE
|
||||
#ifdef __ia64__
|
||||
/* On IA-64, the buffer size is 16k, not 8k.
|
||||
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
|
||||
* Ditto for the __ia64__ case accordingly.
|
||||
*/
|
||||
#define YY_BUF_SIZE 32768
|
||||
#else
|
||||
#define YY_BUF_SIZE 16384
|
||||
#endif /* __ia64__ */
|
||||
#endif
|
||||
|
||||
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
|
||||
#define YY_TYPEDEF_YY_BUFFER_STATE
|
||||
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
|
||||
|
||||
#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 yy_at_bol;
|
||||
|
||||
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;
|
||||
|
||||
};
|
||||
#endif /* !YY_STRUCT_YY_BUFFER_STATE */
|
||||
|
||||
void yyrestart ( FILE *input_file , yyscan_t yyscanner );
|
||||
void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
|
||||
YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
|
||||
void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
|
||||
void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
|
||||
void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
|
||||
void yypop_buffer_state ( yyscan_t yyscanner );
|
||||
|
||||
YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
|
||||
YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
|
||||
YY_BUFFER_STATE 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 );
|
||||
|
||||
/* Begin user sect3 */
|
||||
|
||||
#define cmGccDepfile_yywrap(yyscanner) (/*CONSTCOND*/1)
|
||||
#define YY_SKIP_YYWRAP
|
||||
|
||||
#define yytext_ptr yytext_r
|
||||
|
||||
#ifdef YY_HEADER_EXPORT_START_CONDITIONS
|
||||
#define INITIAL 0
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef YY_EXTRA_TYPE
|
||||
#define YY_EXTRA_TYPE void *
|
||||
#endif
|
||||
|
||||
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 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_INPUT
|
||||
|
||||
#endif
|
||||
|
||||
/* Amount of stuff to slurp up with each read. */
|
||||
#ifndef YY_READ_BUF_SIZE
|
||||
#ifdef __ia64__
|
||||
/* On IA-64, the buffer size is 16k, not 8k */
|
||||
#define YY_READ_BUF_SIZE 16384
|
||||
#else
|
||||
#define YY_READ_BUF_SIZE 8192
|
||||
#endif /* __ia64__ */
|
||||
#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 */
|
||||
|
||||
/* yy_get_previous_state - get the state just before the EOB char was reached */
|
||||
|
||||
#undef YY_NEW_FILE
|
||||
#undef YY_FLUSH_BUFFER
|
||||
#undef yy_set_bol
|
||||
#undef yy_new_buffer
|
||||
#undef yy_set_interactive
|
||||
#undef YY_DO_BEFORE_ACTION
|
||||
|
||||
#ifdef YY_DECL_IS_OURS
|
||||
#undef YY_DECL_IS_OURS
|
||||
#undef YY_DECL
|
||||
#endif
|
||||
|
||||
#ifndef cmGccDepfile_yy_create_buffer_ALREADY_DEFINED
|
||||
#undef yy_create_buffer
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_delete_buffer_ALREADY_DEFINED
|
||||
#undef yy_delete_buffer
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_scan_buffer_ALREADY_DEFINED
|
||||
#undef yy_scan_buffer
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_scan_string_ALREADY_DEFINED
|
||||
#undef yy_scan_string
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_scan_bytes_ALREADY_DEFINED
|
||||
#undef yy_scan_bytes
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_init_buffer_ALREADY_DEFINED
|
||||
#undef yy_init_buffer
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_flush_buffer_ALREADY_DEFINED
|
||||
#undef yy_flush_buffer
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_load_buffer_state_ALREADY_DEFINED
|
||||
#undef yy_load_buffer_state
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_switch_to_buffer_ALREADY_DEFINED
|
||||
#undef yy_switch_to_buffer
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yypush_buffer_state_ALREADY_DEFINED
|
||||
#undef yypush_buffer_state
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yypop_buffer_state_ALREADY_DEFINED
|
||||
#undef yypop_buffer_state
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyensure_buffer_stack_ALREADY_DEFINED
|
||||
#undef yyensure_buffer_stack
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yylex_ALREADY_DEFINED
|
||||
#undef yylex
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyrestart_ALREADY_DEFINED
|
||||
#undef yyrestart
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yylex_init_ALREADY_DEFINED
|
||||
#undef yylex_init
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yylex_init_extra_ALREADY_DEFINED
|
||||
#undef yylex_init_extra
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yylex_destroy_ALREADY_DEFINED
|
||||
#undef yylex_destroy
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_debug_ALREADY_DEFINED
|
||||
#undef yyget_debug
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_debug_ALREADY_DEFINED
|
||||
#undef yyset_debug
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_extra_ALREADY_DEFINED
|
||||
#undef yyget_extra
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_extra_ALREADY_DEFINED
|
||||
#undef yyset_extra
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_in_ALREADY_DEFINED
|
||||
#undef yyget_in
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_in_ALREADY_DEFINED
|
||||
#undef yyset_in
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_out_ALREADY_DEFINED
|
||||
#undef yyget_out
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_out_ALREADY_DEFINED
|
||||
#undef yyset_out
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_leng_ALREADY_DEFINED
|
||||
#undef yyget_leng
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_text_ALREADY_DEFINED
|
||||
#undef yyget_text
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_lineno_ALREADY_DEFINED
|
||||
#undef yyget_lineno
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_lineno_ALREADY_DEFINED
|
||||
#undef yyset_lineno
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_column_ALREADY_DEFINED
|
||||
#undef yyget_column
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_column_ALREADY_DEFINED
|
||||
#undef yyset_column
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yywrap_ALREADY_DEFINED
|
||||
#undef yywrap
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_lval_ALREADY_DEFINED
|
||||
#undef yyget_lval
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_lval_ALREADY_DEFINED
|
||||
#undef yyset_lval
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyget_lloc_ALREADY_DEFINED
|
||||
#undef yyget_lloc
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyset_lloc_ALREADY_DEFINED
|
||||
#undef yyset_lloc
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyalloc_ALREADY_DEFINED
|
||||
#undef yyalloc
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyrealloc_ALREADY_DEFINED
|
||||
#undef yyrealloc
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyfree_ALREADY_DEFINED
|
||||
#undef yyfree
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yytext_ALREADY_DEFINED
|
||||
#undef yytext
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyleng_ALREADY_DEFINED
|
||||
#undef yyleng
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyin_ALREADY_DEFINED
|
||||
#undef yyin
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyout_ALREADY_DEFINED
|
||||
#undef yyout
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yy_flex_debug_ALREADY_DEFINED
|
||||
#undef yy_flex_debug
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yylineno_ALREADY_DEFINED
|
||||
#undef yylineno
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yytables_fload_ALREADY_DEFINED
|
||||
#undef yytables_fload
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yytables_destroy_ALREADY_DEFINED
|
||||
#undef yytables_destroy
|
||||
#endif
|
||||
#ifndef cmGccDepfile_yyTABLES_NAME_ALREADY_DEFINED
|
||||
#undef yyTABLES_NAME
|
||||
#endif
|
||||
|
||||
#undef cmGccDepfile_yyIN_HEADER
|
||||
#endif /* cmGccDepfile_yyHEADER_H */
|
||||
@@ -0,0 +1,72 @@
|
||||
%{
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
|
||||
/* IWYU pragma: no_forward_declare yyguts_t */
|
||||
|
||||
#ifndef __clang_analyzer__ /* Suppress clang scan-build warnings */
|
||||
|
||||
#include <cmGccDepfileLexerHelper.h>
|
||||
#include <string>
|
||||
%}
|
||||
|
||||
%option prefix="cmGccDepfile_yy"
|
||||
%option noyywrap
|
||||
%option reentrant
|
||||
%pointer
|
||||
|
||||
WSPACE [ \t]
|
||||
NEWLINE \r?\n
|
||||
|
||||
%%
|
||||
\${2} {
|
||||
// Unescape the dollar sign.
|
||||
yyextra->addToCurrentPath("$");
|
||||
}
|
||||
\\# {
|
||||
// Unescape the hash.
|
||||
yyextra->addToCurrentPath("#");
|
||||
}
|
||||
(\\\\)*\\[ ] {
|
||||
// 2N+1 backslashes plus space -> N backslashes plus space.
|
||||
size_t c = (strlen(yytext) - 1) / 2;
|
||||
std::string s(c, '\\');
|
||||
s.push_back(' ');
|
||||
yyextra->addToCurrentPath(s.c_str());
|
||||
}
|
||||
(\\\\)+[ ] {
|
||||
// 2N backslashes plus space -> 2N backslashes, end of filename.
|
||||
yytext[strlen(yytext) - 1] = 0;
|
||||
yyextra->addToCurrentPath(yytext);
|
||||
yyextra->newDependency();
|
||||
}
|
||||
{WSPACE}*\\{NEWLINE} {
|
||||
// A line continuation ends the current file name.
|
||||
yyextra->newDependency();
|
||||
}
|
||||
{NEWLINE} {
|
||||
// A newline ends the current file name and the current rule.
|
||||
yyextra->newEntry();
|
||||
}
|
||||
:{WSPACE}+ {
|
||||
// A colon followed by space ends the rules and starts a new dependency.
|
||||
yyextra->newDependency();
|
||||
}
|
||||
{WSPACE}+ {
|
||||
// Rules and dependencies are separated by blocks of whitespace.
|
||||
yyextra->newRuleOrDependency();
|
||||
}
|
||||
[a-zA-Z0-9+,/_.~()}{%=@\x5B\x5D!\x80-\xFF-]+ {
|
||||
// Got a span of plain text.
|
||||
yyextra->addToCurrentPath(yytext);
|
||||
}
|
||||
. {
|
||||
// Got an otherwise unmatched character.
|
||||
yyextra->addToCurrentPath(yytext);
|
||||
}
|
||||
|
||||
%%
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
#endif /* __clang_analyzer__ */
|
||||
@@ -0,0 +1,126 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#include "cmGccDepfileLexerHelper.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "cmGccDepfileReaderTypes.h"
|
||||
|
||||
#include "LexerParser/cmGccDepfileLexer.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
# include "cmsys/Encoding.h"
|
||||
#endif
|
||||
|
||||
bool cmGccDepfileLexerHelper::readFile(const char* filePath)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
wchar_t* wpath = cmsysEncoding_DupToWide(filePath);
|
||||
FILE* file = _wfopen(wpath, L"rb");
|
||||
free(wpath);
|
||||
#else
|
||||
FILE* file = fopen(filePath, "r");
|
||||
#endif
|
||||
if (!file) {
|
||||
return false;
|
||||
}
|
||||
newEntry();
|
||||
yyscan_t scanner;
|
||||
cmGccDepfile_yylex_init(&scanner);
|
||||
cmGccDepfile_yyset_extra(this, scanner);
|
||||
cmGccDepfile_yyrestart(file, scanner);
|
||||
cmGccDepfile_yylex(scanner);
|
||||
cmGccDepfile_yylex_destroy(scanner);
|
||||
sanitizeContent();
|
||||
fclose(file);
|
||||
return true;
|
||||
}
|
||||
|
||||
void cmGccDepfileLexerHelper::newEntry()
|
||||
{
|
||||
this->HelperState = State::Rule;
|
||||
this->Content.emplace_back();
|
||||
newRule();
|
||||
}
|
||||
|
||||
void cmGccDepfileLexerHelper::newRule()
|
||||
{
|
||||
auto& entry = this->Content.back();
|
||||
if (entry.rules.empty() || !entry.rules.back().empty()) {
|
||||
entry.rules.emplace_back();
|
||||
}
|
||||
}
|
||||
|
||||
void cmGccDepfileLexerHelper::newDependency()
|
||||
{
|
||||
// printf("NEW DEP\n");
|
||||
this->HelperState = State::Dependency;
|
||||
if (this->Content.back().paths.empty() ||
|
||||
!this->Content.back().paths.back().empty()) {
|
||||
this->Content.back().paths.emplace_back();
|
||||
}
|
||||
}
|
||||
|
||||
void cmGccDepfileLexerHelper::newRuleOrDependency()
|
||||
{
|
||||
if (this->HelperState == State::Rule) {
|
||||
newRule();
|
||||
} else {
|
||||
newDependency();
|
||||
}
|
||||
}
|
||||
|
||||
void cmGccDepfileLexerHelper::addToCurrentPath(const char* s)
|
||||
{
|
||||
if (this->Content.empty()) {
|
||||
return;
|
||||
}
|
||||
cmGccStyleDependency* dep = &this->Content.back();
|
||||
std::string* dst = nullptr;
|
||||
switch (this->HelperState) {
|
||||
case State::Rule: {
|
||||
if (dep->rules.empty()) {
|
||||
return;
|
||||
}
|
||||
dst = &dep->rules.back();
|
||||
} break;
|
||||
case State::Dependency: {
|
||||
if (dep->paths.empty()) {
|
||||
return;
|
||||
}
|
||||
dst = &dep->paths.back();
|
||||
} break;
|
||||
}
|
||||
dst->append(s);
|
||||
}
|
||||
|
||||
void cmGccDepfileLexerHelper::sanitizeContent()
|
||||
{
|
||||
for (auto it = this->Content.begin(); it != this->Content.end();) {
|
||||
// Remove empty rules
|
||||
for (auto rit = it->rules.begin(); rit != it->rules.end();) {
|
||||
if (rit->empty()) {
|
||||
rit = it->rules.erase(rit);
|
||||
} else {
|
||||
++rit;
|
||||
}
|
||||
}
|
||||
// Remove the entry if rules are empty
|
||||
if (it->rules.empty()) {
|
||||
it = this->Content.erase(it);
|
||||
} else {
|
||||
// Remove empty paths
|
||||
for (auto pit = it->paths.begin(); pit != it->paths.end();) {
|
||||
if (pit->empty()) {
|
||||
pit = it->paths.erase(pit);
|
||||
} else {
|
||||
++pit;
|
||||
}
|
||||
}
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#ifndef cmGccDepfileLexerHelper_h
|
||||
#define cmGccDepfileLexerHelper_h
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include <cmGccDepfileReaderTypes.h>
|
||||
|
||||
class cmGccDepfileLexerHelper
|
||||
{
|
||||
public:
|
||||
cmGccDepfileLexerHelper() = default;
|
||||
|
||||
bool readFile(const char* filePath);
|
||||
cmGccDepfileContent extractContent() && { return std::move(this->Content); }
|
||||
|
||||
// Functions called by the lexer
|
||||
void newEntry();
|
||||
void newRule();
|
||||
void newDependency();
|
||||
void newRuleOrDependency();
|
||||
void addToCurrentPath(const char* s);
|
||||
|
||||
private:
|
||||
void sanitizeContent();
|
||||
|
||||
cmGccDepfileContent Content;
|
||||
|
||||
enum class State
|
||||
{
|
||||
Rule,
|
||||
Dependency
|
||||
};
|
||||
State HelperState = State::Rule;
|
||||
};
|
||||
|
||||
#define YY_EXTRA_TYPE cmGccDepfileLexerHelper*
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,18 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#include "cmGccDepfileReader.h"
|
||||
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#include "cmGccDepfileLexerHelper.h"
|
||||
|
||||
cmGccDepfileContent cmReadGccDepfile(const char* filePath)
|
||||
{
|
||||
cmGccDepfileContent result;
|
||||
cmGccDepfileLexerHelper helper;
|
||||
if (helper.readFile(filePath)) {
|
||||
result = std::move(helper).extractContent();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#ifndef cmGccDepfileReader_h
|
||||
#define cmGccDepfileReader_h
|
||||
|
||||
#include "cmGccDepfileReaderTypes.h"
|
||||
|
||||
cmGccDepfileContent cmReadGccDepfile(const char* filePath);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,17 @@
|
||||
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#ifndef cmGccDepfileReaderTypes_h
|
||||
#define cmGccDepfileReaderTypes_h
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
struct cmGccStyleDependency
|
||||
{
|
||||
std::vector<std::string> rules;
|
||||
std::vector<std::string> paths;
|
||||
};
|
||||
|
||||
using cmGccDepfileContent = std::vector<cmGccStyleDependency>;
|
||||
|
||||
#endif
|
||||
@@ -1171,13 +1171,51 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<std::string> dependencies(
|
||||
this->AutogenTarget.DependFiles.begin(),
|
||||
this->AutogenTarget.DependFiles.end());
|
||||
|
||||
const bool useNinjaDepfile = this->QtVersion >= IntegerVersion(5, 15) &&
|
||||
this->GlobalGen->GetName().find("Ninja") != std::string::npos;
|
||||
if (useNinjaDepfile) {
|
||||
// Create a custom command that generates a timestamp file and
|
||||
// has a depfile assigned. The depfile is created by JobDepFilesMergeT.
|
||||
|
||||
// Add additional autogen target dependencies
|
||||
for (const cmTarget* t : this->AutogenTarget.DependTargets) {
|
||||
dependencies.push_back(t->GetName());
|
||||
}
|
||||
const char timestampFileName[] = "timestamp";
|
||||
const std::string outputFile =
|
||||
cmStrCat(this->Dir.Build, "/", timestampFileName);
|
||||
this->AutogenTarget.DepFile = cmStrCat(this->Dir.Build, "/deps");
|
||||
this->AutogenTarget.DepFileRuleName =
|
||||
cmStrCat(this->GenTarget->GetName(), "_autogen/", timestampFileName);
|
||||
commandLines.push_back(cmMakeCommandLine(
|
||||
{ cmSystemTools::GetCMakeCommand(), "-E", "touch", outputFile }));
|
||||
|
||||
this->AddGeneratedSource(outputFile, this->Moc);
|
||||
const std::string no_main_dependency;
|
||||
this->LocalGen->AddCustomCommandToOutput(
|
||||
outputFile, dependencies, no_main_dependency, commandLines,
|
||||
autogenComment.c_str(), this->Dir.Work.c_str(), /*replace=*/false,
|
||||
/*escapeOldStyle=*/false,
|
||||
/*uses_terminal=*/false,
|
||||
/*command_expand_lists=*/false, this->AutogenTarget.DepFile);
|
||||
|
||||
// Alter variables for the autogen target which now merely wraps the
|
||||
// custom command
|
||||
dependencies.clear();
|
||||
dependencies.push_back(outputFile);
|
||||
commandLines.clear();
|
||||
autogenComment.clear();
|
||||
}
|
||||
|
||||
// Create autogen target
|
||||
cmTarget* autogenTarget = this->LocalGen->AddUtilityCommand(
|
||||
this->AutogenTarget.Name, true, this->Dir.Work.c_str(),
|
||||
/*byproducts=*/autogenProvides,
|
||||
std::vector<std::string>(this->AutogenTarget.DependFiles.begin(),
|
||||
this->AutogenTarget.DependFiles.end()),
|
||||
commandLines, false, autogenComment.c_str());
|
||||
/*depends=*/dependencies, commandLines, false, autogenComment.c_str());
|
||||
// Create autogen generator target
|
||||
this->LocalGen->AddGeneratorTarget(
|
||||
cm::make_unique<cmGeneratorTarget>(autogenTarget, this->LocalGen));
|
||||
@@ -1188,9 +1226,11 @@ bool cmQtAutoGenInitializer::InitAutogenTarget()
|
||||
autogenTarget->AddUtility(depName.Value, this->Makefile);
|
||||
}
|
||||
}
|
||||
// Add additional autogen target dependencies to autogen target
|
||||
for (cmTarget* depTarget : this->AutogenTarget.DependTargets) {
|
||||
autogenTarget->AddUtility(depTarget->GetName(), this->Makefile);
|
||||
if (!useNinjaDepfile) {
|
||||
// Add additional autogen target dependencies to autogen target
|
||||
for (cmTarget* depTarget : this->AutogenTarget.DependTargets) {
|
||||
autogenTarget->AddUtility(depTarget->GetName(), this->Makefile);
|
||||
}
|
||||
}
|
||||
|
||||
// Set FOLDER property in autogen target
|
||||
@@ -1408,12 +1448,15 @@ bool cmQtAutoGenInitializer::SetupWriteAutogenInfo()
|
||||
info.SetConfig("INCLUDE_DIR", this->Dir.Include);
|
||||
|
||||
info.SetUInt("QT_VERSION_MAJOR", this->QtVersion.Major);
|
||||
info.SetUInt("QT_VERSION_MINOR", this->QtVersion.Minor);
|
||||
info.Set("QT_MOC_EXECUTABLE", this->Moc.Executable);
|
||||
info.Set("QT_UIC_EXECUTABLE", this->Uic.Executable);
|
||||
|
||||
info.Set("CMAKE_EXECUTABLE", cmSystemTools::GetCMakeCommand());
|
||||
info.SetConfig("SETTINGS_FILE", this->AutogenTarget.SettingsFile);
|
||||
info.SetConfig("PARSE_CACHE_FILE", this->AutogenTarget.ParseCacheFile);
|
||||
info.Set("DEP_FILE", this->AutogenTarget.DepFile);
|
||||
info.Set("DEP_FILE_RULE_NAME", this->AutogenTarget.DepFileRuleName);
|
||||
info.SetArray("HEADER_EXTENSIONS",
|
||||
this->Makefile->GetCMakeInstance()->GetHeaderExtensions());
|
||||
info.SetArrayArray(
|
||||
|
||||
@@ -191,6 +191,8 @@ private:
|
||||
bool DependOrigin = false;
|
||||
std::set<std::string> DependFiles;
|
||||
std::set<cmTarget*> DependTargets;
|
||||
std::string DepFile;
|
||||
std::string DepFileRuleName;
|
||||
// Sources to process
|
||||
std::unordered_map<cmSourceFile*, MUFileHandle> Headers;
|
||||
std::unordered_map<cmSourceFile*, MUFileHandle> Sources;
|
||||
|
||||
+194
-14
@@ -25,6 +25,8 @@
|
||||
|
||||
#include "cmCryptoHash.h"
|
||||
#include "cmFileTime.h"
|
||||
#include "cmGccDepfileReader.h"
|
||||
#include "cmGccDepfileReaderTypes.h"
|
||||
#include "cmGeneratedFileStream.h"
|
||||
#include "cmQtAutoGen.h"
|
||||
#include "cmQtAutoGenerator.h"
|
||||
@@ -170,7 +172,7 @@ public:
|
||||
// -- Attributes
|
||||
// - Config
|
||||
bool MultiConfig = false;
|
||||
unsigned int QtVersionMajor = 4;
|
||||
IntegerVersion QtVersion = { 4, 0 };
|
||||
unsigned int ThreadCount = 0;
|
||||
// - Directories
|
||||
std::string AutogenBuildDir;
|
||||
@@ -179,6 +181,8 @@ public:
|
||||
std::string CMakeExecutable;
|
||||
cmFileTime CMakeExecutableTime;
|
||||
std::string ParseCacheFile;
|
||||
std::string DepFile;
|
||||
std::string DepFileRuleName;
|
||||
std::vector<std::string> HeaderExtensions;
|
||||
};
|
||||
|
||||
@@ -216,6 +220,7 @@ public:
|
||||
bool SettingsChanged = false;
|
||||
bool RelaxedMode = false;
|
||||
bool PathPrefix = false;
|
||||
bool CanOutputDependencies = false;
|
||||
cmFileTime ExecutableTime;
|
||||
std::string Executable;
|
||||
std::string CompFileAbs;
|
||||
@@ -485,8 +490,17 @@ public:
|
||||
class JobCompileMocT : public JobCompileT
|
||||
{
|
||||
public:
|
||||
using JobCompileT::JobCompileT;
|
||||
JobCompileMocT(MappingHandleT uicMapping,
|
||||
std::unique_ptr<std::string> reason,
|
||||
ParseCacheT::FileHandleT cacheEntry)
|
||||
: JobCompileT(std::move(uicMapping), std::move(reason))
|
||||
, CacheEntry(std::move(cacheEntry))
|
||||
{
|
||||
}
|
||||
void Process() override;
|
||||
|
||||
protected:
|
||||
ParseCacheT::FileHandleT CacheEntry;
|
||||
};
|
||||
|
||||
/** uic compiles a file. */
|
||||
@@ -504,6 +518,12 @@ public:
|
||||
void Process() override;
|
||||
};
|
||||
|
||||
class JobDepFilesMergeT : public JobFenceT
|
||||
{
|
||||
private:
|
||||
void Process() override;
|
||||
};
|
||||
|
||||
/** @brief The last job. */
|
||||
class JobFinishT : public JobFenceT
|
||||
{
|
||||
@@ -546,6 +566,9 @@ private:
|
||||
void Abort(bool error);
|
||||
// -- Generation
|
||||
bool CreateDirectories();
|
||||
// -- Support for depfiles
|
||||
static std::vector<std::string> dependenciesFromDepFile(
|
||||
const char* filePath);
|
||||
|
||||
private:
|
||||
// -- Settings
|
||||
@@ -951,7 +974,7 @@ void cmQtAutoMocUicT::JobParseT::MocMacro()
|
||||
|
||||
void cmQtAutoMocUicT::JobParseT::MocDependecies()
|
||||
{
|
||||
if (MocConst().DependFilters.empty()) {
|
||||
if (MocConst().DependFilters.empty() || MocConst().CanOutputDependencies) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1674,8 +1697,13 @@ bool cmQtAutoMocUicT::JobProbeDepsMocT::Generate(MappingHandleT const& mapping,
|
||||
if (Probe(*mapping, reason.get())) {
|
||||
// Register the parent directory for creation
|
||||
MocEval().OutputDirs.emplace(cmQtAutoGen::ParentDir(mapping->OutputFile));
|
||||
// Fetch the cache entry for the source file
|
||||
std::string const& sourceFile = mapping->SourceFile->FileName;
|
||||
ParseCacheT::GetOrInsertT cacheEntry =
|
||||
BaseEval().ParseCache.GetOrInsert(sourceFile);
|
||||
// Add moc job
|
||||
Gen()->WorkerPool().EmplaceJob<JobCompileMocT>(mapping, std::move(reason));
|
||||
Gen()->WorkerPool().EmplaceJob<JobCompileMocT>(
|
||||
mapping, std::move(reason), std::move(cacheEntry.first));
|
||||
// Check if a moc job for a mocs_compilation.cpp entry was generated
|
||||
if (compFile) {
|
||||
MocEval().CompUpdated = true;
|
||||
@@ -1779,6 +1807,14 @@ cmQtAutoMocUicT::JobProbeDepsMocT::FindDependency(
|
||||
std::string const& sourceDir, std::string const& includeString) const
|
||||
{
|
||||
using ResPair = std::pair<std::string, cmFileTime>;
|
||||
// moc's dependency file contains absolute paths
|
||||
if (MocConst().CanOutputDependencies) {
|
||||
ResPair res{ includeString, {} };
|
||||
if (res.second.Load(res.first)) {
|
||||
return res;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
// Search in vicinity of the source
|
||||
{
|
||||
ResPair res{ sourceDir + includeString, {} };
|
||||
@@ -1898,6 +1934,11 @@ void cmQtAutoMocUicT::JobProbeDepsFinishT::Process()
|
||||
Gen()->WorkerPool().EmplaceJob<JobMocsCompilationT>();
|
||||
}
|
||||
|
||||
if (!BaseConst().DepFile.empty()) {
|
||||
// Add job to merge dep files
|
||||
Gen()->WorkerPool().EmplaceJob<JobDepFilesMergeT>();
|
||||
}
|
||||
|
||||
// Add finish job
|
||||
Gen()->WorkerPool().EmplaceJob<JobFinishT>();
|
||||
}
|
||||
@@ -1947,6 +1988,9 @@ void cmQtAutoMocUicT::JobCompileMocT::Process()
|
||||
}
|
||||
// Add extra options
|
||||
cm::append(cmd, MocConst().OptionsExtra);
|
||||
if (MocConst().CanOutputDependencies) {
|
||||
cmd.emplace_back("--output-dep-file");
|
||||
}
|
||||
// Add output file
|
||||
cmd.emplace_back("-o");
|
||||
cmd.push_back(outputFile);
|
||||
@@ -1956,12 +2000,7 @@ void cmQtAutoMocUicT::JobCompileMocT::Process()
|
||||
|
||||
// Execute moc command
|
||||
cmWorkerPool::ProcessResultT result;
|
||||
if (RunProcess(GenT::MOC, result, cmd, Reason.get())) {
|
||||
// Moc command success. Print moc output.
|
||||
if (!result.StdOut.empty()) {
|
||||
Log().Info(GenT::MOC, result.StdOut);
|
||||
}
|
||||
} else {
|
||||
if (!RunProcess(GenT::MOC, result, cmd, Reason.get())) {
|
||||
// Moc command failed
|
||||
std::string includers;
|
||||
if (!Mapping->IncluderFiles.empty()) {
|
||||
@@ -1976,6 +2015,28 @@ void cmQtAutoMocUicT::JobCompileMocT::Process()
|
||||
MessagePath(outputFile), '\n', includers,
|
||||
result.ErrorMessage),
|
||||
cmd, result.StdOut);
|
||||
return;
|
||||
}
|
||||
|
||||
// Moc command success. Print moc output.
|
||||
if (!result.StdOut.empty()) {
|
||||
Log().Info(GenT::MOC, result.StdOut);
|
||||
}
|
||||
|
||||
// Extract dependencies from the dep file moc generated for us
|
||||
if (MocConst().CanOutputDependencies) {
|
||||
const std::string depfile = outputFile + ".d";
|
||||
if (Log().Verbose()) {
|
||||
Log().Info(GenT::MOC,
|
||||
"Reading dependencies from " + MessagePath(depfile));
|
||||
}
|
||||
if (!cmSystemTools::FileExists(depfile)) {
|
||||
Log().Warning(GenT::MOC,
|
||||
"Dependency file " + MessagePath(depfile) +
|
||||
" does not exist.");
|
||||
return;
|
||||
}
|
||||
CacheEntry->Moc.Depends = dependenciesFromDepFile(depfile.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1992,7 +2053,7 @@ void cmQtAutoMocUicT::JobCompileUicT::Process()
|
||||
auto optionIt = UicConst().UiFiles.find(sourceFile);
|
||||
if (optionIt != UicConst().UiFiles.end()) {
|
||||
UicMergeOptions(allOpts, optionIt->second.Options,
|
||||
(BaseConst().QtVersionMajor == 5));
|
||||
(BaseConst().QtVersion.Major == 5));
|
||||
}
|
||||
cm::append(cmd, allOpts);
|
||||
}
|
||||
@@ -2067,6 +2128,106 @@ void cmQtAutoMocUicT::JobMocsCompilationT::Process()
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Escapes paths for Ninja depfiles.
|
||||
* This is a re-implementation of what moc does when writing depfiles.
|
||||
*/
|
||||
std::string escapeDependencyPath(cm::string_view path)
|
||||
{
|
||||
std::string escapedPath;
|
||||
escapedPath.reserve(path.size());
|
||||
const size_t s = path.size();
|
||||
int backslashCount = 0;
|
||||
for (size_t i = 0; i < s; ++i) {
|
||||
if (path[i] == '\\') {
|
||||
++backslashCount;
|
||||
} else {
|
||||
if (path[i] == '$') {
|
||||
escapedPath.push_back('$');
|
||||
} else if (path[i] == '#') {
|
||||
escapedPath.push_back('\\');
|
||||
} else if (path[i] == ' ') {
|
||||
// Double the amount of written backslashes,
|
||||
// and add one more to escape the space.
|
||||
while (backslashCount-- >= 0) {
|
||||
escapedPath.push_back('\\');
|
||||
}
|
||||
}
|
||||
backslashCount = 0;
|
||||
}
|
||||
escapedPath.push_back(path[i]);
|
||||
}
|
||||
return escapedPath;
|
||||
}
|
||||
|
||||
void cmQtAutoMocUicT::JobDepFilesMergeT::Process()
|
||||
{
|
||||
if (Log().Verbose()) {
|
||||
Log().Info(GenT::MOC, "Merging MOC dependencies");
|
||||
}
|
||||
auto processDepFile =
|
||||
[](const std::string& mocOutputFile) -> std::vector<std::string> {
|
||||
std::string f = mocOutputFile + ".d";
|
||||
if (!cmSystemTools::FileExists(f)) {
|
||||
return {};
|
||||
}
|
||||
return dependenciesFromDepFile(f.c_str());
|
||||
};
|
||||
|
||||
std::vector<std::string> dependencies;
|
||||
ParseCacheT& parseCache = BaseEval().ParseCache;
|
||||
auto processMappingEntry = [&](const MappingMapT::value_type& m) {
|
||||
auto cacheEntry = parseCache.GetOrInsert(m.first);
|
||||
if (cacheEntry.first->Moc.Depends.empty()) {
|
||||
cacheEntry.first->Moc.Depends = processDepFile(m.second->OutputFile);
|
||||
}
|
||||
dependencies.insert(dependencies.end(),
|
||||
cacheEntry.first->Moc.Depends.begin(),
|
||||
cacheEntry.first->Moc.Depends.end());
|
||||
};
|
||||
|
||||
std::for_each(MocEval().HeaderMappings.begin(),
|
||||
MocEval().HeaderMappings.end(), processMappingEntry);
|
||||
std::for_each(MocEval().SourceMappings.begin(),
|
||||
MocEval().SourceMappings.end(), processMappingEntry);
|
||||
|
||||
// Remove duplicates to make the depfile smaller
|
||||
std::sort(dependencies.begin(), dependencies.end());
|
||||
dependencies.erase(std::unique(dependencies.begin(), dependencies.end()),
|
||||
dependencies.end());
|
||||
|
||||
// Add form files
|
||||
for (const auto& uif : UicEval().UiFiles) {
|
||||
dependencies.push_back(uif.first);
|
||||
}
|
||||
|
||||
// Write the file
|
||||
cmsys::ofstream ofs;
|
||||
ofs.open(BaseConst().DepFile.c_str(),
|
||||
(std::ios::out | std::ios::binary | std::ios::trunc));
|
||||
if (!ofs) {
|
||||
LogError(GenT::GEN,
|
||||
cmStrCat("Cannot open ", MessagePath(BaseConst().DepFile),
|
||||
" for writing."));
|
||||
return;
|
||||
}
|
||||
ofs << BaseConst().DepFileRuleName << ": \\" << std::endl;
|
||||
for (const std::string& file : dependencies) {
|
||||
ofs << '\t' << escapeDependencyPath(file) << " \\" << std::endl;
|
||||
if (!ofs.good()) {
|
||||
LogError(GenT::GEN,
|
||||
cmStrCat("Writing depfile", MessagePath(BaseConst().DepFile),
|
||||
" failed."));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Add the CMake executable to re-new cache data if necessary.
|
||||
// Also, this is the last entry, so don't add a backslash.
|
||||
ofs << '\t' << escapeDependencyPath(BaseConst().CMakeExecutable)
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
void cmQtAutoMocUicT::JobFinishT::Process()
|
||||
{
|
||||
Gen()->AbortSuccess();
|
||||
@@ -2082,7 +2243,8 @@ bool cmQtAutoMocUicT::InitFromInfo(InfoT const& info)
|
||||
{
|
||||
// -- Required settings
|
||||
if (!info.GetBool("MULTI_CONFIG", BaseConst_.MultiConfig, true) ||
|
||||
!info.GetUInt("QT_VERSION_MAJOR", BaseConst_.QtVersionMajor, true) ||
|
||||
!info.GetUInt("QT_VERSION_MAJOR", BaseConst_.QtVersion.Major, true) ||
|
||||
!info.GetUInt("QT_VERSION_MINOR", BaseConst_.QtVersion.Minor, true) ||
|
||||
!info.GetUInt("PARALLEL", BaseConst_.ThreadCount, false) ||
|
||||
!info.GetString("BUILD_DIR", BaseConst_.AutogenBuildDir, true) ||
|
||||
!info.GetStringConfig("INCLUDE_DIR", BaseConst_.AutogenIncludeDir,
|
||||
@@ -2090,6 +2252,9 @@ bool cmQtAutoMocUicT::InitFromInfo(InfoT const& info)
|
||||
!info.GetString("CMAKE_EXECUTABLE", BaseConst_.CMakeExecutable, true) ||
|
||||
!info.GetStringConfig("PARSE_CACHE_FILE", BaseConst_.ParseCacheFile,
|
||||
true) ||
|
||||
!info.GetString("DEP_FILE", BaseConst_.DepFile, false) ||
|
||||
!info.GetString("DEP_FILE_RULE_NAME", BaseConst_.DepFileRuleName,
|
||||
false) ||
|
||||
!info.GetStringConfig("SETTINGS_FILE", SettingsFile_, true) ||
|
||||
!info.GetArray("HEADER_EXTENSIONS", BaseConst_.HeaderExtensions, true) ||
|
||||
!info.GetString("QT_MOC_EXECUTABLE", MocConst_.Executable, false) ||
|
||||
@@ -2143,8 +2308,10 @@ bool cmQtAutoMocUicT::InitFromInfo(InfoT const& info)
|
||||
MocConst_.MacroFilters.emplace_back(
|
||||
item, ("[\n][ \t]*{?[ \t]*" + item).append("[^a-zA-Z0-9_]"));
|
||||
}
|
||||
// Dependency filters
|
||||
{
|
||||
// Can moc output dependencies or do we need to setup dependency filters?
|
||||
if (BaseConst_.QtVersion >= IntegerVersion(5, 15)) {
|
||||
MocConst_.CanOutputDependencies = true;
|
||||
} else {
|
||||
Json::Value const& val = info.GetValue("MOC_DEPEND_FILTERS");
|
||||
if (!val.isArray()) {
|
||||
return info.LogError("MOC_DEPEND_FILTERS JSON value is not an array.");
|
||||
@@ -2660,6 +2827,19 @@ bool cmQtAutoMocUicT::CreateDirectories()
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<std::string> cmQtAutoMocUicT::dependenciesFromDepFile(
|
||||
const char* filePath)
|
||||
{
|
||||
cmGccDepfileContent content = cmReadGccDepfile(filePath);
|
||||
if (content.empty()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
// Moc outputs a depfile with exactly one rule.
|
||||
// Discard the rule and return the dependencies.
|
||||
return content.front().paths;
|
||||
}
|
||||
|
||||
void cmQtAutoMocUicT::Abort(bool error)
|
||||
{
|
||||
if (error) {
|
||||
|
||||
@@ -11,6 +11,7 @@ set(CMakeLib_TESTS
|
||||
testCTestResourceAllocator.cxx
|
||||
testCTestResourceSpec.cxx
|
||||
testCTestResourceGroups.cxx
|
||||
testGccDepfileReader.cxx
|
||||
testGeneratedFileStream.cxx
|
||||
testRST.cxx
|
||||
testRange.cxx
|
||||
@@ -35,6 +36,7 @@ set(testRST_ARGS ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(testUVProcessChain_ARGS $<TARGET_FILE:testUVProcessChainHelper>)
|
||||
set(testUVStreambuf_ARGS $<TARGET_FILE:cmake>)
|
||||
set(testCTestResourceSpec_ARGS ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(testGccDepfileReader_ARGS ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
if(WIN32)
|
||||
list(APPEND CMakeLib_TESTS
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
#include <cstddef>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "cmsys/FStream.hxx"
|
||||
|
||||
#include "cmGccDepfileReader.h"
|
||||
#include "cmGccDepfileReaderTypes.h" // for cmGccDepfileContent, cmGccStyle...
|
||||
#include "cmSystemTools.h"
|
||||
|
||||
namespace {
|
||||
|
||||
cmGccDepfileContent readPlainDepfile(const char* filePath)
|
||||
{
|
||||
cmGccDepfileContent result;
|
||||
cmsys::ifstream is(filePath);
|
||||
if (!is.is_open())
|
||||
return result;
|
||||
std::string line;
|
||||
|
||||
cmGccStyleDependency dep;
|
||||
bool readingRules = true;
|
||||
while (cmSystemTools::GetLineFromStream(is, line)) {
|
||||
if (line == "--RULES--") {
|
||||
if (!dep.rules.empty()) {
|
||||
result.push_back(std::move(dep));
|
||||
dep = cmGccStyleDependency();
|
||||
}
|
||||
readingRules = true;
|
||||
} else if (line == "--DEPENDENCIES--") {
|
||||
readingRules = false;
|
||||
} else {
|
||||
std::vector<std::string>& dst = readingRules ? dep.rules : dep.paths;
|
||||
dst.push_back(std::move(line));
|
||||
line = std::string();
|
||||
}
|
||||
}
|
||||
|
||||
if (!dep.rules.empty()) {
|
||||
result.push_back(std::move(dep));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool compare(const std::vector<std::string>& actual,
|
||||
const std::vector<std::string>& expected, const char* msg)
|
||||
{
|
||||
if (actual.size() != expected.size()) {
|
||||
std::cerr << msg << "expected " << expected.size() << " entries."
|
||||
<< std::endl
|
||||
<< "Actual number of entries: " << actual.size() << std::endl;
|
||||
return false;
|
||||
}
|
||||
for (std::size_t i = 0; i < actual.size(); ++i) {
|
||||
if (actual[i] != expected[i]) {
|
||||
std::cerr << msg << std::endl
|
||||
<< "expected: " << expected[i] << std::endl
|
||||
<< "actual: " << actual[i] << std::endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool compare(const cmGccDepfileContent& actual,
|
||||
const cmGccDepfileContent& expected)
|
||||
{
|
||||
if (actual.size() != expected.size()) {
|
||||
std::cerr << "Expected " << expected.size() << " entries." << std::endl
|
||||
<< "Actual number of entries: " << actual.size() << std::endl;
|
||||
return false;
|
||||
}
|
||||
for (std::size_t i = 0; i < actual.size(); ++i) {
|
||||
if (!compare(actual[i].rules, expected[i].rules, "Rules differ: ") ||
|
||||
!compare(actual[i].paths, expected[i].paths, "Paths differ: ")) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void dump(const char* label, const cmGccDepfileContent& dfc)
|
||||
{
|
||||
std::cerr << label << std::endl;
|
||||
for (const auto& entry : dfc) {
|
||||
auto rit = entry.rules.cbegin();
|
||||
if (rit != entry.rules.cend()) {
|
||||
std::cerr << *rit;
|
||||
for (++rit; rit != entry.rules.cend(); ++rit) {
|
||||
std::cerr << " " << *rit;
|
||||
}
|
||||
std::cerr << ": " << std::endl;
|
||||
}
|
||||
for (const auto& path : entry.paths) {
|
||||
std::cerr << " " << path << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
int testGccDepfileReader(int argc, char* argv[])
|
||||
{
|
||||
if (argc < 2) {
|
||||
std::cout << "Invalid arguments.\n";
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string dataDirPath = argv[1];
|
||||
dataDirPath += "/testGccDepfileReader_data";
|
||||
const int numberOfTestFiles = 3;
|
||||
for (int i = 1; i <= numberOfTestFiles; ++i) {
|
||||
const std::string base = dataDirPath + "/deps" + std::to_string(i);
|
||||
const std::string depfile = base + ".d";
|
||||
const std::string plainDepfile = base + ".txt";
|
||||
std::cout << "Comparing " << base << " with " << plainDepfile << std::endl;
|
||||
const auto actual = cmReadGccDepfile(depfile.c_str());
|
||||
const auto expected = readPlainDepfile(plainDepfile.c_str());
|
||||
if (!compare(actual, expected)) {
|
||||
dump("actual", actual);
|
||||
dump("expected", expected);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
main.o: main.cpp /usr/include/stdc-predef.h /usr/include/stdio.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
|
||||
/usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/long-double.h \
|
||||
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
|
||||
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
|
||||
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h \
|
||||
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/typesizes.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types/FILE.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
|
||||
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h
|
||||
@@ -0,0 +1,26 @@
|
||||
--RULES--
|
||||
main.o
|
||||
--DEPENDENCIES--
|
||||
main.cpp
|
||||
/usr/include/stdc-predef.h
|
||||
/usr/include/stdio.h
|
||||
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h
|
||||
/usr/include/features.h
|
||||
/usr/include/x86_64-linux-gnu/sys/cdefs.h
|
||||
/usr/include/x86_64-linux-gnu/bits/wordsize.h
|
||||
/usr/include/x86_64-linux-gnu/bits/long-double.h
|
||||
/usr/include/x86_64-linux-gnu/gnu/stubs.h
|
||||
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h
|
||||
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h
|
||||
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types.h
|
||||
/usr/include/x86_64-linux-gnu/bits/typesizes.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types/FILE.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h
|
||||
/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h
|
||||
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h
|
||||
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h
|
||||
@@ -0,0 +1 @@
|
||||
foo.o bar.o: foobar.c
|
||||
@@ -0,0 +1,5 @@
|
||||
--RULES--
|
||||
foo.o
|
||||
bar.o
|
||||
--DEPENDENCIES--
|
||||
foobar.c
|
||||
@@ -0,0 +1,2 @@
|
||||
main.o: main.cpp foo\#bar.h foo\\#bar.h foo\ bar.h \
|
||||
foo\\\ bar.h foo\\\\\ bar.h foo\\\\ foo$$bar.h
|
||||
@@ -0,0 +1,11 @@
|
||||
--RULES--
|
||||
main.o
|
||||
--DEPENDENCIES--
|
||||
main.cpp
|
||||
foo#bar.h
|
||||
foo\#bar.h
|
||||
foo bar.h
|
||||
foo\ bar.h
|
||||
foo\\ bar.h
|
||||
foo\\\\
|
||||
foo$bar.h
|
||||
@@ -10,7 +10,7 @@ class StyleA : public QStylePlugin
|
||||
Q_OBJECT
|
||||
// Json file in source local directory
|
||||
Q_PLUGIN_METADATA(IID "org.styles.A" FILE "StyleA.json")
|
||||
A_CUSTOM_MACRO(SomeArg, "StyleA_Custom.json", AnotherArg)
|
||||
A_CUSTOM_MACRO(org.styles.A, "StyleA_Custom.json", AnotherArg)
|
||||
public:
|
||||
QStyle* create(const QString& key);
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ class StyleB : public QStylePlugin
|
||||
Q_OBJECT
|
||||
// Json file in source local subdirectory
|
||||
Q_PLUGIN_METADATA(IID "org.styles.B" FILE "jsonIn/StyleB.json")
|
||||
A_CUSTOM_MACRO(SomeArg, "jsonIn/StyleB_Custom.json", AnotherArg)
|
||||
A_CUSTOM_MACRO(org.styles.B, "jsonIn/StyleB_Custom.json", AnotherArg)
|
||||
public:
|
||||
QStyle* create(const QString& key);
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ class StyleC : public QStylePlugin
|
||||
Q_OBJECT
|
||||
// Json file in global root directory
|
||||
Q_PLUGIN_METADATA(IID "org.styles.C" FILE "StyleC.json")
|
||||
A_CUSTOM_MACRO(SomeArg, "StyleC_Custom.json", AnotherArg)
|
||||
A_CUSTOM_MACRO(org.styles.C, "StyleC_Custom.json", AnotherArg)
|
||||
public:
|
||||
QStyle* create(const QString& key);
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ class StyleD : public QStylePlugin
|
||||
Q_OBJECT
|
||||
// Json file in global sub director
|
||||
Q_PLUGIN_METADATA(IID "org.styles.D" FILE "sub/StyleD.json")
|
||||
A_CUSTOM_MACRO(SomeArg, "sub/StyleD_Custom.json", AnotherArg)
|
||||
A_CUSTOM_MACRO(org.styles.D, "sub/StyleD_Custom.json", AnotherArg)
|
||||
public:
|
||||
QStyle* create(const QString& key);
|
||||
};
|
||||
|
||||
@@ -10,7 +10,7 @@ class StyleE : public QStylePlugin
|
||||
Q_OBJECT
|
||||
// Json files in global root directory
|
||||
Q_PLUGIN_METADATA(IID "org.styles.E" FILE "StyleE.json")
|
||||
A_CUSTOM_MACRO(SomeArg, "StyleE_Custom.json", AnotherArg)
|
||||
A_CUSTOM_MACRO(org.styles.E, "StyleE_Custom.json", AnotherArg)
|
||||
public:
|
||||
QStyle* create(const QString& key);
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef UTILITYMACROS_HPP
|
||||
#define UTILITYMACROS_HPP
|
||||
|
||||
// Empty test macro definition
|
||||
#define A_CUSTOM_MACRO(name, jsonFile, pluginRegistrations)
|
||||
#define A_CUSTOM_MACRO(url, jsonFile, pluginRegistrations) \
|
||||
Q_PLUGIN_METADATA(IID #url FILE jsonFile)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -11,8 +11,20 @@ target_link_libraries(exe PRIVATE Qt5::Core)
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/Common.cmake)
|
||||
generate_output_files(exe)
|
||||
|
||||
set(moc_writes_depfiles 0)
|
||||
if(Qt5Core_VERSION VERSION_GREATER_EQUAL "5.15.0")
|
||||
set(moc_writes_depfiles 1)
|
||||
endif()
|
||||
|
||||
set(autogen_files "${CMAKE_BINARY_DIR}/exe_autogen/mocs_compilation.cpp")
|
||||
if(moc_writes_depfiles)
|
||||
list(APPEND autogen_files "${CMAKE_BINARY_DIR}/exe_autogen/deps")
|
||||
list(APPEND autogen_files "${CMAKE_BINARY_DIR}/exe_autogen/timestamp")
|
||||
endif()
|
||||
foreach(c IN LISTS CMAKE_CONFIGURATION_TYPES)
|
||||
list(APPEND autogen_files "${CMAKE_BINARY_DIR}/exe_autogen/include_${c}/moc_qt5.cpp")
|
||||
if(moc_writes_depfiles)
|
||||
list(APPEND autogen_files "${CMAKE_BINARY_DIR}/exe_autogen/include_${c}/moc_qt5.cpp.d")
|
||||
endif()
|
||||
endforeach()
|
||||
file(APPEND "${CMAKE_BINARY_DIR}/target_files.cmake" "set(AUTOGEN_FILES [==[${autogen_files}]==])\n")
|
||||
|
||||
@@ -14,7 +14,8 @@ for lexer in \
|
||||
CTestResourceGroups \
|
||||
DependsJava \
|
||||
Expr \
|
||||
Fortran
|
||||
Fortran \
|
||||
GccDepfile
|
||||
do
|
||||
cxx_file=cm${lexer}Lexer.cxx
|
||||
h_file=cm${lexer}Lexer.h
|
||||
|
||||
Reference in New Issue
Block a user