diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-12T11·49+0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-12T11·49+0100 |
commit | b3e8d72770b4100843c60b35633e529e6e69d543 (patch) | |
tree | f50070c3c31dd862b837bb514a9e0b10e68216a1 /src/libexpr/json-to-value.cc | |
parent | ae4a3cfa030438ca05ad3bf61fa301dee6c1dbb5 (diff) | |
parent | 5cdcaf5e8edd6679f667502eec421ac4e725d4ef (diff) |
Merge pull request #762 from ctheune/ctheune-floats
Implement floats
Diffstat (limited to 'src/libexpr/json-to-value.cc')
-rw-r--r-- | src/libexpr/json-to-value.cc | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/libexpr/json-to-value.cc b/src/libexpr/json-to-value.cc index 0898b560911b..7ef2b2c56227 100644 --- a/src/libexpr/json-to-value.cc +++ b/src/libexpr/json-to-value.cc @@ -105,17 +105,22 @@ static void parseJSON(EvalState & state, const char * & s, Value & v) mkString(v, parseJSONString(s)); } - else if (isdigit(*s) || *s == '-') { - bool neg = false; - if (*s == '-') { - neg = true; - if (!*++s) throw JSONParseError("unexpected end of JSON number"); + else if (isdigit(*s) || *s == '-' || *s == '.' ) { + // Buffer into a string first, then use built-in C++ conversions + std::string tmp_number; + ValueType number_type = tInt; + + while (isdigit(*s) || *s == '-' || *s == '.' || *s == 'e' || *s == 'E') { + if (*s == '.' || *s == 'e' || *s == 'E') + number_type = tFloat; + tmp_number.append(*s++, 1); + } + + if (number_type == tFloat) { + mkFloat(v, stod(tmp_number)); + } else { + mkInt(v, stoi(tmp_number)); } - NixInt n = 0; - // FIXME: detect overflow - while (isdigit(*s)) n = n * 10 + (*s++ - '0'); - if (*s == '.' || *s == 'e') throw JSONParseError("floating point JSON numbers are not supported"); - mkInt(v, neg ? -n : n); } else if (strncmp(s, "true", 4) == 0) { |