Merge branch 'develop' of github.com:ChaiScript/ChaiScript into develop

This commit is contained in:
Jason Turner 2017-11-30 10:08:26 -07:00
commit e884f0816d

View File

@ -170,44 +170,52 @@ namespace chaiscript {
auto parse_num(const char *t_str) -> typename std::enable_if<!std::is_integral<T>::value, T>::type auto parse_num(const char *t_str) -> typename std::enable_if<!std::is_integral<T>::value, T>::type
{ {
T t = 0; T t = 0;
T base = 0; T base;
T decimal_place = 0; T decimal_place = 0;
bool exponent = false; int exponent = 0;
bool neg_exponent = false;
const auto final_value = [](const T val, const T baseval, const bool hasexp, const bool negexp) -> T { for (char c;; ++t_str) {
if (!hasexp) { c = *t_str;
return val; switch (c)
} else { {
return baseval * std::pow(T(10), val*T(negexp?-1:1)); case '.':
}
};
for(; *t_str != '\0'; ++t_str) {
char c = *t_str;
if (c == '.') {
decimal_place = 10; decimal_place = 10;
} else if (c == 'e' || c == 'E') { break;
exponent = true; case 'e':
case 'E':
exponent = 1;
decimal_place = 0; decimal_place = 0;
base = t; base = t;
t = 0; t = 0;
} else if (c == '-' && exponent) { break;
neg_exponent = true; case '-':
} else if (c == '+' && exponent) { exponent = -1;
neg_exponent = false; break;
} else if (c < '0' || c > '9') { case '+':
return final_value(t, base, exponent, neg_exponent); break;
} else if (decimal_place < T(10)) { case '0':
t *= T(10); case '1':
t += T(c - '0'); case '2':
} else { case '3':
t += (T(c - '0') / (T(decimal_place))); case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (decimal_place < 10) {
t *= 10;
t += c - '0';
}
else {
t += (c - '0') / decimal_place;
decimal_place *= 10; decimal_place *= 10;
} }
break;
default:
return exponent ? base * std::pow(T(10), t * exponent) : t;
}
} }
return final_value(t, base, exponent, neg_exponent);
} }
template<typename T> template<typename T>