You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by hd...@apache.org on 2012/01/06 12:12:56 UTC

svn commit: r1228084 - /incubator/ooo/trunk/main/i18npool/source/search/textsearch.cxx

Author: hdu
Date: Fri Jan  6 11:12:55 2012
New Revision: 1228084

URL: http://svn.apache.org/viewvc?rev=1228084&view=rev
Log:
#i118723# fill in regexp matcher group details

Modified:
    incubator/ooo/trunk/main/i18npool/source/search/textsearch.cxx

Modified: incubator/ooo/trunk/main/i18npool/source/search/textsearch.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/trunk/main/i18npool/source/search/textsearch.cxx?rev=1228084&r1=1228083&r2=1228084&view=diff
==============================================================================
--- incubator/ooo/trunk/main/i18npool/source/search/textsearch.cxx (original)
+++ incubator/ooo/trunk/main/i18npool/source/search/textsearch.cxx Fri Jan  6 11:12:55 2012
@@ -741,11 +741,16 @@ SearchResult TextSearch::RESrchFrwrd( co
 	if( !pRegexMatcher->find( startPos, nIcuErr))
 		return aRet;
 
-	aRet.subRegExpressions = 1;
+	const int nGroupCount = pRegexMatcher->groupCount();
+	aRet.subRegExpressions = nGroupCount + 1;
 	aRet.startOffset.realloc( aRet.subRegExpressions);
 	aRet.endOffset.realloc( aRet.subRegExpressions);
 	aRet.startOffset[0] = pRegexMatcher->start( nIcuErr);
 	aRet.endOffset[0]   = pRegexMatcher->end( nIcuErr);
+	for( int i = 1; i <= nGroupCount; ++i) {
+		aRet.startOffset[i] = pRegexMatcher->start( i, nIcuErr);
+		aRet.endOffset[i]   = pRegexMatcher->end( i, nIcuErr);
+	}
 
 	return aRet;
 }
@@ -765,21 +770,34 @@ SearchResult TextSearch::RESrchBkwrd( co
 
 	// use the ICU RegexMatcher to find the matches
 	// TODO: use ICU's backward searching once it becomes available
+	//       as its replacement using forward search is not as good as the real thing
 	UErrorCode nIcuErr = U_ZERO_ERROR;
 	const IcuUniString aSearchTargetStr( searchStr.getStr(), startPos);
 	pRegexMatcher->reset( aSearchTargetStr);
 	if( !pRegexMatcher->find( endPos, nIcuErr))
 		return aRet;
 
-	aRet.subRegExpressions = 1;
+	// find the last match
+	int nLastPos = 0;
+	do {
+		nLastPos = pRegexMatcher->start( nIcuErr);
+	} while( pRegexMatcher->find( nLastPos + 1, nIcuErr));
+
+	// find last match again to get its details
+	pRegexMatcher->find( nLastPos, nIcuErr);
+
+	// fill in the details of the last match
+	const int nGroupCount = pRegexMatcher->groupCount();
+	aRet.subRegExpressions = nGroupCount + 1;
 	aRet.startOffset.realloc( aRet.subRegExpressions);
 	aRet.endOffset.realloc( aRet.subRegExpressions);
-
-	do {
-		// NOTE: backward search seems to be expected to have startOfs/endOfs inverted!
-		aRet.startOffset[0] = pRegexMatcher->end( nIcuErr);
-		aRet.endOffset[0]   = pRegexMatcher->start( nIcuErr);
-	} while( pRegexMatcher->find( aRet.endOffset[0]+1, nIcuErr));
+	// NOTE: existing users of backward search seem to expect startOfs/endOfs being inverted!
+	aRet.startOffset[0] = pRegexMatcher->end( nIcuErr);
+	aRet.endOffset[0]   = pRegexMatcher->start( nIcuErr);
+	for( int i = 1; i <= nGroupCount; ++i) {
+		aRet.startOffset[i] = pRegexMatcher->end( i, nIcuErr);
+		aRet.endOffset[i]   = pRegexMatcher->start( i, nIcuErr);
+	}
 
 	return aRet;
 }