glsl: Implement predefinded macros.
authorMichal Krol <michal@vmware.com>
Fri, 4 Sep 2009 11:30:40 +0000 (13:30 +0200)
committerMichal Krol <michal@vmware.com>
Mon, 7 Sep 2009 08:12:05 +0000 (10:12 +0200)
The values are hardcoded: __LINE__ = 1, __FILE__ = 0 and __VERSION__ = 110.

src/glsl/pp/sl_pp_macro.c

index a82c30cb167642e577fd311f3281f9c3840091c6..bacd468964cac50c589e14b98cab6d8dd09dea97 100644 (file)
@@ -26,6 +26,7 @@
  **************************************************************************/
 
 #include <stdlib.h>
+#include <stdio.h>
 #include "sl_pp_macro.h"
 #include "sl_pp_process.h"
 
@@ -94,6 +95,21 @@ skip_whitespace(const struct sl_pp_token_info *input,
    }
 }
 
+static int
+_out_number(struct sl_pp_context *context,
+            struct sl_pp_process_state *state,
+            unsigned int number)
+{
+   char buf[32];
+   struct sl_pp_token_info ti;
+
+   sprintf(buf, "%u", number);
+
+   ti.token = SL_PP_NUMBER;
+   ti.data.number = sl_pp_context_add_unique_str(context, buf);
+   return sl_pp_process_out(state, &ti);
+}
+
 int
 sl_pp_macro_expand(struct sl_pp_context *context,
                    const struct sl_pp_token_info *input,
@@ -103,6 +119,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
                    int mute)
 {
    int macro_name;
+   const char *macro_str;
    struct sl_pp_macro *macro = NULL;
    struct sl_pp_macro *actual_arg = NULL;
    unsigned int j;
@@ -112,6 +129,30 @@ sl_pp_macro_expand(struct sl_pp_context *context,
    }
 
    macro_name = input[*pi].data.identifier;
+   macro_str = sl_pp_context_cstr(context, macro_name);
+
+   /* TODO: Having the following built-ins hardcoded is a bit lame. */
+   if (!strcmp(macro_str, "__LINE__")) {
+      if (!mute && _out_number(context, state, 1)) {
+         return -1;
+      }
+      (*pi)++;
+      return 0;
+   }
+   if (!strcmp(macro_str, "__FILE__")) {
+      if (!mute && _out_number(context, state, 0)) {
+         return -1;
+      }
+      (*pi)++;
+      return 0;
+   }
+   if (!strcmp(macro_str, "__VERSION__")) {
+      if (!mute && _out_number(context, state, 110)) {
+         return -1;
+      }
+      (*pi)++;
+      return 0;
+   }
 
    if (local) {
       for (macro = local; macro; macro = macro->next) {