+#if NO_LEAKS
+static TERMINAL **saved_terminals;
+static size_t num_saved;
+static size_t max_saved;
+
+static void
+failed(const char *msg)
+{
+ perror(msg);
+ ExitProgram(EXIT_FAILURE);
+}
+
+static void
+finish(int code)
+{
+ size_t n;
+ for (n = 0; n < num_saved; ++n)
+ del_curterm(saved_terminals[n]);
+ free(saved_terminals);
+ ExitProgram(code);
+}
+
+static void
+save_curterm(void)
+{
+ size_t n;
+ bool found = FALSE;
+ for (n = 0; n < num_saved; ++n) {
+ if (saved_terminals[n] == cur_term) {
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ if (num_saved + 1 >= max_saved) {
+ max_saved += 100;
+ saved_terminals = typeRealloc(TERMINAL *, max_saved, saved_terminals);
+ if (saved_terminals == NULL)
+ failed("realloc");
+ }
+ saved_terminals[num_saved++] = cur_term;
+ }
+}
+
+#else
+#define finish(code) ExitProgram(code)
+#define save_curterm() /* nothing */
+#endif
+