From 9eb39ccff8741d59e47af34b4038b7fcb79d15c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20N=C3=A9meth?= Date: Fri, 23 Aug 2013 11:35:27 +0200 Subject: [PATCH] fdo#68373 allow "*word" pattern matching Change-Id: I13682f3886451838e522b259dbb2d686bff1437b --- editeng/source/misc/svxacorr.cxx | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx index b8406f8b3727..043cba5494fe 100644 --- a/editeng/source/misc/svxacorr.cxx +++ b/editeng/source/misc/svxacorr.cxx @@ -2710,20 +2710,29 @@ const SvxAutocorrWord* SvxAutocorrWordList::WordMatches(const SvxAutocorrWord *p xub_StrLen nEndPos) const { const String& rChk = pFnd->GetShort(); - if( nEndPos >= rChk.Len() ) + xub_StrLen left_wildcard = ( rChk.GetChar( 0 ) == C_ASTERISK ) ? 1 : 0; // "*word" pattern? + xub_StrLen nSttWdPos = nEndPos; + bool bWasWordDelim = false; + if( nEndPos >= rChk.Len() - left_wildcard) { - xub_StrLen nCalcStt = nEndPos - rChk.Len(); - if( ( !nCalcStt || nCalcStt == rStt || + + xub_StrLen nCalcStt = nEndPos - rChk.Len() + left_wildcard; + if( ( !nCalcStt || nCalcStt == rStt || left_wildcard || ( nCalcStt < rStt && IsWordDelim( rTxt.GetChar( nCalcStt - 1 ) ))) ) { TransliterationWrapper& rCmp = GetIgnoreTranslWrapper(); - - OUString sWord(rTxt.GetBuffer() + nCalcStt, rChk.Len()); - if( rCmp.isEqual( rChk, sWord )) + OUString sWord(rTxt.GetBuffer() + nCalcStt, rChk.Len() - left_wildcard); + if( (!left_wildcard && rCmp.isEqual( rChk, sWord )) || (left_wildcard && rCmp.isEqual( rChk.Copy(1), sWord) )) { rStt = nCalcStt; - return pFnd; + if (!left_wildcard) return pFnd; + // get the first word delimiter position before the matching "*word" pattern + while( rStt && !(bWasWordDelim = IsWordDelim( rTxt.GetChar( --rStt )))) + ; + if (bWasWordDelim) rStt++; + SvxAutocorrWord* pNew = new SvxAutocorrWord(OUString(rTxt.GetBuffer() + rStt, nEndPos - rStt), OUString(rTxt.GetBuffer() + rStt, nEndPos - rStt - rChk.Len() + 1) + OUString(pFnd->GetLong())); + if( Insert( pNew ) ) return pNew; else delete pNew; } } // match "word*" patterns, eg. "i18n*" @@ -2731,8 +2740,6 @@ const SvxAutocorrWord* SvxAutocorrWordList::WordMatches(const SvxAutocorrWord *p { String sTmp( rChk.Copy( 0, rChk.Len() - 1 ) ); // Get the last word delimiter position - xub_StrLen nSttWdPos = nEndPos; - bool bWasWordDelim = false; bool not_suffix; while( nSttWdPos && !(bWasWordDelim = IsWordDelim( rTxt.GetChar( --nSttWdPos )))) ;