diff options
| -rw-r--r-- | src/glsl/pp/sl_pp_define.c | 35 | ||||
| -rw-r--r-- | src/glsl/pp/sl_pp_process.c | 22 | ||||
| -rw-r--r-- | src/glsl/pp/sl_pp_process.h | 6 | 
3 files changed, 54 insertions, 9 deletions
| diff --git a/src/glsl/pp/sl_pp_define.c b/src/glsl/pp/sl_pp_define.c index 0509646430..9bc9fb5359 100644 --- a/src/glsl/pp/sl_pp_define.c +++ b/src/glsl/pp/sl_pp_define.c @@ -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; +} diff --git a/src/glsl/pp/sl_pp_process.c b/src/glsl/pp/sl_pp_process.c index 4715eed2fc..c17a3ac7ce 100644 --- a/src/glsl/pp/sl_pp_process.c +++ b/src/glsl/pp/sl_pp_process.c @@ -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; diff --git a/src/glsl/pp/sl_pp_process.h b/src/glsl/pp/sl_pp_process.h index 66d61496a2..61e67fef0b 100644 --- a/src/glsl/pp/sl_pp_process.h +++ b/src/glsl/pp/sl_pp_process.h @@ -51,6 +51,12 @@ sl_pp_process_define(struct sl_pp_context *context,                       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,                   unsigned int first, | 
