summaryrefslogtreecommitdiffstats
path: root/src/mesa/shader/slang/slang_preprocess.c
diff options
context:
space:
mode:
authorMichal Krol <[email protected]>2009-06-10 19:45:00 +0200
committerMichal Krol <[email protected]>2009-06-10 20:00:15 +0200
commitcc22620e4b11425997f3bc1fc70f4c88cec22d2e (patch)
treeca933d6d87411d071f4a328c02ba1a34554237eb /src/mesa/shader/slang/slang_preprocess.c
parentaebc08b5ccc6ac2a7c6673e93c63b097c7734e6d (diff)
glsl: Handle continuation characters in preprocessor.
Diffstat (limited to 'src/mesa/shader/slang/slang_preprocess.c')
-rw-r--r--src/mesa/shader/slang/slang_preprocess.c65
1 files changed, 63 insertions, 2 deletions
diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c
index 15cd1ece7da..749bb8c0f64 100644
--- a/src/mesa/shader/slang/slang_preprocess.c
+++ b/src/mesa/shader/slang/slang_preprocess.c
@@ -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);
+
+ slang_string_init(&without_backslashes);
+ success = _slang_preprocess_backslashes(&without_backslashes, input);
+
+ if (0) {
+ _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", output->data);
+ _mesa_printf("%s", slang_string_cstr(output));
_mesa_printf("----------------------\n");
}
+
return success;
}