warn about some non-portable idioms in .Bl -column;
authorschwarze <schwarze@openbsd.org>
Thu, 29 Jun 2017 15:21:46 +0000 (15:21 +0000)
committerschwarze <schwarze@openbsd.org>
Thu, 29 Jun 2017 15:21:46 +0000 (15:21 +0000)
triggered by a question from Yuri Pankov (illumos)

regress/usr.bin/mandoc/mdoc/Bl/Makefile
regress/usr.bin/mandoc/mdoc/Bl/column.in
regress/usr.bin/mandoc/mdoc/Bl/column.out_lint
regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.in [new file with mode: 0644]
regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_ascii [new file with mode: 0644]
regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_lint [new file with mode: 0644]
regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_markdown [new file with mode: 0644]
usr.bin/mandoc/mandoc.1
usr.bin/mandoc/mandoc.h
usr.bin/mandoc/mdoc_validate.c
usr.bin/mandoc/read.c

index de93986..6c62615 100644 (file)
@@ -1,7 +1,8 @@
-# $OpenBSD: Makefile,v 1.37 2017/03/08 22:53:35 schwarze Exp $
+# $OpenBSD: Makefile,v 1.38 2017/06/29 15:21:46 schwarze Exp $
 
 REGRESS_TARGETS  = item inset diag ohang bullet dash enum hang tag
-REGRESS_TARGETS += column colNoIt extend nested offset secstart
+REGRESS_TARGETS += column column_nogroff colNoIt
+REGRESS_TARGETS += extend nested offset secstart
 
 REGRESS_TARGETS += notype multitype badargs
 REGRESS_TARGETS += empty noIt emptyhead emptytag emptyitem multitag
@@ -9,7 +10,7 @@ REGRESS_TARGETS += bareIt bareTa unclosed break breakingIt breakingTa broken
 
 UTF8_TARGETS    = dash
 
-LINT_TARGETS    = column notype badargs tag
+LINT_TARGETS    = column column_nogroff notype badargs tag
 LINT_TARGETS   += empty noIt emptyhead emptytag emptyitem
 LINT_TARGETS   += bareIt bareTa break breakingIt broken
 
@@ -19,6 +20,8 @@ LINT_TARGETS  += bareIt bareTa break breakingIt broken
 SKIP_GROFF ?= breakingTa
 
 # groff-1.22.3 defects:
+# - column list items with no args but multiple lines cause bogus breaks
+# - in column lists, the tab macro cannot be a line macro
 # - lists with missing or late type ruin indentation
 # - empty lists ruin indentation and sometimes cause empty lines
 # - breaking lists continue indefinitely
@@ -26,7 +29,7 @@ SKIP_GROFF ?= breakingTa
 # - breaking a list aborts processing
 # - empty -tag item heads lose the blank line and the indentation
 
-SKIP_GROFF += notype empty break breakingIt broken emptytag
+SKIP_GROFF += column_nogroff notype empty emptytag break breakingIt broken
 
 SKIP_TMAN ?= column colNoIt multitype multitag bareTa break breakingTa broken
 
@@ -38,7 +41,7 @@ SKIP_TMAN += tag
 
 # Empty heads are still mishandled by -Tman.
 
-SKIP_TMAN += emptyhead emptytag
+SKIP_TMAN += column_nogroff emptyhead emptytag
 
 # mandoc -T markdown still has issues with badly nested lists
 
index be6ccdc..5f059a8 100644 (file)
 .El
 .\" Wrong number of columns.
 .Bl -column "a" "b"
+.It
 .It "a"
 .It "a" Ta "b"
+.It
 .It "a" Ta "b" Ta "c"
 .It "a" Ta "b" Ta "c" Ta "d"
 .It "a" Ta "b" Ta "c" Ta "d" Ta "e"
+.It
 .El
 .\" Mixed tab and Ta
 .Bl -column a b c d
index d335550..dea3ec7 100644 (file)
@@ -1,7 +1,10 @@
 mandoc: column.in:3:5: BASE: operating system explicitly specified: Os OpenBSD (OpenBSD)
 mandoc: column.in:1:5: BASE: Mdocdate missing: Dd October (OpenBSD)
