aboutsummaryrefslogtreecommitdiff
path: root/contrib/epee
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2018-11-16 11:00:56 +0200
committerRiccardo Spagni <ric@spagni.net>2018-11-16 11:00:56 +0200
commit3880cae134b62d6948fce8d5583e043430fd4773 (patch)
tree1a562ee52ad6e4e86f59b0f0649c10456448fbba /contrib/epee
parentMerge pull request #4770 (diff)
parentepee: speed up json number parsing (diff)
downloadmonero-3880cae134b62d6948fce8d5583e043430fd4773.tar.xz
Merge pull request #4775
741e4a11 epee: speed up json number parsing (moneromooo-monero)
Diffstat (limited to 'contrib/epee')
-rw-r--r--contrib/epee/include/storages/portable_storage_from_json.h52
1 files changed, 41 insertions, 11 deletions
diff --git a/contrib/epee/include/storages/portable_storage_from_json.h b/contrib/epee/include/storages/portable_storage_from_json.h
index 5b2eafa9a..0307b732c 100644
--- a/contrib/epee/include/storages/portable_storage_from_json.h
+++ b/contrib/epee/include/storages/portable_storage_from_json.h
@@ -125,16 +125,22 @@ namespace epee
{
if(is_signed)
{
- int64_t nval = boost::lexical_cast<int64_t>(val);
+ errno = 0;
+ int64_t nval = strtoll(val.c_str(), NULL, 10);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
stg.set_value(name, nval, current_section);
}else
{
- uint64_t nval = boost::lexical_cast<uint64_t >(val);
+ errno = 0;
+ uint64_t nval = strtoull(val.c_str(), NULL, 10);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
stg.set_value(name, nval, current_section);
}
}else
{
- double nval = boost::lexical_cast<double>(val);
+ errno = 0;
+ double nval = strtod(val.c_str(), NULL);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
stg.set_value(name, nval, current_section);
}
state = match_state_wonder_after_value;
@@ -208,12 +214,25 @@ namespace epee
match_number2(it, buf_end, val, is_v_float, is_signed_val);
if(!is_v_float)
{
- int64_t nval = boost::lexical_cast<int64_t>(val);//bool res = string_tools::string_to_num_fast(val, nval);
- h_array = stg.insert_first_value(name, nval, current_section);
+ if (is_signed_val)
+ {
+ errno = 0;
+ int64_t nval = strtoll(val.c_str(), NULL, 10);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
+ h_array = stg.insert_first_value(name, nval, current_section);
+ }else
+ {
+ errno = 0;
+ uint64_t nval = strtoull(val.c_str(), NULL, 10);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
+ h_array = stg.insert_first_value(name, nval, current_section);
+ }
CHECK_AND_ASSERT_THROW_MES(h_array, " failed to insert values section entry");
}else
{
- double nval = boost::lexical_cast<double>(val);//bool res = string_tools::string_to_num_fast(val, nval);
+ errno = 0;
+ double nval = strtod(val.c_str(), NULL);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
h_array = stg.insert_first_value(name, nval, current_section);
CHECK_AND_ASSERT_THROW_MES(h_array, " failed to insert values section entry");
}
@@ -286,13 +305,24 @@ namespace epee
bool insert_res = false;
if(!is_v_float)
{
- int64_t nval = boost::lexical_cast<int64_t>(val); //bool res = string_tools::string_to_num_fast(val, nval);
- insert_res = stg.insert_next_value(h_array, nval);
-
+ if (is_signed_val)
+ {
+ errno = 0;
+ int64_t nval = strtoll(val.c_str(), NULL, 10);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
+ insert_res = stg.insert_next_value(h_array, nval);
+ }else
+ {
+ errno = 0;
+ uint64_t nval = strtoull(val.c_str(), NULL, 10);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
+ insert_res = stg.insert_next_value(h_array, nval);
+ }
}else
{
- //TODO: optimize here if need
- double nval = boost::lexical_cast<double>(val); //string_tools::string_to_num_fast(val, nval);
+ errno = 0;
+ double nval = strtod(val.c_str(), NULL);
+ if (errno) throw std::runtime_error("Invalid number: " + val);
insert_res = stg.insert_next_value(h_array, nval);
}
CHECK_AND_ASSERT_THROW_MES(insert_res, "Failed to insert next value");