BUG#1179: Fix for syntax in unquoted arguments.

This commit is contained in:
Brad King 2004-09-20 08:51:12 -04:00
parent bedb6e899f
commit bc26a216b4
3 changed files with 90 additions and 70 deletions

View File

@ -363,11 +363,12 @@ struct yy_trans_info
flex_int32_t yy_verify; flex_int32_t yy_verify;
flex_int32_t yy_nxt; flex_int32_t yy_nxt;
}; };
static yyconst flex_int16_t yy_accept[27] = static yyconst flex_int16_t yy_accept[33] =
{ 0, { 0,
0, 0, 0, 0, 15, 6, 12, 1, 7, 2, 0, 0, 0, 0, 15, 6, 12, 1, 7, 2,
3, 4, 6, 13, 8, 9, 10, 11, 6, 0, 6, 3, 4, 6, 13, 8, 9, 10, 11, 6,
2, 5, 6, 8, 0, 0 6, 0, 2, 0, 5, 6, 8, 0, 0, 0,
0, 0
} ; } ;
static yyconst flex_int32_t yy_ec[256] = static yyconst flex_int32_t yy_ec[256] =
@ -375,17 +376,17 @@ static yyconst flex_int32_t yy_ec[256] =
1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 4, 5, 1, 1, 1, 1, 6, 1, 2, 1, 4, 5, 6, 1, 1, 1, 7,
7, 1, 1, 1, 1, 1, 1, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 9, 9, 9,
8, 8, 8, 8, 8, 8, 8, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1,
1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 10, 10, 10, 10, 10, 10,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
1, 10, 1, 1, 9, 1, 9, 9, 9, 9, 1, 11, 1, 1, 10, 1, 10, 10, 10, 10,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 10, 10, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@ -402,49 +403,58 @@ static yyconst flex_int32_t yy_ec[256] =
1, 1, 1, 1, 1 1, 1, 1, 1, 1
} ; } ;
static yyconst flex_int32_t yy_meta[11] = static yyconst flex_int32_t yy_meta[12] =
{ 0, { 0,
1, 2, 3, 4, 2, 2, 2, 1, 1, 1 1, 2, 3, 4, 2, 1, 2, 5, 6, 6,
1
} ; } ;
static yyconst flex_int16_t yy_base[32] = static yyconst flex_int16_t yy_base[40] =
{ 0, { 0,
0, 0, 8, 16, 17, 6, 63, 63, 63, 0, 0, 0, 9, 18, 26, 24, 91, 91, 91, 0,
63, 63, 26, 0, 5, 63, 63, 34, 4, 37, 30, 91, 91, 35, 0, 14, 91, 91, 43, 17,
0, 0, 0, 3, 0, 63, 44, 48, 52, 56, 16, 46, 0, 11, 0, 11, 6, 52, 8, 7,
60 6, 91, 56, 62, 68, 74, 80, 82, 84
} ; } ;
static yyconst flex_int16_t yy_def[32] = static yyconst flex_int16_t yy_def[40] =
{ 0, { 0,
26, 1, 27, 27, 26, 28, 26, 26, 26, 29, 32, 1, 33, 33, 32, 34, 32, 32, 32, 35,
26, 26, 26, 30, 31, 26, 26, 31, 28, 28, 34, 32, 32, 11, 36, 37, 32, 32, 37, 11,
29, 13, 19, 31, 18, 0, 26, 26, 26, 26, 11, 34, 35, 38, 14, 11, 37, 37, 39, 38,
26 39, 0, 32, 32, 32, 32, 32, 32, 32
} ; } ;
static yyconst flex_int16_t yy_nxt[74] = static yyconst flex_int16_t yy_nxt[103] =
{ 0, { 0,
6, 7, 8, 9, 10, 11, 12, 6, 13, 14, 6, 7, 8, 9, 10, 11, 12, 13, 6, 14,
16, 17, 25, 20, 25, 20, 26, 18, 16, 17, 15, 17, 18, 20, 26, 20, 28, 32, 26, 19,
26, 26, 26, 26, 26, 18, 19, 26, 26, 19, 17, 18, 29, 32, 28, 32, 32, 32, 19, 21,
26, 26, 26, 22, 22, 20, 24, 24, 19, 26, 32, 32, 32, 32, 22, 21, 24, 32, 32, 32,
26, 19, 19, 19, 15, 15, 15, 15, 19, 26, 22, 32, 32, 25, 25, 27, 27, 20, 32, 32,
26, 19, 21, 21, 26, 21, 23, 23, 26, 23, 20, 32, 20, 20, 27, 27, 16, 16, 16, 16,
24, 24, 5, 26, 26, 26, 26, 26, 26, 26, 16, 16, 20, 32, 32, 20, 32, 20, 23, 23,
26, 26, 26 32, 23, 23, 23, 26, 26, 32, 26, 26, 26,
27, 27, 32, 32, 27, 27, 30, 30, 31, 31,
5, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32
} ; } ;
static yyconst flex_int16_t yy_chk[74] = static yyconst flex_int16_t yy_chk[103] =
{ 0, { 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
3, 3, 24, 19, 15, 6, 5, 3, 4, 4, 1, 3, 3, 31, 30, 29, 27, 26, 24, 3,
0, 0, 0, 0, 0, 4, 13, 0, 0, 13, 4, 4, 21, 20, 16, 5, 0, 0, 4, 6,
0, 0, 0, 13, 13, 13, 18, 18, 20, 0, 0, 0, 0, 0, 6, 11, 11, 0, 0, 0,
0, 20, 20, 20, 27, 27, 27, 27, 28, 0, 11, 14, 0, 14, 14, 19, 19, 22, 0, 0,
0, 28, 29, 29, 0, 29, 30, 30, 0, 30, 22, 0, 22, 22, 28, 28, 33, 33, 33, 33,
31, 31, 26, 26, 26, 26, 26, 26, 26, 26, 33, 33, 34, 0, 0, 34, 0, 34, 35, 35,
26, 26, 26 0, 35, 35, 35, 36, 36, 0, 36, 36, 36,
37, 37, 0, 0, 37, 37, 38, 38, 39, 39,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32
} ; } ;
/* Table of booleans, true if rule could match eol. */ /* Table of booleans, true if rule could match eol. */
@ -549,7 +559,7 @@ static void cmListFileLexerDestroy(cmListFileLexer* lexer);
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
#line 555 "cmListFileLexer.c" #line 565 "cmListFileLexer.c"
#define INITIAL 0 #define INITIAL 0
#define STRING 1 #define STRING 1
@ -763,10 +773,10 @@ YY_DECL
register int yy_act; register int yy_act;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
#line 97 "cmListFileLexer.in.l" #line 99 "cmListFileLexer.in.l"
#line 774 "cmListFileLexer.c" #line 784 "cmListFileLexer.c"
if ( yyg->yy_init ) if ( yyg->yy_init )
{ {
@ -819,13 +829,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 27 ) if ( yy_current_state >= 33 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp; ++yy_cp;
} }
while ( yy_base[yy_current_state] != 63 ); while ( yy_base[yy_current_state] != 91 );
yy_find_action: yy_find_action:
yy_act = yy_accept[yy_current_state]; yy_act = yy_accept[yy_current_state];
@ -864,7 +874,7 @@ do_action: /* This label is used only to access EOF actions. */
case 1: case 1:
/* rule 1 can match eol */ /* rule 1 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 99 "cmListFileLexer.in.l" #line 101 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_Newline; lexer->token.type = cmListFileLexer_Token_Newline;
cmListFileLexerSetToken(lexer, yytext, yyleng); cmListFileLexerSetToken(lexer, yytext, yyleng);
@ -874,14 +884,14 @@ YY_RULE_SETUP
} }
case 2: case 2:
YY_RULE_SETUP YY_RULE_SETUP
#line 107 "cmListFileLexer.in.l" #line 109 "cmListFileLexer.in.l"
{ {
lexer->column += yyleng; lexer->column += yyleng;
} }
YY_BREAK YY_BREAK
case 3: case 3:
YY_RULE_SETUP YY_RULE_SETUP
#line 111 "cmListFileLexer.in.l" #line 113 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_ParenLeft; lexer->token.type = cmListFileLexer_Token_ParenLeft;
cmListFileLexerSetToken(lexer, yytext, yyleng); cmListFileLexerSetToken(lexer, yytext, yyleng);
@ -890,7 +900,7 @@ YY_RULE_SETUP
} }
case 4: case 4:
YY_RULE_SETUP YY_RULE_SETUP
#line 118 "cmListFileLexer.in.l" #line 120 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_ParenRight; lexer->token.type = cmListFileLexer_Token_ParenRight;
cmListFileLexerSetToken(lexer, yytext, yyleng); cmListFileLexerSetToken(lexer, yytext, yyleng);
@ -899,7 +909,7 @@ YY_RULE_SETUP
} }
case 5: case 5:
YY_RULE_SETUP YY_RULE_SETUP
#line 125 "cmListFileLexer.in.l" #line 127 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_Identifier; lexer->token.type = cmListFileLexer_Token_Identifier;
cmListFileLexerSetToken(lexer, yytext, yyleng); cmListFileLexerSetToken(lexer, yytext, yyleng);
@ -908,7 +918,7 @@ YY_RULE_SETUP
} }
case 6: case 6:
YY_RULE_SETUP YY_RULE_SETUP
#line 132 "cmListFileLexer.in.l" #line 134 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted; lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
cmListFileLexerSetToken(lexer, yytext, yyleng); cmListFileLexerSetToken(lexer, yytext, yyleng);
@ -917,7 +927,7 @@ YY_RULE_SETUP
} }
case 7: case 7:
YY_RULE_SETUP YY_RULE_SETUP
#line 139 "cmListFileLexer.in.l" #line 141 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_ArgumentQuoted; lexer->token.type = cmListFileLexer_Token_ArgumentQuoted;
cmListFileLexerSetToken(lexer, "", 0); cmListFileLexerSetToken(lexer, "", 0);
@ -928,7 +938,7 @@ YY_RULE_SETUP
case 8: case 8:
/* rule 8 can match eol */ /* rule 8 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 146 "cmListFileLexer.in.l" #line 148 "cmListFileLexer.in.l"
{ {
cmListFileLexerAppend(lexer, yytext, yyleng); cmListFileLexerAppend(lexer, yytext, yyleng);
lexer->column += yyleng; lexer->column += yyleng;
@ -937,7 +947,7 @@ YY_RULE_SETUP
case 9: case 9:
/* rule 9 can match eol */ /* rule 9 can match eol */
YY_RULE_SETUP YY_RULE_SETUP
#line 151 "cmListFileLexer.in.l" #line 153 "cmListFileLexer.in.l"
{ {
cmListFileLexerAppend(lexer, yytext, yyleng); cmListFileLexerAppend(lexer, yytext, yyleng);
++lexer->line; ++lexer->line;
@ -946,7 +956,7 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 10: case 10:
YY_RULE_SETUP YY_RULE_SETUP
#line 157 "cmListFileLexer.in.l" #line 159 "cmListFileLexer.in.l"
{ {
lexer->column += yyleng; lexer->column += yyleng;
BEGIN(INITIAL); BEGIN(INITIAL);
@ -954,14 +964,14 @@ YY_RULE_SETUP
} }
case 11: case 11:
YY_RULE_SETUP YY_RULE_SETUP
#line 163 "cmListFileLexer.in.l" #line 165 "cmListFileLexer.in.l"
{ {
cmListFileLexerAppend(lexer, yytext, yyleng); cmListFileLexerAppend(lexer, yytext, yyleng);
lexer->column += yyleng; lexer->column += yyleng;
} }
YY_BREAK YY_BREAK
case YY_STATE_EOF(STRING): case YY_STATE_EOF(STRING):
#line 168 "cmListFileLexer.in.l" #line 170 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_BadString; lexer->token.type = cmListFileLexer_Token_BadString;
BEGIN(INITIAL); BEGIN(INITIAL);
@ -969,14 +979,14 @@ case YY_STATE_EOF(STRING):
} }
case 12: case 12:
YY_RULE_SETUP YY_RULE_SETUP
#line 174 "cmListFileLexer.in.l" #line 176 "cmListFileLexer.in.l"
{ {
lexer->column += yyleng; lexer->column += yyleng;
} }
YY_BREAK YY_BREAK
case 13: case 13:
YY_RULE_SETUP YY_RULE_SETUP
#line 178 "cmListFileLexer.in.l" #line 180 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_BadCharacter; lexer->token.type = cmListFileLexer_Token_BadCharacter;
cmListFileLexerSetToken(lexer, yytext, yyleng); cmListFileLexerSetToken(lexer, yytext, yyleng);
@ -984,7 +994,7 @@ YY_RULE_SETUP
return 1; return 1;
} }
case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(INITIAL):
#line 185 "cmListFileLexer.in.l" #line 187 "cmListFileLexer.in.l"
{ {
lexer->token.type = cmListFileLexer_Token_None; lexer->token.type = cmListFileLexer_Token_None;
cmListFileLexerSetToken(lexer, 0, 0); cmListFileLexerSetToken(lexer, 0, 0);
@ -992,10 +1002,10 @@ case YY_STATE_EOF(INITIAL):
} }
case 14: case 14:
YY_RULE_SETUP YY_RULE_SETUP
#line 191 "cmListFileLexer.in.l" #line 193 "cmListFileLexer.in.l"
ECHO; ECHO;
YY_BREAK YY_BREAK
#line 1012 "cmListFileLexer.c" #line 1022 "cmListFileLexer.c"
case YY_END_OF_BUFFER: case YY_END_OF_BUFFER:
{ {
@ -1279,7 +1289,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 27 ) if ( yy_current_state >= 33 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@ -1308,11 +1318,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{ {
yy_current_state = (int) yy_def[yy_current_state]; yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 27 ) if ( yy_current_state >= 33 )
yy_c = yy_meta[(unsigned int) yy_c]; yy_c = yy_meta[(unsigned int) yy_c];
} }
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
yy_is_jam = (yy_current_state == 26); yy_is_jam = (yy_current_state == 32);
return yy_is_jam ? 0 : yy_current_state; return yy_is_jam ? 0 : yy_current_state;
} }
@ -2048,6 +2058,7 @@ void *yyalloc (yy_size_t size , yyscan_t yyscanner)
void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
{ {
(void)yyscanner;
/* The cast to (char *) in the following accommodates both /* The cast to (char *) in the following accommodates both
* implementations that use char* generic pointers, and those * implementations that use char* generic pointers, and those
* that use void* generic pointers. It works with the latter * that use void* generic pointers. It works with the latter
@ -2055,7 +2066,6 @@ void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner)
* any pointer type to void*, and deal with argument conversions * any pointer type to void*, and deal with argument conversions
* as though doing an assignment. * as though doing an assignment.
*/ */
(void)yyscanner;
return (void *) realloc( (char *) ptr, size ); return (void *) realloc( (char *) ptr, size );
} }
@ -2079,7 +2089,7 @@ void yyfree (void * ptr , yyscan_t yyscanner)
#undef YY_DECL_IS_OURS #undef YY_DECL_IS_OURS
#undef YY_DECL #undef YY_DECL
#endif #endif
#line 191 "cmListFileLexer.in.l" #line 193 "cmListFileLexer.in.l"

