/** * Pre-increment operator. Reads the next unicode character and sets * the state appropriately. * Note - not protected against overruns. */ FTUnicodeStringItr& operator++() { cur = next; // unicode handling switch (sizeof(T)) { case 1: // UTF-8 // get this character readUTF8(); break; case 2: // UTF-16 readUTF16(); break; case 4: // UTF-32 // fall through default: // error condition really, but give it a shot anyway curChar = *next_32++; } return *this; }
/*--------------------------------------------------------------------------*/ Tuint CFilterUTF::onFilterReadText(IReader& a_rReader, Twstr a_pBuffer, const Tuint a_cSize) { CALL Tuint wc; Tuint result = 0; Tuint count = a_cSize; Tbuffer dst = (Tbuffer)a_pBuffer; while (count-- > 0) { // Read UTF character. switch (m_UTFType) { case e_UTF8: { if (!readUTF8(a_rReader, wc)) return result; break; } case e_UTF16BE: { if (!readUTF16(a_rReader, wc, true)) return result; break; } case e_UTF16LE: { if (!readUTF16(a_rReader, wc, false)) return result; break; } case e_UTF32BE: { if (!readUTF32(a_rReader, wc, true)) return result; break; } case e_UTF32LE: { if (!readUTF32(a_rReader, wc, true)) return result; break; } case e_AUTODETECT: default: { WARNING(STR("UTF type of the current filter is unknown.")); return result; } } // Convert into the Unicode buffer. #if (defined(__WCHAR_S_UCS2__) || defined(__WCHAR_U_UCS2__)) if ((wc < 0x10000) && !((wc >= 0xD800) && (wc < 0xE000))) { #if defined(__BIG_ENDIAN__) dst[0] = (Tbyte)(wc >> 8); dst[1] = (Tbyte)(wc); #else dst[0] = (Tbyte)(wc); dst[1] = (Tbyte)(wc >> 8); #endif } else {
/*--------------------------------------------------------------------------*/ Tuint CFilterUTF::onFilterReadText(IReader& a_rReader, Tsstr a_pBuffer, const Tuint a_cSize) { CALL Tuint wc; Tuint result = 0; Tuint count = a_cSize; Tbuffer dst = (Tbuffer)a_pBuffer; while (count-- > 0) { // Read UTF character. switch (m_UTFType) { case e_UTF8: { if (!readUTF8(a_rReader, wc)) return result; break; } case e_UTF16BE: { if (!readUTF16(a_rReader, wc, true)) return result; break; } case e_UTF16LE: { if (!readUTF16(a_rReader, wc, false)) return result; break; } case e_UTF32BE: { if (!readUTF32(a_rReader, wc, true)) return result; break; } case e_UTF32LE: { if (!readUTF32(a_rReader, wc, true)) return result; break; } case e_AUTODETECT: default: { WARNING(STR("UTF type of the current filter is unknown.")); return result; } } // Convert into the ASCII buffer. if (wc < 0x100) dst[0] = (Tbyte)(wc); else { WARNING(STR("Cannot convert wide character into the ASCII one (character code is %hU).") COMMA wc); return result; } // Take next character. dst += sizeof(Tschar); ++result; } return result; }