31 inline char hex(
unsigned int n )
33 static constexpr std::array<char,17> map {{
"0123456789ABCDEF" }} ;
37 inline bool ishex(
char c ,
bool allow_lowercase )
40 ( c >=
'0' && c <=
'9' ) ||
41 ( allow_lowercase && c >=
'a' && c <=
'f' ) ||
42 ( c >=
'A' && c <=
'F' ) ;
44 inline unsigned int unhex(
char c )
46 unsigned int rc = 0U ;
49 case '0': rc = 0U ; break ;
50 case '1': rc = 1U ; break ;
51 case '2': rc = 2U ; break ;
52 case '3': rc = 3U ; break ;
53 case '4': rc = 4U ; break ;
54 case '5': rc = 5U ; break ;
55 case '6': rc = 6U ; break ;
56 case '7': rc = 7U ; break ;
57 case '8': rc = 8U ; break ;
58 case '9': rc = 9U ; break ;
59 case 'A': rc = 10U ; break ;
60 case 'B': rc = 11U ; break ;
61 case 'C': rc = 12U ; break ;
62 case 'D': rc = 13U ; break ;
63 case 'E': rc = 14U ; break ;
64 case 'F': rc = 15U ; break ;
65 case 'a': rc = 10U ; break ;
66 case 'b': rc = 11U ; break ;
67 case 'c': rc = 12U ; break ;
68 case 'd': rc = 13U ; break ;
69 case 'e': rc = 14U ; break ;
70 case 'f': rc = 15U ; break ;
79 namespace imp = XtextImp ;
86 std::size_t pos = s.find(
'+') ;
87 for( ; pos != std::string::npos ; pos = ((pos+1U)==s.size()?std::string::npos:s.find(
'+',pos+1U)) )
89 if( (pos+2U) >= s.size() )
return false ;
90 if( !imp::ishex(s.at(pos+1U),!strict) )
return false ;
91 if( !imp::ishex(s.at(pos+2U),!strict) )
return false ;
99 namespace imp = XtextImp ;
103 if( c >=
'!' && c <=
'~' && c !=
'=' && c !=
'+' )
105 result.append( 1U , c ) ;
109 unsigned int n =
static_cast<unsigned char>(c) ;
110 result.append( 1U ,
'+' ) ;
111 result.append( 1U , imp::hex( n >> 4U ) ) ;
112 result.append( 1U , imp::hex( n & 0x0f ) ) ;
115 G_ASSERT( decode(result) == s ) ;
121 namespace imp = XtextImp ;
123 result.reserve( s.size() ) ;
124 for(
auto p = s.begin() ; p != s.end() ; ++p )
128 ++p ;
if( p == s.end() ) break ;
129 char h1 = *p++ ;
if( p == s.end() ) break ;
131 unsigned int c = ( imp::unhex(h1) << 4U ) | imp::unhex(h2) ;
132 result.append( 1U ,
static_cast<char>(
static_cast<unsigned char>(c)) ) ;
136 result.append( 1U , *p ) ;
static bool isPrintableAscii(std::string_view s) noexcept
Returns true if every character is between 0x20 and 0x7e inclusive.
static std::string encode(std::string_view)
Encodes the given string.
static std::string decode(std::string_view)
Decodes the given string.
static bool valid(std::string_view, bool strict=false)
Returns true if a valid encoding, or empty.