]> git.cameronkatri.com Git - mandoc.git/commitdiff
When drawing a horizontal line in tbl(7) UTF-8 output, it is not
authorIngo Schwarze <schwarze@openbsd.org>
Sat, 16 Mar 2019 21:35:48 +0000 (21:35 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sat, 16 Mar 2019 21:35:48 +0000 (21:35 +0000)
sufficient to look at two data rows, but up to three are needed:
the one above to identify vertical lines branching off upward, the
row itself (in case the line is in a data row rather than a layout
line) to figure out the horizontal line style, and the row below
to identify vertical lines branching off downward.

As an example, bentley@ reported from the mpv(1) manual page that
in a tbl(7) having a vertical line in the middle and a horizontal
line in the bottom data row, the vertical line extended below the
bottom horizontal line.

tbl_term.c

index a197f8ef743a8fbd0b6ea6c27b515b35934dbc34..63e7cc628ca41cade867be5dd6f880c6eb3015c0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: tbl_term.c,v 1.68 2019/02/09 21:02:47 schwarze Exp $ */
+/*     $Id: tbl_term.c,v 1.69 2019/03/16 21:35:48 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011-2019 Ingo Schwarze <schwarze@openbsd.org>
@@ -46,7 +46,8 @@ static        void    tbl_fill_border(struct termp *, int, size_t);
 static void    tbl_fill_char(struct termp *, char, size_t);
 static void    tbl_fill_string(struct termp *, const char *, size_t);
 static void    tbl_hrule(struct termp *, const struct tbl_span *,
-                       const struct tbl_span *, int);
+                       const struct tbl_span *, const struct tbl_span *,
+                       int);
 static void    tbl_literal(struct termp *, const struct tbl_dat *,
                        const struct roffcol *);
 static void    tbl_number(struct termp *, const struct tbl_opts *,
@@ -222,9 +223,9 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
 
                if (tp->enc == TERMENC_ASCII &&
                    sp->opts->opts & TBL_OPT_DBOX)
-                       tbl_hrule(tp, NULL, sp, TBL_OPT_DBOX);
+                       tbl_hrule(tp, NULL, sp, sp, TBL_OPT_DBOX);
                if (sp->opts->opts & (TBL_OPT_DBOX | TBL_OPT_BOX))
-                       tbl_hrule(tp, NULL, sp, TBL_OPT_BOX);
+                       tbl_hrule(tp, NULL, sp, sp, TBL_OPT_BOX);
        }
 
        /* Set up the columns. */
@@ -342,7 +343,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
 
                more = 0;
                if (horiz)
-                       tbl_hrule(tp, sp->prev, sp, 0);
+                       tbl_hrule(tp, sp->prev, sp, sp->next, 0);
                else {
                        cp = sp->layout->first;
                        cpn = sp->next == NULL ? NULL :
@@ -557,12 +558,12 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
        tp->tcol->rmargin = tp->maxrmargin;
        if (sp->next == NULL) {
                if (sp->opts->opts & (TBL_OPT_DBOX | TBL_OPT_BOX)) {
-                       tbl_hrule(tp, sp, NULL, TBL_OPT_BOX);
+                       tbl_hrule(tp, sp, sp, NULL, TBL_OPT_BOX);
                        tp->skipvsp = 1;
                }
                if (tp->enc == TERMENC_ASCII &&
                    sp->opts->opts & TBL_OPT_DBOX) {
-                       tbl_hrule(tp, sp, NULL, TBL_OPT_DBOX);
+                       tbl_hrule(tp, sp, sp, NULL, TBL_OPT_DBOX);
                        tp->skipvsp = 2;
                }
                assert(tp->tbl.cols);
@@ -571,7 +572,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
        } else if (horiz == 0 && sp->opts->opts & TBL_OPT_ALLBOX &&
            (sp->next == NULL || sp->next->pos == TBL_SPAN_DATA ||
             sp->next->next != NULL))
-               tbl_hrule(tp, sp, sp->next, TBL_OPT_ALLBOX);
+               tbl_hrule(tp, sp, sp, sp->next, TBL_OPT_ALLBOX);
 
        tp->tcol->offset = save_offset;
        tp->flags &= ~TERMP_NONOSPACE;
@@ -579,9 +580,10 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
 
 static void
 tbl_hrule(struct termp *tp, const struct tbl_span *spp,
-    const struct tbl_span *spn, int flags)
+    const struct tbl_span *sp, const struct tbl_span *spn, int flags)
 {
        const struct tbl_cell   *cpp;    /* Layout cell above this line. */
+       const struct tbl_cell   *cp;     /* Layout cell in this line. */
        const struct tbl_cell   *cpn;    /* Layout cell below this line. */
        const struct tbl_dat    *dpn;    /* Data cell below this line. */
        const struct roffcol    *col;    /* Contains width and spacing. */
@@ -592,6 +594,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
        int                      uw, dw; /* Vertical line widths. */
 
        cpp = spp == NULL ? NULL : spp->layout->first;
+       cp  = sp  == NULL ? NULL : sp->layout->first;
        cpn = spn == NULL ? NULL : spn->layout->first;
        dpn = NULL;
        if (spn != NULL) {
@@ -600,11 +603,11 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
                else if (spn->next != NULL)
                        dpn = spn->next->first;
        }
-       opts = spn == NULL ? spp->opts->opts : spn->opts->opts;
+       opts = sp->opts->opts;
        bw = opts & TBL_OPT_DBOX ? (tp->enc == TERMENC_UTF8 ? 2 : 1) :
            opts & (TBL_OPT_BOX | TBL_OPT_ALLBOX) ? 1 : 0;
        hw = flags == TBL_OPT_DBOX || flags == TBL_OPT_BOX ? bw :
-           spn->pos == TBL_SPAN_DHORIZ ? 2 : 1;
+           sp->pos == TBL_SPAN_DHORIZ ? 2 : 1;
 
        /* Print the left end of the line. */
 
@@ -620,7 +623,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
                     cpn->pos != TBL_CELL_DOWN ? BRIGHT * hw : 0), 1);
 
        for (;;) {
-               col = tp->tbl.cols + (cpn == NULL ? cpp->col : cpn->col);
+               col = tp->tbl.cols + cp->col;
 
                /* Print the horizontal line inside this column. */
 
@@ -646,6 +649,8 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
                        }
                        cpp = cpp->next;
                }
+               if (cp != NULL)
+                       cp = cp->next;
                if (cpn != NULL) {
                        if (flags != TBL_OPT_DBOX) {
                                dw = cpn->vert;
@@ -656,7 +661,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
                        while (dpn != NULL && dpn->layout != cpn)
                                dpn = dpn->next;
                }
-               if (cpp == NULL && cpn == NULL)
+               if (cpp == NULL && cp == NULL && cpn == NULL)
                        break;
 
                /* Vertical lines do not cross spanned cells. */