glsl: Implement `undef' preprocessor directive.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user