#include <cmath>
#include <limits>
+#include "format.h"
#include "lexicalcast.h"
using namespace std;
T str_to_int(const std::string &s, const Fmt &f)
{
if(s.empty())
- throw LexicalError("Empty input in integer conversion");
+ throw lexical_error("conversion of '' to integer");
std::string::const_iterator i = s.begin();
if(*i=='-')
{
if(!IsSigned<T>::result)
- throw LexicalError("Negative sign in unsigned integer conversion");
+ throw lexical_error(format("conversion of '%s' to unsigned integer", s));
neg = true;
++i;
}
// Must have some digits to convert
if(i==s.end())
- throw LexicalError("Missing digits in integer conversion");
+ throw lexical_error(format("conversion of '%s' to integer", s));
T base = f.get_base();
if(!base && i!=s.end())
else if(*i>='a' && *i<='f')
digit = *i-'a'+10;
if(digit>=base)
- throw LexicalError("Invalid digit in integer conversion");
+ throw lexical_error(format("conversion of '%s' to integer (base-%d)", s, base));
T next = result*base+digit;
if(next/base!=result)
- throw LexicalError("Overflow in integer conversion");
+ throw lexical_error(format("conversion of '%s' to %d-bit integer", s, sizeof(T)*8));
result = next;
}
bool str_to_bool(const string &s)
{
if(s.empty())
- throw LexicalError("Empty input in boolean conversion");
+ throw lexical_error("conversion of '' to boolean");
if(s=="1" || s=="true" || s=="yes" || s=="on")
return true;
else if(s=="0" || s=="false" || s=="no" || s=="off")
return false;
- throw LexicalError("Invalid input in boolean conversion");
+ throw lexical_error(format("conversion of '%s' to boolean", s));
}
string flt_to_str(T v, const Fmt &f)
{
if(f.get_type()==Fmt::CHAR)
- throw LexicalError("Character format in floating-point conversion");
+ throw format_mismatch("floating-point conversion with character format");
Fmt::FloatMode mode = f.get_floatmode();
long double w = abs(v);
T str_to_flt(const string &s, const Fmt &)
{
if(s.empty())
- throw LexicalError("Empty input in floating-point conversion");
+ throw lexical_error("conversion of '' to floating-point");
std::string::const_iterator i = s.begin();
// Must have some digits to convert
if(i==s.end())
- throw LexicalError("Missing digits in floating-point conversion");
+ throw lexical_error(format("conversion of '%s' to floating-point", s));
long double v = 0;
int exp = 0;
if(*i=='.')
{
if(point_seen)
- throw LexicalError("Extra point in floating-point conversion");
+ throw lexical_error(format("conversion of '%s' to floating-point", s));
point_seen = true;
}
else if(*i>='0' && *i<='9')
break;
}
else
- throw LexicalError("Invalid digit in floating-point conversion");
+ throw lexical_error(format("conversion of '%s' to floating-point", s));
}
// Scale and negate the result as needed
string str_to_str(const string &s, const Fmt &f)
{
if(f.get_type()==Fmt::NUM)
- throw LexicalError("Numeric format in string conversion");
+ throw format_mismatch("string conversion with numeric format");
return s;
}
{
const std::string &s = c.get();
if(s.empty())
- throw LexicalError("Empty input in character conversion");
+ throw lexical_error("conversion of '' to character");
if(s.size()>1)
- throw LexicalError("Extra input in character conversion");
+ throw lexical_error(format("conversion of '%s' to character", s));
v = s[0];
}
}
#include <sstream>
#include <string>
-#include <msp/core/except.h>
+#include <stdexcept>
#include "fmt.h"
namespace Msp {
/**
Thrown for errors in lexical conversions
*/
-class LexicalError: public Exception
+class lexical_error: public std::runtime_error
{
public:
- LexicalError(const std::string &w_): Exception(w_) { }
+ lexical_error(const std::string &w): runtime_error(w) { }
+ virtual ~lexical_error() throw() { }
+};
+
+
+class format_mismatch: public lexical_error
+{
+public:
+ format_mismatch(const std::string &w): lexical_error(w) { }
+ virtual ~format_mismatch() throw() { }
};
ss.setf(std::ios_base::fmtflags(0), std::ios_base::skipws);
ss>>v;
if(ss.fail() || !ss.eof())
- throw LexicalError("Conversion failure");
+ throw lexical_error("conversion failure");
}
// The main interface to the lexical conversion machinery