glsl: Implement `undef' preprocessor directive.
authorMichal Krol <michal@vmware.com>
Fri, 26 Jun 2009 10:48:14 +0000 (12:48 +0200)
committerMichal Krol <michal@vmware.com>
Mon, 7 Sep 2009 08:11:54 +0000 (10:11 +0200)
src/glsl/pp/sl_pp_define.c
src/glsl/pp/sl_pp_process.c
src/glsl/pp/sl_pp_process.h

index 0509646430ac59e8c3df2524560c2c30d823c53d..9bc9fb535993557d95c977d4492dbcebb7b33b6b 100644 (file)
@@ -176,3 +176,38 @@ sl_pp_process_define(struct sl_pp_context *context,
 
    return 0;
 }
+
+
+int
+sl_pp_process_undef(struct sl_pp_context *context,
+                    const struct sl_pp_token_info *input,
+                    unsigned int first,
+                    unsigned int last)
+{
+   int macro_name = -1;
+   struct sl_pp_macro **pmacro;
+   struct sl_pp_macro *macro;
+
+   if (first < last && input[first].token == SL_PP_IDENTIFIER) {
+      macro_name = input[first].data.identifier;
+   }
+   if (macro_name == -1) {
+      return 0;
+   }
+
+   for (pmacro = &context->macro; *pmacro; pmacro = &(**pmacro).next) {
+      if ((**pmacro).name == macro_name) {
+         break;
+      }
+   }
+   if (!*pmacro) {
+      return 0;
+   }
+
+   macro = *pmacro;
+   *pmacro = macro->next;
+   macro->next = NULL;
+   sl_pp_macro_free(macro);
+
+   return 0;
+}
index 4715eed2fcd94fba070748d8095ada3cb37c3af8..c17a3ac7ce864798dae41714128ba2a076d36b96 100644 (file)
@@ -122,13 +122,7 @@ sl_pp_process(struct sl_pp_context *context,
 
                last = i - 1;
 
-               if (!strcmp(name, "define")) {
-                  if (context->if_value) {
-                     if (sl_pp_process_define(context, input, first, last)) {
-                        return -1;
-                     }
-                  }
-               } else if (!strcmp(name, "if")) {
+               if (!strcmp(name, "if")) {
                   if (sl_pp_process_if(context, input, first, last)) {
                      return -1;
                   }
@@ -152,8 +146,18 @@ sl_pp_process(struct sl_pp_context *context,
                   if (sl_pp_process_endif(context, input, first, last)) {
                      return -1;
                   }
-               } else {
-                  /* XXX: Ignore. */
+               } else if (context->if_value) {
+                  if (!strcmp(name, "define")) {
+                     if (sl_pp_process_define(context, input, first, last)) {
+                        return -1;
+                     }
+                  } else if (!strcmp(name, "undef")) {
+                     if (sl_pp_process_undef(context, input, first, last)) {
+                        return -1;
+                     }
+                  } else {
+                     /* XXX: Ignore. */
+                  }
                }
             }
             break;
index 66d61496a2dc15bf3a1bf54813a6235fb12fb375..61e67fef0b7fcdc219613bb053bf36f55eade32b 100644 (file)
@@ -50,6 +50,12 @@ sl_pp_process_define(struct sl_pp_context *context,
                      unsigned int first,
                      unsigned int last);
 
+int
+sl_pp_process_undef(struct sl_pp_context *context,
+                    const struct sl_pp_token_info *input,
+                    unsigned int first,
+                    unsigned int last);
+
 int
 sl_pp_process_if(struct sl_pp_context *context,
                  const struct sl_pp_token_info *input,