summaryrefslogtreecommitdiffstats
path: root/src/glsl/glcpp
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2014-06-26 14:04:01 -0700
committerCarl Worth <cworth@cworth.org>2014-07-29 15:11:51 -0700
commit4757c74c840460f387a466894baf1c45624467c7 (patch)
treeba59873fa2ee051073f21a4e89c6604bfc7ce22b /src/glsl/glcpp
parent12d583b21a7e538d7fa44c3129e95b407d03c01a (diff)
downloadexternal_mesa3d-4757c74c840460f387a466894baf1c45624467c7.zip
external_mesa3d-4757c74c840460f387a466894baf1c45624467c7.tar.gz
external_mesa3d-4757c74c840460f387a466894baf1c45624467c7.tar.bz2
glsl/glcpp: Treat carriage return as equivalent to line feed.
Previously, the '\r' character was not explicitly matched by any lexer rule. This means that glcpp would have been using the default flex rule to match '\r' characters, (where they would have been printed to stdout rather than actually correctly handled). With this commit, we treat '\r' as equivalent to '\n'. This is clearly an improvement the bogus printing to stdout. The resulting behavior is compliant with the GLSL specification for any source file that uses exclusively '\r' or '\n' to separate lines. For shaders that use a multiple-character line separator, (such as "\r\n"), glcpp won't be precisely compliant with the specification, (treating these as two newline characters rather than one), but this should not introduce any semantic changes to the shader programs. Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Diffstat (limited to 'src/glsl/glcpp')
-rw-r--r--src/glsl/glcpp/glcpp-lex.l17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
index d0894c1..cb5ee99 100644
--- a/src/glsl/glcpp/glcpp-lex.l
+++ b/src/glsl/glcpp/glcpp-lex.l
@@ -165,7 +165,6 @@ glcpp_lex_update_state_per_token (glcpp_parser_t *parser, int token)
SPACE [[:space:]]
NONSPACE [^[:space:]]
-NEWLINE [\n]
HSPACE [ \t]
HASH #
IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
@@ -246,15 +245,15 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
}
/* Single-line comments */
-"//"[^\n]* {
+"//"[^\r\n]* {
}
/* Multi-line comments */
-<DEFINE,HASH,INITIAL>"/*" { yy_push_state(COMMENT, yyscanner); }
-<COMMENT>[^*\n]*
-<COMMENT>[^*\n]*\n { yylineno++; yycolumn = 0; parser->commented_newlines++; }
-<COMMENT>"*"+[^*/\n]*
-<COMMENT>"*"+[^*/\n]*\n { yylineno++; yycolumn = 0; parser->commented_newlines++; }
+<DEFINE,HASH,INITIAL>"/*" { yy_push_state(COMMENT, yyscanner); }
+<COMMENT>[^*\r\n]*
+<COMMENT>[^*\r\n]*[\r\n] { yylineno++; yycolumn = 0; parser->commented_newlines++; }
+<COMMENT>"*"+[^*/\r\n]*
+<COMMENT>"*"+[^*/\r\n]*[\r\n] { yylineno++; yycolumn = 0; parser->commented_newlines++; }
<COMMENT>"*"+"/" {
yy_pop_state(yyscanner);
/* In the <HASH> start condition, we don't want any SPACE token. */
@@ -285,7 +284,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
/* glcpp doesn't handle #extension, #version, or #pragma directives.
* Simply pass them through to the main compiler's lexer/parser. */
-<HASH>(extension|pragma)[^\n]* {
+<HASH>(extension|pragma)[^\r\n]* {
BEGIN INITIAL;
yylineno++;
yycolumn = 0;
@@ -513,7 +512,7 @@ HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
/* We preserve all newlines, even between #if 0..#endif, so no
skipping.. */
-\n {
+[\r\n] {
if (parser->commented_newlines) {
BEGIN NEWLINE_CATCHUP;
}