summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorIvan Timofeev <timofeev.i.s@gmail.com>2011-10-08 22:20:42 +0400
committerIvan Timofeev <timofeev.i.s@gmail.com>2011-10-08 22:20:42 +0400
commit6dcfa9d2aefc161ce61ea9b007d8997be3f31af9 (patch)
treec6f76f2e83bcd6a4cef75f02e87f50e5f03717d7 /tools
parentd1076b1b7f4049d8820f410d72c7a60bfac95152 (diff)
allow parsing of joined ranges
i.e. "1-4-2" means "1,2,3,4,3,2" now. This is for eliminating ambiguity, it is doubtful whether users will find this useful.
Diffstat (limited to 'tools')
-rw-r--r--tools/inc/tools/multisel.hxx1
-rw-r--r--tools/source/memtools/multisel.cxx97
2 files changed, 49 insertions, 49 deletions
diff --git a/tools/inc/tools/multisel.hxx b/tools/inc/tools/multisel.hxx
index bb74783a7a35..733682f9579f 100644
--- a/tools/inc/tools/multisel.hxx
+++ b/tools/inc/tools/multisel.hxx
@@ -127,6 +127,7 @@ class TOOLS_DLLPUBLIC StringRangeEnumerator
sal_Int32 mnOffset;
bool insertRange( sal_Int32 nFirst, sal_Int32 nLast, bool bSequence, bool bMayAdjust );
+ bool insertJoinedRanges( const std::vector< sal_Int32 >& rNumbers, bool i_bStrict );
bool checkValue( sal_Int32, const std::set< sal_Int32 >* i_pPossibleValues = NULL ) const;
public:
class TOOLS_DLLPUBLIC Iterator
diff --git a/tools/source/memtools/multisel.cxx b/tools/source/memtools/multisel.cxx
index 9984b3a3e190..395082ed96ed 100644
--- a/tools/source/memtools/multisel.cxx
+++ b/tools/source/memtools/multisel.cxx
@@ -972,6 +972,33 @@ bool StringRangeEnumerator::insertRange( sal_Int32 i_nFirst, sal_Int32 i_nLast,
return bSuccess;
}
+bool StringRangeEnumerator::insertJoinedRanges(
+ const std::vector< sal_Int32 >& rNumbers, bool i_bStrict )
+{
+ size_t nCount = rNumbers.size();
+ if( nCount == 0 )
+ return true;
+
+ if( nCount == 1 )
+ return insertRange( rNumbers[0], -1, false, ! i_bStrict );
+
+ for( size_t i = 0; i < nCount - 1; i++ )
+ {
+ sal_Int32 nFirst = rNumbers[i];
+ sal_Int32 nLast = rNumbers[i + 1];
+ if( i > 0 )
+ {
+ if ( nFirst > nLast ) nFirst--;
+ else if( nFirst < nLast ) nFirst++;
+ }
+
+ if ( ! insertRange( nFirst, nLast, nFirst != nLast, ! i_bStrict ) && i_bStrict)
+ return false;
+ }
+
+ return true;
+}
+
bool StringRangeEnumerator::setRange( const rtl::OUString& i_rNewRange, bool i_bStrict )
{
mnCount = 0;
@@ -989,75 +1016,47 @@ bool StringRangeEnumerator::setRange( const rtl::OUString& i_rNewRange, bool i_b
const sal_Unicode* pInput = i_rNewRange.getStr();
rtl::OUStringBuffer aNumberBuf( 16 );
- sal_Int32 nLastNumber = -1, nNumber = -1;
+ std::vector< sal_Int32 > aNumbers;
bool bSequence = false;
- bool bSuccess = true;
while( *pInput )
{
while( *pInput >= sal_Unicode('0') && *pInput <= sal_Unicode('9') )
aNumberBuf.append( *pInput++ );
if( aNumberBuf.getLength() )
{
- if( nNumber != -1 )
- {
- if( bSequence )
- {
- if( ! insertRange( nLastNumber, nNumber, true, ! i_bStrict ) && i_bStrict )
- {
- bSuccess = false;
- break;
- }
- nLastNumber = -1;
- bSequence = false;
- }
- else
- {
- if( ! insertRange( nNumber, nNumber, false, ! i_bStrict ) && i_bStrict )
- {
- bSuccess = false;
- break;
- }
- }
- }
- nNumber = aNumberBuf.makeStringAndClear().toInt32();
- nNumber += mnOffset;
+ if( bSequence && aNumbers.empty() )
+ aNumbers.push_back( mnMin );
+
+ sal_Int32 nNumber = aNumberBuf.makeStringAndClear().toInt32() + mnOffset;
+ aNumbers.push_back( nNumber );
+ bSequence = false;
}
- bool bInsertRange = false;
+
if( *pInput == sal_Unicode('-') )
- {
- nLastNumber = nNumber;
- nNumber = -1;
bSequence = true;
- }
- else if( *pInput == ' ' )
- {
- }
else if( *pInput == sal_Unicode(',') || *pInput == sal_Unicode(';') )
- bInsertRange = true;
- else if( *pInput )
{
+ if( bSequence && !aNumbers.empty() )
+ aNumbers.push_back( mnMax );
+ if( ! insertJoinedRanges( aNumbers, i_bStrict ) && i_bStrict )
+ return false;
- bSuccess = false;
- break; // parse error
- }
-
- if( bInsertRange )
- {
- if( ! insertRange( nLastNumber, nNumber, bSequence, ! i_bStrict ) && i_bStrict )
- {
- bSuccess = false;
- break;
- }
- nNumber = nLastNumber = -1;
+ aNumbers.clear();
bSequence = false;
}
+ else if( *pInput && *pInput != sal_Unicode(' ') )
+ return false; // parse error
+
if( *pInput )
pInput++;
}
// insert last entries
- insertRange( nLastNumber, nNumber, bSequence, ! i_bStrict );
+ if( bSequence && !aNumbers.empty() )
+ aNumbers.push_back( mnMax );
+ if( ! insertJoinedRanges( aNumbers, i_bStrict ) && i_bStrict )
+ return false;
- return bSuccess;
+ return true;
}
bool StringRangeEnumerator::hasValue( sal_Int32 i_nValue, const std::set< sal_Int32 >* i_pPossibleValues ) const