glsl: Handle continuation characters in preprocessor.

This commit is contained in:
Michal Krol 2009-06-10 19:45:00 +02:00
parent aebc08b5cc
commit cc22620e4b

View file

@ -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;
}