summaryrefslogtreecommitdiff
path: root/i18npool/source/search/textsearch.cxx
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2007-12-05 15:45:18 +0000
committerVladimir Glazounov <vg@openoffice.org>2007-12-05 15:45:18 +0000
commitda015d1935b7e1e54fa5c02d54fea9f6cb734fef (patch)
tree3f450e785d2baed525ca446d1a502661988a2f6f /i18npool/source/search/textsearch.cxx
parent24eec91a92735bd954294f8db44e9f9cf7e5174f (diff)
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
Diffstat (limited to 'i18npool/source/search/textsearch.cxx')
-rw-r--r--i18npool/source/search/textsearch.cxx73
1 files changed, 43 insertions, 30 deletions
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 *)&regs, 0, sizeof(struct re_registers));
- if ( ! pRegExp->re_search(&regs, nOffset) )
+ if ( ! pRegExp->re_search(&regs, 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 )
{