diff options
author | Michael Stahl <mstahl@redhat.com> | 2012-02-03 14:19:47 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2012-02-03 14:20:13 +0100 |
commit | 874f2e53b24ad24d4e99f0df54ba6539d1958371 (patch) | |
tree | 923251de8906b3f3f7877b08d2e80c2e6a3b1784 /editeng | |
parent | aa2333374d8f587afa9e876334a1b6303bcec0a9 (diff) |
WrongList::TextInserted: fix STL crash
vector iterators and insert don't mix well
(regression from dfbf0cabfa8310502e19642d56c746cc0d454d27)
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/source/editeng/edtspell.cxx | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/editeng/source/editeng/edtspell.cxx b/editeng/source/editeng/edtspell.cxx index f13fb1a729f4..eda0d6143d5a 100644 --- a/editeng/source/editeng/edtspell.cxx +++ b/editeng/source/editeng/edtspell.cxx @@ -242,48 +242,51 @@ void WrongList::TextInserted( sal_uInt16 nPos, sal_uInt16 nNew, sal_Bool bPosIsS nInvalidEnd = nPos+nNew; } - for (WrongList::iterator i = begin(); i != end(); ++i) + for (WrongList::size_type i = 0; i < size(); ++i) { + WrongRange & rWrong = (*this)[i]; // why does this thing derive vector? sal_Bool bRefIsValid = sal_True; - if (i->nEnd >= nPos) + if (rWrong.nEnd >= nPos) { // Move all Wrongs after the insert position... - if (i->nStart > nPos) + if (rWrong.nStart > nPos) { - i->nStart += nNew; - i->nEnd += nNew; + rWrong.nStart += nNew; + rWrong.nEnd += nNew; } // 1: Starts before and goes until nPos... - else if (i->nEnd == nPos) + else if (rWrong.nEnd == nPos) { // Should be halted at a blank! if ( !bPosIsSep ) - i->nEnd += nNew; + rWrong.nEnd += nNew; } // 2: Starts before and goes until after nPos... - else if (i->nStart < nPos && i->nEnd > nPos) + else if ((rWrong.nStart < nPos) && (rWrong.nEnd > nPos)) { - i->nEnd += nNew; + rWrong.nEnd += nNew; // When a separator remove and re-examine the Wrong if ( bPosIsSep ) { // Split Wrong... - WrongRange aNewWrong(i->nStart, nPos); - i->nStart = nPos + 1; - insert(i, aNewWrong); - bRefIsValid = sal_False; // Reference no longer valid after Insert, the other was inserted in front of this position + WrongRange aNewWrong(rWrong.nStart, nPos); + rWrong.nStart = nPos + 1; + insert(begin() + i, aNewWrong); + // Reference no longer valid after Insert, the other + // was inserted in front of this position + bRefIsValid = false; ++i; // Not this again... } } // 3: Attribute starts at position .. - else if (i->nStart == nPos) + else if (rWrong.nStart == nPos) { - i->nEnd += nNew; + rWrong.nEnd += nNew; if ( bPosIsSep ) - ++(i->nStart); + ++(rWrong.nStart); } } - SAL_WARN_IF(bRefIsValid && i->nStart >= i->nEnd, "editeng", + SAL_WARN_IF(bRefIsValid && rWrong.nStart >= rWrong.nEnd, "editeng", "TextInserted, WrongRange: Start >= End?!"); (void)bRefIsValid; } |