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 http://www.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 : 2455100 : {
# 17 : 2455100 : typ = VNULL;
# 18 : 2455100 : val.clear();
# 19 : 2455100 : keys.clear();
# 20 : 2455100 : values.clear();
# 21 : 2455100 : }
# 22 : :
# 23 : : bool UniValue::setNull()
# 24 : 0 : {
# 25 : 0 : clear();
# 26 : 0 : return true;
# 27 : 0 : }
# 28 : :
# 29 : : bool UniValue::setBool(bool val_)
# 30 : 621658 : {
# 31 : 621658 : clear();
# 32 : 621658 : typ = VBOOL;
# 33 [ + + ]: 621658 : if (val_)
# 34 : 250837 : val = "1";
# 35 : 621658 : return true;
# 36 : 621658 : }
# 37 : :
# 38 : : static bool validNumStr(const std::string& s)
# 39 : 1161142 : {
# 40 : 1161142 : std::string tokenVal;
# 41 : 1161142 : unsigned int consumed;
# 42 : 1161142 : enum jtokentype tt = getJsonToken(tokenVal, consumed, s.data(), s.data() + s.size());
# 43 : 1161142 : return (tt == JTOK_NUMBER);
# 44 : 1161142 : }
# 45 : :
# 46 : : bool UniValue::setNumStr(const std::string& val_)
# 47 : 1161142 : {
# 48 [ - + ]: 1161142 : if (!validNumStr(val_))
# 49 : 0 : return false;
# 50 : :
# 51 : 1161142 : clear();
# 52 : 1161142 : typ = VNUM;
# 53 : 1161142 : val = val_;
# 54 : 1161142 : return true;
# 55 : 1161142 : }
# 56 : :
# 57 : : bool UniValue::setInt(uint64_t val_)
# 58 : 477147 : {
# 59 : 477147 : std::ostringstream oss;
# 60 : :
# 61 : 477147 : oss << val_;
# 62 : :
# 63 : 477147 : return setNumStr(oss.str());
# 64 : 477147 : }
# 65 : :
# 66 : : bool UniValue::setInt(int64_t val_)
# 67 : 653379 : {
# 68 : 653379 : std::ostringstream oss;
# 69 : :
# 70 : 653379 : oss << val_;
# 71 : :
# 72 : 653379 : return setNumStr(oss.str());
# 73 : 653379 : }
# 74 : :
# 75 : : bool UniValue::setFloat(double val_)
# 76 : 30564 : {
# 77 : 30564 : std::ostringstream oss;
# 78 : :
# 79 : 30564 : oss << std::setprecision(16) << val_;
# 80 : :
# 81 : 30564 : bool ret = setNumStr(oss.str());
# 82 : 30564 : typ = VNUM;
# 83 : 30564 : return ret;
# 84 : 30564 : }
# 85 : :
# 86 : : bool UniValue::setStr(const std::string& val_)
# 87 : 446767 : {
# 88 : 446767 : clear();
# 89 : 446767 : typ = VSTR;
# 90 : 446767 : val = val_;
# 91 : 446767 : return true;
# 92 : 446767 : }
# 93 : :
# 94 : : bool UniValue::setArray()
# 95 : 698 : {
# 96 : 698 : clear();
# 97 : 698 : typ = VARR;
# 98 : 698 : return true;
# 99 : 698 : }
# 100 : :
# 101 : : bool UniValue::setObject()
# 102 : 112184 : {
# 103 : 112184 : clear();
# 104 : 112184 : typ = VOBJ;
# 105 : 112184 : return true;
# 106 : 112184 : }
# 107 : :
# 108 : : bool UniValue::push_back(const UniValue& val_)
# 109 : 4566116 : {
# 110 [ - + ]: 4566116 : if (typ != VARR)
# 111 : 0 : return false;
# 112 : :
# 113 : 4566116 : values.push_back(val_);
# 114 : 4566116 : return true;
# 115 : 4566116 : }
# 116 : :
# 117 : : bool UniValue::push_backV(const std::vector<UniValue>& vec)
# 118 : 428 : {
# 119 [ - + ]: 428 : if (typ != VARR)
# 120 : 0 : return false;
# 121 : :
# 122 : 428 : values.insert(values.end(), vec.begin(), vec.end());
# 123 : :
# 124 : 428 : return true;
# 125 : 428 : }
# 126 : :
# 127 : : void UniValue::__pushKV(const std::string& key, const UniValue& val_)
# 128 : 2868947 : {
# 129 : 2868947 : keys.push_back(key);
# 130 : 2868947 : values.push_back(val_);
# 131 : 2868947 : }
# 132 : :
# 133 : : bool UniValue::pushKV(const std::string& key, const UniValue& val_)
# 134 : 2811584 : {
# 135 [ - + ]: 2811584 : if (typ != VOBJ)
# 136 : 0 : return false;
# 137 : :
# 138 : 2811584 : size_t idx;
# 139 [ - + ]: 2811584 : if (findKey(key, idx))
# 140 : 0 : values[idx] = val_;
# 141 : 2811584 : else
# 142 : 2811584 : __pushKV(key, val_);
# 143 : 2811584 : return true;
# 144 : 2811584 : }
# 145 : :
# 146 : : bool UniValue::pushKVs(const UniValue& obj)
# 147 : 5641 : {
# 148 [ - + ][ - + ]: 5641 : if (typ != VOBJ || obj.typ != VOBJ)
# 149 : 0 : return false;
# 150 : :
# 151 [ + + ]: 20778 : for (size_t i = 0; i < obj.keys.size(); i++)
# 152 : 15137 : __pushKV(obj.keys[i], obj.values.at(i));
# 153 : :
# 154 : 5641 : return true;
# 155 : 5641 : }
# 156 : :
# 157 : : void UniValue::getObjMap(std::map<std::string,UniValue>& kv) const
# 158 : 0 : {
# 159 [ # # ]: 0 : if (typ != VOBJ)
# 160 : 0 : return;
# 161 : :
# 162 : 0 : kv.clear();
# 163 [ # # ]: 0 : for (size_t i = 0; i < keys.size(); i++)
# 164 : 0 : kv[keys[i]] = values[i];
# 165 : 0 : }
# 166 : :
# 167 : : bool UniValue::findKey(const std::string& key, size_t& retIdx) const
# 168 : 2842469 : {
# 169 [ + + ]: 20877782 : for (size_t i = 0; i < keys.size(); i++) {
# 170 [ + + ]: 18051590 : if (keys[i] == key) {
# 171 : 16277 : retIdx = i;
# 172 : 16277 : return true;
# 173 : 16277 : }
# 174 : 18051590 : }
# 175 : :
# 176 : 2842469 : return false;
# 177 : 2842469 : }
# 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 : :
# 184 : 0 : for (std::map<std::string,UniValue::VType>::const_iterator it = t.begin();
# 185 [ # # ]: 0 : it != t.end(); ++it) {
# 186 : 0 : size_t idx = 0;
# 187 [ # # ]: 0 : if (!findKey(it->first, idx))
# 188 : 0 : return false;
# 189 : :
# 190 [ # # ]: 0 : if (values.at(idx).getType() != it->second)
# 191 : 0 : return false;
# 192 : 0 : }
# 193 : :
# 194 : 0 : return true;
# 195 : 0 : }
# 196 : :
# 197 : : const UniValue& UniValue::operator[](const std::string& key) const
# 198 : 14937 : {
# 199 [ + + ]: 14937 : if (typ != VOBJ)
# 200 : 18 : return NullUniValue;
# 201 : :
# 202 : 14919 : size_t index = 0;
# 203 [ + + ]: 14919 : if (!findKey(key, index))
# 204 : 2019 : return NullUniValue;
# 205 : :
# 206 : 12900 : return values.at(index);
# 207 : 12900 : }
# 208 : :
# 209 : : const UniValue& UniValue::operator[](size_t index) const
# 210 : 322630 : {
# 211 [ + + ][ - + ]: 322630 : if (typ != VOBJ && typ != VARR)
# 212 : 0 : return NullUniValue;
# 213 [ + + ]: 322630 : if (index >= values.size())
# 214 : 74658 : return NullUniValue;
# 215 : :
# 216 : 247972 : return values.at(index);
# 217 : 247972 : }
# 218 : :
# 219 : : const char *uvTypeName(UniValue::VType t)
# 220 : 125 : {
# 221 [ - + ]: 125 : switch (t) {
# 222 [ - + ]: 0 : case UniValue::VNULL: return "null";
# 223 [ + + ]: 6 : case UniValue::VBOOL: return "bool";
# 224 [ + + ]: 24 : case UniValue::VOBJ: return "object";
# 225 [ + + ]: 5 : case UniValue::VARR: return "array";
# 226 [ + + ]: 41 : case UniValue::VSTR: return "string";
# 227 [ + + ]: 49 : case UniValue::VNUM: return "number";
# 228 : 0 : }
# 229 : :
# 230 : : // not reached
# 231 : 0 : return NULL;
# 232 : 0 : }
# 233 : :
# 234 : : const UniValue& find_value(const UniValue& obj, const std::string& name)
# 235 : 380184 : {
# 236 [ + + ]: 1105011 : for (unsigned int i = 0; i < obj.keys.size(); i++)
# 237 [ + + ]: 1085558 : if (obj.keys[i] == name)
# 238 : 360731 : return obj.values.at(i);
# 239 : :
# 240 : 380184 : return NullUniValue;
# 241 : 380184 : }
# 242 : :
|