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 }