fix the interaction of the allbox option with spanned cells in the layout
authorschwarze <schwarze@openbsd.org>
Tue, 13 Jun 2017 14:38:38 +0000 (14:38 +0000)
committerschwarze <schwarze@openbsd.org>
Tue, 13 Jun 2017 14:38:38 +0000 (14:38 +0000)
regress/usr.bin/mandoc/tbl/layout/span.in
regress/usr.bin/mandoc/tbl/layout/span.out_ascii
usr.bin/mandoc/tbl_term.c

index dc172dc..e210437 100644 (file)
@@ -38,3 +38,13 @@ s:c:d
 a:s:d
 a:b:s
 .TE
+.sp
+.TS
+allbox tab(:);
+L L L L L
+C S S C S
+R R R R R.
+a:b:c:d:e
+s1:s2
+a:b:c:d:e
+.TE
index 0ffb989..b2c6fcf 100644 (file)
@@ -29,5 +29,13 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
        |a   b       s |
        +--------------+
 
+       +--+---+---+---+---+
+       |a | b | c | d | e |
+       +--+---+---+---+---+
+       |   s1     |  s2   |
+       +--+---+---+---+---+
+       |a | b | c | d | e |
+       +--+---+---+---+---+
+
 
                                                             TBL-LAYOUT-SPAN(1)
index 9c5d8ae..8011095 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tbl_term.c,v 1.38 2017/06/12 22:48:52 schwarze Exp $ */
+/*     $OpenBSD: tbl_term.c,v 1.39 2017/06/13 14:38:38 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011,2012,2014,2015,2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -217,29 +217,44 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                        dp = sp->first;
                        spans = 0;
                        for (ic = 0; ic < sp->opts->cols; ic++) {
-                               if (spans == 0) {
-                                       tp->tcol++;
-                                       if (dp != NULL) {
-                                               spans = dp->spans;
-                                               dp = dp->next;
-                                       }
-                                       if (tp->tcol->col < tp->tcol->lastcol)
-                                               term_flushln(tp);
-                                       if (tp->tcol->col < tp->tcol->lastcol)
-                                               more = 1;
-                                       if (tp->tcol + 1 ==
-                                           tp->tcols + tp->lasttcol)
-                                               continue;
-                               } else
-                                       spans--;
 
-                               /* Vertical frames between data cells. */
+                               /* Advance to next layout cell. */
 
                                if (cp != NULL) {
                                        vert = cp->vert;
                                        cp = cp->next;
                                } else
                                        vert = 0;
+
+                               /* Skip later cells in a span. */
+
+                               if (spans) {
+                                       spans--;
+                                       continue;
+                               }
+
+                               /* Advance to next data cell. */
+
+                               if (dp != NULL) {
+                                       spans = dp->spans;
+                                       dp = dp->next;
+                               }
+
+                               /* Print one line of text in the cell. */
+
+                               tp->tcol++;
+                               if (tp->tcol->col < tp->tcol->lastcol)
+                                       term_flushln(tp);
+                               if (tp->tcol->col < tp->tcol->lastcol)
+                                       more = 1;
+
+                               /*
+                                * Vertical frames between data cells,
+                                * but not after the last column.
+                                */
+
+                               if (tp->tcol + 1 == tp->tcols + tp->lasttcol)
+                                       continue;
                                if (vert == 0 &&
                                    sp->opts->opts & TBL_OPT_ALLBOX)
                                        vert = 1;