Mesa (master): glsl: Handle continuation characters in preprocessor.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Thu Jun 11 15:35:49 UTC 2009


Module: Mesa
Branch: master
Commit: 9225b67383ee5c5b511b84838fd248b85403bd92
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9225b67383ee5c5b511b84838fd248b85403bd92

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Jun 10 12:21:56 2009 -0600

glsl: Handle continuation characters in preprocessor.

(cherry picked from master, commit cc22620e4b11425997f3bc1fc70f4c88cec22d2e)

---

 src/mesa/shader/slang/slang_preprocess.c |   68 +++++++++++++++++++++++++++++-
 1 files changed, 67 insertions(+), 1 deletions(-)

diff --git a/src/mesa/shader/slang/slang_preprocess.c b/src/mesa/shader/slang/slang_preprocess.c
index f73400d..749bb8c 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,9 +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", slang_string_cstr(output));
+      _mesa_printf("----------------------\n");
+   }
+
    return success;
 }
 




More information about the mesa-commit mailing list