Mesa (glsl-pp-rework-1): glsl: Allow for multiple version statements.

Michał Król michal at kemper.freedesktop.org
Mon Jun 15 07:50:55 UTC 2009


Module: Mesa
Branch: glsl-pp-rework-1
Commit: 62b378bd502eafb762cd9ee5b0285f2347031ac3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=62b378bd502eafb762cd9ee5b0285f2347031ac3

Author: Michal Krol <michal at vmware.com>
Date:   Mon Jun 15 09:50:48 2009 +0200

glsl: Allow for multiple version statements.

---

 src/glsl/pp/sl_pp_version.c |  144 +++++++++++++++++++++++--------------------
 1 files changed, 76 insertions(+), 68 deletions(-)

diff --git a/src/glsl/pp/sl_pp_version.c b/src/glsl/pp/sl_pp_version.c
index f4b4b82..e743a09 100644
--- a/src/glsl/pp/sl_pp_version.c
+++ b/src/glsl/pp/sl_pp_version.c
@@ -59,90 +59,98 @@ sl_pp_version(const struct sl_pp_token_info *input,
               unsigned int *tokens_eaten)
 {
    unsigned int i = 0;
-   int found_hash = 0;
-   int found_version = 0;
-   int found_number = 0;
 
    /* Default values if `#version' is not present. */
    *version = 110;
    *tokens_eaten = 0;
 
-   /* Skip whitespace and newlines and seek for hash. */
-   while (!found_hash) {
-      switch (input[i].token) {
-      case SL_PP_WHITESPACE:
-      case SL_PP_NEWLINE:
-         i++;
-         break;
-
-      case SL_PP_HASH:
-         i++;
-         found_hash = 1;
-         break;
-
-      default:
-         return 0;
+   /* There can be multiple `#version' directives present.
+    * Accept the value of the last one.
+    */
+   for (;;) {
+      int found_hash = 0;
+      int found_version = 0;
+      int found_number = 0;
+      int found_end = 0;
+
+      /* Skip whitespace and newlines and seek for hash. */
+      while (!found_hash) {
+         switch (input[i].token) {
+         case SL_PP_WHITESPACE:
+         case SL_PP_NEWLINE:
+            i++;
+            break;
+
+         case SL_PP_HASH:
+            i++;
+            found_hash = 1;
+            break;
+
+         default:
+            return 0;
+         }
       }
-   }
 
-   /* Skip whitespace and seek for `version'. */
-   while (!found_version) {
-      switch (input[i].token) {
-      case SL_PP_WHITESPACE:
-         i++;
-         break;
-
-      case SL_PP_IDENTIFIER:
-         if (strcmp(input[i].data.identifier, "version")) {
+      /* Skip whitespace and seek for `version'. */
+      while (!found_version) {
+         switch (input[i].token) {
+         case SL_PP_WHITESPACE:
+            i++;
+            break;
+
+         case SL_PP_IDENTIFIER:
+            if (strcmp(input[i].data.identifier, "version")) {
+               return 0;
+            }
+            i++;
+            found_version = 1;
+            break;
+
+         default:
             return 0;
          }
-         i++;
-         found_version = 1;
-         break;
-
-      default:
-         return 0;
       }
-   }
-
-   /* Skip whitespace and seek for version number. */
-   while (!found_number) {
-      switch (input[i].token) {
-      case SL_PP_WHITESPACE:
-         i++;
-         break;
 
-      case SL_PP_NUMBER:
-         if (_parse_integer(input[i].data.number, version)) {
+      /* Skip whitespace and seek for version number. */
+      while (!found_number) {
+         switch (input[i].token) {
+         case SL_PP_WHITESPACE:
+            i++;
+            break;
+
+         case SL_PP_NUMBER:
+            if (_parse_integer(input[i].data.number, version)) {
+               /* Expected version number. */
+               return -1;
+            }
+            i++;
+            found_number = 1;
+            break;
+
+         default:
             /* Expected version number. */
             return -1;
          }
-         i++;
-         found_number = 1;
-         break;
-
-      default:
-         /* Expected version number. */
-         return -1;
       }
-   }
 
-   /* Skip whitespace and seek for either newline or eof. */
-   for (;;) {
-      switch (input[i].token) {
-      case SL_PP_WHITESPACE:
-         i++;
-         break;
-
-      case SL_PP_NEWLINE:
-      case SL_PP_EOF:
-         i++;
-         *tokens_eaten = i;
-         return 0;
-
-      default:
-         /* Expected end of line. */
-         return -1;
+      /* Skip whitespace and seek for either newline or eof. */
+      while (!found_end) {
+         switch (input[i].token) {
+         case SL_PP_WHITESPACE:
+            i++;
+            break;
+
+         case SL_PP_NEWLINE:
+         case SL_PP_EOF:
+            i++;
+            *tokens_eaten = i;
+            found_end = 1;
+            break;
+
+         default:
+            /* Expected end of line. */
+            return -1;
+         }
       }
    }
 




More information about the mesa-commit mailing list