@ -31,6 +31,9 @@
# include <algorithm>
# include <boost/utility/string_ref.hpp>
# undef MONERO_DEFAULT_LOG_CATEGORY
# define MONERO_DEFAULT_LOG_CATEGORY "serialization"
namespace epee
{
namespace misc_utils
@ -62,6 +65,26 @@ namespace misc_utils
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
} ;
static const constexpr unsigned char isx [ 256 ] =
{
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 10 , 11 , 12 , 13 , 14 , 15 , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 10 , 11 , 12 , 13 , 14 , 15 , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
} ;
inline bool isspace ( char c )
{
return lut [ ( uint8_t ) c ] & 8 ;
@ -162,6 +185,42 @@ namespace misc_utils
val . push_back ( ' \\ ' ) ; break ;
case ' / ' : //Slash character
val . push_back ( ' / ' ) ; break ;
case ' u ' : //Unicode code point
if ( buf_end - it < 4 )
{
ASSERT_MES_AND_THROW ( " Invalid Unicode escape sequence " ) ;
}
else
{
uint32_t dst = 0 ;
for ( int i = 0 ; i < 4 ; + + i )
{
const unsigned char tmp = isx [ ( int ) * + + it ] ;
CHECK_AND_ASSERT_THROW_MES ( tmp ! = 0xff , " Bad Unicode encoding " ) ;
dst = dst < < 4 | tmp ;
}
// encode as UTF-8
if ( dst < = 0x7f )
{
val . push_back ( dst ) ;
}
else if ( dst < = 0x7ff )
{
val . push_back ( 0xc0 | ( dst > > 6 ) ) ;
val . push_back ( 0x80 | ( dst & 0x3f ) ) ;
}
else if ( dst < = 0xffff )
{
val . push_back ( 0xe0 | ( dst > > 12 ) ) ;
val . push_back ( 0x80 | ( ( dst > > 6 ) & 0x3f ) ) ;
val . push_back ( 0x80 | ( dst & 0x3f ) ) ;
}
else
{
ASSERT_MES_AND_THROW ( " Unicode code point is out or range " ) ;
}
}
break ;
default :
val . push_back ( * it ) ;
LOG_PRINT_L0 ( " Unknown escape sequence : \" \\ " < < * it < < " \" " ) ;