diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-04-16 11:40:20 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-04-16 11:40:20 +0800 |
commit | 2acb5a8ac29ddc6f6894802d255d686fdb18329d (patch) | |
tree | a52c35427e7416f3c43be83c21e7caa85aba96ae /src/main.cpp | |
parent | 8a12037b9f8c3a18c860e6f392ba9cebb3ed5aa6 (diff) | |
download | mrust-2acb5a8ac29ddc6f6894802d255d686fdb18329d.tar.gz |
common - Expand FmtEscaped
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp index 2f392bb7..a9e4868b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -717,3 +717,54 @@ ProgramParams::ProgramParams(int argc, char *argv[]) } } + +::std::ostream& operator<<(::std::ostream& os, const FmtEscaped& x) +{ + os << ::std::hex; + for(auto s = x.s; *s != '\0'; s ++) + { + switch(*s) + { + case '\0': os << "\\0"; break; + case '\n': os << "\\n"; break; + case '\\': os << "\\\\"; break; + case '"': os << "\\\""; break; + default: + uint8_t v = *s; + if( v < 0x80 ) + { + if( v < ' ' || v > 0x7F ) + os << "\\u{" << ::std::hex << (unsigned int)v << "}"; + else + os << v; + } + else if( v < 0xC0 ) + ; + else if( v < 0xE0 ) + { + uint32_t val = (uint32_t)(v & 0x1F) << 6; + v = (uint8_t)*++s; if( (v & 0xC0) != 0x80 ) { s--; continue ; } val |= (uint32_t)v << 6; + os << "\\u{" << ::std::hex << val << "}"; + } + else if( v < 0xF0 ) + { + uint32_t val = (uint32_t)(v & 0x0F) << 12; + v = (uint8_t)*++s; if( (v & 0xC0) != 0x80 ) { s--; continue ; } val |= (uint32_t)v << 12; + v = (uint8_t)*++s; if( (v & 0xC0) != 0x80 ) { s--; continue ; } val |= (uint32_t)v << 6; + os << "\\u{" << ::std::hex << val << "}"; + } + else if( v < 0xF8 ) + { + uint32_t val = (uint32_t)(v & 0x07) << 18; + v = (uint8_t)*++s; if( (v & 0xC0) != 0x80 ) { s--; continue ; } val |= (uint32_t)v << 18; + v = (uint8_t)*++s; if( (v & 0xC0) != 0x80 ) { s--; continue ; } val |= (uint32_t)v << 12; + v = (uint8_t)*++s; if( (v & 0xC0) != 0x80 ) { s--; continue ; } val |= (uint32_t)v << 6; + os << "\\u{" << ::std::hex << val << "}"; + } + break; + } + } + os << ::std::dec; + return os; +} + |