univalue_get.cpp raw

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