-#ifdef WIN32
-#include <windows.h>
-#endif
#include <signal.h>
-#include <typeinfo>
-#include <msp/debug/demangle.h>
#include <msp/io/print.h>
#include "application.h"
#include "getopt.h"
exit_code(0)
{ }
-/**
-Constructs an instance of the registered application class and runs it. If the
-application throws a usage_error, a help message is printed. The GetOpt class
-will throw such exceptions automatically in error conditions.
-
-This function can only be called once. The global main() function provided by
-the library normally does it automatically at program startup.
-*/
int Application::run(int argc, char **argv, void *data)
{
static bool called = false;
{
delete app_;
-#ifdef WIN32
- string msg = Debug::demangle(typeid(e).name())+":\n"+e.what();
- MessageBoxA(0, msg.c_str(), "Uncaught exception", MB_OK|MB_ICONERROR);
-#else
- IO::print(IO::cerr, "An uncaught exception occurred.\n");
- IO::print(IO::cerr, " type: %s\n", Debug::demangle(typeid(e).name()));
- IO::print(IO::cerr, " what(): %s\n", e.what());
-#endif
+ display_exception(e);
return 124;
}
}
-/**
-Default main loop. Calls tick() repeatedly until exit() is called. A custom
-main loop should monitor the done member variable and return exit_code.
-*/
int Application::main()
{
done = false;
return exit_code;
}
-/**
-Sets the specified signal to be delivered to the sighandler member function.
-*/
void Application::catch_signal(int s)
{
signal(s, &sighandler_);
}
-/**
-Causes the application to exit gracefully with the given exit code.
-*/
void Application::exit(int c)
{
done = true;
exit_code = c;
}
-/**
-Static wrapper function to call a member function of the Application instance.
-*/
void Application::sighandler_(int s)
{
app_->sighandler(s);