View File

@ -94,6 +94,8 @@ static void cmListFileLexerDestroy(cmListFileLexer* lexer);
%pointer %pointer
%x STRING %x STRING
MAKEVAR \$\([A-Za-z0-9_]*\)
%% %%
\n { \n {
@ -129,7 +131,7 @@ static void cmListFileLexerDestroy(cmListFileLexer* lexer);
return 1; return 1;
} }
([^ \t\r\n\(\)#\\\"]|\\.)([^ \t\r\n\(\)#\\]|\\.)* { ({MAKEVAR}|[^ \t\r\n\(\)#\\\"]|\\.)({MAKEVAR}|[^ \t\r\n\(\)#\\]|\\.)* {
lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted; lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
cmListFileLexerSetToken(lexer, yytext, yyleng); cmListFileLexerSetToken(lexer, yytext, yyleng);
lexer->column += yyleng; lexer->column += yyleng;

View File

@ -27,6 +27,14 @@ MESSAGE("Output: [${var}]")
SET(var \\ \" \ \t \n \r \# \( \) \0) SET(var \\ \" \ \t \n \r \# \( \) \0)
MESSAGE("Output: [${var}]") MESSAGE("Output: [${var}]")
# Make-style unquoted argument test
SET(var $(VAR1)$(VAR2)/$(VAR3))
MESSAGE("Output: [${var}]")
STRING(COMPARE EQUAL "${var}" "$(VAR1)$(VAR2)/$(VAR3)" result)
IF(NOT result)
MESSAGE(SEND_ERROR "Unquoted $(VAR) syntax is broken.")
ENDIF(NOT result)
# Make directories test # Make directories test
FILE(MAKE_DIRECTORY FILE(MAKE_DIRECTORY
"${CMAKE_CURRENT_BINARY_DIR}/Includes" "${CMAKE_CURRENT_BINARY_DIR}/Includes"