Last active
August 29, 2015 14:23
-
-
Save dexX7/26c24067ef3edac89a02 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace sanitization { | |
inline char to_hex_char( unsigned int c ) | |
{ | |
assert( c <= 0xF ); | |
const char ch = static_cast< char >( c ); | |
if( ch < 10 ) return '0' + ch; | |
return 'A' - 10 + ch; | |
} | |
template< class String_type > | |
String_type non_printable_to_string( unsigned int c ) | |
{ | |
// Silence the warning: typedef ‘Char_type’ locally defined but not used [-Wunused-local-typedefs] | |
// typedef typename String_type::value_type Char_type; | |
String_type result( 6, '\\' ); | |
result[1] = 'u'; | |
result[ 5 ] = to_hex_char( c & 0x000F ); c >>= 4; | |
result[ 4 ] = to_hex_char( c & 0x000F ); c >>= 4; | |
result[ 3 ] = to_hex_char( c & 0x000F ); c >>= 4; | |
result[ 2 ] = to_hex_char( c & 0x000F ); | |
return result; | |
} | |
template< class String_type > | |
String_type add_esc_chars( const String_type& s ) | |
{ | |
typedef typename String_type::const_iterator Iter_type; | |
typedef typename String_type::value_type Char_type; | |
String_type result; | |
const Iter_type end( s.end() ); | |
for( Iter_type i = s.begin(); i != end; ++i ) | |
{ | |
const Char_type c( *i ); | |
const wint_t unsigned_c( ( c >= 0 ) ? c : 256 + c ); | |
if( iswprint( unsigned_c ) ) | |
{ | |
result += c; | |
} | |
else | |
{ | |
result += non_printable_to_string< String_type >( unsigned_c ); | |
} | |
} | |
return result; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment