]> git.cameronkatri.com Git - mandoc.git/commitdiff
When the HEAD scope of .TP is broken by another block macro,
authorIngo Schwarze <schwarze@openbsd.org>
Mon, 7 Nov 2011 01:24:40 +0000 (01:24 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Mon, 7 Nov 2011 01:24:40 +0000 (01:24 +0000)
do not abort with a FATAL error, but report a report a WARNING,
remove the broken .TP from the syntax tree, and prod on.
Reported repeatedly by ports people, at least by brad@ and jeremy@.
Also fixes rendition(4) in Xenocara.
ok kristaps@

TODO
libman.h
man.c
man_macro.c
man_validate.c
mandoc.h
read.c

diff --git a/TODO b/TODO
index 231db2edf0dc0b18a1cdd20ffc5ab06b68e925bf..c29922aa130a89674f0e1e5c453f2948f8046aa2 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,6 @@
 ************************************************************************
 * Official mandoc TODO.
 ************************************************************************
 * Official mandoc TODO.
-* $Id: TODO,v 1.122 2011/09/20 14:20:48 schwarze Exp $
+* $Id: TODO,v 1.123 2011/11/07 01:24:40 schwarze Exp $
 ************************************************************************
 
 ************************************************************************
 ************************************************************************
 
 ************************************************************************
   and then triggers an unknown macro error
   reported by naddy@  Sun, 3 Jul 2011 21:52:24 +0200
 
   and then triggers an unknown macro error
   reported by naddy@  Sun, 3 Jul 2011 21:52:24 +0200
 
-- .TP before .SH is still FATAL in man(7)
-  reported by brad@  Sat, 15 Jan 2011 15:54:54 -0500
-  also occurs in emulators/pcsxr/patches/patch-doc_pcsx_1
-  jeremy@  commit Wed, 7 Sep 2011 10:00:19 -0600 (MDT)
-
 ************************************************************************
 * formatter bugs
 ************************************************************************
 ************************************************************************
 * formatter bugs
 ************************************************************************
   .It Em Authentication<tab>Key Length
   ought to render "Key Length" with emphasis, too,
   see OpenBSD iked.conf(5).
   .It Em Authentication<tab>Key Length
   ought to render "Key Length" with emphasis, too,
   see OpenBSD iked.conf(5).
+  reported again Nicolas Joly via wiz@ Wed, 12 Oct 2011 00:20:00 +0200
 
 - empty phrases in .Bl column produce too few blanks
   try e.g. .Bl -column It Ta Ta
 
 - empty phrases in .Bl column produce too few blanks
   try e.g. .Bl -column It Ta Ta
index cacb02754e8401f109a313a6c1c96a31f24a9c3b..4bc5128204f636e911d14c151bc7c84cef510c80 100644 (file)
--- a/libman.h
+++ b/libman.h
@@ -1,4 +1,4 @@
-/*     $Id: libman.h,v 1.54 2011/09/18 14:14:15 schwarze Exp $ */
+/*     $Id: libman.h,v 1.55 2011/11/07 01:24:40 schwarze Exp $ */
 /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -54,6 +54,7 @@ struct        man_macro {
 #define        MAN_FSCOPED      (1 << 2)       /* See blk_imp(). */
 #define        MAN_NSCOPED      (1 << 3)       /* See in_line_eoln(). */
 #define        MAN_NOCLOSE      (1 << 4)       /* See blk_exp(). */
 #define        MAN_FSCOPED      (1 << 2)       /* See blk_imp(). */
 #define        MAN_NSCOPED      (1 << 3)       /* See in_line_eoln(). */
 #define        MAN_NOCLOSE      (1 << 4)       /* See blk_exp(). */
+#define        MAN_BSCOPE       (1 << 5)       /* Break BLINE scope. */
 };
 
 extern const struct man_macro *const man_macros;
 };
 
 extern const struct man_macro *const man_macros;
