]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/application.cpp
Move most platform-specific code into overlay directories
[libs/core.git] / source / core / application.cpp
index 139f94f2d88054d745ad9119b562dd7ec174d596..36621e92ae99af9b74a2726263fd3b8176cbd020 100644 (file)
@@ -1,19 +1,7 @@
-/* $Id$
-
-This file is part of libmspcore
-Copyright © 2006-2008, 2011  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #include <signal.h>
 #include <signal.h>
-#include <iostream>
-#include <typeinfo>
-#include "../debug/backtrace.h"
-#include "../debug/demangle.h"
-#include "../time/units.h"
-#include "../time/utils.h"
+#include <msp/io/print.h>
 #include "application.h"
 #include "application.h"
-#include "except.h"
+#include "getopt.h"
 
 using namespace std;
 
 
 using namespace std;
 
@@ -29,7 +17,8 @@ Application::Application():
 
 /**
 Constructs an instance of the registered application class and runs it.  If the
 
 /**
 Constructs an instance of the registered application class and runs it.  If the
-application throws a UsageError, the static usage() function is called.
+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.
 
 This function can only be called once.  The global main() function provided by
 the library normally does it automatically at program startup.
@@ -39,14 +28,14 @@ int Application::run(int argc, char **argv, void *data)
        static bool called = false;
        if(called)
        {
        static bool called = false;
        if(called)
        {
-               cerr<<"Trying to call Application::run_app twice!\n";
+               IO::cerr.write("Trying to call Application::run_app twice!\n");
                return 125;
        }
        called = true;
 
        if(!starter_)
        {
                return 125;
        }
        called = true;
 
        if(!starter_)
        {
-               cerr<<"Trying to run with no RegisteredApplication class!\n";
+               IO::cerr.write("Trying to run with no RegisteredApplication class!\n");
                return 126;
        }
 
                return 126;
        }
 
@@ -58,9 +47,9 @@ int Application::run(int argc, char **argv, void *data)
                {
                        app_ = starter_->create_app(argc, argv);
                }
                {
                        app_ = starter_->create_app(argc, argv);
                }
-               catch(const UsageError &e)
+               catch(const usage_error &e)
                {
                {
-                       starter_->usage(e.what(), argv[0], e.get_brief());
+                       IO::print(IO::cerr, "%s\n%s\n", e.what(), e.help());
                        return 1;
                }
 
                        return 1;
                }
 
@@ -74,43 +63,12 @@ int Application::run(int argc, char **argv, void *data)
        {
                delete app_;
 
        {
                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
-               cerr<<"An uncaught exception occurred.\n";
-               cerr<<"  type:   "<<Debug::demangle(typeid(e).name())<<'\n';
-               cerr<<"  what(): "<<e.what()<<'\n';
-
-               const Exception *exc = dynamic_cast<const Exception *>(&e);
-               if(exc && !exc->get_backtrace().get_frames().empty())
-               {
-                       cerr<<"  backtrace:\n";
-                       const list<Debug::Backtrace::StackFrame> &frames = exc->get_backtrace().get_frames();
-                       for(list<Debug::Backtrace::StackFrame>::const_iterator i=frames.begin(); i!=frames.end(); ++i)
-                               cerr<<"    "<<*i<<'\n';
-               }
-#endif
+               display_exception(e);
 
                return 124;
        }
 }
 
 
                return 124;
        }
 }
 
-/**
-Prints a message describing the usage of the application.  The default version
-will blame the programmer for being lazy.
-
-@param   reason  Why the function was called
-@param   argv0   The value of argv[0], to be used in the message
-@param   brief   Whether to print a brief or long usage message
-*/
-void Application::usage(const char *reason, const char *, bool)
-{
-       if(reason)
-               cerr<<"UsageError: "<<reason<<'\n';
-       cerr<<"The programmer was lazy and didn't write a usage() function for this application.\n";
-}
-
 /**
 Default main loop.  Calls tick() repeatedly until exit() is called.  A custom
 main loop should monitor the done member variable and return exit_code.
 /**
 Default main loop.  Calls tick() repeatedly until exit() is called.  A custom
 main loop should monitor the done member variable and return exit_code.
@@ -153,7 +111,7 @@ void Application::sighandler_(int s)
 Application::Starter::Starter()
 {
        if(starter_)
 Application::Starter::Starter()
 {
        if(starter_)
-               throw InvalidState("Can't create more than one Starter instance");
+               throw logic_error("Can't create more than one Starter instance");
 
        starter_ = this;
 }
 
        starter_ = this;
 }