univalue_get.cpp raw
1 // Copyright 2014 BitPay Inc.
2 // Copyright 2015 Limenka 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 }
92