More GLSL preprocessor code:
authorMichal Krol <mjkrol@gmail.org>
Mon, 21 Aug 2006 09:25:11 +0000 (09:25 +0000)
committerMichal Krol <mjkrol@gmail.org>
Mon, 21 Aug 2006 09:25:11 +0000 (09:25 +0000)
Rename slang_version.syn to slang_pp_version.syn.
The #version directive understands version 120.
Cosmetic changes in version preprocessor.
Checks if requested version is supported by the compiler.

src/mesa/shader/slang/library/slang_pp_version.syn [new file with mode: 0644]
src/mesa/shader/slang/library/slang_pp_version_syn.h [new file with mode: 0644]
src/mesa/shader/slang/slang_compile.c
src/mesa/shader/slang/slang_preprocess.c
src/mesa/shader/slang/slang_preprocess.h

diff --git a/src/mesa/shader/slang/library/slang_pp_version.syn b/src/mesa/shader/slang/library/slang_pp_version.syn
new file mode 100644 (file)
index 0000000..f48f3dd
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  6.5
+ *
+ * Copyright (C) 2005-2006  Brian Paul   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file slang_version.syn
+ * slang #version directive syntax
+ * \author Michal Krol
+ */
+
+.syntax version_directive;
+
+version_directive
+       version_directive_1 .and .loop version_directive_2;
+version_directive_1
+       prior_optional_spaces .and optional_version_directive .and .true .emit $;
+version_directive_2
+       prior_optional_spaces .and version_directive_body .and .true .emit $;
+
+optional_version_directive
+       version_directive_body .or .true .emit 10 .emit 1;
+
+version_directive_body
+       '#' .and optional_space .and "version" .and space .and version_number .and optional_space .and
+       new_line;
+
+version_number
+       version_number_110 .or version_number_120;
+
+version_number_110
+       leading_zeroes .and "110" .emit 10 .emit 1;
+
+version_number_120
+   leading_zeroes .and "120" .emit 20 .emit 1;
+
+leading_zeroes
+       .loop zero;
+
+zero
+       '0';
+
+space
+    single_space .and .loop single_space;
+
+optional_space
+    .loop single_space;
+
+single_space
+    ' ' .or '\t';
+
+prior_optional_spaces
+       .loop prior_space;
+
+prior_space
+       c_style_comment_block .or cpp_style_comment_block .or space .or new_line;
+
+c_style_comment_block
+    '/' .and '*' .and c_style_comment_rest;
+
+c_style_comment_rest
+    .loop c_style_comment_char_no_star .and c_style_comment_rest_1;
+c_style_comment_rest_1
+    c_style_comment_end .or c_style_comment_rest_2;
+c_style_comment_rest_2
+    '*' .and c_style_comment_rest;
+
+c_style_comment_char_no_star
+    '\x2B'-'\xFF' .or '\x01'-'\x29';
+
+c_style_comment_end
+    '*' .and '/';
+
+cpp_style_comment_block
+    '/' .and '/' .and cpp_style_comment_block_1;
+cpp_style_comment_block_1
+    cpp_style_comment_block_2 .or cpp_style_comment_block_3;
+cpp_style_comment_block_2
+    .loop cpp_style_comment_char .and new_line;
+cpp_style_comment_block_3
+    .loop cpp_style_comment_char;
+
+cpp_style_comment_char
+    '\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
+
+new_line
+    cr_lf .or lf_cr .or '\n' .or '\r';
+
+cr_lf
+    '\r' .and '\n';
+
+lf_cr
+       '\n' .and '\r';
+
+.string __string_filter;
+
+__string_filter
+    .loop __identifier_char;
+
+__identifier_char
+    'a'-'z' .or 'A'-'Z' .or '_' .or '0'-'9';
+
diff --git a/src/mesa/shader/slang/library/slang_pp_version_syn.h b/src/mesa/shader/slang/library/slang_pp_version_syn.h
new file mode 100644 (file)
index 0000000..a75cf75
--- /dev/null
@@ -0,0 +1,69 @@
+
+/* DO NOT EDIT - THIS FILE IS AUTOMATICALLY GENERATED FROM THE .syn FILE */
+
+".syntax version_directive;\n"
+"version_directive\n"
+"      version_directive_1 .and .loop version_directive_2;\n"
+"version_directive_1\n"
+"      prior_optional_spaces .and optional_version_directive .and .true .emit $;\n"
+"version_directive_2\n"
+"      prior_optional_spaces .and version_directive_body .and .true .emit $;\n"
+"optional_version_directive\n"
+"      version_directive_body .or .true .emit 10 .emit 1;\n"
+"version_directive_body\n"
+"      '#' .and optional_space .and \"version\" .and space .and version_number .and optional_space .and\n"
+"      new_line;\n"
+"version_number\n"
+"      version_number_110 .or version_number_120;\n"
+"version_number_110\n"
+"      leading_zeroes .and \"110\" .emit 10 .emit 1;\n"
+"version_number_120\n"
+" leading_zeroes .and \"120\" .emit 20 .emit 1;\n"
+"leading_zeroes\n"
+"      .loop zero;\n"
+"zero\n"
+"      '0';\n"
+"space\n"
+" single_space .and .loop single_space;\n"
+"optional_space\n"
+" .loop single_space;\n"
+"single_space\n"
+" ' ' .or '\\t';\n"
+"prior_optional_spaces\n"
+"      .loop prior_space;\n"
+"prior_space\n"
+"      c_style_comment_block .or cpp_style_comment_block .or space .or new_line;\n"
+"c_style_comment_block\n"
+" '/' .and '*' .and c_style_comment_rest;\n"
+"c_style_comment_rest\n"
+" .loop c_style_comment_char_no_star .and c_style_comment_rest_1;\n"
+"c_style_comment_rest_1\n"
+" c_style_comment_end .or c_style_comment_rest_2;\n"
+"c_style_comment_rest_2\n"
+" '*' .and c_style_comment_rest;\n"
+"c_style_comment_char_no_star\n"
+" '\\x2B'-'\\xFF' .or '\\x01'-'\\x29';\n"
+"c_style_comment_end\n"
+" '*' .and '/';\n"
+"cpp_style_comment_block\n"
+" '/' .and '/' .and cpp_style_comment_block_1;\n"
+"cpp_style_comment_block_1\n"
+" cpp_style_comment_block_2 .or cpp_style_comment_block_3;\n"
+"cpp_style_comment_block_2\n"
+" .loop cpp_style_comment_char .and new_line;\n"
+"cpp_style_comment_block_3\n"
+" .loop cpp_style_comment_char;\n"
+"cpp_style_comment_char\n"
+" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"
+"new_line\n"
+" cr_lf .or lf_cr .or '\\n' .or '\\r';\n"
+"cr_lf\n"
+" '\\r' .and '\\n';\n"
+"lf_cr\n"
+"      '\\n' .and '\\r';\n"
+".string __string_filter;\n"
+"__string_filter\n"
+" .loop __identifier_char;\n"
+"__identifier_char\n"
+" 'a'-'z' .or 'A'-'Z' .or '_' .or '0'-'9';\n"
+""
index bcbb75618273b079aa028ee5012bfb338b2a9075..46bdf830f92b3e3dd3947591dbc68bdd38387518 100644 (file)
@@ -1925,6 +1925,11 @@ compile_with_grammar (grammar id, const char *source, slang_code_unit *unit, sla
    if (!_slang_preprocess_version (source, &version, &start, infolog))
       return GL_FALSE;
 
+   if (version > 110) {
+      slang_info_log_error (infolog, "language version specified is not supported.");
+      return GL_FALSE;
+   }
+
        /* check the syntax and generate its binary representation */
        if (!grammar_fast_check (id, (const byte *) source + start, &prod, &size, 65536))
        {
index 005a0a534bc828100eafd579eebed981a8ff3708..bd9ff9002e93c6e072738d3ada48f412507623e7 100644 (file)
 #include "grammar_mesa.h"
 #include "slang_preprocess.h"
 
-static const char *slang_version_syn =
-#include "library/slang_version_syn.h"
+static const char *slang_pp_version_syn =
+#include "library/slang_pp_version_syn.h"
 ;
 
-int _slang_preprocess_version (const char *text, unsigned int *version, unsigned int *eaten,
-       slang_info_log *log)
+static GLvoid
+grammar_error_to_log (slang_info_log *log)
 {
-       grammar id;
-       byte *prod, *I;
-       unsigned int size;
+   char buf[1024];
+   int pos;
 
-       id = grammar_load_from_text ((const byte *) slang_version_syn);
-       if (id == 0)
-       {
-               char buf[1024];
-               unsigned int pos;
-               grammar_get_last_error ( (unsigned char*) buf, 1024, (int*) &pos);
-               slang_info_log_error (log, buf);
-               return 0;
-       }
+   grammar_get_last_error ((byte *) (buf), sizeof (buf), &pos);
+   slang_info_log_error (log, buf);
+}
+
+GLboolean
+_slang_preprocess_version (const char *text, GLuint *version, GLuint *eaten, slang_info_log *log)
+{
+   grammar id;
+   byte *prod, *I;
+   unsigned int size;
 
-       if (!grammar_fast_check (id, (const byte *) text, &prod, &size, 8))
-       {
-               char buf[1024];
-               unsigned int pos;
-               grammar_get_last_error ( (unsigned char*) buf, 1024, (int*) &pos);
-               slang_info_log_error (log, buf);
-               grammar_destroy (id);
-               return 0;
-       }
+   id = grammar_load_from_text ((const byte *) (slang_pp_version_syn));
+   if (id == 0) {
+      grammar_error_to_log (log);
+      return GL_FALSE;
+   }
 
-       grammar_destroy (id);
+   if (!grammar_fast_check (id, (const byte *) (text), &prod, &size, 8)) {
+      grammar_error_to_log (log);
+      grammar_destroy (id);
+      return GL_FALSE;
+   }
 
-       /* there can be multiple #version directives - grab the last one */
-       I = prod;
-       while (I < prod + size)
-       {
-               *version =
-                       (unsigned int) I[0] +
-                       (unsigned int) I[1] * 100;
-               *eaten =
-                       ((unsigned int) I[2]) +
-                       ((unsigned int) I[3] << 8) +
-                       ((unsigned int) I[4] << 16) +
-                       ((unsigned int) I[5] << 24);
-               I += 6;
-       }
+   /* there can be multiple #version directives - grab the last one */
+   I = &prod[size - 6];
+   *version = (GLuint) (I[0]) + (GLuint) (I[1]) * 100;
+   *eaten = (GLuint) (I[2]) + ((GLuint) (I[3]) << 8) + ((GLuint) (I[4]) << 16) + ((GLuint) (I[5]) << 24);
 
-       grammar_alloc_free (prod);
-       return 1;
+   grammar_destroy (id);
+   grammar_alloc_free (prod);
+   return GL_TRUE;
 }
 
index 60635cc40b1bab41ba065bd987ba69ed815fa97b..b55852dc4c00fa6def9107f64552ef7c6058d495 100644 (file)
@@ -31,7 +31,8 @@
 extern "C" {
 #endif
 
-int _slang_preprocess_version (const char *, unsigned int *, unsigned int *, slang_info_log *);
+GLboolean
+_slang_preprocess_version (const char *, GLuint *, GLuint *, slang_info_log *);
 
 #ifdef __cplusplus
 }