/*! Generate correct line break characters Makes a line break correct for the encoding and platform. */ void Text_Listener::_genLineBreak(void) { char *pMB = static_cast<char *>(m_mbLineBreak); const UT_UCSChar *pWC = 0; int mbLen = 0; // TODO Old Mac should use "\r". Mac OSX should Use U+2028 or U+2029. #ifdef WIN32 static const UT_UCSChar wcLineBreak[3] = {'\r', '\n', 0}; #else static const UT_UCSChar wcLineBreak[3] = {'\n', 0, 0}; #endif for (pWC = wcLineBreak; *pWC; ++pWC) { if (_wctomb(pMB,mbLen,*pWC)) pMB += mbLen; else UT_ASSERT_NOT_REACHED(); } m_iLineBreakLen = pMB - m_mbLineBreak; UT_ASSERT_HARMLESS(m_iLineBreakLen && m_iLineBreakLen < 20); }
void WordPerfect_Listener::_outputData(const UT_UCSChar * data, UT_uint32 length) { UT_ByteBuf bBuf; const UT_UCSChar * pData; int mbLen; char pC[MY_MB_LEN_MAX+1]; for (pData=data; (pData<data+length); ++pData) { //UT_DEBUGMSG(("WordPerfect Listener: output char: %c\n", *pData)); if (*pData == ' ') { *(m_pie->m_buffer) += (char)0x80; // Soft Space -- FIXME: use defines in ie_imp_wordperfect.h } else if (*pData == UCS_FF) { *(m_pie->m_buffer) += (char)0xC7; // Hard OEP -- FIXME: use defines in ie_imp_wordperfect.h } else if (*pData == '\t') { _handleTabGroup((char)0x11); // Left Tab -- FIXME: support more complete TAB definitions } else { if (*pData > 127) { // FIXME: handle chars > 127!!! continue; } if (!_wctomb(pC,mbLen,*pData)) { //*UT_ASSERT_HARMLESS(!m_bIs16Bit); mbLen=1; pC[0]='?'; m_wctomb.initialize(); } UT_ASSERT_HARMLESS(mbLen>=1); pC[mbLen] = '\0'; *(m_pie->m_buffer) += pC; } } }
/*! Output text buffer to stream \param data Buffer to output \param length Size of buffer */ void Text_Listener::_outputData(const UT_UCSChar * data, UT_uint32 length) { UT_ByteBuf bBuf; const UT_UCSChar * pData; int mbLen; char pC[MY_MB_LEN_MAX]; if (m_bFirstWrite) { if (m_szEncoding) m_wctomb.setOutCharset(m_szEncoding); _genLineBreak(); if (m_bUseBOM) { _genBOM(); m_pie->write(static_cast<const char *>(m_mbBOM),m_iBOMLen); } m_bFirstWrite = false; } for (pData=data; (pData<data+length); ++pData) { // We let any UCS_LF's (forced line breaks) go out as is. if (*pData==UCS_LF) bBuf.append(reinterpret_cast<UT_Byte *>(m_mbLineBreak),m_iLineBreakLen); else { if (!_wctomb(pC,mbLen,*pData)) { UT_ASSERT_HARMLESS(!m_bIs16Bit); mbLen=1; pC[0]='?'; m_wctomb.initialize(); } UT_ASSERT_HARMLESS(mbLen>=1); bBuf.append(reinterpret_cast<const UT_Byte *>(pC),mbLen); } } m_pie->write(reinterpret_cast<const char *>(bBuf.getPointer(0)),bBuf.getLength()); }