#include <data/file-handle-def.h>
#include <libpspp/getl.h>
#include <data/file-name.h>
-#include <data/format.h>
#include <data/procedure.h>
#include <data/settings.h>
#include <data/variable.h>
#include <ui/terminal/read-line.h>
#include <ui/terminal/terminal.h>
+#include "fatal-signal.h"
#include "progname.h"
#include "gettext.h"
static void i18n_init (void);
static void fpu_init (void);
-static void terminate (bool success) NO_RETURN;
+static void clean_up (void);
/* If a segfault happens, issue a message to that effect and halt */
void bug_handler(int sig);
signal (SIGABRT, bug_handler);
signal (SIGSEGV, bug_handler);
signal (SIGFPE, bug_handler);
- signal (SIGINT, interrupt_handler);
+ at_fatal_signal (clean_up);
i18n_init ();
fpu_init ();
gsl_set_error_handler_off ();
- fmt_init ();
outp_init ();
fn_init ();
fh_init ();
if (parse_command_line (argc, argv, the_source_stream))
{
msg_ui_init (the_source_stream);
- if (!get_testing_mode ())
+ if (!settings_get_testing_mode ())
outp_read_devices ();
else
outp_configure_driver_line (
}
}
- terminate (!any_errors ());
+ clean_up ();
+ return any_errors ();
}
\f
static void
}
}
-void
-interrupt_handler(int sig UNUSED)
-{
- terminate (false);
-}
-
-
-/* Terminate PSPP. SUCCESS should be true to exit successfully,
- false to exit as a failure. */
+/* Clean up PSPP in preparation for termination. */
static void
-terminate (bool success)
+clean_up (void)
{
static bool terminating = false;
if (!terminating)
destroy_source_stream (the_source_stream);
prompt_done ();
readln_uninitialize ();
-
outp_done ();
msg_ui_done ();
- fmt_done ();
}
- exit (success ? EXIT_SUCCESS : EXIT_FAILURE);
}