A simplistic rowbreakpoint sanitizing patch... that works (or seems to).
It's still somewhat ugly (I'm cleaning it a bit) but loads the UserGuide
correctly.

Beware that it introduces a lot of asserts, but if you have the time, please
test it.

Index: lyxrow_funcs.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxrow_funcs.C,v
retrieving revision 1.23
diff -u -p -u -r1.23 lyxrow_funcs.C
--- lyxrow_funcs.C      22 Oct 2003 16:30:56 -0000      1.23
+++ lyxrow_funcs.C      24 Oct 2003 11:00:15 -0000
@@ -29,8 +29,8 @@ pos_type lastPos(Paragraph const & par, 
        if (par.empty())
                return 0;
        pos_type pos = row.endpos() - 1;
-       if (pos == par.size())
-               --pos;
+//     if (pos == par.size())
+//             --pos;
        return pos;
 }
 
Index: paragraph.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.C,v
retrieving revision 1.334
diff -u -p -u -r1.334 paragraph.C
--- paragraph.C 24 Oct 2003 09:45:03 -0000      1.334
+++ paragraph.C 24 Oct 2003 11:00:17 -0000
@@ -1327,12 +1327,13 @@ Paragraph::value_type Paragraph::getChar
        // This is in the critical path!
        pos_type const siz = text_.size();
 
-       BOOST_ASSERT(pos <= siz);
+       BOOST_ASSERT(0 <= pos && pos <= siz);
 
        if (pos == siz) {
                lyxerr << "getChar() on pos " << pos << " in par id "
                       << id() << " of size " << siz
                       << "  is a bit silly !" << endl;
+               BOOST_ASSERT(false);
                return '\0';
        }
 
