diff options
author | Philipp Borsutzki <kitware@borsutzki.org> | 2024-04-25 11:35:33 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-04-30 13:16:49 (GMT) |
commit | bc258730ec1b3171bb11d17cb096a60007ff9508 (patch) | |
tree | e7b110b3edf0d07867bbcb52df786f2af84ea93f /Source/LexerParser | |
parent | 781e25a35bcd5174ca884386066af08ed4ebe2b4 (diff) | |
download | CMake-bc258730ec1b3171bb11d17cb096a60007ff9508.zip CMake-bc258730ec1b3171bb11d17cb096a60007ff9508.tar.gz CMake-bc258730ec1b3171bb11d17cb096a60007ff9508.tar.bz2 |
cmake_transform_depfile: Handle escaped colons in depfile content
Support escaped colons in windows paths containing driver letters
(e.g. `c\:\\`) when parsing depfiles.
Fixes: #25943
Diffstat (limited to 'Source/LexerParser')
-rw-r--r-- | Source/LexerParser/cmGccDepfileLexer.cxx | 92 | ||||
-rw-r--r-- | Source/LexerParser/cmGccDepfileLexer.in.l | 4 |
2 files changed, 54 insertions, 42 deletions
diff --git a/Source/LexerParser/cmGccDepfileLexer.cxx b/Source/LexerParser/cmGccDepfileLexer.cxx index ca5577e..d926c8b 100644 --- a/Source/LexerParser/cmGccDepfileLexer.cxx +++ b/Source/LexerParser/cmGccDepfileLexer.cxx @@ -548,8 +548,8 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 12 -#define YY_END_OF_BUFFER 13 +#define YY_NUM_RULES 13 +#define YY_END_OF_BUFFER 14 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -557,11 +557,12 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[31] = +static const flex_int16_t yy_accept[32] = { 0, - 0, 0, 13, 11, 9, 6, 11, 10, 11, 11, - 11, 9, 0, 6, 10, 1, 8, 7, 0, 0, - 5, 0, 3, 2, 0, 8, 0, 4, 0, 0 + 0, 0, 14, 12, 10, 7, 12, 11, 12, 12, + 12, 10, 0, 7, 11, 1, 9, 8, 0, 0, + 6, 0, 4, 2, 3, 0, 9, 0, 5, 0, + 0 } ; static const YY_CHAR yy_ec[256] = @@ -601,40 +602,40 @@ static const YY_CHAR yy_meta[11] = 1, 2, 1, 1, 2, 1, 1, 1, 1, 3 } ; -static const flex_int16_t yy_base[33] = +static const flex_int16_t yy_base[34] = { 0, - 0, 0, 36, 46, 25, 46, 31, 27, 18, 9, + 0, 0, 39, 46, 26, 46, 32, 28, 25, 9, 17, 15, 25, 46, 17, 46, 0, 46, 15, 27, - 46, 14, 46, 46, 27, 46, 13, 46, 33, 46, - 42, 13 + 46, 14, 46, 46, 46, 27, 46, 13, 46, 33, + 46, 42, 13 } ; -static const flex_int16_t yy_def[33] = +static const flex_int16_t yy_def[34] = { 0, - 30, 1, 30, 30, 31, 30, 30, 30, 30, 30, - 30, 31, 30, 30, 30, 30, 32, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, - 30, 30 + 31, 1, 31, 31, 32, 31, 31, 31, 31, 31, + 31, 32, 31, 31, 31, 31, 33, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 0, 31, 31 } ; static const flex_int16_t yy_nxt[57] = { 0, 4, 5, 6, 7, 5, 8, 4, 9, 10, 11, - 17, 18, 19, 17, 17, 26, 21, 18, 20, 21, - 22, 23, 15, 24, 13, 16, 25, 21, 22, 26, - 27, 28, 15, 14, 13, 30, 29, 23, 30, 30, - 30, 30, 25, 12, 12, 3, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30 + 17, 18, 19, 17, 17, 27, 21, 18, 20, 21, + 22, 23, 15, 24, 13, 25, 26, 21, 22, 27, + 28, 29, 16, 15, 14, 13, 30, 23, 31, 31, + 31, 31, 26, 12, 12, 3, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31 } ; static const flex_int16_t yy_chk[57] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 10, 10, 10, 10, 32, 27, 22, 19, 10, 11, - 11, 11, 15, 11, 12, 9, 11, 13, 13, 20, - 20, 25, 8, 7, 5, 3, 25, 29, 0, 0, - 0, 0, 29, 31, 31, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30 + 10, 10, 10, 10, 33, 28, 22, 19, 10, 11, + 11, 11, 15, 11, 12, 11, 11, 13, 13, 20, + 20, 26, 9, 8, 7, 5, 26, 30, 3, 0, + 0, 0, 30, 32, 32, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31 } ; /* The intent behind this definition is that it'll catch @@ -930,7 +931,7 @@ yy_match: 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 >= 31 ) + if ( yy_current_state >= 32 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -977,6 +978,13 @@ YY_RULE_SETUP case 3: YY_RULE_SETUP { + // Unescape the colon. + yyextra->addToCurrentPath(":"); + } + YY_BREAK +case 4: +YY_RULE_SETUP +{ // 2N+1 backslashes plus space -> N backslashes plus space. size_t c = (strlen(yytext) - 1) / 2; std::string s(c, '\\'); @@ -984,7 +992,7 @@ YY_RULE_SETUP yyextra->addToCurrentPath(s.c_str()); } YY_BREAK -case 4: +case 5: YY_RULE_SETUP { // 2N backslashes plus space -> 2N backslashes, end of filename. @@ -993,24 +1001,24 @@ YY_RULE_SETUP yyextra->newDependency(); } YY_BREAK -case 5: -/* rule 5 can match eol */ +case 6: +/* rule 6 can match eol */ YY_RULE_SETUP { // A line continuation ends the current file name. yyextra->newRuleOrDependency(); } YY_BREAK -case 6: -/* rule 6 can match eol */ +case 7: +/* rule 7 can match eol */ YY_RULE_SETUP { // A newline ends the current file name and the current rule. yyextra->newEntry(); } YY_BREAK -case 7: -/* rule 7 can match eol */ +case 8: +/* rule 8 can match eol */ YY_RULE_SETUP { // A colon ends the rules @@ -1019,8 +1027,8 @@ YY_RULE_SETUP yyextra->newEntry(); } YY_BREAK -case 8: -/* rule 8 can match eol */ +case 9: +/* rule 9 can match eol */ YY_RULE_SETUP { // A colon followed by space or line continuation ends the rules @@ -1028,28 +1036,28 @@ YY_RULE_SETUP yyextra->newDependency(); } YY_BREAK -case 9: +case 10: YY_RULE_SETUP { // Rules and dependencies are separated by blocks of whitespace. yyextra->newRuleOrDependency(); } YY_BREAK -case 10: +case 11: YY_RULE_SETUP { // Got a span of plain text. yyextra->addToCurrentPath(yytext); } YY_BREAK -case 11: +case 12: YY_RULE_SETUP { // Got an otherwise unmatched character. yyextra->addToCurrentPath(yytext); } YY_BREAK -case 12: +case 13: YY_RULE_SETUP ECHO; YY_BREAK @@ -1351,7 +1359,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) 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 >= 31 ) + if ( yy_current_state >= 32 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -1380,11 +1388,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner) 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 >= 31 ) + if ( yy_current_state >= 32 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 30); + yy_is_jam = (yy_current_state == 31); (void)yyg; return yy_is_jam ? 0 : yy_current_state; diff --git a/Source/LexerParser/cmGccDepfileLexer.in.l b/Source/LexerParser/cmGccDepfileLexer.in.l index 6336b5f..a0a0f22 100644 --- a/Source/LexerParser/cmGccDepfileLexer.in.l +++ b/Source/LexerParser/cmGccDepfileLexer.in.l @@ -27,6 +27,10 @@ NEWLINE \r?\n // Unescape the hash. yyextra->addToCurrentPath("#"); } +\\: { + // Unescape the colon. + yyextra->addToCurrentPath(":"); + } (\\\\)*\\[ ] { // 2N+1 backslashes plus space -> N backslashes plus space. size_t c = (strlen(yytext) - 1) / 2; |