[Libreoffice-commits] core.git: 3 commits - editeng/qa editeng/source include/editeng sw/source

Caolán McNamara caolanm at redhat.com
Wed Sep 18 07:06:41 PDT 2013


 editeng/qa/unit/core-test.cxx       |    9 +----
 editeng/source/editeng/edtspell.cxx |    4 +-
 editeng/source/editeng/edtspell.hxx |    2 -
 editeng/source/misc/svxacorr.cxx    |   61 +++++++++++++++++++-----------------
 include/editeng/svxacorr.hxx        |   12 +++----
 sw/source/core/edit/acorrect.cxx    |    2 -
 sw/source/core/edit/autofmt.cxx     |    2 -
 sw/source/core/edit/edws.cxx        |    2 -
 sw/source/core/inc/acorrect.hxx     |    2 -
 9 files changed, 49 insertions(+), 47 deletions(-)

New commits:
commit 163975fd413be1751b8624f8724af441433039d4
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Sep 18 13:51:35 2013 +0100

    convert SvxAutoCorrect::DoAutoCorrect to OUString
    
    which makes autocorrect in the editengine work again
    
    Change-Id: I97d56448e4abd6e563479ffee706b86cb04199ec

diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx
index e8958e1..57c62c3 100644
--- a/editeng/qa/unit/core-test.cxx
+++ b/editeng/qa/unit/core-test.cxx
@@ -272,8 +272,8 @@ private:
         //fprintf(stderr, "TestAutoCorrDoc::GetPrevPara\n");
         return OUString();
     }
-    virtual sal_Bool ChgAutoCorrWord( sal_uInt16& rSttPos,
-                sal_uInt16 nEndPos, SvxAutoCorrect& rACorrect,
+    virtual bool ChgAutoCorrWord( sal_Int32& rSttPos,
+                sal_Int32 nEndPos, SvxAutoCorrect& rACorrect,
                 OUString* pPara )
     {
         //fprintf(stderr, "TestAutoCorrDoc::ChgAutoCorrWord\n");
@@ -333,10 +333,7 @@ void Test::testAutocorrect()
         OUString sExpected("foo");
 
         TestAutoCorrDoc aFoo(sInput, LANGUAGE_ENGLISH_US);
-        String const& rInput2(reinterpret_cast<String const&>(aFoo.getResult()));
-        aAutoCorrect.DoAutoCorrect(aFoo,
-            rInput2,
-            sInput.getLength(), cNextChar, true);
+        aAutoCorrect.DoAutoCorrect(aFoo, sInput, sInput.getLength(), cNextChar, true);
 
         CPPUNIT_ASSERT_EQUAL(sExpected, aFoo.getResult());
     }
diff --git a/editeng/source/editeng/edtspell.cxx b/editeng/source/editeng/edtspell.cxx
index 4ac3157..6787981 100644
--- a/editeng/source/editeng/edtspell.cxx
+++ b/editeng/source/editeng/edtspell.cxx
@@ -727,8 +727,8 @@ OUString EdtAutoCorrDoc::GetPrevPara( sal_Bool )
 
 }
 