Index: text.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v
retrieving revision 1.482
diff -u -p -u -r1.482 text.C
--- text.C      24 Oct 2003 09:45:04 -0000      1.482
+++ text.C      24 Oct 2003 11:00:20 -0000
@@ -456,7 +456,7 @@ pos_type addressBreakPoint(pos_type i, P
 {
        for (; i < par.size(); ++i)
                if (par.isNewline(i))
-                       return i;
+                       return i + 1;
 
        return par.size();
 }
@@ -466,6 +466,11 @@ pos_type addressBreakPoint(pos_type i, P
 
 void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
 {
+       if (pit->empty()) {
+               row.endpos(pit->size());
+               return;
+       }
+       
        // maximum pixel width of a row.
        int width = workWidth()
                - rightMargin(*pit, *bv()->buffer(), row)
@@ -474,24 +479,24 @@ void LyXText::rowBreakPoint(ParagraphLis
        // inset->textWidth() returns -1 via workWidth(),
        // but why ?
        if (width < 0) {
-               row.endpos(pit->size() + 1);
+               row.endpos(pit->size());
                return;
        }
 
        LyXLayout_ptr const & layout = pit->layout();
 
        if (layout->margintype == MARGIN_RIGHT_ADDRESS_BOX) {
-               row.endpos(addressBreakPoint(row.pos(), *pit) + 1);
+               row.endpos(addressBreakPoint(row.pos(), *pit));
                return;
        }
 
        pos_type const pos = row.pos();
        pos_type const body_pos = pit->beginningOfBody();
-       pos_type const last = pit->size();
-       pos_type point = last;
+       pos_type const end = pit->size();
+       pos_type point = end - 1;
 
-       if (pos == last) {
-               row.endpos(last + 1);
+       if (pos == end) {
+               row.endpos(end);
                return;
        }
 
@@ -511,13 +516,13 @@ void LyXText::rowBreakPoint(ParagraphLis
        LyXFont font = getFont(pit, i);
        lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
 
-       for ( ; i < last; ++i) {
+       for ( ; i < end; ++i) {
                if (pit->isNewline(i)) {
                        point = i;
                        break;
                }
                // Break before...      
-               if (i + 1 < last) {
+               if (i + 1 < end) {
                        InsetOld * in = pit->getInset(i + 1);
                        if (in && in->display()) {
                                point = i;
@@ -560,7 +565,7 @@ void LyXText::rowBreakPoint(ParagraphLis
                // the right of the row
                if (x >= width) {
                        // if no break before, break here
-                       if (point == last || chunkwidth >= width - left) {
+                       if (point == end || chunkwidth >= width - left) {
                                if (pos < i) {
                                        point = i - 1;
                                        // exit on last registered breakpoint:
@@ -568,7 +573,7 @@ void LyXText::rowBreakPoint(ParagraphLis
                                }
                        }
                        // emergency exit:
-                       if (i + 1 < last)               
+                       if (i + 1 < end)
                                break;  
                }
 
@@ -583,13 +588,13 @@ void LyXText::rowBreakPoint(ParagraphLis
                }
        }
 
-       if (point == last && x >= width) {
+       if (point == end && x >= width) {
                // didn't find one, break at the point we reached the edge
                point = i;
-       } else if (i == last && x < width) {
+       } else if (i == end && x < width) {
                // found one, but we fell off the end of the par, so prefer
                // that.
-               point = last;
+               point = end - 1;
        }
 
        // manual labels cannot be broken in LaTeX. But we
@@ -1227,8 +1232,10 @@ void LyXText::prepareToPrint(ParagraphLi
                // The test on pit->size() is to catch zero-size pars, which
                // would trigger the assert in Paragraph::getInset().
                //inset = pit->size() ? pit->getInset(row.pos()) : 0;
-               inset = pit->isInset(row.pos()) ? pit->getInset(row.pos()) : 0;
-               if (inset && inset->display()) {
+               if (!pit->empty()
+                   && pit->isInset(row.pos())
+                   && pit->getInset(row.pos())->display())
+               {
                        align = LYX_ALIGN_CENTER;
                }
                
@@ -1895,7 +1902,8 @@ void LyXText::redoParagraphInternal(Para
 
        // rebreak the paragraph
        int const ww = workWidth();
-       for (pos_type z = 0; z < pit->size() + 1; ) {
+       pos_type z = 0;
+       do {
                Row row(z);
                rowBreakPoint(pit, row);
                z = row.endpos();
@@ -1906,7 +1914,8 @@ void LyXText::redoParagraphInternal(Para
                pit->rows.push_back(row);
                pit->width = std::max(pit->width, row.width());
                pit->height += row.height();
-       }
+       } while (z < pit->size());
+
        height += pit->height;
        //lyxerr << "redoParagraph: " << pit->rows.size() << " rows\n";
 }
Index: text2.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v
retrieving revision 1.484
diff -u -p -u -r1.484 text2.C
--- text2.C     24 Oct 2003 09:45:06 -0000      1.484
+++ text2.C     24 Oct 2003 11:00:22 -0000
@@ -1311,18 +1311,27 @@ void LyXText::setCursor(LyXCursor & cur,
 
        // None of these should happen, but we're scaredy-cats
        if (pos > pit->size()) {
-               lyxerr << "dont like 1, pos: " << pos << " size: " << pit->size() <<
endl;
+               lyxerr << "dont like 1, pos: " << pos
+                      << " size: " << pit->size()
+                      << " row.pos():" << row.pos()
+                      << " paroffset: " << par << endl;
                pos = 0;
                cur.pos(0);
+               BOOST_ASSERT(false);
        } else if (pos > last + 1) {
                lyxerr << "dont like 2 please report" << endl;
                // This shouldn't happen.
                pos = last + 1;
                cur.pos(pos);
+               BOOST_ASSERT(false);
        } else if (pos < row.pos()) {
-               lyxerr << "dont like 3 please report" << endl;
+               lyxerr << "dont like 3 please report pos:" << pos
+                      << " size: " << pit->size()
+                      << " row.pos():" << row.pos()
+                      << " paroffset: " << par << endl;
                pos = row.pos();
                cur.pos(pos);
+               BOOST_ASSERT(false);
        }
 
        // now get the cursors x position

Reply via email to