/ src / univalue / lib / univalue_get.cpp
univalue_get.cpp
 1  // Copyright 2014 BitPay Inc.
 2  // Copyright 2015 Bitcoin Core Developers
 3  // Distributed under the MIT software license, see the accompanying
 4  // file COPYING or https://opensource.org/licenses/mit-license.php.
 5  
 6  #include <univalue.h>
 7  
 8  #include <cerrno>
 9  #include <cstdint>
10  #include <cstdlib>
11  #include <cstring>
12  #include <limits>
13  #include <locale>
14  #include <sstream>
15  #include <stdexcept>
16  #include <string>
17  #include <vector>
18  
19  namespace
20  {
21  static bool ParsePrechecks(const std::string& str)
22  {
23      if (str.empty()) // No empty string allowed
24          return false;
25      if (str.size() >= 1 && (json_isspace(str[0]) || json_isspace(str[str.size()-1]))) // No padding allowed
26          return false;
27      if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed
28          return false;
29      return true;
30  }
31  
32  bool ParseDouble(const std::string& str, double *out)
33  {
34      if (!ParsePrechecks(str))
35          return false;
36      if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') // No hexadecimal floats allowed
37          return false;
38      std::istringstream text(str);
39      text.imbue(std::locale::classic());
40      double result;
41      text >> result;
42      if(out) *out = result;
43      return text.eof() && !text.fail();
44  }
45  }
46  
47  const std::vector<std::string>& UniValue::getKeys() const
48  {
49      checkType(VOBJ);
50      return keys;
51  }
52  
53  const std::vector<UniValue>& UniValue::getValues() const
54  {
55      if (typ != VOBJ && typ != VARR)
56          throw std::runtime_error("JSON value is not an object or array as expected");
57      return values;
58  }
59  
60  bool UniValue::get_bool() const
61  {
62      checkType(VBOOL);
63      return isTrue();
64  }
65  
66  const std::string& UniValue::get_str() const
67  {
68      checkType(VSTR);
69      return getValStr();
70  }
71  
72  double UniValue::get_real() const
73  {
74      checkType(VNUM);
75      double retval;
76      if (!ParseDouble(getValStr(), &retval))
77          throw std::runtime_error("JSON double out of range");
78      return retval;
79  }
80  
81  const UniValue& UniValue::get_obj() const
82  {
83      checkType(VOBJ);
84      return *this;
85  }
86  
87  const UniValue& UniValue::get_array() const
88  {
89      checkType(VARR);
90      return *this;
91  }