From da015d1935b7e1e54fa5c02d54fea9f6cb734fef Mon Sep 17 00:00:00 2001 From: Vladimir Glazounov Date: Wed, 5 Dec 2007 15:45:18 +0000 Subject: INTEGRATION: CWS regexp02 (1.9.106); FILE MERGED 2007/11/06 12:59:10 ama 1.9.106.3: Fix #i15666#: Backward search in regular expressions 2007/11/01 14:03:51 ama 1.9.106.2: Fix #i83208#: Backward regular search in selections 2007/11/01 12:35:40 ama 1.9.106.1: Fix #i15666#i77376#: Deliver backreferences, dont treat selections as paragraphs --- i18npool/source/search/textsearch.cxx | 73 +++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 30 deletions(-) (limited to 'i18npool/source/search/textsearch.cxx') diff --git a/i18npool/source/search/textsearch.cxx b/i18npool/source/search/textsearch.cxx index da136b48b2aa..3ddb3ccb7c54 100644 --- a/i18npool/source/search/textsearch.cxx +++ b/i18npool/source/search/textsearch.cxx @@ -4,9 +4,9 @@ * * $RCSfile: textsearch.cxx,v $ * - * $Revision: 1.9 $ + * $Revision: 1.10 $ * - * last change: $Author: obo $ $Date: 2006-09-17 09:23:23 $ + * last change: $Author: vg $ $Date: 2007-12-05 16:45:18 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -756,38 +756,38 @@ SearchResult TextSearch::RESrchFrwrd( const OUString& searchStr, throw(RuntimeException) { SearchResult aRet; - sal_Int32 nOffset = 0; aRet.subRegExpressions = 0; OUString aStr( searchStr ); bool bSearchInSel = (0 != (( SearchFlags::REG_NOT_BEGINOFLINE | SearchFlags::REG_NOT_ENDOFLINE ) & aSrchPara.searchFlag )); - // search only in the subString - if (bSearchInSel) - aStr = aStr.copy(startPos, endPos - startPos); - - if ( !bSearchInSel && startPos ) - nOffset = startPos; - - pRegExp->set_line(aStr.getStr(), aStr.getLength()); + pRegExp->set_line(aStr.getStr(), bSearchInSel ? endPos : aStr.getLength()); struct re_registers regs; // Clear structure memset((void *)®s, 0, sizeof(struct re_registers)); - if ( ! pRegExp->re_search(®s, nOffset) ) + if ( ! pRegExp->re_search(®s, startPos) ) { if( regs.num_of_match > 0 && (regs.start[0] != -1 && regs.end[0] != -1) ) { - aRet.subRegExpressions = 1; - aRet.startOffset.realloc(1); - aRet.endOffset.realloc(1); + aRet.startOffset.realloc(regs.num_of_match); + aRet.endOffset.realloc(regs.num_of_match); - nOffset = bSearchInSel ? startPos : 0; - aRet.startOffset[0] = regs.start[0] + nOffset; - aRet.endOffset[0] = regs.end[0] + nOffset; + sal_Int32 i = 0, j = 0; + while( j < regs.num_of_match ) + { + if( regs.start[j] != -1 && regs.end[j] != -1 ) + { + aRet.startOffset[i] = regs.start[j]; + aRet.endOffset[i] = regs.end[j]; + ++i; + } + ++j; + } + aRet.subRegExpressions = i; } if ( regs.num_regs > 0 ) { @@ -818,13 +818,19 @@ SearchResult TextSearch::RESrchBkwrd( const OUString& searchStr, bool bSearchInSel = (0 != (( SearchFlags::REG_NOT_BEGINOFLINE | SearchFlags::REG_NOT_ENDOFLINE ) & aSrchPara.searchFlag )); - // search only in the subString - if( bSearchInSel ) - aStr = aStr.copy( nStrEnde, startPos - nStrEnde ); - if( startPos ) nOffset = startPos - 1; + // search only in the subString + if( bSearchInSel && nStrEnde ) + { + aStr = aStr.copy( nStrEnde, aStr.getLength() - nStrEnde ); + if( nOffset > nStrEnde ) + nOffset = nOffset - nStrEnde; + else + nOffset = 0; + } + // set the length to negative for reverse search pRegExp->set_line( aStr.getStr(), -(aStr.getLength()) ); struct re_registers regs; @@ -836,15 +842,22 @@ SearchResult TextSearch::RESrchBkwrd( const OUString& searchStr, if( regs.num_of_match > 0 && (regs.start[0] != -1 && regs.end[0] != -1) ) { - aRet.subRegExpressions = 1; - aRet.startOffset.realloc(1); - aRet.endOffset.realloc(1); - // aRet.startOffset[0] = regs.start[0]; - // aRet.endOffset[0] = regs.end[0]; - nOffset = bSearchInSel ? nStrEnde : 0; - aRet.startOffset[0] = regs.end[0] + nOffset; - aRet.endOffset[0] = regs.start[0] + nOffset; + aRet.startOffset.realloc(regs.num_of_match); + aRet.endOffset.realloc(regs.num_of_match); + + sal_Int32 i = 0, j = 0; + while( j < regs.num_of_match ) + { + if( regs.start[j] != -1 && regs.end[j] != -1 ) + { + aRet.startOffset[i] = regs.end[j] + nOffset; + aRet.endOffset[i] = regs.start[j] + nOffset; + ++i; + } + ++j; + } + aRet.subRegExpressions = i; } if ( regs.num_regs > 0 ) { -- cgit v1.2.3