mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-02 20:58:04 +02:00
glsl: Handle continuation characters in preprocessor.
This commit is contained in:
parent
aebc08b5cc
commit
cc22620e4b
1 changed files with 66 additions and 5 deletions
|
|
@ -1300,6 +1300,44 @@ error:
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Remove the continuation characters from the input string.
|
||||
* This is the very first step in preprocessing and is effective
|
||||
* even inside comment blocks.
|
||||
* If there is a whitespace between a backslash and a newline,
|
||||
* this is not considered as a line continuation.
|
||||
*/
|
||||
GLboolean
|
||||
_slang_preprocess_backslashes(slang_string *output,
|
||||
const char *input)
|
||||
{
|
||||
while (*input) {
|
||||
if (input[0] == '\\') {
|
||||
/* If a newline follows, eat the backslash and the newline. */
|
||||
if (input[1] == '\r') {
|
||||
if (input[2] == '\n') {
|
||||
input += 3;
|
||||
} else {
|
||||
input += 2;
|
||||
}
|
||||
} else if (input[1] == '\n') {
|
||||
if (input[2] == '\r') {
|
||||
input += 3;
|
||||
} else {
|
||||
input += 2;
|
||||
}
|
||||
} else {
|
||||
/* Leave the backslash alone. */
|
||||
slang_string_pushc(output, *input++);
|
||||
}
|
||||
} else {
|
||||
slang_string_pushc(output, *input++);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Run preprocessor on source code.
|
||||
* \param extensions indicates which GL extensions are enabled
|
||||
|
|
@ -1319,6 +1357,7 @@ _slang_preprocess_directives(slang_string *output,
|
|||
{
|
||||
grammar pid, eid;
|
||||
GLboolean success;
|
||||
slang_string without_backslashes;
|
||||
|
||||
pid = grammar_load_from_text ((const byte *) (slang_pp_directives_syn));
|
||||
if (pid == 0) {
|
||||
|
|
@ -1331,14 +1370,36 @@ _slang_preprocess_directives(slang_string *output,
|
|||
grammar_destroy (pid);
|
||||
return GL_FALSE;
|
||||
}
|
||||
success = preprocess_source (output, input, pid, eid, elog, extensions, pragmas);
|
||||
grammar_destroy (eid);
|
||||
grammar_destroy (pid);
|
||||
|
||||
slang_string_init(&without_backslashes);
|
||||
success = _slang_preprocess_backslashes(&without_backslashes, input);
|
||||
|
||||
if (0) {
|
||||
_mesa_printf("Post-processed shader:\n");
|
||||
_mesa_printf("%s", output->data);
|
||||
_mesa_printf("Pre-processed shader:\n");
|
||||
_mesa_printf("%s", slang_string_cstr(&without_backslashes));
|
||||
_mesa_printf("----------------------\n");
|
||||
}
|
||||
|
||||
if (success) {
|
||||
success = preprocess_source(output,
|
||||
slang_string_cstr(&without_backslashes),
|
||||
pid,
|
||||
eid,
|
||||
elog,
|
||||
extensions,
|
||||
pragmas);
|
||||
}
|
||||
|
||||
slang_string_free(&without_backslashes);
|
||||
grammar_destroy (eid);
|
||||
grammar_destroy (pid);
|
||||
|
||||
if (0) {
|
||||
_mesa_printf("Post-processed shader:\n");
|
||||
_mesa_printf("%s", slang_string_cstr(output));
|
||||
_mesa_printf("----------------------\n");
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue