It turns out association of tbl spans with layout rows is simpler than
authorschwarze <schwarze@openbsd.org>
Tue, 4 Jul 2017 20:59:17 +0000 (20:59 +0000)
committerschwarze <schwarze@openbsd.org>
Tue, 4 Jul 2017 20:59:17 +0000 (20:59 +0000)
i thought.  Fixing a bug in curs_addch(3) and minus 25 lines of code.

regress/usr.bin/mandoc/tbl/data/Makefile
regress/usr.bin/mandoc/tbl/data/insert.in [new file with mode: 0644]
regress/usr.bin/mandoc/tbl/data/insert.out_ascii [new file with mode: 0644]
regress/usr.bin/mandoc/tbl/data/insert.out_lint [new file with mode: 0644]
usr.bin/mandoc/tbl_data.c

index 52f6d30..07a5573 100644 (file)
@@ -1,7 +1,7 @@
-# $OpenBSD: Makefile,v 1.3 2017/06/15 00:27:23 schwarze Exp $
+# $OpenBSD: Makefile,v 1.4 2017/07/04 20:59:17 schwarze Exp $
 
-REGRESS_TARGETS         = blankline block_unclosed block_width block_wrap empty
-LINT_TARGETS    = block_unclosed empty
+REGRESS_TARGETS  = blankline block_unclosed block_width block_wrap empty insert
+LINT_TARGETS    = block_unclosed empty insert
 
 # groff-1.22.3 defect:
 # - When a table ends in the middle of a block,
diff --git a/regress/usr.bin/mandoc/tbl/data/insert.in b/regress/usr.bin/mandoc/tbl/data/insert.in
new file mode 100644 (file)
index 0000000..942a496
--- /dev/null
@@ -0,0 +1,21 @@
+.\" $OpenBSD: insert.in,v 1.1 2017/07/04 20:59:17 schwarze Exp $
+.TH TBL-DATA-INSERT 1 "July 4, 2017"
+.SH NAME
+tbl-data-insert \- insertion of empty spans for line-only layout rows
+.SH DESCRIPTION
+initial text
+.TS
+tab(:);
+_ _
+l l
+- -
+l r
+_ ^
+r.
+colum one:column two
+left:right
+not:printed
+right:left
+.TE
+.sp
+final text
diff --git a/regress/usr.bin/mandoc/tbl/data/insert.out_ascii b/regress/usr.bin/mandoc/tbl/data/insert.out_ascii
new file mode 100644 (file)
index 0000000..50ce348
--- /dev/null
@@ -0,0 +1,22 @@
+TBL-DATA-INSERT(1)          General Commands Manual         TBL-DATA-INSERT(1)
+
+
+
+N\bNA\bAM\bME\bE
+       tbl-data-insert - insertion of empty spans for line-only layout rows
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       initial text
+
+       -----------------------
+       colum one   column two
+       -----------------------
+       left             right
+       -----------
+           right   left
+
+       final text
+
+
+
+OpenBSD                          July 4, 2017               TBL-DATA-INSERT(1)
diff --git a/regress/usr.bin/mandoc/tbl/data/insert.out_lint b/regress/usr.bin/mandoc/tbl/data/insert.out_lint
new file mode 100644 (file)
index 0000000..380b5e6
--- /dev/null
@@ -0,0 +1,2 @@
+mandoc: insert.in:17:1: ERROR: ignoring data in spanned tbl cell: not
+mandoc: insert.in:17:5: ERROR: ignoring data in spanned tbl cell: printed
index 986ee25..7406b0c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tbl_data.c,v 1.30 2017/06/16 20:00:41 schwarze Exp $ */
+/*     $OpenBSD: tbl_data.c,v 1.31 2017/07/04 20:59:17 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -194,9 +194,7 @@ tbl_data(struct tbl_node *tbl, int ln, const char *p, int pos)
 {
        struct tbl_row  *rp;
        struct tbl_cell *cp;
-       struct tbl_span *sp, *spi;
-       struct tbl_dat  *dp;
-       int              have_data, spans;
+       struct tbl_span *sp;
 
        rp = (sp = tbl->last_span) == NULL ? tbl->first_row :
            sp->pos == TBL_SPAN_DATA && sp->layout->next != NULL ?
@@ -204,66 +202,40 @@ tbl_data(struct tbl_node *tbl, int ln, const char *p, int pos)
 
        assert(rp != NULL);
 
-       sp = newspan(tbl, ln, rp);
-
        if ( ! strcmp(p, "_")) {
+               sp = newspan(tbl, ln, rp);
                sp->pos = TBL_SPAN_HORIZ;
                return;
        } else if ( ! strcmp(p, "=")) {
+               sp = newspan(tbl, ln, rp);
                sp->pos = TBL_SPAN_DHORIZ;
                return;
        }
-       sp->pos = TBL_SPAN_DATA;
-
-       while (p[pos] != '\0')
-               getdata(tbl, sp, ln, p, &pos);
 
        /*
-        * If this span contains some data,
-        * make sure at least part of it gets printed.
+        * If the layout row contains nothing but horizontal lines,
+        * allocate an empty span for it and assign the current span
+        * to the next layout row accepting data.
         */
 
-       have_data = 0;
-       cp = rp->first;
-       for (dp = sp->first; dp != NULL; dp = dp->next) {
-               if (dp->pos == TBL_DATA_DATA && *dp->string != '\0') {
-                       if (cp == NULL ||
-                           (cp->pos != TBL_CELL_HORIZ &&
-                            cp->pos != TBL_CELL_DHORIZ))
-                               return;
-                       have_data = 1;
-               }
-               spans = dp->spans;
-               while (spans-- >= 0) {
-                       if (cp != NULL)
-                               cp = cp->next;
-               }
+       while (rp->next != NULL) {
+               if (rp->last->col + 1 < tbl->opts.cols)
+                       break;
+               for (cp = rp->first; cp != NULL; cp = cp->next)
+                       if (cp->pos != TBL_CELL_HORIZ &&
+                           cp->pos != TBL_CELL_DHORIZ)
+                               break;
+               if (cp != NULL)
+                       break;
+               sp = newspan(tbl, ln, rp);
+               sp->pos = TBL_SPAN_DATA;
+               rp = rp->next;
        }
-       if (have_data == 0 || rp->next == NULL)
-               return;
 
-       /*
-        * There is some data, but it would all get lost
-        * due to horizontal lines in the layout.
-        * Insert an empty span to consume the layout row.
-        */
+       /* Process a real data row. */
 
-       tbl->last_span = sp->prev;
-       spi = newspan(tbl, ln, rp);
-       spi->pos = TBL_SPAN_DATA;
-       spi->next = sp;
-       tbl->last_span = sp;
-       sp->prev = spi;
-       sp->layout = rp->next;
-       cp = sp->layout->first;
-       for (dp = sp->first; dp != NULL; dp = dp->next) {
-               dp->layout = cp;
-               dp->spans = 0;
-               if (cp != NULL)
-                       cp = cp->next;
-               while (cp != NULL && cp->pos == TBL_CELL_SPAN) {
-                       dp->spans++;
-                       cp = cp->next;
-               }
-       }
+       sp = newspan(tbl, ln, rp);
+       sp->pos = TBL_SPAN_DATA;
+       while (p[pos] != '\0')
+               getdata(tbl, sp, ln, p, &pos);
 }