-mandoc: column.in:71:2: WARNING: wrong number of cells: 2 columns, 1 cells
-mandoc: column.in:74:2: WARNING: wrong number of cells: 2 columns, 4 cells
-mandoc: column.in:75:2: WARNING: wrong number of cells: 2 columns, 5 cells
-mandoc: column.in:103:18: WARNING: skipping -width argument: Bl -column
+mandoc: column.in:71:2: WARNING: skipping empty macro: It
+mandoc: column.in:72:2: WARNING: wrong number of cells: 2 columns, 1 cells
+mandoc: column.in:74:2: WARNING: skipping empty macro: It
+mandoc: column.in:76:2: WARNING: wrong number of cells: 2 columns, 4 cells
+mandoc: column.in:77:2: WARNING: wrong number of cells: 2 columns, 5 cells
+mandoc: column.in:78:2: WARNING: skipping empty macro: It
+mandoc: column.in:106:18: WARNING: skipping -width argument: Bl -column
 mandoc: column.in: BASE: RCS id missing: (OpenBSD)
diff --git a/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.in b/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.in
new file mode 100644 (file)
index 0000000..43f332f
--- /dev/null
@@ -0,0 +1,19 @@
+.Dd June 29, 2017
+.Dt BL-COLUMN_NOGROFF 1
+.Os OpenBSD
+.Sh NAME
+.Nm Bl-column_nogroff
+.Nd column lists mishandled by groff
+.Sh DESCRIPTION
+Item macro without arguments:
+.Bl -column "first column" "second column"
+.It
+text
+.No macro Ta after tab
+.El
+.Pp
+Tab macro at the beginning of a line:
+.Bl -column "aa" "bb"
+.It aa
+.Ta bb
+.El
diff --git a/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_ascii b/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_ascii
new file mode 100644 (file)
index 0000000..f86d4d4
--- /dev/null
@@ -0,0 +1,15 @@
+BL-COLUMN_NOGROFF(1)        General Commands Manual       BL-COLUMN_NOGROFF(1)
+
+N\bNA\bAM\bME\bE
+     B\bBl\bl-\b-c\bco\bol\blu\bum\bmn\bn_\b_n\bno\bog\bgr\bro\bof\bff\bf - column lists mishandled by groff
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+     Item macro without arguments:
+
+     text macro      after tab
+
+     Tab macro at the beginning of a line:
+
+     aa    bb
+
+OpenBSD                          June 29, 2017                         OpenBSD
diff --git a/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_lint b/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_lint
new file mode 100644 (file)
index 0000000..df15cf1
--- /dev/null
@@ -0,0 +1,5 @@
+mandoc: column_nogroff.in:3:5: BASE: operating system explicitly specified: Os OpenBSD (OpenBSD)
+mandoc: column_nogroff.in:1:5: BASE: Mdocdate missing: Dd June (OpenBSD)
+mandoc: column_nogroff.in:10:2: WARNING: missing argument, using next line: Bl -column It
+mandoc: column_nogroff.in:18:2: WARNING: first macro on line: Ta
+mandoc: column_nogroff.in: BASE: RCS id missing: (OpenBSD)
diff --git a/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_markdown b/regress/usr.bin/mandoc/mdoc/Bl/column_nogroff.out_markdown
new file mode 100644 (file)
index 0000000..595236f
--- /dev/null
@@ -0,0 +1,18 @@
+BL-COLUMN\_NOGROFF(1) - General Commands Manual
+
+# NAME
+
+**Bl-column\_nogroff** - column lists mishandled by groff
+
+# DESCRIPTION
+
+Item macro without arguments:
+
+       text
+       macro           after tab
+
+Tab macro at the beginning of a line:
+
+       aa    bb
+
+OpenBSD - June 29, 2017
index 232ba78..88370fc 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: mandoc.1,v 1.132 2017/06/27 12:17:35 schwarze Exp $
+.\"    $OpenBSD: mandoc.1,v 1.133 2017/06/29 15:21:46 schwarze Exp $
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 .\" Copyright (c) 2012, 2014-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,7 +15,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: June 27 2017 $
+.Dd $Mdocdate: June 29 2017 $
 .Dt MANDOC 1
 .Os
 .Sh NAME
@@ -1218,6 +1218,12 @@ list block contains text or macros before the first
 .Ic \&It
 macro.
 The offending children are moved before the beginning of the list.
+.It Sy "first macro on line"
+Inside a
+.Ic \&Bl Fl column
+list, a
+.Ic \&Ta
+macro occurs as the first macro on a line, which is not portable.
 .It Sy "fill mode already enabled, skipping"
 .Pq man
 A
