]> git.cameronkatri.com Git - mandoc.git/commitdiff
warn about some non-portable idioms in .Bl -column;
authorIngo Schwarze <schwarze@openbsd.org>
Thu, 29 Jun 2017 15:22:17 +0000 (15:22 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Thu, 29 Jun 2017 15:22:17 +0000 (15:22 +0000)
triggered by a question from Yuri Pankov (illumos)

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

index 7ac89ed927977fa82074bcef899789bd87b99fdf..5d59ba4f5379c2685e04c72c1da1305e5d6f05bb 100644 (file)
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\"    $Id: mandoc.1,v 1.208 2017/06/27 12:18:00 schwarze Exp $
+.\"    $Id: mandoc.1,v 1.209 2017/06/29 15:22:17 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 8e7ddf44fa6e5ad703098248edd6ce3b2a912393..94a5f2fb8bf56dc54e604e94967a2905b8e01b10 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.236 2017/06/25 17:43:45 schwarze Exp $ */
+/*     $Id: mandoc.h,v 1.237 2017/06/29 15:22:17 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 a7d91ec08aa43d6a3a85f6fa65d76b37ca49b4d6..734931554d626aeb725d9f3b10a8655a1352be5a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.344 2017/06/27 12:18:00 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.345 2017/06/29 15:22:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -1460,15 +1460,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();
diff --git a/read.c b/read.c
index f1c14c1d6909a644fde34c2c440fdf8ca82587f3..ab390334dfec189fa87f63db21c056f02c7b2a1d 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.182 2017/06/25 17:43:45 schwarze Exp $ */
+/*     $Id: read.c,v 1.183 2017/06/29 15:22:17 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -151,6 +151,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",
@@ -169,6 +170,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",
index 01c45ed1575af6514eea595121cb11be1bcfec36..7ac8d729fc411e710cd28de860509b2fbe4f476d 100644 (file)
@@ -1,7 +1,8 @@
 # $OpenBSD: Makefile,v 1.31 2016/10/17 19:00:16 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 be6ccdca9d7a98ba166b11998f8e150720bb3f02..5f059a8cf15ce862f792944c260f09bcd4291f76 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 d335550c00ec8ac6ce717c2dcda86ed78be71370..dea3ec79656b74fe805df5406f37cd3292d76cf9 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/mdoc/Bl/column_nogroff.in b/regress/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/mdoc/Bl/column_nogroff.out_ascii b/regress/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/mdoc/Bl/column_nogroff.out_lint b/regress/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/mdoc/Bl/column_nogroff.out_markdown b/regress/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