glsl/pp: Expand unknown identifiers to 0 in if/elif expressions.
authorMichal Krol <michal@vmware.com>
Fri, 20 Nov 2009 07:59:50 +0000 (08:59 +0100)
committerMichal Krol <michal@vmware.com>
Fri, 20 Nov 2009 07:59:50 +0000 (08:59 +0100)
src/glsl/pp/sl_pp_if.c
src/glsl/pp/sl_pp_line.c
src/glsl/pp/sl_pp_macro.c
src/glsl/pp/sl_pp_macro.h
src/glsl/pp/sl_pp_process.c

index a0b3635dd5a4132bb7473c1cc0d9b875389107c4..6610bc69f3c93772bad946522584c7a21c86a24f 100644 (file)
@@ -137,7 +137,7 @@ _parse_if(struct sl_pp_context *context,
                return -1;
             }
          } else {
-            if (sl_pp_macro_expand(context, input, &i, NULL, &state, 0)) {
+            if (sl_pp_macro_expand(context, input, &i, NULL, &state, sl_pp_macro_expand_unknown_to_0)) {
                free(state.out);
                return -1;
             }
index fc2dd89e68b4bd8b525333c28d3b9ae52a7b4788..ed5acc697ce6875e331a031c28380aa87fe20a63 100644 (file)
@@ -53,7 +53,7 @@ sl_pp_process_line(struct sl_pp_context *context,
          break;
 
       case SL_PP_IDENTIFIER:
-         if (sl_pp_macro_expand(context, input, &i, NULL, &state, 0)) {
+         if (sl_pp_macro_expand(context, input, &i, NULL, &state, sl_pp_macro_expand_normal)) {
             free(state.out);
             return -1;
          }
index d6c32a0e78299e6a4fb04908e0187f0073ff7551..29f1229dd7d835a8994c1067aadfa55e61e8ec5b 100644 (file)
@@ -28,6 +28,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include "sl_pp_public.h"
 #include "sl_pp_macro.h"
 #include "sl_pp_process.h"
 
@@ -122,8 +123,9 @@ sl_pp_macro_expand(struct sl_pp_context *context,
                    unsigned int *pi,
                    struct sl_pp_macro *local,
                    struct sl_pp_process_state *state,
-                   int mute)
+                   enum sl_pp_macro_expand_behaviour behaviour)
 {
+   int mute = (behaviour == sl_pp_macro_expand_mute);
    int macro_name;
    struct sl_pp_macro *macro = NULL;
    struct sl_pp_macro *actual_arg = NULL;
@@ -183,7 +185,12 @@ sl_pp_macro_expand(struct sl_pp_context *context,
    }
 
    if (!macro) {
-      if (!mute) {
+      if (behaviour == sl_pp_macro_expand_unknown_to_0) {
+         if (_out_number(context, state, 0)) {
+            strcpy(context->error_msg, "out of memory");
+            return -1;
+         }
+      } else if (!mute) {
          if (sl_pp_process_out(state, &input[*pi])) {
             strcpy(context->error_msg, "out of memory");
             return -1;
@@ -274,7 +281,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
                break;
 
             case SL_PP_IDENTIFIER:
-               if (sl_pp_macro_expand(context, input, &i, local, &arg_state, 0)) {
+               if (sl_pp_macro_expand(context, input, &i, local, &arg_state, sl_pp_macro_expand_normal)) {
                   free(arg_state.out);
                   return -1;
                }
@@ -339,7 +346,7 @@ sl_pp_macro_expand(struct sl_pp_context *context,
          break;
 
       case SL_PP_IDENTIFIER:
-         if (sl_pp_macro_expand(context, macro->body, &j, actual_arg, state, mute)) {
+         if (sl_pp_macro_expand(context, macro->body, &j, actual_arg, state, behaviour)) {
             return -1;
          }
          break;
index e3ae2fc71253b6cb3f0c72154df60215ebcb0347..3ad3438236a660c59d55942508fb5190b990be2e 100644 (file)
@@ -56,12 +56,18 @@ sl_pp_macro_free(struct sl_pp_macro *macro);
 void
 sl_pp_macro_reset(struct sl_pp_macro *macro);
 
+enum sl_pp_macro_expand_behaviour {
+   sl_pp_macro_expand_normal,
+   sl_pp_macro_expand_mute,
+   sl_pp_macro_expand_unknown_to_0
+};
+
 int
 sl_pp_macro_expand(struct sl_pp_context *context,
                    const struct sl_pp_token_info *input,
                    unsigned int *pi,
                    struct sl_pp_macro *local,
                    struct sl_pp_process_state *state,
-                   int mute);
+                   enum sl_pp_macro_expand_behaviour behaviour);
 
 #endif /* SL_PP_MACRO_H */
index 4b783e40b4def68e1204e237ed612d29e11a7e64..e2adc2a0215098b363e0941780e4fbdcf06f75d4 100644 (file)
@@ -257,7 +257,8 @@ sl_pp_process(struct sl_pp_context *context,
                break;
 
             case SL_PP_IDENTIFIER:
-               if (sl_pp_macro_expand(context, input, &i, NULL, &state, !context->if_value)) {
+               if (sl_pp_macro_expand(context, input, &i, NULL, &state,
+                                      context->if_value ? sl_pp_macro_expand_normal : sl_pp_macro_expand_mute)) {
                   return -1;
                }
                break;