} type;
int args;
int fillargs;
+ int expanding;
} YAPP_Macro;
YAPP_Macro *
ym->type = YAPP_DEFINE;
ym->args = argc;
ym->fillargs = fillargs;
+ ym->expanding = 0;
/*ydebug (("]]Inserting %s:%d:%d\n", name, argc, fillargs));*/
void
expand_macro(YAPP_Macro *ym)
{
+ if (ym->expanding) InternalError(_("Recursively expanding a macro!"));
+
+ ym->expanding = 1;
+
if (ym->type == YAPP_DEFINE) {
if (ym->args == -1) {
source *src;
src = SLIST_FIRST(&ym->macro_head);
while (src != NULL) {
if (src->token.type == IDENT) {
- if (yapp_defined(src->token.str)) {
- expand_macro(yapp_macro_get(src->token.str));
+ YAPP_Macro *imacro = yapp_macro_get(src->token.str);
+ if (imacro != NULL && !imacro->expanding) {
+ expand_macro(imacro);
}
else {
copy_token(&src->token);
}
else
InternalError(_("Invoking Macros not yet supported"));
+
+ ym->expanding = 0;
}
static size_t
} type;
int args;
int fillargs;
+ int expanding;
} YAPP_Macro;
YAPP_Macro *
ym->type = YAPP_DEFINE;
ym->args = argc;
ym->fillargs = fillargs;
+ ym->expanding = 0;
/*ydebug (("]]Inserting %s:%d:%d\n", name, argc, fillargs));*/
void
expand_macro(YAPP_Macro *ym)
{
+ if (ym->expanding) InternalError(_("Recursively expanding a macro!"));
+
+ ym->expanding = 1;
+
if (ym->type == YAPP_DEFINE) {
if (ym->args == -1) {
source *src;
src = SLIST_FIRST(&ym->macro_head);
while (src != NULL) {
if (src->token.type == IDENT) {
- if (yapp_defined(src->token.str)) {
- expand_macro(yapp_macro_get(src->token.str));
+ YAPP_Macro *imacro = yapp_macro_get(src->token.str);
+ if (imacro != NULL && !imacro->expanding) {
+ expand_macro(imacro);
}
else {
copy_token(&src->token);
}
else
InternalError(_("Invoking Macros not yet supported"));
+
+ ym->expanding = 0;
}
static size_t