]> git.cameronkatri.com Git - mandoc.git/blobdiff - tbl_term.c
Do not indent by SIZE_MAX/2 when .ce occurs inside explicit no-fill mode.
[mandoc.git] / tbl_term.c
index 63e7cc628ca41cade867be5dd6f880c6eb3015c0..b124d2c073fc49f0e8502a7ea9e66be744779eed 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: tbl_term.c,v 1.69 2019/03/16 21:35:48 schwarze Exp $ */
+/*     $Id: tbl_term.c,v 1.73 2020/01/11 16:26:08 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2011-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2011-2020 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
@@ -164,7 +164,7 @@ 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                   save_offset;
        size_t                   coloff, tsz;
        int                      hspans, ic, more;
        int                      dvert, fc, horiz, lhori, rhori, uvert;
@@ -267,11 +267,11 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                                hspans--;
                                continue;
                        }
-                       if (dp == NULL)
-                               continue;
-                       hspans = dp->hspans;
-                       if (ic || sp->layout->first->pos != TBL_CELL_SPAN)
+                       if (dp != NULL &&
+                           (ic || sp->layout->first->pos != TBL_CELL_SPAN)) {
+                               hspans = dp->hspans;
                                dp = dp->next;
+                       }
                }
 
                /* Set up a column for a right vertical frame. */
@@ -302,11 +302,11 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                        tp->tcol++;
                        tp->col = 0;
                        tbl_data(tp, sp->opts, cp, dp, tp->tbl.cols + ic);
-                       if (dp == NULL)
-                               continue;
-                       hspans = dp->hspans;
-                       if (cp->pos != TBL_CELL_SPAN)
+                       if (dp != NULL &&
+                           (ic || sp->layout->first->pos != TBL_CELL_SPAN)) {
+                               hspans = dp->hspans;
                                dp = dp->next;
+                       }
                }
                break;
        }
@@ -425,11 +425,10 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                                        cp = cp->next;
                                        continue;
                                }
-                               if (dp != NULL) {
+                               if (dp != NULL && (ic ||
+                                   sp->layout->first->pos != TBL_CELL_SPAN)) {
                                        hspans = dp->hspans;
-                                       if (ic || sp->layout->first->pos
-                                           != TBL_CELL_SPAN)
-                                               dp = dp->next;
+                                       dp = dp->next;
                                }
 
                                /*
@@ -622,14 +621,19 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
                    (spp == NULL || cpn == NULL ||
                     cpn->pos != TBL_CELL_DOWN ? BRIGHT * hw : 0), 1);
 
+       col = tp->tbl.cols;
        for (;;) {
-               col = tp->tbl.cols + cp->col;
+               if (cp == NULL)
+                       col++;
+               else
+                       col = tp->tbl.cols + cp->col;
 
                /* Print the horizontal line inside this column. */
 
                lw = cpp == NULL || cpn == NULL ||
                    (cpn->pos != TBL_CELL_DOWN &&
-                    (dpn == NULL || strcmp(dpn->string, "\\^") != 0))
+                    (dpn == NULL || dpn->string == NULL ||
+                     strcmp(dpn->string, "\\^") != 0))
                    ? hw : 0;
                tbl_direct_border(tp, BHORIZ * lw,
                    col->width + col->spacing / 2);
@@ -648,7 +652,8 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
                                        uw = 1;
                        }
                        cpp = cpp->next;
-               }
+               } else if (spp != NULL && opts & TBL_OPT_ALLBOX)
+                       uw = 1;
                if (cp != NULL)
                        cp = cp->next;
                if (cpn != NULL) {
@@ -660,8 +665,9 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
                        cpn = cpn->next;
                        while (dpn != NULL && dpn->layout != cpn)
                                dpn = dpn->next;
-               }
-               if (cpp == NULL && cp == NULL && cpn == NULL)
+               } else if (spn != NULL && opts & TBL_OPT_ALLBOX)
+                       dw = 1;
+               if (col + 1 == tp->tbl.cols + sp->opts->cols)
                        break;
 
                /* Vertical lines do not cross spanned cells. */
@@ -675,7 +681,8 @@ tbl_hrule(struct termp *tp, const struct tbl_span *spp,
 
                rw = cpp == NULL || cpn == NULL ||
                    (cpn->pos != TBL_CELL_DOWN &&
-                    (dpn == NULL || strcmp(dpn->string, "\\^") != 0))
+                    (dpn == NULL || dpn->string == NULL ||
+                     strcmp(dpn->string, "\\^") != 0))
                    ? hw : 0;
 
                /* The line crossing at the end of this column. */