25#include <rtl/character.hxx>
26#include <rtl/strbuf.hxx>
27#include <rtl/tencinfo.h>
28#include <rtl/ustrbuf.hxx>
36#define RTF_ISDIGIT( c ) rtl::isAsciiDigit(c)
37#define RTF_ISALPHA( c ) rtl::isAsciiAlpha(c)
42 , eCodeSet(RTL_TEXTENCODING_MS_1252)
46 SetSrcEncoding( RTL_TEXTENCODING_MS_1252 );
47 bRTF_InTextRead =
false;
65 nNextCh = GetNextChar();
80 bNextCh = 0 == nNextCh;
104 aToken.appendUtf32(nNextCh);
105 nNextCh = GetNextChar();
110 bool bNegValue =
false;
114 nNextCh = GetNextChar();
120 OUStringBuffer aNumber;
123 nNextCh = GetNextChar();
125 nTokenValue = OUString::unacquired(aNumber).toInt32();
127 nTokenValue = -nTokenValue;
136 nNextCh = GetNextChar();
148 if( 0 <= nTokenValue )
157 aToken.setLength( 0 );
171 while (nNextToken !=
'{' && nNextToken !=
sal_Unicode(EOF) && IsParserWorking());
180 if( !bRTF_InTextRead )
183 aToken = OUStringChar(
static_cast<sal_Unicode>(nTokenValue) );
189 sal_uInt32 cAnsi = nNextCh;
190 while( 0xD == cAnsi )
191 cAnsi = GetNextChar();
192 while( 0xA == cAnsi )
193 cAnsi = GetNextChar();
196 '\'' == GetNextChar() )
199 nNextCh = GetNextChar();
202 bNextCh = 0 == nNextCh;
233 "ParserStateStack unequal to bracket count" );
258 "ParserStateStack unequal to bracket count" );
270 bNextCh = 0 == nNextCh;
275 nNextCh = GetNextChar();
288 for(
n = 0;
n < 2; ++
n )
291 nNextCh = GetNextChar();
292 if( nNextCh >=
'0' && nNextCh <=
'9' )
293 nHexVal += (nNextCh - 48);
294 else if( nNextCh >=
'a' && nNextCh <=
'f' )
295 nHexVal += (nNextCh - 87);
296 else if( nNextCh >=
'A' && nNextCh <=
'F' )
297 nHexVal += (nNextCh - 55);
305 OUStringBuffer aStrBuffer;
306 bool bContinue =
true;
307 while( bContinue && IsParserWorking() && aStrBuffer.getLength() <
MAX_STRING_LEN)
314 nNextCh = GetNextChar();
320 OStringBuffer aByteString;
329 aByteString.append(c);
336 auto next = GetNextChar();
344 if (!aByteString.isEmpty())
346 aStrBuffer.append( OStringToOUString(aByteString, GetSrcEncoding()) );
347 aByteString.setLength(0);
353 nSlash =
static_cast<char>(next);
354 while (nSlash == 0xD || nSlash == 0xA)
355 nSlash =
static_cast<char>(GetNextChar());
365 aByteString.append(nSlash);
376 nNextCh = GetNextChar();
378 if (nSlash !=
'\\' || nNextCh !=
'\'')
381 nNextCh =
static_cast<unsigned char>(nSlash);
388 if (!aByteString.isEmpty())
390 aStrBuffer.append( OStringToOUString(aByteString, GetSrcEncoding()) );
391 aByteString.setLength(0);
402 aStrBuffer.append(
u'\x00A0');
405 aStrBuffer.append(
u'\x00AD');
408 aStrBuffer.append(
u'\x2011');
414 nNextCh = GetNextChar();
419 bRTF_InTextRead =
true;
421 OUString sSave( aToken );
426 aStrBuffer.append(
static_cast< sal_Unicode >(nTokenValue));
433 while( 0xD == cAnsi )
434 cAnsi = GetNextChar();
435 while( 0xA == cAnsi )
436 cAnsi = GetNextChar();
439 '\'' == GetNextChar() )
442 nNextCh = GetNextChar();
446 bRTF_InTextRead =
false;
448 else if (
'c' == nNextCh )
452 nNextCh = GetNextChar();
458 nNewOverread += nNextCh -
'0';
459 nNextCh = GetNextChar();
465 bNextCh = 0x20 == nNextCh;
497 if( nNextCh == cBreak || aStrBuffer.getLength() >=
MAX_STRING_LEN)
503 aStrBuffer.appendUtf32(nNextCh);
507 if (!aStrBuffer.isEmpty())
508 aToken.append( aStrBuffer );
520 if( bContinue && bNextCh )
521 nNextCh = GetNextChar();
524 if (!aStrBuffer.isEmpty())
525 aToken.append( aStrBuffer );
556 SAL_WARN_IF(nTokenValue < 0,
"svtools",
"negative value argument for rtf \\bin keyword");
559 nNextCh = GetNextChar();
561 while (nNextCh==0xa || nNextCh==0xd)
563 nNextCh = GetNextChar();
565 }
while (
sal_Unicode(EOF) != nNextCh && IsParserWorking());
579 nNextChPos = rInput.
Tell();
581 nNextCh =
static_cast<unsigned char>(cFirstCh);
584 eCodeSet = RTL_TEXTENCODING_MS_1252;
588 if(
'{' == GetNextToken() &&
RTF_RTF == GetNextToken() )
612 bool bLooping =
false;
614 while (IsParserWorking() && !bLooping)
616 auto nCurrentTokenIndex = m_nTokenIndex;
617 auto nCurrentToken =
nToken;
651 eCodeSet = RTL_TEXTENCODING_MS_1252;
655 eCodeSet = RTL_TEXTENCODING_APPLE_ROMAN;
659 eCodeSet = RTL_TEXTENCODING_IBM_437;
663 eCodeSet = RTL_TEXTENCODING_IBM_850;
667 eCodeSet = rtl_getTextEncodingFromWindowsCodePage(nTokenValue);
675 if( IsParserWorking() )
679 bLooping = nCurrentTokenIndex == m_nTokenIndex &&
nToken == nCurrentToken;
687 if (eEnc == RTL_TEXTENCODING_DONTKNOW)
692 SetSrcEncoding(eEnc);
rtl_TextEncoding GetCodeSet() const
sal_Unicode GetHexValue()
virtual ~SvRTFParser() override
std::stack< RtfParserState_Impl > aParserStates
virtual void Continue(int nToken) override
rtl_TextEncoding eCodeSet
virtual SvParserState CallParser() override
SvRTFParser(SvStream &rIn, sal_uInt8 nStackSize=3)
static short _inSkipGroup
virtual int GetNextToken_() override
void SetEncoding(rtl_TextEncoding eEnc)
SvStream & ReadChar(char &rChar)
sal_uInt64 SeekRel(sal_Int64 nPos)
#define DBG_ASSERT(sCon, aError)
#define SAL_WARN_IF(condition, area, stream)
const wchar_t *typedef int(__stdcall *DllNativeUnregProc)(int
int GetRTFToken(std::u16string_view rSearch)
rtl_TextEncoding eCodeSet