Line data Source code
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 0 : static bool ParsePrechecks(const std::string& str) 22 : { 23 0 : if (str.empty()) // No empty string allowed 24 0 : return false; 25 0 : if (str.size() >= 1 && (json_isspace(str[0]) || json_isspace(str[str.size()-1]))) // No padding allowed 26 0 : return false; 27 0 : if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed 28 0 : return false; 29 0 : return true; 30 0 : } 31 : 32 0 : bool ParseDouble(const std::string& str, double *out) 33 : { 34 0 : if (!ParsePrechecks(str)) 35 0 : return false; 36 0 : if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') // No hexadecimal floats allowed 37 0 : return false; 38 0 : std::istringstream text(str); 39 0 : text.imbue(std::locale::classic()); 40 : double result; 41 0 : text >> result; 42 0 : if(out) *out = result; 43 0 : return text.eof() && !text.fail(); 44 0 : } 45 : } 46 : 47 0 : const std::vector<std::string>& UniValue::getKeys() const 48 : { 49 0 : checkType(VOBJ); 50 0 : return keys; 51 : } 52 : 53 0 : const std::vector<UniValue>& UniValue::getValues() const 54 : { 55 0 : if (typ != VOBJ && typ != VARR) 56 0 : throw std::runtime_error("JSON value is not an object or array as expected"); 57 0 : return values; 58 0 : } 59 : 60 0 : bool UniValue::get_bool() const 61 : { 62 0 : checkType(VBOOL); 63 0 : return isTrue(); 64 : } 65 : 66 11 : const std::string& UniValue::get_str() const 67 : { 68 11 : checkType(VSTR); 69 11 : return getValStr(); 70 : } 71 : 72 0 : double UniValue::get_real() const 73 : { 74 0 : checkType(VNUM); 75 : double retval; 76 0 : if (!ParseDouble(getValStr(), &retval)) 77 0 : throw std::runtime_error("JSON double out of range"); 78 0 : return retval; 79 0 : } 80 : 81 0 : const UniValue& UniValue::get_obj() const 82 : { 83 0 : checkType(VOBJ); 84 0 : return *this; 85 : } 86 : 87 0 : const UniValue& UniValue::get_array() const 88 : { 89 0 : checkType(VARR); 90 0 : return *this; 91 : }