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;
 

Reply via email to