]> git.cameronkatri.com Git - mandoc.git/blobdiff - tbl_term.c
If no output device was allocated because no file wanted to produce output,
[mandoc.git] / tbl_term.c
index 160f3baa3756c8299fae12da038fabaa9b3bdab6..eceaa4b60f4ad74434978ea72ad8e775697db262 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: tbl_term.c,v 1.35 2015/01/30 02:09:04 schwarze Exp $ */
+/*     $Id: tbl_term.c,v 1.43 2015/10/12 00:08:16 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -47,25 +47,24 @@ static size_t
 term_tbl_strlen(const char *p, void *arg)
 {
 
-       return(term_strlen((const struct termp *)arg, p));
+       return term_strlen((const struct termp *)arg, p);
 }
 
 static size_t
 term_tbl_len(size_t sz, void *arg)
 {
 
-       return(term_len((const struct termp *)arg, sz));
+       return term_len((const struct termp *)arg, sz);
 }
 
 void
 term_tbl(struct termp *tp, const struct tbl_span *sp)
 {
-       const struct tbl_head   *hp;
        const struct tbl_cell   *cp;
        const struct tbl_dat    *dp;
        static size_t            offset;
        size_t                   rmargin, maxrmargin, tsz;
-       int                      horiz, spans, vert;
+       int                      ic, horiz, spans, vert;
 
        rmargin = tp->rmargin;
        maxrmargin = tp->maxrmargin;
@@ -82,9 +81,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
         * calculate the table widths and decimal positions.
         */
 
-       if (sp->flags & TBL_SPAN_FIRST) {
-               term_flushln(tp);
-
+       if (tp->tbl.cols == NULL) {
                tp->tbl.len = term_tbl_len;
                tp->tbl.slen = term_tbl_strlen;
                tp->tbl.arg = tp;
@@ -97,8 +94,8 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                if (sp->opts->opts & TBL_OPT_CENTRE) {
                        tsz = sp->opts->opts & (TBL_OPT_BOX | TBL_OPT_DBOX)
                            ? 2 : !!sp->opts->lvert + !!sp->opts->rvert;
-                       for (hp = sp->head; hp != NULL; hp = hp->next)
-                               tsz += tp->tbl.cols[hp->ident].width + 3;
+                       for (ic = 0; ic < sp->opts->cols; ic++)
+                               tsz += tp->tbl.cols[ic].width + 3;
                        tsz -= 3;
                        if (offset + tsz > rmargin)
                                tsz -= 1;
@@ -127,16 +124,14 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
 
        /*
         * Now print the actual data itself depending on the span type.
-        * Spanner spans get a horizontal rule; data spanners have their
-        * data printed by matching data to header.
+        * Match data cells to column numbers.
         */
 
        if (sp->pos == TBL_SPAN_DATA) {
-               /* Iterate over template headers. */
                cp = sp->layout->first;
                dp = sp->first;
                spans = 0;
-               for (hp = sp->head; hp != NULL; hp = hp->next) {
+               for (ic = 0; ic < sp->opts->cols; ic++) {
 
                        /*
                         * Remeber whether we need a vertical bar
@@ -150,8 +145,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                         */
 
                        if (spans == 0) {
-                               tbl_data(tp, sp->opts, dp,
-                                   tp->tbl.cols + hp->ident);
+                               tbl_data(tp, sp->opts, dp, tp->tbl.cols + ic);
                                if (dp != NULL) {
                                        spans = dp->spans;
                                        dp = dp->next;
@@ -166,13 +160,13 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
                         * of spans and after the last cell.
                         */
 
-                       if (hp->next == NULL || spans)
+                       if (ic + 1 == sp->opts->cols || spans)
                                continue;
 
                        tbl_char(tp, ASCII_NBRSP, 1);
                        if (vert > 0)
                                tbl_char(tp, '|', vert);
-                       if (vert < 2 && hp->next != NULL)
+                       if (vert < 2)
                                tbl_char(tp, ASCII_NBRSP, 2 - vert);
                }
        } else if (horiz)
@@ -193,7 +187,7 @@ term_tbl(struct termp *tp, const struct tbl_span *sp)
         * existing table configuration and set it to NULL.
         */
 
-       if (sp->flags & TBL_SPAN_LAST) {
+       if (sp->next == NULL) {
                if (sp->opts->opts & (TBL_OPT_DBOX | TBL_OPT_BOX)) {
                        tbl_hrule(tp, sp, 1);
                        tp->skipvsp = 1;
@@ -236,7 +230,7 @@ tbl_hrule(struct termp *tp, const struct tbl_span *sp, int kind)
        if (c2 == c1)
                c2 = NULL;
        for (;;) {
-               tbl_char(tp, line, tp->tbl.cols[c1->head->ident].width + 1);
+               tbl_char(tp, line, tp->tbl.cols[c1->col].width + 1);
                vert = c1->vert;
                if ((c1 = c1->next) == NULL)
                         break;
@@ -272,12 +266,10 @@ tbl_data(struct termp *tp, const struct tbl_opts *opts,
                tbl_char(tp, ASCII_NBRSP, col->width);
                return;
        case TBL_DATA_HORIZ:
-               /* FALLTHROUGH */
        case TBL_DATA_NHORIZ:
                tbl_char(tp, '-', col->width);
                return;
        case TBL_DATA_NDHORIZ:
-               /* FALLTHROUGH */
        case TBL_DATA_DHORIZ:
                tbl_char(tp, '=', col->width);
                return;
@@ -293,11 +285,8 @@ tbl_data(struct termp *tp, const struct tbl_opts *opts,
                tbl_char(tp, '=', col->width);
                break;
        case TBL_CELL_LONG:
-               /* FALLTHROUGH */
        case TBL_CELL_CENTRE:
-               /* FALLTHROUGH */
        case TBL_CELL_LEFT:
-               /* FALLTHROUGH */
        case TBL_CELL_RIGHT:
                tbl_literal(tp, dp, col);
                break;
@@ -309,7 +298,6 @@ tbl_data(struct termp *tp, const struct tbl_opts *opts,
                break;
        default:
                abort();
-               /* NOTREACHED */
        }
 }
 
@@ -332,17 +320,16 @@ static void
 tbl_literal(struct termp *tp, const struct tbl_dat *dp,
                const struct roffcol *col)
 {
-       struct tbl_head         *hp;
-       size_t                   width, len, padl, padr;
-       int                      spans;
+       size_t           len, padl, padr, width;
+       int              ic, spans;
 
        assert(dp->string);
        len = term_strlen(tp, dp->string);
-
-       hp = dp->layout->head->next;
        width = col->width;
-       for (spans = dp->spans; spans--; hp = hp->next)
-               width += tp->tbl.cols[hp->ident].width + 3;
+       ic = dp->layout->col;
+       spans = dp->spans;
+       while (spans--)
+               width += tp->tbl.cols[++ic].width + 3;
 
        padr = width > len ? width - len : 0;
        padl = 0;
@@ -419,9 +406,9 @@ tbl_number(struct termp *tp, const struct tbl_opts *opts,
 static void
 tbl_word(struct termp *tp, const struct tbl_dat *dp)
 {
-       const void      *prev_font;
+       int              prev_font;
 
-       prev_font = term_fontq(tp);
+       prev_font = tp->fonti;
        if (dp->layout->flags & TBL_CELL_BOLD)
                term_fontpush(tp, TERMFONT_BOLD);
        else if (dp->layout->flags & TBL_CELL_ITALIC)