fixed a minor problem with unstacking
authorceriel <none@none>
Wed, 4 Nov 1987 15:55:23 +0000 (15:55 +0000)
committerceriel <none@none>
Wed, 4 Nov 1987 15:55:23 +0000 (15:55 +0000)
util/cpp/macro.h
util/cpp/replace.c

index bf9f878..a501f8f 100644 (file)
@@ -45,6 +45,7 @@ struct mlist {
        struct mlist *next;
        struct macro *m_mac;
        char *m_repl;
+       char m_unstack;
 };
 
 /* allocation definitions of struct mlist */
index 8aa4f4e..fb932a8 100644 (file)
@@ -190,25 +190,36 @@ macro2buffer(idef, actpars, siztext)
 EXPORT
 DoUnstack()
 {
+       register struct mlist *p = ReplaceList;
+
+       while (p->m_unstack) p = p->next;
+       p->m_unstack = 1;
        Unstacked++;
 }
 
 EXPORT
 EnableMacros()
 {
-       register struct mlist *p = ReplaceList;
+       register struct mlist *p = ReplaceList, *prev = 0;
+       int cnt = 0;
 
        assert(Unstacked > 0);
-       while (Unstacked > 0) {
+       while (p) {
                struct mlist *nxt = p->next;
 
-               assert(p != 0);
-               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);
-               free_mlist(p);
+               if (p->m_unstack) {
+                       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;
-               Unstacked--;
        }
-       ReplaceList = p;
+       assert(cnt == Unstacked);
+       Unstacked = 0;
 }
+#endif NOPP