Support line-continuation (backslash before newline) for tokens and one-line comments in the preprocessor.

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@22168 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2013-06-25 21:09:47 +00:00
parent e5f80b8054
commit d3f85891a7
4 changed files with 43 additions and 9 deletions

View File

@ -13,7 +13,7 @@ still in a comment
// a different comment
#version 430 core
varying vec4 v;
in vec4 v;
void main() {}

View File

@ -0,0 +1,14 @@
#version 300 es
// this file cont\
ains no errors
float f\
oo; // same as 'float foo;'
#define MAIN void main() \
{ \
gl_Position = vec4(foo); \
}
MAIN

View File

@ -42,3 +42,4 @@ tokenLength.vert
400.frag
420.vert
430scope.vert
lineContinuation.vert

View File

@ -382,7 +382,18 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
case 'u': case 'v': case 'w': case 'x': case 'y':
case 'z':
do {
if (len < MAX_SYMBOL_NAME_LEN) {
if (ch == '\\') {
// escaped character
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
if (ch == '\r' || ch == '\n') {
int nextch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
if (ch == '\r' && nextch == '\n')
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
else
ch = nextch;
} else
ShPpErrorToInfoLog("can only escape newlines");
} else if (len < MAX_SYMBOL_NAME_LEN) {
symbol_name[len] = ch;
len++;
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
@ -393,7 +404,8 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
} while ((ch >= 'a' && ch <= 'z') ||
(ch >= 'A' && ch <= 'Z') ||
(ch >= '0' && ch <= '9') ||
ch == '_');
ch == '_' ||
ch == '\\');
if (len > MAX_SYMBOL_NAME_LEN)
len = MAX_SYMBOL_NAME_LEN;
symbol_name[len] = '\0';
@ -664,18 +676,25 @@ static int byte_scan(InputSrc *in, yystypepp * yylvalpp)
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
return lFloatConst(yylvalpp->symbol_name, 0, '.', yylvalpp);
} else {
if (ch == '.') {
return -1; // Special EOF hack
} else {
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
return '.';
}
cpp->currentInput->ungetch(cpp->currentInput, ch, yylvalpp);
return '.';
}
case '/':
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
if (ch == '/') {
do {
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
if (ch == '\\') {
// allow an escaped newline, otherwise escapes in comments are meaningless
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
if (ch == '\r' || ch == '\n') {
int nextch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
if (ch == '\r' && nextch == '\n')
ch = cpp->currentInput->getch(cpp->currentInput, yylvalpp);
else
ch = nextch;
}
}
} while (ch != '\n' && ch != EOF);
if (ch == EOF)
return -1;