Exemple #1
0
 /**
  * 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;
 }
Exemple #2
0
/*--------------------------------------------------------------------------*/
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
      {
Exemple #3
0
/*--------------------------------------------------------------------------*/
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;
}