Branch data 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 <stdint.h>
# 7 : : #include <iomanip>
# 8 : : #include <sstream>
# 9 : : #include <stdlib.h>
# 10 : :
# 11 : : #include "univalue.h"
# 12 : :
# 13 : : const UniValue NullUniValue;
# 14 : :
# 15 : : void UniValue::clear()
# 16 : 2336409 : {
# 17 : 2336409 : typ = VNULL;
# 18 : 2336409 : val.clear();
# 19 : 2336409 : keys.clear();
# 20 : 2336409 : values.clear();
# 21 : 2336409 : }
# 22 : :
# 23 : : bool UniValue::setNull()
# 24 : 0 : {
# 25 : 0 : clear();
# 26 : 0 : return true;
# 27 : 0 : }
# 28 : :
# 29 : : bool UniValue::setBool(bool val_)
# 30 : 600641 : {
# 31 : 600641 : clear();
# 32 : 600641 : typ = VBOOL;
# 33 [ + + ]: 600641 : if (val_)
# 34 : 232795 : val = "1";
# 35 : 600641 : return true;
# 36 : 600641 : }
# 37 : :
# 38 : : static bool validNumStr(const std::string& s)
# 39 : 981695 : {
# 40 : 981695 : std::string tokenVal;
# 41 : 981695 : unsigned int consumed;
# 42 : 981695 : enum jtokentype tt = getJsonToken(tokenVal, consumed, s.data(), s.data() + s.size());
# 43 : 981695 : return (tt == JTOK_NUMBER);
# 44 : 981695 : }
# 45 : :
# 46 : : bool UniValue::setNumStr(const std::string& val_)
# 47 : 981695 : {
# 48 [ - + ]: 981695 : if (!validNumStr(val_))
# 49 : 0 : return false;
# 50 : :
# 51 : 981695 : clear();
# 52 : 981695 : typ = VNUM;
# 53 : 981695 : val = val_;
# 54 : 981695 : return true;
# 55 : 981695 : }
# 56 : :
# 57 : : bool UniValue::setInt(uint64_t val_)
# 58 : 486866 : {
# 59 : 486866 : std::ostringstream oss;
# 60 : :
# 61 : 486866 : oss << val_;
# 62 : :
# 63 : 486866 : return setNumStr(oss.str());
# 64 : 486866 : }
# 65 : :
# 66 : : bool UniValue::setInt(int64_t val_)
# 67 : 455329 : {
# 68 : 455329 : std::ostringstream oss;
# 69 : :
# 70 : 455329 : oss << val_;
# 71 : :
# 72 : 455329 : return setNumStr(oss.str());
# 73 : 455329 : }
# 74 : :
# 75 : : bool UniValue::setFloat(double val_)
# 76 : 39448 : {
# 77 : 39448 : std::ostringstream oss;
# 78 : :
# 79 : 39448 : oss << std::setprecision(16) << val_;
# 80 : :
# 81 : 39448 : bool ret = setNumStr(oss.str());
# 82 : 39448 : typ = VNUM;
# 83 : 39448 : return ret;
# 84 : 39448 : }
# 85 : :
# 86 : : bool UniValue::setStr(const std::string& val_)
# 87 : 473541 : {
# 88 : 473541 : clear();
# 89 : 473541 : typ = VSTR;
# 90 : 473541 : val = val_;
# 91 : 473541 : return true;
# 92 : 473541 : }
# 93 : :
# 94 : : bool UniValue::setArray()
# 95 : 774 : {
# 96 : 774 : clear();
# 97 : 774 : typ = VARR;
# 98 : 774 : return true;
# 99 : 774 : }
# 100 : :
# 101 : : bool UniValue::setObject()
# 102 : 139605 : {
# 103 : 139605 : clear();
# 104 : 139605 : typ = VOBJ;
# 105 : 139605 : return true;
# 106 : 139605 : }
# 107 : :
# 108 : : bool UniValue::push_back(const UniValue& val_)
# 109 : 631938 : {
# 110 [ - + ]: 631938 : if (typ != VARR)
# 111 : 0 : return false;
# 112 : :
# 113 : 631938 : values.push_back(val_);
# 114 : 631938 : return true;
# 115 : 631938 : }
# 116 : :
# 117 : : bool UniValue::push_backV(const std::vector<UniValue>& vec)
# 118 : 450 : {
# 119 [ - + ]: 450 : if (typ != VARR)
# 120 : 0 : return false;
# 121 : :
# 122 : 450 : values.insert(values.end(), vec.begin(), vec.end());
# 123 : :
# 124 : 450 : return true;
# 125 : 450 : }
# 126 : :
# 127 : : void UniValue::__pushKV(const std::string& key, const UniValue& val_)
# 128 : 2325400 : {
# 129 : 2325400 : keys.push_back(key);
# 130 : 2325400 : values.push_back(val_);
# 131 : 2325400 : }
# 132 : :
# 133 : : bool UniValue::pushKV(const std::string& key, const UniValue& val_)
# 134 : 2307242 : {
# 135 [ + + ]: 2307242 : if (typ != VOBJ)
# 136 : 8 : return false;
# 137 : :
# 138 : 2307234 : size_t idx;
# 139 [ + + ]: 2307234 : if (findKey(key, idx))
# 140 : 1 : values[idx] = val_;
# 141 : 2307233 : else
# 142 : 2307233 : __pushKV(key, val_);
# 143 : 2307234 : return true;
# 144 : 2307242 : }
# 145 : :
# 146 : : bool UniValue::pushKVs(const UniValue& obj)
# 147 : 6182 : {
# 148 [ - + ][ - + ]: 6182 : if (typ != VOBJ || obj.typ != VOBJ)
# 149 : 0 : return false;
# 150 : :
# 151 [ + + ]: 22881 : for (size_t i = 0; i < obj.keys.size(); i++)
# 152 : 16699 : __pushKV(obj.keys[i], obj.values.at(i));
# 153 : :
# 154 : 6182 : return true;
# 155 : 6182 : }
# 156 : :
# 157 : : void UniValue::getObjMap(std::map<std::string,UniValue>& kv) const
# 158 : 169270 : {
# 159 [ - + ]: 169270 : if (typ != VOBJ)
# 160 : 0 : return;
# 161 : :
# 162 : 169270 : kv.clear();
# 163 [ + + ]: 1549142 : for (size_t i = 0; i < keys.size(); i++)
# 164 : 1379872 : kv[keys[i]] = values[i];
# 165 : 169270 : }
# 166 : :
# 167 : : bool UniValue::findKey(const std::string& key, size_t& retIdx) const
# 168 : 2349844 : {
# 169 [ + + ]: 17723826 : for (size_t i = 0; i < keys.size(); i++) {
# 170 [ + + ]: 15395186 : if (keys[i] == key) {
# 171 : 21204 : retIdx = i;
# 172 : 21204 : return true;
# 173 : 21204 : }
# 174 : 15395186 : }
# 175 : :
# 176 : 2328640 : return false;
# 177 : 2349844 : }
# 178 : :
# 179 : : bool UniValue::checkObject(const std::map<std::string,UniValue::VType>& t) const
# 180 : 0 : {
# 181 [ # # ]: 0 : if (typ != VOBJ) {
# 182 : 0 : return false;
# 183 : 0 : }
# 184 : :
# 185 [ # # ]: 0 : for (const auto& object: t) {
# 186 : 0 : size_t idx = 0;
# 187 [ # # ]: 0 : if (!findKey(object.first, idx)) {
# 188 : 0 : return false;
# 189 : 0 : }
# 190 : :
# 191 [ # # ]: 0 : if (values.at(idx).getType() != object.second) {
# 192 : 0 : return false;
# 193 : 0 : }
# 194 : 0 : }
# 195 : :
# 196 : 0 : return true;
# 197 : 0 : }
# 198 : :
# 199 : : const UniValue& UniValue::operator[](const std::string& key) const
# 200 : 19612 : {
# 201 [ + + ]: 19612 : if (typ != VOBJ)
# 202 : 20 : return NullUniValue;
# 203 : :
# 204 : 19592 : size_t index = 0;
# 205 [ + + ]: 19592 : if (!findKey(key, index))
# 206 : 2964 : return NullUniValue;
# 207 : :
# 208 : 16628 : return values.at(index);
# 209 : 19592 : }
# 210 : :
# 211 : : const UniValue& UniValue::operator[](size_t index) const
# 212 : 1348045 : {
# 213 [ + + ][ - + ]: 1348045 : if (typ != VOBJ && typ != VARR)
# 214 : 0 : return NullUniValue;
# 215 [ + + ]: 1348045 : if (index >= values.size())
# 216 : 113829 : return NullUniValue;
# 217 : :
# 218 : 1234216 : return values.at(index);
# 219 : 1348045 : }
# 220 : :
# 221 : : const char *uvTypeName(UniValue::VType t)
# 222 : 125 : {
# 223 [ - + ]: 125 : switch (t) {
# 224 [ - + ]: 0 : case UniValue::VNULL: return "null";
# 225 [ + + ]: 6 : case UniValue::VBOOL: return "bool";
# 226 [ + + ]: 24 : case UniValue::VOBJ: return "object";
# 227 [ + + ]: 5 : case UniValue::VARR: return "array";
# 228 [ + + ]: 41 : case UniValue::VSTR: return "string";
# 229 [ + + ]: 49 : case UniValue::VNUM: return "number";
# 230 : 125 : }
# 231 : :
# 232 : : // not reached
# 233 : 0 : return nullptr;
# 234 : 125 : }
# 235 : :
# 236 : : const UniValue& find_value(const UniValue& obj, const std::string& name)
# 237 : 466789 : {
# 238 [ + + ]: 1362195 : for (unsigned int i = 0; i < obj.keys.size(); i++)
# 239 [ + + ]: 1338574 : if (obj.keys[i] == name)
# 240 : 443168 : return obj.values.at(i);
# 241 : :
# 242 : 23621 : return NullUniValue;
# 243 : 466789 : }
# 244 : :
|