LCOV - code coverage report
Current view: top level - src/univalue/lib - univalue_get.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 38 46 82.6 %
Date: 2026-06-25 07:23:43 Functions: 9 9 100.0 %

          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             : }

Generated by: LCOV version 1.16