diff --git a/man.c b/man.c
index 17e002b48ba8d7da7feedd0f9974f06d2f3877a3..a901c82c6417620fa69d87613a8ad2d5a5a89f95 100644 (file)
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/*     $Id: man.c,v 1.112 2011/10/06 22:29:12 kristaps Exp $ */
+/*     $Id: man.c,v 1.113 2011/11/07 01:24:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -543,12 +543,39 @@ man_pmacro(struct man *m, int ln, char *buf, int offs)
                        n = n->parent;
 
                mandoc_vmsg(MANDOCERR_LINESCOPE, m->parse, n->line, 
                        n = n->parent;
 
                mandoc_vmsg(MANDOCERR_LINESCOPE, m->parse, n->line, 
-                               n->pos, "%s", man_macronames[n->tok]);
+                   n->pos, "%s breaks %s", man_macronames[tok],
+                   man_macronames[n->tok]);
 
                man_node_delete(m, n);
                m->flags &= ~MAN_ELINE;
        }
 
 
                man_node_delete(m, n);
                m->flags &= ~MAN_ELINE;
        }
 
+       /*
+        * Remove prior BLINE macro that is being clobbered.
+        */
+       if ((m->flags & MAN_BLINE) &&
+           (MAN_BSCOPE & man_macros[tok].flags)) {
+               n = m->last;
+               assert(MAN_TEXT != n->type);
+
+               /* Remove element that didn't end BLINE, if any. */
+
+               if ( ! (MAN_BSCOPE & man_macros[n->tok].flags))
+                       n = n->parent;
+
+               assert(MAN_HEAD == n->type);
+               n = n->parent;
+               assert(MAN_BLOCK == n->type);
+               assert(MAN_SCOPED & man_macros[n->tok].flags);
+
+               mandoc_vmsg(MANDOCERR_LINESCOPE, m->parse, n->line, 
+                   n->pos, "%s breaks %s", man_macronames[tok],
+                   man_macronames[n->tok]);
+
+               man_node_delete(m, n);
+               m->flags &= ~MAN_BLINE;
+       }
+
        /*
         * Save the fact that we're in the next-line for a block.  In
         * this way, embedded roff instructions can "remember" state
        /*
         * Save the fact that we're in the next-line for a block.  In
         * this way, embedded roff instructions can "remember" state
index 90037b89776b6cee7f54c48291b3be1a338f4a7c..a08adf62e9713b25c78ca06fd0eba0e2fa639fc7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_macro.c,v 1.65 2011/09/18 14:14:15 schwarze Exp $ */
+/*     $Id: man_macro.c,v 1.66 2011/11/07 01:24:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -52,15 +52,15 @@ static      void             rew_warn(struct man *,
 
 const  struct man_macro __man_macros[MAN_MAX] = {
        { in_line_eoln, MAN_NSCOPED }, /* br */
 
 const  struct man_macro __man_macros[MAN_MAX] = {
        { in_line_eoln, MAN_NSCOPED }, /* br */
-       { in_line_eoln, 0 }, /* TH */
-       { blk_imp, MAN_SCOPED }, /* SH */
-       { blk_imp, MAN_SCOPED }, /* SS */
-       { blk_imp, MAN_SCOPED | MAN_FSCOPED }, /* TP */
-       { blk_imp, 0 }, /* LP */
-       { blk_imp, 0 }, /* PP */
-       { blk_imp, 0 }, /* P */
-       { blk_imp, 0 }, /* IP */
-       { blk_imp, 0 }, /* HP */
+       { in_line_eoln, MAN_BSCOPE }, /* TH */
+       { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SH */
+       { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SS */
+       { blk_imp, MAN_BSCOPE | MAN_SCOPED | MAN_FSCOPED }, /* TP */
+       { blk_imp, MAN_BSCOPE }, /* LP */
+       { blk_imp, MAN_BSCOPE }, /* PP */
+       { blk_imp, MAN_BSCOPE }, /* P */
+       { blk_imp, MAN_BSCOPE }, /* IP */
+       { blk_imp, MAN_BSCOPE }, /* HP */
        { in_line_eoln, MAN_SCOPED }, /* SM */
        { in_line_eoln, MAN_SCOPED }, /* SB */
        { in_line_eoln, 0 }, /* BI */
        { in_line_eoln, MAN_SCOPED }, /* SM */
        { in_line_eoln, MAN_SCOPED }, /* SB */
        { in_line_eoln, 0 }, /* BI */
@@ -74,8 +74,8 @@ const struct man_macro __man_macros[MAN_MAX] = {
        { in_line_eoln, 0 }, /* RI */
        { in_line_eoln, MAN_NSCOPED }, /* na */
        { in_line_eoln, MAN_NSCOPED }, /* sp */
        { in_line_eoln, 0 }, /* RI */
        { in_line_eoln, MAN_NSCOPED }, /* na */
        { in_line_eoln, MAN_NSCOPED }, /* sp */
-       { in_line_eoln, 0 }, /* nf */
-       { in_line_eoln, 0 }, /* fi */
+       { in_line_eoln, MAN_BSCOPE }, /* nf */
+       { in_line_eoln, MAN_BSCOPE }, /* fi */
        { blk_close, 0 }, /* RE */
        { blk_exp, MAN_EXPLICIT }, /* RS */
        { in_line_eoln, 0 }, /* DT */
        { blk_close, 0 }, /* RE */
        { blk_exp, MAN_EXPLICIT }, /* RS */
        { in_line_eoln, 0 }, /* DT */
index 5ab775ac34a873c5bffe4fae994115589f7db39b..d39618ff542b7b12c34f456a8e6778ad27982c19 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_validate.c,v 1.77 2011/11/03 20:48:52 schwarze Exp $ */
+/*     $Id: man_validate.c,v 1.78 2011/11/07 01:24:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -44,7 +44,6 @@ struct        man_valid {
        v_check  *posts;
 };
 
        v_check  *posts;
 };
 
-static int       check_bline(CHKARGS);
 static int       check_eq0(CHKARGS);
 static int       check_le1(CHKARGS);
 static int       check_ge2(CHKARGS);
 static int       check_eq0(CHKARGS);
 static int       check_le1(CHKARGS);
 static int       check_ge2(CHKARGS);
@@ -76,20 +75,19 @@ static      v_check   posts_sec[] = { post_sec, NULL };
 static v_check   posts_sp[] = { post_vs, check_le1, NULL };
 static v_check   posts_th[] = { check_ge2, check_le5, post_TH, NULL };
 static v_check   posts_uc[] = { post_UC, NULL };
 static v_check   posts_sp[] = { post_vs, check_le1, NULL };
 static v_check   posts_th[] = { check_ge2, check_le5, post_TH, NULL };
 static v_check   posts_uc[] = { post_UC, NULL };
-static v_check   pres_bline[] = { check_bline, NULL };
-static v_check   pres_sec[] = { check_bline, pre_sec, NULL};
+static v_check   pres_sec[] = { pre_sec, NULL };
 
 static const struct man_valid man_valids[MAN_MAX] = {
        { NULL, posts_br }, /* br */
 
 static const struct man_valid man_valids[MAN_MAX] = {
        { NULL, posts_br }, /* br */
-       { pres_bline, posts_th }, /* TH */
+       { NULL, posts_th }, /* TH */
        { pres_sec, posts_sec }, /* SH */
        { pres_sec, posts_sec }, /* SS */
        { pres_sec, posts_sec }, /* SH */
        { pres_sec, posts_sec }, /* SS */
-       { pres_bline, NULL }, /* TP */
-       { pres_bline, posts_par }, /* LP */
-       { pres_bline, posts_par }, /* PP */
-       { pres_bline, posts_par }, /* P */
-       { pres_bline, NULL }, /* IP */
-       { pres_bline, NULL }, /* HP */
+       { NULL, NULL }, /* TP */
+       { NULL, posts_par }, /* LP */
+       { NULL, posts_par }, /* PP */
+       { NULL, posts_par }, /* P */
+       { NULL, NULL }, /* IP */
+       { NULL, NULL }, /* HP */
        { NULL, NULL }, /* SM */
        { NULL, NULL }, /* SB */
        { NULL, NULL }, /* BI */
        { NULL, NULL }, /* SM */
        { NULL, NULL }, /* SB */
        { NULL, NULL }, /* BI */
@@ -103,8 +101,8 @@ static      const struct man_valid man_valids[MAN_MAX] = {
        { NULL, NULL }, /* RI */
        { NULL, posts_eq0 }, /* na */ /* FIXME: should warn only. */
        { NULL, posts_sp }, /* sp */ /* FIXME: should warn only. */
        { NULL, NULL }, /* RI */
        { NULL, posts_eq0 }, /* na */ /* FIXME: should warn only. */
        { NULL, posts_sp }, /* sp */ /* FIXME: should warn only. */
-       { pres_bline, posts_nf }, /* nf */
-       { pres_bline, posts_fi }, /* fi */
+       { NULL, posts_nf }, /* nf */
+       { NULL, posts_fi }, /* fi */
        { NULL, NULL }, /* RE */
        { NULL, posts_part }, /* RS */
        { NULL, NULL }, /* DT */
        { NULL, NULL }, /* RE */
        { NULL, posts_part }, /* RS */
        { NULL, NULL }, /* DT */
@@ -351,19 +349,6 @@ check_par(CHKARGS)
 }
 
 
 }
 
 
-static int
-check_bline(CHKARGS)
-{
-
-       assert( ! (MAN_ELINE & m->flags));
-       if (MAN_BLINE & m->flags) {
-               man_nmsg(m, n, MANDOCERR_SYNTLINESCOPE);
-               return(0);
-       }
-
-       return(1);
-}
-
 static int
 post_TH(CHKARGS)
 {
 static int
 post_TH(CHKARGS)
 {
index d80098e3cca5dae4b395b43cd9fc4ed053c11b89..01d6df2e703f22f5e91f4340814b956dc06cffaf 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.96 2011/10/06 22:29:12 kristaps Exp $ */
+/*     $Id: mandoc.h,v 1.97 2011/11/07 01:24:40 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -150,7 +150,6 @@ enum        mandocerr {
        MANDOCERR_NOTMANUAL, /* manual isn't really a manual */
        MANDOCERR_COLUMNS, /* column syntax is inconsistent */
        MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */
        MANDOCERR_NOTMANUAL, /* manual isn't really a manual */
        MANDOCERR_COLUMNS, /* column syntax is inconsistent */
        MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */
-       MANDOCERR_SYNTLINESCOPE, /* line scope broken, syntax violated */
        MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */
        MANDOCERR_SYNTCHILD, /* child violates parent syntax */
        MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */
        MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */
        MANDOCERR_SYNTCHILD, /* child violates parent syntax */
        MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */
diff --git a/read.c b/read.c
index ab2a734719b9475da06925857fea384a683bee6a..2e66757b9543ba85c102ab1e59a8176664d08108 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.25 2011/10/08 15:42:29 kristaps Exp $ */
+/*     $Id: read.c,v 1.26 2011/11/07 01:24:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -192,7 +192,6 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "not a manual",
        "column syntax is inconsistent",
        "NOT IMPLEMENTED: .Bd -file",
        "not a manual",
        "column syntax is inconsistent",
        "NOT IMPLEMENTED: .Bd -file",
-       "line scope broken, syntax violated",
        "argument count wrong, violates syntax",
        "child violates parent syntax",
        "argument count wrong, violates syntax",
        "argument count wrong, violates syntax",
        "child violates parent syntax",
        "argument count wrong, violates syntax",