#include <boost/lexical_cast.hpp>
#include <string>
+#include <sstream>
//needed for Mac OSX 10.5.2 Leopard
#include <cstdlib>
using namespace std;
-namespace lyx {
+namespace {
+
+// A version of lexical cast that does not throw. Useful for when we convert to string
+template<typename To, typename From>
+To lexical_cast(From const & value, To const & defaultResult = To())
+{
+ try {
+ return boost::lexical_cast<To>(value);
+ } catch(...) {
+ // Ignore all exceptions and use default.
+ return defaultResult;
+ }
+}
+
+} // namespace
-using boost::lexical_cast;
+
+namespace lyx {
template<>
string convert<string>(bool b)
}
+#ifdef HAVE_LONG_LONG_INT
+template<>
+string convert<string>(unsigned long long ull)
+{
+ return lexical_cast<string>(ull);
+}
+
+
+template<>
+docstring convert<docstring>(unsigned long long ull)
+{
+ return from_ascii(lexical_cast<string>(ull));
+}
+#endif
+
+
template<>
string convert<string>(long l)
{
}
+#ifdef HAVE_LONG_LONG_INT
+template<>
+string convert<string>(long long ll)
+{
+ return lexical_cast<string>(ll);
+}
+
+
+template<>
+docstring convert<docstring>(long long ll)
+{
+ return from_ascii(lexical_cast<string>(ll));
+}
+#endif
+
+
template<>
string convert<string>(float f)
{
- return lexical_cast<string>(f);
+ std::ostringstream val;
+ val << f;
+ return val.str();
}
template<>
string convert<string>(double d)
{
- return lexical_cast<string>(d);
+ std::ostringstream val;
+ val << d;
+ return val.str();
+}
+
+
+template<>
+docstring convert<docstring>(double d)
+{
+ return from_ascii(convert<string>(d));
}
template<>
int convert<int>(string const s)
{
- return strtol(s.c_str(), 0, 10);
+ return int(strtol(s.c_str(), nullptr, 10));
+}
+
+
+int convert(std::string const & s, int base)
+{
+ return int(strtol(s.c_str(), nullptr, base));
}
template<>
int convert<int>(docstring const s)
{
- return strtol(to_ascii(s).c_str(), 0, 10);
+ return int(strtol(to_ascii(s).c_str(), nullptr, 10));
}
template<>
unsigned int convert<unsigned int>(string const s)
{
- return strtoul(s.c_str(), 0, 10);
+ return static_cast<unsigned int>(strtoul(s.c_str(), nullptr, 10));
}
template<>
unsigned long convert<unsigned long>(string const s)
{
- return strtoul(s.c_str(), 0, 10);
+ return strtoul(s.c_str(), nullptr, 10);
}
template<>
double convert<double>(string const s)
{
- return strtod(s.c_str(), 0);
+ return strtod(s.c_str(), nullptr);
}
template<>
int convert<int>(char const * cptr)
{
- return strtol(cptr, 0, 10);
+ return int(strtol(cptr, nullptr, 10));
}
template<>
double convert<double>(char const * cptr)
{
- return strtod(cptr, 0);
+ return strtod(cptr, nullptr);
}