]> git.cameronkatri.com Git - mandoc.git/blobdiff - tbl_term.c
add arch.o
[mandoc.git] / tbl_term.c
index 9e533bfc6d6859f1c3bb93655a689c0f0e082d9f..a197f8ef743a8fbd0b6ea6c27b515b35934dbc34 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: tbl_term.c,v 1.66 2018/12/12 21:54:35 schwarze Exp $ */
+/*     $Id: tbl_term.c,v 1.68 2019/02/09 21:02:47 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2018 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2019 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -163,13 +163,15 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
        const struct tbl_cell   *cp, *cpn, *cpp, *cps;
        const struct tbl_dat    *dp;
        static size_t            offset;
+       size_t                   save_offset;
        size_t                   coloff, tsz;
        int                      hspans, ic, more;
-       int                      dvert, fc, horiz, line, uvert;
+       int                      dvert, fc, horiz, lhori, rhori, uvert;
 
        /* Inhibit printing of spaces: we do padding ourselves. */
 
        tp->flags |= TERMP_NOSPACE | TERMP_NONOSPACE;
+       save_offset = tp->tcol->offset;
 
        /*
         * The first time we're invoked for a given table block,
@@ -211,8 +213,9 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                                tsz += tp->tbl.cols[sp->opts->cols - 1].width;
                        if (offset + tsz > tp->tcol->rmargin)
                                tsz -= 1;
-                       tp->tcol->offset = offset + tp->tcol->rmargin > tsz ?
+                       offset = offset + tp->tcol->rmargin > tsz ?
                            (offset + tp->tcol->rmargin - tsz) / 2 : 0;
+                       tp->tcol->offset = offset;
                }
 
                /* Horizontal frame at the start of boxed tables. */
@@ -227,6 +230,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
        /* Set up the columns. */
 
        tp->flags |= TERMP_MULTICOL;
+       tp->tcol->offset = offset;
        horiz = 0;
        switch (sp->pos) {
        case TBL_SPAN_HORIZ:
@@ -321,11 +325,13 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                    (horiz || (IS_HORIZ(sp->layout->first) &&
                      !IS_HORIZ(sp->prev->layout->first))))
                        uvert = sp->prev->layout->vert;
-               line = sp->pos == TBL_SPAN_DHORIZ ||
+               rhori = sp->pos == TBL_SPAN_DHORIZ ||
+                   (sp->first != NULL && sp->first->pos == TBL_DATA_DHORIZ) ||
                    sp->layout->first->pos == TBL_CELL_DHORIZ ? 2 :
                    sp->pos == TBL_SPAN_HORIZ ||
+                   (sp->first != NULL && sp->first->pos == TBL_DATA_HORIZ) ||
                    sp->layout->first->pos == TBL_CELL_HORIZ ? 1 : 0;
-               fc = BUP * uvert + BDOWN * dvert + BRIGHT * line;
+               fc = BUP * uvert + BDOWN * dvert + BRIGHT * rhori;
                if (uvert > 0 || dvert > 0 || (horiz && sp->opts->lvert)) {
                        (*tp->advance)(tp, tp->tcols->offset);
                        tp->viscol = tp->tcol->offset;
@@ -398,6 +404,15 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                                        cpn = cpn->next;
                                }
 
