30 inline char hex(
unsigned int n )
32 static const char * map =
"0123456789ABCDEF" ;
35 inline bool ishex(
char c ,
bool allow_lowercase )
38 ( c >=
'0' && c <=
'9' ) ||
39 ( allow_lowercase && c >=
'a' && c <=
'f' ) ||
40 ( c >=
'A' && c <=
'F' ) ;
42 inline unsigned int unhex(
char c )
44 unsigned int rc = 0U ;
47 case '0': rc = 0U ; break ;
48 case '1': rc = 1U ; break ;
49 case '2': rc = 2U ; break ;
50 case '3': rc = 3U ; break ;
51 case '4': rc = 4U ; break ;
52 case '5': rc = 5U ; break ;
53 case '6': rc = 6U ; break ;
54 case '7': rc = 7U ; break ;
55 case '8': rc = 8U ; break ;
56 case '9': rc = 9U ; break ;
57 case 'A': rc = 10U ; break ;
58 case 'B': rc = 11U ; break ;
59 case 'C': rc = 12U ; break ;
60 case 'D': rc = 13U ; break ;
61 case 'E': rc = 14U ; break ;
62 case 'F': rc = 15U ; break ;
63 case 'a': rc = 10U ; break ;
64 case 'b': rc = 11U ; break ;
65 case 'c': rc = 12U ; break ;
66 case 'd': rc = 13U ; break ;
67 case 'e': rc = 14U ; break ;
68 case 'f': rc = 15U ; break ;
77 namespace imp = XtextImp ;
84 std::size_t pos = s.find(
'+') ;
85 for( ; pos != std::string::npos ; pos = ((pos+1U)==s.size()?std::string::npos:s.find(
'+',pos+1U)) )
87 if( (pos+2U) >= s.size() )
return false ;
88 if( !imp::ishex(s.at(pos+1U),!strict) )
return false ;
89 if( !imp::ishex(s.at(pos+2U),!strict) )
return false ;
97 namespace imp = XtextImp ;
101 if( c >=
'!' && c <=
'~' && c !=
'=' && c !=
'+' )
103 result.append( 1U , c ) ;
107 unsigned int n =
static_cast<unsigned char>(c) ;
108 result.append( 1U ,
'+' ) ;
109 result.append( 1U , imp::hex( n >> 4U ) ) ;
110 result.append( 1U , imp::hex( n & 0x0f ) ) ;
113 G_ASSERT( decode(result) == s ) ;
119 namespace imp = XtextImp ;
121 for( std::string::const_iterator p = s.begin() ; p != s.end() ; ++p )
125 ++p ;
if( p == s.end() ) break ;
126 char h1 = *p++ ;
if( p == s.end() ) break ;
128 unsigned int c = ( imp::unhex(h1) << 4U ) | imp::unhex(h2) ;
129 result.append( 1U ,
static_cast<char>(
static_cast<unsigned char>(c)) ) ;
133 result.append( 1U , *p ) ;
static bool isPrintableAscii(const std::string &s)
Returns true if every character is a 7-bit, non-control character (ie.
static std::string decode(const std::string &)
Decodes the given string.
static bool valid(const std::string &, bool strict=false)
Returns true if a valid encoding.
static std::string encode(const std::string &)
Encodes the given string.