sw/source/filter/md/swmd.cxx | 93 ++++++++++++++++++------------------------- sw/source/filter/md/swmd.hxx | 2 2 files changed, 39 insertions(+), 56 deletions(-)
New commits: commit 4f185603001b44d0fb1faf3dd6474f9755fa3450 Author: Mike Kaganski <[email protected]> AuthorDate: Sun Feb 22 17:03:39 2026 +0100 Commit: Mike Kaganski <[email protected]> CommitDate: Tue Feb 24 09:10:40 2026 +0100 Optimize SwMarkdownParser::CallParser a bit Change-Id: Ic4e04b5a2ef8b0d3e1573817616c2e94d8339854 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199989 Reviewed-by: Ujjawal Kumar <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Mike Kaganski <[email protected]> diff --git a/sw/source/filter/md/swmd.cxx b/sw/source/filter/md/swmd.cxx index 5c4d1fc14329..6fd3cabe409e 100644 --- a/sw/source/filter/md/swmd.cxx +++ b/sw/source/filter/md/swmd.cxx @@ -747,7 +747,6 @@ SwMarkdownParser::SwMarkdownParser(SwDoc& rD, SwPaM& rCursor, SvStream& rIn, OUS rCursor.DeleteMark(); m_pPam = &rCursor; m_rInput.ResetError(); - m_nFilesize = m_rInput.TellEnd(); m_rInput.Seek(STREAM_SEEK_TO_BEGIN); m_rInput.ResetError(); } @@ -843,67 +842,54 @@ ErrCode SwMarkdownParser::CallParser() { // use utf8 m_rInput.StartReadingUnicodeText(RTL_TEXTENCODING_DONTKNOW); - if (m_rInput.good()) - { - rtl_TextEncoding eSrcEnc; - const sal_uInt64 nPos = m_rInput.Tell(); //bom size - if (nPos == 2) - eSrcEnc = RTL_TEXTENCODING_UCS2; - else if (nPos == 3) - eSrcEnc = RTL_TEXTENCODING_UTF8; - else - { - SvStreamEndian eEndian; - SfxObjectShell::DetectCharSet(m_rInput, eSrcEnc, eEndian); - if (eSrcEnc == RTL_TEXTENCODING_DONTKNOW) - return ERRCODE_IO_INVALIDCHAR; - m_rInput.SetEndian(eEndian); - } + if (!m_rInput.good()) + { + return ERRCODE_IO_INVALIDCHAR; + } - m_rInput.ResetError(); - m_nFilesize -= nPos; + rtl_TextEncoding eSrcEnc; + const sal_uInt64 nPos = m_rInput.Tell(); //bom size + if (nPos == 2) + eSrcEnc = RTL_TEXTENCODING_UCS2; + else if (nPos == 3) + eSrcEnc = RTL_TEXTENCODING_UTF8; + else + { + SvStreamEndian eEndian; + SfxObjectShell::DetectCharSet(m_rInput, eSrcEnc, eEndian); + if (eSrcEnc == RTL_TEXTENCODING_DONTKNOW) + return ERRCODE_IO_INVALIDCHAR; + m_rInput.SetEndian(eEndian); + } - if (eSrcEnc == RTL_TEXTENCODING_UTF8) - { - m_pArr.reset(new char[m_nFilesize]); - m_rInput.ReadBytes(m_pArr.get(), m_nFilesize); - } - else - { - OString sUtf8Data; - if (eSrcEnc == RTL_TEXTENCODING_UCS2) - { - if (m_nFilesize & 1) - return ERRCODE_IO_INVALIDCHAR; + m_rInput.ResetError(); + const sal_uInt64 nFilesize = m_rInput.remainingSize(); + OString sUtf8Data; - const sal_uInt64 nChars = m_nFilesize / 2; - OUString sData = read_uInt16s_ToOUString(m_rInput, nChars); - sUtf8Data = OUStringToOString(sData, RTL_TEXTENCODING_UTF8); - } - else - { - OUString sData = read_uInt8s_ToOUString(m_rInput, m_nFilesize, eSrcEnc); - sUtf8Data = OUStringToOString(sData, RTL_TEXTENCODING_UTF8); - } + if (eSrcEnc == RTL_TEXTENCODING_UCS2) + { + if (nFilesize & 1) + return ERRCODE_IO_INVALIDCHAR; - if (sUtf8Data.getLength()) - { - m_nFilesize = sUtf8Data.getLength(); - m_pArr.reset(new char[m_nFilesize]); - memcpy(m_pArr.get(), sUtf8Data.getStr(), m_nFilesize); - } - else - { - return ERRCODE_IO_INVALIDCHAR; - } - } + const sal_uInt64 nChars = nFilesize / 2; + OUString sData = read_uInt16s_ToOUString(m_rInput, nChars); + sUtf8Data = OUStringToOString(sData, RTL_TEXTENCODING_UTF8); } else + { + sUtf8Data = read_uInt8s_ToOString(m_rInput, nFilesize); + if (eSrcEnc != RTL_TEXTENCODING_UTF8) + { + OUString sData = OStringToOUString(sUtf8Data, eSrcEnc); + sUtf8Data = OUStringToOString(sData, RTL_TEXTENCODING_UTF8); + } + } + if (sUtf8Data.isEmpty()) { return ERRCODE_IO_INVALIDCHAR; } - ::StartProgress(STR_STATSTR_W4WREAD, 0, m_nFilesize, m_xDoc->GetDocShell()); + ::StartProgress(STR_STATSTR_W4WREAD, 0, sUtf8Data.getLength(), m_xDoc->GetDocShell()); SwTextFormatColl* pColl = m_xDoc->getIDocumentStylePoolAccess().GetTextCollFromPool(RES_POOLCOLL_TEXT); @@ -921,7 +907,7 @@ ErrCode SwMarkdownParser::CallParser() nullptr, nullptr }; - int result = md_parse(m_pArr.get(), m_nFilesize, &parser, static_cast<void*>(this)); + int result = md_parse(sUtf8Data.getStr(), sUtf8Data.getLength(), &parser, this); if (result != 0) { @@ -934,7 +920,6 @@ ErrCode SwMarkdownParser::CallParser() SwMarkdownParser::~SwMarkdownParser() { - m_pArr.reset(); m_pNumRuleInfo.reset(); m_xDoc.clear(); } diff --git a/sw/source/filter/md/swmd.hxx b/sw/source/filter/md/swmd.hxx index afc3f9b145e2..f4a88541e8b0 100644 --- a/sw/source/filter/md/swmd.hxx +++ b/sw/source/filter/md/swmd.hxx @@ -80,9 +80,7 @@ class SwMarkdownParser SwPaM* m_pPam; SvStream& m_rInput; // SfxMedium* m_pMedium; - std::unique_ptr<char[]> m_pArr; std::unique_ptr<SwMdNumRuleInfo> m_pNumRuleInfo; - sal_uInt64 m_nFilesize; MDAttrStack m_aAttrStack;