+                               lhori = (cp != NULL &&
+                                    cp->pos == TBL_CELL_DHORIZ) ||
+                                   (dp != NULL &&
+                                    dp->pos == TBL_DATA_DHORIZ) ? 2 :
+                                   (cp != NULL &&
+                                    cp->pos == TBL_CELL_HORIZ) ||
+                                   (dp != NULL &&
+                                    dp->pos == TBL_DATA_HORIZ) ? 1 : 0;
+
                                /*
                                 * Skip later cells in a span,
                                 * figure out whether to start a span,
@@ -450,57 +465,36 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                                }
                                while (tp->viscol < tp->tcol->rmargin +
                                    tp->tbl.cols[ic].spacing / 2)
-                                       tbl_direct_border(tp, fc, 1);
+                                       tbl_direct_border(tp,
+                                           BHORIZ * lhori, 1);
 
                                if (tp->tcol + 1 == tp->tcols + tp->lasttcol)
                                        continue;
 
-                               if (cp != NULL) {
-                                       switch (cp->pos) {
-                                       case TBL_CELL_HORIZ:
-                                               fc = BLEFT;
-                                               break;
-                                       case TBL_CELL_DHORIZ:
-                                               fc = BLEFT * 2;
-                                               break;
-                                       default:
-                                               fc = 0;
-                                               break;
-                                       }
+                               if (cp != NULL)
                                        cp = cp->next;
-                               }
-                               if (cp != NULL) {
-                                       switch (cp->pos) {
-                                       case TBL_CELL_HORIZ:
-                                               fc += BRIGHT;
-                                               break;
-                                       case TBL_CELL_DHORIZ:
-                                               fc += BRIGHT * 2;
-                                               break;
-                                       default:
-                                               break;
-                                       }
-                               }
+
+                               rhori = (cp != NULL &&
+                                    cp->pos == TBL_CELL_DHORIZ) ||
+                                   (dp != NULL &&
+                                    dp->pos == TBL_DATA_DHORIZ) ? 2 :
+                                   (cp != NULL &&
+                                    cp->pos == TBL_CELL_HORIZ) ||
+                                   (dp != NULL &&
+                                    dp->pos == TBL_DATA_HORIZ) ? 1 : 0;
+
                                if (tp->tbl.cols[ic].spacing)
-                                       tbl_direct_border(tp, fc +
+                                       tbl_direct_border(tp,
+                                           BLEFT * lhori + BRIGHT * rhori +
                                            BUP * uvert + BDOWN * dvert, 1);
 
                                if (tp->enc == TERMENC_UTF8)
                                        uvert = dvert = 0;
 
-                               if (fc != 0) {
-                                       if (cp != NULL &&
-                                           cp->pos == TBL_CELL_HORIZ)
-                                               fc = BHORIZ;
-                                       else if (cp != NULL &&
-                                           cp->pos == TBL_CELL_DHORIZ)
-                                               fc = BHORIZ * 2;
-                                       else
-                                               fc = 0;
-                               }
                                if (tp->tbl.cols[ic].spacing > 2 &&
-                                   (uvert > 1 || dvert > 1 || fc != 0))
-                                       tbl_direct_border(tp, fc +
+                                   (uvert > 1 || dvert > 1 || rhori))
+                                       tbl_direct_border(tp,
+                                           BHORIZ * rhori +
                                            BUP * (uvert > 1) +
                                            BDOWN * (dvert > 1), 1);
                        }
@@ -524,20 +518,27 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                    (horiz || (IS_HORIZ(sp->layout->last) &&
                     !IS_HORIZ(sp->prev->layout->last))))
                        uvert = sp->prev->layout->last->vert;
-               line = sp->pos == TBL_SPAN_DHORIZ ||
+               lhori = sp->pos == TBL_SPAN_DHORIZ ||
+                   (sp->last != NULL &&
+                    sp->last->pos == TBL_DATA_DHORIZ &&
+                    sp->last->layout->col + 1 == sp->opts->cols) ||
                    (sp->layout->last->pos == TBL_CELL_DHORIZ &&
                     sp->layout->last->col + 1 == sp->opts->cols) ? 2 :
                    sp->pos == TBL_SPAN_HORIZ ||
+                   (sp->last != NULL &&
+                    sp->last->pos == TBL_DATA_HORIZ &&
+                    sp->last->layout->col + 1 == sp->opts->cols) ||
                    (sp->layout->last->pos == TBL_CELL_HORIZ &&
                     sp->layout->last->col + 1 == sp->opts->cols) ? 1 : 0;
-               fc = BUP * uvert + BDOWN * dvert + BLEFT * line;
+               fc = BUP * uvert + BDOWN * dvert + BLEFT * lhori;
                if (uvert > 0 || dvert > 0 || (horiz && sp->opts->rvert)) {
                        if (horiz == 0 && (IS_HORIZ(sp->layout->last) == 0 ||
                            sp->layout->last->col + 1 < sp->opts->cols)) {
                                tp->tcol++;
-                               (*tp->advance)(tp,
-                                   tp->tcol->offset > tp->viscol ?
-                                   tp->tcol->offset - tp->viscol : 1);
+                               do {
+                                       tbl_direct_border(tp,
+                                           BHORIZ * lhori, 1);
+                               } while (tp->viscol < tp->tcol->offset);
                        }
                        tbl_direct_border(tp, fc, 1);
                }
@@ -567,12 +568,12 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                assert(tp->tbl.cols);
                free(tp->tbl.cols);
                tp->tbl.cols = NULL;
-               tp->tcol->offset = offset;
        } 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);
 
+       tp->tcol->offset = save_offset;
        tp->flags &= ~TERMP_NONOSPACE;
 }