+#include <typeinfo>
+#include <msp/debug/demangle.h>
+#include <msp/strings/format.h>
+#include "dataerror.h"
+
+using namespace std;
+
+namespace Msp {
+namespace DataFile {
+
+data_error::data_error(const string &s, unsigned l, const string &w):
+ runtime_error(make_what(s, l, w)),
+ source(s),
+ line(l)
+{ }
+
+data_error::data_error(const string &s, unsigned l, const exception &e):
+ runtime_error(make_what(s, l, format("%s (%s)", Debug::demangle(typeid(e).name()), e.what()))),
+ source(s),
+ line(l)
+{ }
+
+string data_error::make_what(const string &s, unsigned l, const string &w)
+{
+ if(l)
+ return format("%s:%d: %s", s, l, w);
+ else
+ return format("%s: %s", s, w);
+}
+
+} // namespace DataFile
+} // namespace Msp