//
// aegis - project change supervisor
// Copyright (C) 2004-2006, 2008 Peter Miller
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include // for assert
#include
#include
#include
static quit_action **quit_list;
static size_t quit_list_len;
static size_t quit_list_max;
static int quitting;
void
quit_register(quit_action &action)
{
if (quitting)
return;
for (size_t j = 0; j < quit_list_len; ++j)
if (quit_list[j] == &action)
return;
if (quit_list_len >= quit_list_max)
{
size_t new_max = quit_list_max * 2 + 16;
quit_action **new_list = new quit_action * [new_max];
for (size_t j = 0; j < quit_list_len; ++j)
new_list[j] = quit_list[j];
delete [] quit_list;
quit_list = new_list;
quit_list_max = new_max;
}
quit_list[quit_list_len++] = &action;
}
void
quit_unregister(quit_action &action)
{
if (quitting)
return;
for (size_t j = 0; j < quit_list_len; ++j)
{
if (quit_list[j] == &action)
{
for (size_t k = j + 1; k < quit_list_len; ++k)
quit_list[k - 1] = quit_list[k];
--quit_list_len;
return;
}
}
}
void
quit(int n)
{
if (quitting++ > 4)
{
fprintf
(
stderr,
"%s: incorrectly handled error while quitting (bug)\n",
progname_get()
);
exit(1);
}
while (quit_list_len > 0)
{
quit_action *qap = quit_list[--quit_list_len];
(*qap)(n);
}
exit(n);
}