From: ceriel Date: Fri, 14 Jul 1989 09:51:02 +0000 (+0000) Subject: fixed a problem with recursive macros: this was not always detected X-Git-Tag: release-5-5~2335 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=09a52b8cf2be28f224d0b68f25e31788a7d5db65;p=ack.git fixed a problem with recursive macros: this was not always detected --- diff --git a/lang/cem/cemcom/input.c b/lang/cem/cemcom/input.c index 137827ff4..fb4bb6955 100644 --- a/lang/cem/cemcom/input.c +++ b/lang/cem/cemcom/input.c @@ -38,6 +38,8 @@ getwdir(fn) } return ""; } + +int InputLevel; #endif NOPP int NoUnstack; @@ -47,6 +49,7 @@ AtEoIT() #ifndef NOPP /* if (NoUnstack) lexwarning("unexpected EOF"); ??? */ DoUnstack(); + InputLevel--; #endif NOPP return 0; } diff --git a/lang/cem/cemcom/macro.str b/lang/cem/cemcom/macro.str index 5e129402d..193760b21 100644 --- a/lang/cem/cemcom/macro.str +++ b/lang/cem/cemcom/macro.str @@ -37,7 +37,7 @@ struct mlist { struct mlist *next; struct macro *m_mac; char *m_repl; - char m_unstack; + int m_level; }; /* ALLOCDEF "mlist" 20 */ diff --git a/lang/cem/cemcom/replace.c b/lang/cem/cemcom/replace.c index e1ed2fa84..1aed93cae 100644 --- a/lang/cem/cemcom/replace.c +++ b/lang/cem/cemcom/replace.c @@ -24,6 +24,7 @@ char *strcpy(), *strcat(); char *long2str(); +extern int InputLevel; PRIVATE struct mlist *ReplaceList; /* list of currently active macros */ @@ -85,6 +86,8 @@ replace(idef) else reptext = "0"; InsertText(reptext, 1); + InputLevel++; + repl->m_level = InputLevel; repl->next = ReplaceList; ReplaceList = repl; repl->m_mac = mac; @@ -105,6 +108,8 @@ replace(idef) repl->m_repl = reptext; } InsertText(reptext, size); + InputLevel++; + repl->m_level = InputLevel; repl->next = ReplaceList; ReplaceList = repl; return 1; @@ -191,36 +196,29 @@ macro2buffer(idef, actpars, siztext) EXPORT DoUnstack() { - register struct mlist *p = ReplaceList; - - while (p->m_unstack) p = p->next; - p->m_unstack = 1; - Unstacked++; + Unstacked = 1; } EXPORT EnableMacros() { register struct mlist *p = ReplaceList, *prev = 0; - int cnt = 0; ASSERT(Unstacked > 0); while (p) { struct mlist *nxt = p->next; - if (p->m_unstack) { + if (p->m_level > InputLevel) { p->m_mac->mc_flag &= ~NOREPLACE; if (p->m_mac->mc_count) p->m_mac->mc_count--; if (p->m_repl) free(p->m_repl); if (! prev) ReplaceList = nxt; else prev->next = nxt; free_mlist(p); - cnt++; } else prev = p; p = nxt; } - ASSERT(cnt == Unstacked); Unstacked = 0; } #endif NOPP diff --git a/util/cpp/input.c b/util/cpp/input.c index 20f3b2e9e..66c2aac67 100644 --- a/util/cpp/input.c +++ b/util/cpp/input.c @@ -37,10 +37,12 @@ getwdir(fn) int NoUnstack; int Unstacked; +int InputLevel; AtEoIT() { if (NoUnstack) warning("unexpected EOF"); + InputLevel--; DoUnstack(); return 0; } diff --git a/util/cpp/macro.h b/util/cpp/macro.h index 25874ea28..b9b33838f 100644 --- a/util/cpp/macro.h +++ b/util/cpp/macro.h @@ -45,7 +45,7 @@ struct mlist { struct mlist *next; struct macro *m_mac; char *m_repl; - char m_unstack; + int m_level; }; /* allocation definitions of struct mlist */ diff --git a/util/cpp/replace.c b/util/cpp/replace.c index a71880ece..af8c3df59 100644 --- a/util/cpp/replace.c +++ b/util/cpp/replace.c @@ -20,6 +20,7 @@ char *strcpy(), *strcat(); char *long2str(); +extern int InputLevel; PRIVATE struct mlist *ReplList; /* list of currently active macros */ @@ -81,6 +82,8 @@ replace(idef) else reptext = "0"; InsertText(reptext, 1); + InputLevel++; + repl->m_level = InputLevel; repl->next = ReplList; ReplList = repl; @@ -103,6 +106,8 @@ replace(idef) repl->m_repl = reptext; } InsertText(reptext, size); + InputLevel++; + repl->m_level = InputLevel; repl->next = ReplList; ReplList = repl; return 1; @@ -190,35 +195,28 @@ macro2buffer(idef, actpars, siztext) EXPORT DoUnstack() { - register struct mlist *p = ReplList; - - while (p->m_unstack) p = p->next; - p->m_unstack = 1; - Unstacked++; + Unstacked = 1; } EXPORT EnableMacros() { register struct mlist *p = ReplList, *prev = 0; - int cnt = 0; assert(Unstacked > 0); while (p) { struct mlist *nxt = p->next; - if (p->m_unstack) { + if (p->m_level > InputLevel) { p->m_mac->mc_flag &= ~NOREPLACE; if (p->m_mac->mc_count) p->m_mac->mc_count--; if (p->m_repl) free(p->m_repl); if (! prev) ReplList = nxt; else prev->next = nxt; free_mlist(p); - cnt++; } else prev = p; p = nxt; } - assert(cnt == Unstacked); Unstacked = 0; }