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