- ExtendedASCIICharacterSet()
- {
- if(!globalCharacterSet().isUTF8())
- {
- GIConv descriptor = g_iconv_open("UTF-8", globalCharacterSet().get());
- for(std::size_t i = 1; i < 128; ++i)
- {
- char c = extended_ascii_for_index(i);
- char* inbuf = &c;
- std::size_t inbytesleft = 1;
- char* outbuf = m_converted[i];
- std::size_t outbytesleft = 6;
- if(g_iconv(descriptor, &inbuf, &inbytesleft, &outbuf, &outbytesleft) != (size_t)(-1))
- {
- UTF8Character utf8(m_converted[i]);
- m_decodeMap[i] = utf8;
- m_encodeMap[i] = UTF8CharacterToExtendedASCII(utf8, c);
- }
- }
- g_iconv_close(descriptor);
- std::sort(m_encodeMap, m_encodeMap + 128);
- }
- }
- /// \brief Prints the (up to) 128 characters in the current extended-ascii character set.
- /// Useful for debugging.
- void print() const
- {
- globalOutputStream() << "UTF-8 conversion required from charset: " << globalCharacterSet().get() << "\n";
- for(std::size_t i = 1; i < 128; ++i)
- {
- if(m_decodeMap[i].buffer != 0)
- {
- globalOutputStream() << extended_ascii_for_index(i) << " = " << m_decodeMap[i] << "\n";
- }
- }
- }
- /// \brief Returns \p c decoded from extended-ascii to UTF-8.
- /// \p c must be an extended-ascii character.
- const UTF8Character& decode(char c) const
- {
- ASSERT_MESSAGE(!globalCharacterSet().isUTF8(), "locale is utf8, no conversion required");
- ASSERT_MESSAGE(!char_is_ascii(c), "decode: ascii character");
- ASSERT_MESSAGE(m_decodeMap[extended_ascii_to_index(c)].buffer != 0, "decode: invalid character: " << HexChar(c));
- return m_decodeMap[extended_ascii_to_index(c)];
- }
- /// \brief Returns \p c encoded to extended-ascii from UTF-8.
- /// \p c must map to an extended-ascii character.
- char encode(const UTF8Character& c) const
- {
- ASSERT_MESSAGE(!globalCharacterSet().isUTF8(), "locale is utf8, no conversion required");
- ASSERT_MESSAGE(!char_is_ascii(*c.buffer), "encode: ascii character");
- std::pair<const UTF8CharacterToExtendedASCII*, const UTF8CharacterToExtendedASCII*> range
- = std::equal_range(m_encodeMap, m_encodeMap + 128, UTF8CharacterToExtendedASCII(c, 0));
- ASSERT_MESSAGE(range.first != range.second, "encode: invalid character: " << c);
- return (*range.first).m_c;
- }
+ExtendedASCIICharacterSet(){
+ if ( !globalCharacterSet().isUTF8() ) {
+ GIConv descriptor = g_iconv_open( "UTF-8", globalCharacterSet().get() );
+ for ( std::size_t i = 1; i < 128; ++i )
+ {
+ char c = extended_ascii_for_index( i );
+ char* inbuf = &c;
+ std::size_t inbytesleft = 1;
+ char* outbuf = m_converted[i];
+ std::size_t outbytesleft = 6;
+ if ( g_iconv( descriptor, &inbuf, &inbytesleft, &outbuf, &outbytesleft ) != (size_t)( -1 ) ) {
+ UTF8Character utf8( m_converted[i] );
+ m_decodeMap[i] = utf8;
+ m_encodeMap[i] = UTF8CharacterToExtendedASCII( utf8, c );
+ }
+ }
+ g_iconv_close( descriptor );
+ std::sort( m_encodeMap, m_encodeMap + 128 );
+ }
+}
+/// \brief Prints the (up to) 128 characters in the current extended-ascii character set.
+/// Useful for debugging.
+void print() const {
+ globalOutputStream() << "UTF-8 conversion required from charset: " << globalCharacterSet().get() << "\n";
+ for ( std::size_t i = 1; i < 128; ++i )
+ {
+ if ( m_decodeMap[i].buffer != 0 ) {
+ globalOutputStream() << extended_ascii_for_index( i ) << " = " << m_decodeMap[i] << "\n";
+ }
+ }
+}
+/// \brief Returns \p c decoded from extended-ascii to UTF-8.
+/// \p c must be an extended-ascii character.
+const UTF8Character& decode( char c ) const {
+ ASSERT_MESSAGE( !globalCharacterSet().isUTF8(), "locale is utf8, no conversion required" );
+ ASSERT_MESSAGE( !char_is_ascii( c ), "decode: ascii character" );
+ ASSERT_MESSAGE( m_decodeMap[extended_ascii_to_index( c )].buffer != 0, "decode: invalid character: " << HexChar( c ) );
+ return m_decodeMap[extended_ascii_to_index( c )];
+}
+/// \brief Returns \p c encoded to extended-ascii from UTF-8.
+/// \p c must map to an extended-ascii character.
+char encode( const UTF8Character& c ) const {
+ ASSERT_MESSAGE( !globalCharacterSet().isUTF8(), "locale is utf8, no conversion required" );
+ ASSERT_MESSAGE( !char_is_ascii( *c.buffer ), "encode: ascii character" );
+ std::pair<const UTF8CharacterToExtendedASCII*, const UTF8CharacterToExtendedASCII*> range
+ = std::equal_range( m_encodeMap, m_encodeMap + 128, UTF8CharacterToExtendedASCII( c, 0 ) );
+ ASSERT_MESSAGE( range.first != range.second, "encode: invalid character: " << c );
+ return ( *range.first ).m_c;
+}