+#include <cstring>
#include <typeinfo>
#include <signal.h>
#include <msp/debug/demangle.h>
#include <msp/debug/errorreporter.h>
+#include <msp/fs/dir.h>
+#include <msp/fs/path.h>
#include <msp/fs/utils.h>
#include <msp/io/print.h>
+#include <msp/strings/utils.h>
#include "application.h"
#include "getopt.h"
{
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());
+ vector<string> lines = split(e.what(), '\n');
+ if(lines.size()<2)
+ IO::print(IO::cerr, " what(): %s\n", e.what());
+ else
+ {
+ IO::print(IO::cerr, " what(): %s\n", lines.front());
+ for(vector<string>::const_iterator i=lines.begin(); ++i!=lines.end(); )
+ IO::print(IO::cerr, " %s\n", *i);
+ }
}
delete app_;
if(argv0_)
throw logic_error("startup info already set");
- argv0_ = argv0;
+ static FS::Path exe;
+
+ if(!argv0 || !*argv0)
+ {
+#ifdef _WIN32
+ argv0 = "application.exe";
+#else
+ argv0 = "./application";
+#endif
+ }
+
+ bool has_slash = strchr(argv0, FS::DIRSEP);
+ if(!has_slash)
+ exe = FS::path_lookup(argv0);
+ if(exe.empty())
+ exe = FS::realpath(argv0);
+
+ argv0_ = exe.c_str();
data_ = data;
}