summaryrefslogtreecommitdiffstats
path: root/Source/cmListFileLexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmListFileLexer.c')
-rw-r--r--Source/cmListFileLexer.c82
1 files changed, 57 insertions, 25 deletions
diff --git a/Source/cmListFileLexer.c b/Source/cmListFileLexer.c
index 394bd17..cbd2b5d 100644
--- a/Source/cmListFileLexer.c
+++ b/Source/cmListFileLexer.c
@@ -542,6 +542,7 @@ struct cmListFileLexer_s
int column;
int size;
FILE* file;
+ size_t cr;
char* string_buffer;
char* string_position;
int string_left;
@@ -564,7 +565,7 @@ static void cmListFileLexerDestroy(cmListFileLexer* lexer);
/*--------------------------------------------------------------------------*/
-#line 570 "cmListFileLexer.c"
+#line 571 "cmListFileLexer.c"
#define INITIAL 0
#define STRING 1
@@ -793,10 +794,10 @@ YY_DECL
int yy_act;
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-#line 82 "cmListFileLexer.in.l"
+#line 83 "cmListFileLexer.in.l"
-#line 804 "cmListFileLexer.c"
+#line 805 "cmListFileLexer.c"
if ( !yyg->yy_init )
{
@@ -894,7 +895,7 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
-#line 84 "cmListFileLexer.in.l"
+#line 85 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_Newline;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -904,14 +905,14 @@ YY_RULE_SETUP
}
case 2:
YY_RULE_SETUP
-#line 92 "cmListFileLexer.in.l"
+#line 93 "cmListFileLexer.in.l"
{
lexer->column += yyleng;
}
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 96 "cmListFileLexer.in.l"
+#line 97 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_ParenLeft;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -920,7 +921,7 @@ YY_RULE_SETUP
}
case 4:
YY_RULE_SETUP
-#line 103 "cmListFileLexer.in.l"
+#line 104 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_ParenRight;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -929,7 +930,7 @@ YY_RULE_SETUP
}
case 5:
YY_RULE_SETUP
-#line 110 "cmListFileLexer.in.l"
+#line 111 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_Identifier;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -938,7 +939,7 @@ YY_RULE_SETUP
}
case 6:
YY_RULE_SETUP
-#line 117 "cmListFileLexer.in.l"
+#line 118 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -947,7 +948,7 @@ YY_RULE_SETUP
}
case 7:
YY_RULE_SETUP
-#line 124 "cmListFileLexer.in.l"
+#line 125 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_ArgumentUnquoted;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -956,7 +957,7 @@ YY_RULE_SETUP
}
case 8:
YY_RULE_SETUP
-#line 131 "cmListFileLexer.in.l"
+#line 132 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_ArgumentQuoted;
cmListFileLexerSetToken(lexer, "", 0);
@@ -966,7 +967,7 @@ YY_RULE_SETUP
YY_BREAK
case 9:
YY_RULE_SETUP
-#line 138 "cmListFileLexer.in.l"
+#line 139 "cmListFileLexer.in.l"
{
cmListFileLexerAppend(lexer, yytext, yyleng);
lexer->column += yyleng;
@@ -975,7 +976,7 @@ YY_RULE_SETUP
case 10:
/* rule 10 can match eol */
YY_RULE_SETUP
-#line 143 "cmListFileLexer.in.l"
+#line 144 "cmListFileLexer.in.l"
{
cmListFileLexerAppend(lexer, yytext, yyleng);
++lexer->line;
@@ -985,7 +986,7 @@ YY_RULE_SETUP
case 11:
/* rule 11 can match eol */
YY_RULE_SETUP
-#line 149 "cmListFileLexer.in.l"
+#line 150 "cmListFileLexer.in.l"
{
cmListFileLexerAppend(lexer, yytext, yyleng);
++lexer->line;
@@ -994,7 +995,7 @@ YY_RULE_SETUP
YY_BREAK
case 12:
YY_RULE_SETUP
-#line 155 "cmListFileLexer.in.l"
+#line 156 "cmListFileLexer.in.l"
{
lexer->column += yyleng;
BEGIN(INITIAL);
@@ -1002,14 +1003,14 @@ YY_RULE_SETUP
}
case 13:
YY_RULE_SETUP
-#line 161 "cmListFileLexer.in.l"
+#line 162 "cmListFileLexer.in.l"
{
cmListFileLexerAppend(lexer, yytext, yyleng);
lexer->column += yyleng;
}
YY_BREAK
case YY_STATE_EOF(STRING):
-#line 166 "cmListFileLexer.in.l"
+#line 167 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_BadString;
BEGIN(INITIAL);
@@ -1017,7 +1018,7 @@ case YY_STATE_EOF(STRING):
}
case 14:
YY_RULE_SETUP
-#line 172 "cmListFileLexer.in.l"
+#line 173 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_Space;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -1026,7 +1027,7 @@ YY_RULE_SETUP
}
case 15:
YY_RULE_SETUP
-#line 179 "cmListFileLexer.in.l"
+#line 180 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_BadCharacter;
cmListFileLexerSetToken(lexer, yytext, yyleng);
@@ -1034,7 +1035,7 @@ YY_RULE_SETUP
return 1;
}
case YY_STATE_EOF(INITIAL):
-#line 186 "cmListFileLexer.in.l"
+#line 187 "cmListFileLexer.in.l"
{
lexer->token.type = cmListFileLexer_Token_None;
cmListFileLexerSetToken(lexer, 0, 0);
@@ -1042,10 +1043,10 @@ case YY_STATE_EOF(INITIAL):
}
case 16:
YY_RULE_SETUP
-#line 192 "cmListFileLexer.in.l"
+#line 193 "cmListFileLexer.in.l"
ECHO;
YY_BREAK
-#line 1064 "cmListFileLexer.c"
+#line 1065 "cmListFileLexer.c"
case YY_END_OF_BUFFER:
{
@@ -2166,7 +2167,7 @@ void cmListFileLexer_yyfree (void * ptr , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables"
-#line 192 "cmListFileLexer.in.l"
+#line 193 "cmListFileLexer.in.l"
@@ -2243,7 +2244,38 @@ static int cmListFileLexerInput(cmListFileLexer* lexer, char* buffer,
{
if(lexer->file)
{
- return (int)fread(buffer, 1, bufferSize, lexer->file);
+ /* Convert CRLF -> LF explicitly. The C FILE "t"ext mode
+ does not convert newlines on all platforms. Move any
+ trailing CR to the start of the buffer for the next read. */
+ size_t cr = lexer->cr;
+ size_t n;
+ buffer[0] = '\r';
+ n = fread(buffer+cr, 1, bufferSize-cr, lexer->file);
+ if(n)
+ {
+ char* o = buffer;
+ const char* i = buffer;
+ const char* e;
+ n += cr;
+ cr = (buffer[n-1] == '\r')? 1:0;
+ e = buffer + n - cr;
+ while(i != e)
+ {
+ if(i[0] == '\r' && i[1] == '\n')
+ {
+ ++i;
+ }
+ *o++ = *i++;
+ }
+ n = o - buffer;
+ }
+ else
+ {
+ n = cr;
+ cr = 0;
+ }
+ lexer->cr = cr;
+ return n;
}
else if(lexer->string_left)
{
@@ -2360,7 +2392,7 @@ int cmListFileLexer_SetFileName(cmListFileLexer* lexer, const char* name,
cmListFileLexerDestroy(lexer);
if(name)
{
- lexer->file = fopen(name, "r");
+ lexer->file = fopen(name, "rb");
if(lexer->file)
{
if(bom)