@@ -1363,6 +1369,17 @@ list, an
 .Ic \&It
 block is empty.
 An empty list item is shown.
+.It Sy "missing argument, using next line"
+.Pq mdoc
+An
+.Ic \&It
+macro in a
+.Ic \&Bd Fl column
+list has no arguments.
+While
+.Nm
+uses the text or macros of the following line, if any, for the cell,
+other formatters may misformat the list.
 .It Sy "missing font type, using \efR"
 .Pq mdoc
 A
index 9515490..89ecbe9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mandoc.h,v 1.178 2017/06/25 17:42:37 schwarze Exp $ */
+/*     $OpenBSD: mandoc.h,v 1.179 2017/06/29 15:21:46 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -109,6 +109,7 @@ enum        mandocerr {
        MANDOCERR_BLK_NEST, /* blocks badly nested: macro ... */
        MANDOCERR_BD_NEST, /* nested displays are not portable: macro ... */
        MANDOCERR_BL_MOVE, /* moving content out of list: macro */
+       MANDOCERR_TA_LINE, /* first macro on line: Ta */
        MANDOCERR_FI_SKIP, /* fill mode already enabled, skipping: fi */
        MANDOCERR_NF_SKIP, /* fill mode already disabled, skipping: nf */
        MANDOCERR_BLK_LINE, /* line scope broken: macro breaks macro */
@@ -127,6 +128,7 @@ enum        mandocerr {
        MANDOCERR_FO_NOHEAD, /* missing function name, using "": Fo */
        MANDOCERR_IT_NOHEAD, /* empty head in list item: Bl -type It */
        MANDOCERR_IT_NOBODY, /* empty list item: Bl -type It */
+       MANDOCERR_IT_NOARG, /* missing argument, using next line: Bl -c It */
        MANDOCERR_BF_NOFONT, /* missing font type, using \fR: Bf */
        MANDOCERR_BF_BADFONT, /* unknown font type, using \fR: Bf font */
        MANDOCERR_PF_SKIP, /* nothing follows prefix: Pf arg */
index 04b4324..573b682 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_validate.c,v 1.259 2017/06/27 12:17:35 schwarze Exp $ */
+/*     $OpenBSD: mdoc_validate.c,v 1.260 2017/06/29 15:21:46 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -1445,15 +1445,30 @@ post_it(POST_ARGS)
 
                assert(nit->head->child == NULL);
 
-               i = 0;
-               for (nch = nit->child; nch != NULL; nch = nch->next)
-                       if (nch->type == ROFFT_BODY)
-                               i++;
+               if (nit->head->next->child == NULL &&
+                   nit->head->next->next == NULL) {
+                       mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse,
+                           nit->line, nit->pos, "It");
+                       roff_node_delete(mdoc, nit);
+                       break;
+               }
 
+               i = 0;
+               for (nch = nit->child; nch != NULL; nch = nch->next) {
+                       if (nch->type != ROFFT_BODY)
+                               continue;
+                       if (i++ && nch->flags & NODE_LINE)
+                               mandoc_msg(MANDOCERR_TA_LINE, mdoc->parse,
+                                   nch->line, nch->pos, "Ta");
+               }
                if (i < cols || i > cols + 1)
                        mandoc_vmsg(MANDOCERR_BL_COL,
                            mdoc->parse, nit->line, nit->pos,
                            "%d columns, %d cells", cols, i);
+               else if (nit->head->next->child != NULL &&
+                   nit->head->next->child->line > nit->line)
+                       mandoc_msg(MANDOCERR_IT_NOARG, mdoc->parse,
+                           nit->line, nit->pos, "Bl -column It");
                break;
        default:
                abort();
index 55f24b3..63eaebf 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: read.c,v 1.154 2017/06/25 17:42:37 schwarze Exp $ */
+/*     $OpenBSD: read.c,v 1.155 2017/06/29 15:21:46 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -147,6 +147,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "blocks badly nested",
        "nested displays are not portable",
        "moving content out of list",
+       "first macro on line",
        "fill mode already enabled, skipping",
        "fill mode already disabled, skipping",
        "line scope broken",
@@ -165,6 +166,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "missing function name, using \"\"",
        "empty head in list item",
        "empty list item",
+       "missing argument, using next line",
        "missing font type, using \\fR",
        "unknown font type, using \\fR",
        "nothing follows prefix",