epee: some more minor JSON parsing speedup
This commit is contained in:
parent
e4b049da05
commit
59776a64ff
@ -834,21 +834,21 @@ namespace net_utils
|
|||||||
const char *ptr = m_header_cache.c_str();
|
const char *ptr = m_header_cache.c_str();
|
||||||
CHECK_AND_ASSERT_MES(!memcmp(ptr, "HTTP/", 5), false, "Invalid first response line: " + m_header_cache);
|
CHECK_AND_ASSERT_MES(!memcmp(ptr, "HTTP/", 5), false, "Invalid first response line: " + m_header_cache);
|
||||||
ptr += 5;
|
ptr += 5;
|
||||||
CHECK_AND_ASSERT_MES(isdigit(*ptr), false, "Invalid first response line: " + m_header_cache);
|
CHECK_AND_ASSERT_MES(epee::misc_utils::parse::isdigit(*ptr), false, "Invalid first response line: " + m_header_cache);
|
||||||
unsigned long ul;
|
unsigned long ul;
|
||||||
char *end;
|
char *end;
|
||||||
ul = strtoul(ptr, &end, 10);
|
ul = strtoul(ptr, &end, 10);
|
||||||
CHECK_AND_ASSERT_MES(ul <= INT_MAX && *end =='.', false, "Invalid first response line: " + m_header_cache);
|
CHECK_AND_ASSERT_MES(ul <= INT_MAX && *end =='.', false, "Invalid first response line: " + m_header_cache);
|
||||||
m_response_info.m_http_ver_hi = ul;
|
m_response_info.m_http_ver_hi = ul;
|
||||||
ptr = end + 1;
|
ptr = end + 1;
|
||||||
CHECK_AND_ASSERT_MES(isdigit(*ptr), false, "Invalid first response line: " + m_header_cache + ", ptr: " << ptr);
|
CHECK_AND_ASSERT_MES(epee::misc_utils::parse::isdigit(*ptr), false, "Invalid first response line: " + m_header_cache + ", ptr: " << ptr);
|
||||||
ul = strtoul(ptr, &end, 10);
|
ul = strtoul(ptr, &end, 10);
|
||||||
CHECK_AND_ASSERT_MES(ul <= INT_MAX && isblank(*end), false, "Invalid first response line: " + m_header_cache + ", ptr: " << ptr);
|
CHECK_AND_ASSERT_MES(ul <= INT_MAX && isblank(*end), false, "Invalid first response line: " + m_header_cache + ", ptr: " << ptr);
|
||||||
m_response_info.m_http_ver_lo = ul;
|
m_response_info.m_http_ver_lo = ul;
|
||||||
ptr = end + 1;
|
ptr = end + 1;
|
||||||
while (isblank(*ptr))
|
while (isblank(*ptr))
|
||||||
++ptr;
|
++ptr;
|
||||||
CHECK_AND_ASSERT_MES(isdigit(*ptr), false, "Invalid first response line: " + m_header_cache);
|
CHECK_AND_ASSERT_MES(epee::misc_utils::parse::isdigit(*ptr), false, "Invalid first response line: " + m_header_cache);
|
||||||
ul = strtoul(ptr, &end, 10);
|
ul = strtoul(ptr, &end, 10);
|
||||||
CHECK_AND_ASSERT_MES(ul >= 100 && ul <= 999 && isspace(*end), false, "Invalid first response line: " + m_header_cache);
|
CHECK_AND_ASSERT_MES(ul >= 100 && ul <= 999 && isspace(*end), false, "Invalid first response line: " + m_header_cache);
|
||||||
m_response_info.m_response_code = ul;
|
m_response_info.m_response_code = ul;
|
||||||
|
@ -42,13 +42,14 @@ namespace misc_utils
|
|||||||
// 4: alpha
|
// 4: alpha
|
||||||
// 8: whitespace
|
// 8: whitespace
|
||||||
// 16: allowed in float but doesn't necessarily mean it's a float
|
// 16: allowed in float but doesn't necessarily mean it's a float
|
||||||
|
// 32: \ and " (end of verbatim string)
|
||||||
static const constexpr uint8_t lut[256]={
|
static const constexpr uint8_t lut[256]={
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, // 16
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 0, 0, // 16
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32
|
||||||
8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 18, 0, // 48
|
8, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 18, 0, // 48
|
||||||
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, // 64
|
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, // 64
|
||||||
0, 4, 4, 4, 4, 22, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 80
|
0, 4, 4, 4, 4, 22, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 80
|
||||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, // 96
|
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 32, 0, 0, 0, // 96
|
||||||
0, 4, 4, 4, 4, 22, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 112
|
0, 4, 4, 4, 4, 22, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, // 112
|
||||||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, // 128
|
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, // 128
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
@ -130,7 +131,7 @@ namespace misc_utils
|
|||||||
std::string::const_iterator it = star_end_string;
|
std::string::const_iterator it = star_end_string;
|
||||||
++it;
|
++it;
|
||||||
std::string::const_iterator fi = it;
|
std::string::const_iterator fi = it;
|
||||||
while (fi != buf_end && *fi != '\\' && *fi != '\"')
|
while (fi != buf_end && ((lut[(uint8_t)*fi] & 32)) == 0)
|
||||||
++fi;
|
++fi;
|
||||||
val.assign(it, fi);
|
val.assign(it, fi);
|
||||||
val.reserve(std::distance(star_end_string, buf_end));
|
val.reserve(std::distance(star_end_string, buf_end));
|
||||||
|
@ -144,7 +144,7 @@ POP_WARNINGS
|
|||||||
{
|
{
|
||||||
MTRACE("Converting std::string to uint64_t. Source: " << from);
|
MTRACE("Converting std::string to uint64_t. Source: " << from);
|
||||||
// String only contains digits
|
// String only contains digits
|
||||||
if(std::all_of(from.begin(), from.end(), ::isdigit))
|
if(std::all_of(from.begin(), from.end(), epee::misc_utils::parse::isdigit))
|
||||||
to = boost::lexical_cast<uint64_t>(from);
|
to = boost::lexical_cast<uint64_t>(from);
|
||||||
// MyMonero ISO 8061 timestamp (2017-05-06T16:27:06Z)
|
// MyMonero ISO 8061 timestamp (2017-05-06T16:27:06Z)
|
||||||
else if (boost::regex_match (from, boost::regex("\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\dZ")))
|
else if (boost::regex_match (from, boost::regex("\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\dZ")))
|
||||||
|
@ -42,6 +42,8 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/algorithm/string/predicate.hpp>
|
#include <boost/algorithm/string/predicate.hpp>
|
||||||
|
#include "misc_log_ex.h"
|
||||||
|
#include "storages/parserse_base_utils.h"
|
||||||
#include "hex.h"
|
#include "hex.h"
|
||||||
#include "memwipe.h"
|
#include "memwipe.h"
|
||||||
#include "mlocker.h"
|
#include "mlocker.h"
|
||||||
@ -126,7 +128,7 @@ DISABLE_GCC_WARNING(maybe-uninitialized)
|
|||||||
{
|
{
|
||||||
for (char c : str_id)
|
for (char c : str_id)
|
||||||
{
|
{
|
||||||
if (!std::isdigit(c))
|
if (!epee::misc_utils::parse::isdigit(c))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user