On Mon, Mar 13, 2006 at 07:29:02PM +0100, Juergen Spitzmueller wrote: > Martin Vermeer wrote: > > - if (start == end || !par_.isChanged(start, end - 1)) > > + if (start == end || !par_.isChanged(start, end)) > > Are you sure this is the right patch?
No it is not. The attached is (cursed evo interface!) - Martin
Index: paragraph_funcs.C =================================================================== --- paragraph_funcs.C (revision 13339) +++ paragraph_funcs.C (working copy) @@ -236,6 +236,17 @@ pos_type pos_end = next.size() - 1; pos_type pos_insert = par.size(); + // What happens is the following. Later on, moveItem() will copy over characters from + // the next paragraph to be inserted into this position. Now, if the first char to be so + // copied is "red" (i.e., marked deleted) and the paragraph break is marked "blue", + // insertChar will trigger (eventually, through record(), and see del() and erase() in + // changes.C) a "hard" character deletion. Which doesn't make sense of course at this + // pos, but the effect is to shorten the change range to which this para break belongs, + // by one. It will (should) remain "orphaned", having no CT info to it, and check() in + // changes.C will assert. Setting the para break forcibly to "black" prevents this + // scenario. -- MV 13.3.2006 + par.setChange(par.size(), Change::UNCHANGED); + Change::Type cr = next.lookupChange(next.size()); // ok, now copy the paragraph for (pos_type i = 0, j = 0; i <= pos_end; ++i) {
pgpjTu5rh30ZZ.pgp
Description: PGP signature