-sal_Bool EdtAutoCorrDoc::ChgAutoCorrWord( sal_uInt16& rSttPos,
-            sal_uInt16 nEndPos, SvxAutoCorrect& rACorrect,
+bool EdtAutoCorrDoc::ChgAutoCorrWord( sal_Int32& rSttPos,
+            sal_Int32 nEndPos, SvxAutoCorrect& rACorrect,
             OUString* pPara )
 {
     // Paragraph-start or a blank found, search for the word
diff --git a/editeng/source/editeng/edtspell.hxx b/editeng/source/editeng/edtspell.hxx
index 76d0c0d..04a3397 100644
--- a/editeng/source/editeng/edtspell.hxx
+++ b/editeng/source/editeng/edtspell.hxx
@@ -149,7 +149,7 @@ public:
 
     virtual OUString    GetPrevPara( sal_Bool bAtNormalPos );
 
-    virtual sal_Bool    ChgAutoCorrWord( sal_uInt16& rSttPos, sal_uInt16 nEndPos,
+    virtual bool        ChgAutoCorrWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
                                   SvxAutoCorrect& rACorrect, OUString* pPara );
 
     virtual LanguageType GetLanguage( sal_uInt16 nPos, sal_Bool bPrevPara = sal_False ) const;
diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index ab82308..14d3de7 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -1229,7 +1229,7 @@ OUString SvxAutoCorrect::GetQuote( SvxAutoCorrDoc& rDoc, xub_StrLen nInsPos,
 }
 
 sal_uLong
-SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
+SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt,
                                     xub_StrLen nInsPos, sal_Unicode cChar,
                                     sal_Bool bInsert, Window* pFrameWin )
 {
@@ -1243,7 +1243,7 @@ SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
             // Prevent double space
             if( nInsPos && ' ' == cChar &&
                 IsAutoCorrFlag( IgnoreDoubleSpace ) &&
-                ' ' == rTxt.GetChar( nInsPos - 1 ) )
+                ' ' == rTxt[ nInsPos - 1 ])
             {
                 nRet = IgnoreDoubleSpace;
                 break;
@@ -1257,7 +1257,7 @@ SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
             {
                 sal_Unicode cPrev;
                 sal_Bool bSttQuote = !nInsPos ||
-                        IsWordDelim( ( cPrev = rTxt.GetChar( nInsPos-1 ))) ||
+                        IsWordDelim( ( cPrev = rTxt[ nInsPos-1 ])) ||
                         lcl_IsInAsciiArr( "([{", cPrev ) ||
                         ( cEmDash && cEmDash == cPrev ) ||
                         ( cEnDash && cEnDash == cPrev );
@@ -1283,15 +1283,15 @@ SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
                 else if ( bIsNextRun && !IsAutoCorrectChar( cChar ) )
                 {
                     // Remove the NBSP if it wasn't an autocorrection
-                    if ( nInsPos != 0 && NeedsHardspaceAutocorr( rTxt.GetChar( nInsPos - 1 ) ) &&
+                    if ( nInsPos != 0 && NeedsHardspaceAutocorr( rTxt[ nInsPos - 1 ] ) &&
                             cChar != ' ' && cChar != '\t' && cChar != CHAR_HARDBLANK )
                     {
                         // Look for the last HARD_SPACE
-                        xub_StrLen nPos = nInsPos - 1;
+                        sal_Int32 nPos = nInsPos - 1;
                         bool bContinue = true;
                         while ( bContinue )
                         {
-                            const sal_Unicode cTmpChar = rTxt.GetChar( nPos );
+                            const sal_Unicode cTmpChar = rTxt[ nPos ];
                             if ( cTmpChar == CHAR_HARDBLANK )
                             {
                                 rDoc.Delete( nPos, nPos + 1 );
@@ -1310,13 +1310,13 @@ SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
         if( !nInsPos )
             break;
 
-        xub_StrLen nPos = nInsPos - 1;
+        sal_Int32 nPos = nInsPos - 1;
 
-        if( IsWordDelim( rTxt.GetChar( nPos )))
+        if( IsWordDelim( rTxt[ nPos ]))
             break;
 
         // Set bold or underline automatically?
-        if( '*' == cChar || '_' == cChar )
+        if (('*' == cChar || '_' == cChar) && (nPos+1 < rTxt.getLength()))
         {
             if( IsAutoCorrFlag( ChgWeightUnderl ) &&
                 FnChgWeightUnderl( rDoc, rTxt, 0, nPos+1 ) )
@@ -1324,13 +1324,13 @@ SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
             break;
         }
 
-        while( nPos && !IsWordDelim( rTxt.GetChar( --nPos )))
+        while( nPos && !IsWordDelim( rTxt[ --nPos ]))
             ;
 
         // Found a Paragraph-start or a Blank, search for the word shortcut in
         // auto.
-        xub_StrLen nCapLttrPos = nPos+1;        // on the 1st Character
-        if( !nPos && !IsWordDelim( rTxt.GetChar( 0 )))
+        sal_Int32 nCapLttrPos = nPos+1;        // on the 1st Character
+        if( !nPos && !IsWordDelim( rTxt[ 0 ]))
             --nCapLttrPos;          // Absatz Anfang und kein Blank !
 
         LanguageType eLang = rDoc.GetLanguage( nCapLttrPos, sal_False );
@@ -1347,17 +1347,17 @@ SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
             OUString aPara;
             OUString* pPara = IsAutoCorrFlag(CptlSttSntnc) ? &aPara : 0;
 
-            sal_Bool bChgWord = rDoc.ChgAutoCorrWord( nCapLttrPos, nInsPos,
+            bool bChgWord = rDoc.ChgAutoCorrWord( nCapLttrPos, nInsPos,
                                                     *this, pPara );
             if( !bChgWord )
             {
-                xub_StrLen nCapLttrPos1 = nCapLttrPos, nInsPos1 = nInsPos;
+                sal_Int32 nCapLttrPos1 = nCapLttrPos, nInsPos1 = nInsPos;
                 while( nCapLttrPos1 < nInsPos &&
-                        lcl_IsInAsciiArr( sImplSttSkipChars, rTxt.GetChar( nCapLttrPos1 ) )
+                        lcl_IsInAsciiArr( sImplSttSkipChars, rTxt[ nCapLttrPos1 ] )
                         )
                         ++nCapLttrPos1;
                 while( nCapLttrPos1 < nInsPos1 && nInsPos1 &&
-                        lcl_IsInAsciiArr( sImplEndSkipChars, rTxt.GetChar( nInsPos1-1 ) )
+                        lcl_IsInAsciiArr( sImplEndSkipChars, rTxt[ nInsPos1-1 ] )
                         )
                         --nInsPos1;
 
@@ -1365,7 +1365,7 @@ SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
                     nCapLttrPos1 < nInsPos1 &&
                     rDoc.ChgAutoCorrWord( nCapLttrPos1, nInsPos1, *this, pPara ))
                 {
-                    bChgWord = sal_True;
+                    bChgWord = true;
                     nCapLttrPos = nCapLttrPos1;
                 }
             }
@@ -1685,7 +1685,7 @@ static void GeneratePackageName ( const OUString& rShort, OUString& rPackageName
 
 static const SvxAutocorrWord* lcl_SearchWordsInList(
                 SvxAutoCorrectLanguageListsPtr pList, const String& rTxt,
-                xub_StrLen& rStt, xub_StrLen nEndPos)
+                sal_Int32& rStt, sal_Int32 nEndPos)
 {
     const SvxAutocorrWordList* pAutoCorrWordList = pList->GetAutocorrWordList();
     return pAutoCorrWordList->SearchWordsInList( rTxt, rStt, nEndPos );
@@ -1693,7 +1693,7 @@ static const SvxAutocorrWord* lcl_SearchWordsInList(
 
 // the search for the words in the substitution table
 const SvxAutocorrWord* SvxAutoCorrect::SearchWordsInList(
-                const OUString& rTxt, xub_StrLen& rStt, xub_StrLen nEndPos,
+                const OUString& rTxt, sal_Int32& rStt, sal_Int32 nEndPos,
                 SvxAutoCorrDoc&, LanguageType& rLang )
 {
     LanguageType eLang = rLang;
@@ -2734,8 +2734,8 @@ SvxAutocorrWordList::Content SvxAutocorrWordList::getSortedContent() const
 
 const SvxAutocorrWord* SvxAutocorrWordList::WordMatches(const SvxAutocorrWord *pFnd,
                                       const OUString &rTxt,
-                                      xub_StrLen &rStt,
-                                      xub_StrLen nEndPos) const
+                                      sal_Int32 &rStt,
+                                      sal_Int32 nEndPos) const
 {
     const String& rChk = pFnd->GetShort();
     xub_StrLen left_wildcard = ( rChk.GetChar( 0 ) == C_ASTERISK ) ? 1 : 0; // "*word" pattern?
@@ -2794,8 +2794,8 @@ const SvxAutocorrWord* SvxAutocorrWordList::WordMatches(const SvxAutocorrWord *p
     return NULL;
 }
 
-const SvxAutocorrWord* SvxAutocorrWordList::SearchWordsInList(const OUString& rTxt, xub_StrLen& rStt,
-                                                              xub_StrLen nEndPos) const
+const SvxAutocorrWord* SvxAutocorrWordList::SearchWordsInList(const OUString& rTxt, sal_Int32& rStt,
+                                                              sal_Int32 nEndPos) const
 {
     for( SvxAutocorrWordList_Hash::const_iterator it = maHash.begin(); it != maHash.end(); ++it )
     {
diff --git a/include/editeng/svxacorr.hxx b/include/editeng/svxacorr.hxx
index b687dc4..cc08b5f3 100644
--- a/include/editeng/svxacorr.hxx
+++ b/include/editeng/svxacorr.hxx
@@ -104,7 +104,7 @@ public:
     //             (Does not to have to be the same paragraph !!!!)
     virtual OUString GetPrevPara( sal_Bool bAtNormalPos ) = 0;
 
-    virtual sal_Bool ChgAutoCorrWord( xub_StrLen& rSttPos, xub_StrLen nEndPos,
+    virtual bool ChgAutoCorrWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
                                   SvxAutoCorrect& rACorrect,
                                   OUString* pPara ) = 0;
     // Is called after the change of the signs by the functions
@@ -151,8 +151,8 @@ class EDITENG_DLLPUBLIC SvxAutocorrWordList
 
     const SvxAutocorrWord* WordMatches(const SvxAutocorrWord *pFnd,
                                        const OUString &rTxt,
-                                       xub_StrLen &rStt,
-                                       xub_StrLen nEndPos) const;
+                                       sal_Int32 &rStt,
+                                       sal_Int32 nEndPos) const;
 public:
                            // free any objects still in the set
                            ~SvxAutocorrWordList();
@@ -165,7 +165,7 @@ public:
     typedef std::vector<SvxAutocorrWord *> Content;
     Content                getSortedContent() const;
 
-    const SvxAutocorrWord* SearchWordsInList(const OUString& rTxt, xub_StrLen& rStt, xub_StrLen nEndPos) const;
+    const SvxAutocorrWord* SearchWordsInList(const OUString& rTxt, sal_Int32& rStt, sal_Int32 nEndPos) const;
 };
 
 class EDITENG_DLLPUBLIC SvxAutoCorrectLanguageLists
@@ -292,7 +292,7 @@ public:
     // FIXME: this has the horrible flaw that the rTxt must be a reference
     // to the actual SwTxtNode/EditNode string because it inserts the character
     // in rDoc and expects that to side-effect rTxt
-    sal_uLong DoAutoCorrect( SvxAutoCorrDoc& rDoc, const String& rTxt,
+    sal_uLong DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt,
                            xub_StrLen nPos, sal_Unicode cInsChar, sal_Bool bInsert, Window* pFrameWin = NULL );
 
     // Return for the autotext expansion the previous word,
@@ -307,7 +307,7 @@ public:
     // rLang - Input: in which language is searched
     //         Output: in which "language list" was it found
     const SvxAutocorrWord* SearchWordsInList( const OUString& rTxt,
-                                    xub_StrLen& rStt, xub_StrLen nEndPos,
+                                    sal_Int32& rStt, sal_Int32 nEndPos,
                                     SvxAutoCorrDoc& rDoc,
                                     LanguageType& rLang );
 
diff --git a/sw/source/core/edit/acorrect.cxx b/sw/source/core/edit/acorrect.cxx
index 4eb19c7..4599e75 100644
--- a/sw/source/core/edit/acorrect.cxx
+++ b/sw/source/core/edit/acorrect.cxx
@@ -293,7 +293,7 @@ OUString SwAutoCorrDoc::GetPrevPara( sal_Bool bAtNormalPos )
     return aStr;
 }
 
-sal_Bool SwAutoCorrDoc::ChgAutoCorrWord( xub_StrLen & rSttPos, xub_StrLen nEndPos,
+bool SwAutoCorrDoc::ChgAutoCorrWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
                                          SvxAutoCorrect& rACorrect,
                                          OUString* pPara )
 {
diff --git a/sw/source/core/edit/autofmt.cxx b/sw/source/core/edit/autofmt.cxx
index 9b4dae9..8d4571a 100644
--- a/sw/source/core/edit/autofmt.cxx
+++ b/sw/source/core/edit/autofmt.cxx
@@ -1827,7 +1827,7 @@ void SwAutoFormat::AutoCorrect( xub_StrLen nPos )
 
     SwTxtFrmInfo aFInfo( 0 );
 
-    xub_StrLen nSttPos, nLastBlank = nPos;
+    sal_Int32 nSttPos, nLastBlank = nPos;
     sal_Bool bFirst = aFlags.bCptlSttSntnc, bFirstSent = bFirst;
     sal_Unicode cChar = 0;
 
diff --git a/sw/source/core/edit/edws.cxx b/sw/source/core/edit/edws.cxx
index e006f56..437189b 100644
--- a/sw/source/core/edit/edws.cxx
+++ b/sw/source/core/edit/edws.cxx
@@ -254,7 +254,7 @@ void SwEditShell::AutoCorrect( SvxAutoCorrect& rACorr, sal_Bool bInsert,
 
     SwAutoCorrDoc aSwAutoCorrDoc( *this, *pCrsr, cChar );
     // FIXME: this _must_ be called with reference to the actual node text!
-    String const& rNodeText(reinterpret_cast<String const&>(pTNd->GetTxt()));
+    OUString const& rNodeText(pTNd->GetTxt());
     rACorr.DoAutoCorrect( aSwAutoCorrDoc,
                     rNodeText, pCrsr->GetPoint()->nContent.GetIndex(),
                     cChar, bInsert, GetWin() );
diff --git a/sw/source/core/inc/acorrect.hxx b/sw/source/core/inc/acorrect.hxx
index a7a5e6b..6b6d5a0 100644
--- a/sw/source/core/inc/acorrect.hxx
+++ b/sw/source/core/inc/acorrect.hxx
@@ -74,7 +74,7 @@ public:
     //               (does not need to be the same paragraph)
     virtual OUString GetPrevPara( sal_Bool bAtNormalPos );
 
-    virtual sal_Bool ChgAutoCorrWord( xub_StrLen& rSttPos, xub_StrLen nEndPos,
+    virtual bool ChgAutoCorrWord( sal_Int32& rSttPos, sal_Int32 nEndPos,
                                   SvxAutoCorrect& rACorrect,
                                   OUString* pPara );
 
commit 5b6dcac8dca72583e25213331bbadc5ec1973646
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Sep 18 13:44:24 2013 +0100

    comparision of STRING_NOTFOUND to OUString::indexOf
    
    Change-Id: I5ad12b594143a3e9ab2399836d30e48deb656639

diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index 2e932e7..ab82308 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -653,8 +653,8 @@ sal_Bool SvxAutoCorrect::FnAddNonBrkSpace(
             }
 
             // Check the presence of "://" in the word
-            xub_StrLen nStrPos = rTxt.indexOf( "://", nSttWdPos + 1 );
-            if ( STRING_NOTFOUND == nStrPos && nEndPos > 0 )
+            sal_Int32 nStrPos = rTxt.indexOf( "://", nSttWdPos + 1 );
+            if ( nStrPos == -1 && nEndPos > 0 )
             {
                 // Check the previous char
                 sal_Unicode cPrevChar = rTxt[ nEndPos - 1 ];
commit 9bb1b4c5a1529a4cca09d0ed3e5325bf9310e814
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Sep 18 13:34:35 2013 +0100

    don't access string out of bounds
    
    Change-Id: I1cee53bc864efaa4ae3b4462111cad4dc80e82be

diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index bb24fe0..2e932e7 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -642,11 +642,16 @@ sal_Bool SvxAutoCorrect::FnAddNonBrkSpace(
             while( nSttWdPos && !(bWasWordDelim = IsWordDelim( rTxt[ --nSttWdPos ])))
                 ;
 
-            if(INetURLObject::CompareProtocolScheme(rTxt.copy(nSttWdPos + (bWasWordDelim ? 1 : 0), nEndPos - nSttWdPos + 1)) != INET_PROT_NOT_VALID) {
-                return sal_False;
+            //See if the text is the start of a protocol string, e.g. have text of
+            //"http" see if it is the start of "http:" and if so leave it alone
+            sal_Int32 nIndex = nSttWdPos + (bWasWordDelim ? 1 : 0);
+            sal_Int32 nProtocolLen = nEndPos - nSttWdPos + 1;
+            if (nIndex + nProtocolLen <= rTxt.getLength())
+            {
+                if (INetURLObject::CompareProtocolScheme(rTxt.copy(nIndex, nProtocolLen)) != INET_PROT_NOT_VALID)
+                    return sal_False;
             }
 
-
             // Check the presence of "://" in the word
             xub_StrLen nStrPos = rTxt.indexOf( "://", nSttWdPos + 1 );
             if ( STRING_NOTFOUND == nStrPos && nEndPos > 0 )


More information about the Libreoffice-commits mailing list