]> git.cameronkatri.com Git - mandoc.git/commitdiff
discard .Rs head arguments and improve .Rs diagnostics
authorIngo Schwarze <schwarze@openbsd.org>
Wed, 4 Feb 2015 18:03:47 +0000 (18:03 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Wed, 4 Feb 2015 18:03:47 +0000 (18:03 +0000)
mandoc.1
mandoc.h
mdoc_macro.c
mdoc_validate.c
read.c

index cda92aa26f10f7568d839bb89d4eacfa41cb0bc6..a80634e391e3c09c0ac76c8c985aa2f9d688eaa0 100644 (file)
--- a/mandoc.1
+++ b/mandoc.1
@@ -1,4 +1,4 @@
-.\"    $Id: mandoc.1,v 1.142 2015/02/04 16:38:56 schwarze Exp $
+.\"    $Id: mandoc.1,v 1.143 2015/02/04 18:03:47 schwarze Exp $
 .\"
 .\" Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
 .\" Copyright (c) 2012, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1091,6 +1091,14 @@ macro has no argument, or only one argument and no macro follows
 on the same input line.
 This defeats its purpose; in particular, spacing is not suppressed
 before the text or macros following on the next input line.
+.It Sy "empty reference block"
+.Pq mdoc
+An
+.Ic \&Rs
+macro is immediately followed by an
+.Ic \&Re
+macro on the next input line.
+Such an empty block does not produce any output.
 .It Sy "missing -std argument, adding it"
 .Pq mdoc
 An
@@ -1595,6 +1603,7 @@ An
 .Ic \&Ek ,
 .Ic \&El ,
 .Ic \&Re ,
+.Ic \&Rs ,
 or
 .Ic \&Ud
 macro, an
index efb2c8a28a92234696ec73e0a52360df02b0ab56..aaa241144816d316dcd2cc5bcf265a72f12cf513 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.195 2015/02/04 16:38:56 schwarze Exp $ */
+/*     $Id: mandoc.h,v 1.196 2015/02/04 18:03:47 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -103,6 +103,7 @@ enum        mandocerr {
        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 */
+       MANDOCERR_RS_EMPTY, /* empty reference block: Rs */
        MANDOCERR_ARG_STD, /* missing -std argument, adding it: macro */
        MANDOCERR_EQN_NOBOX, /* missing eqn box, using "": op */
 
index 5ffb6a2a841070d7e93250820c3fa2124d07c005..7cf30c42cec9b5f420459e42f75d2a122287a983 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_macro.c,v 1.172 2015/02/03 18:22:05 schwarze Exp $ */
+/*     $Id: mdoc_macro.c,v 1.173 2015/02/04 18:03:47 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1027,8 +1027,6 @@ blk_full(MACRO_PROT_ARGS)
                la = *pos;
                lac = ac;
                ac = mdoc_args(mdoc, line, pos, buf, tok, &p);
-               if (ac == ARGS_PUNCT)
-                       break;
                if (ac == ARGS_EOLN) {
                        if (lac != ARGS_PPHRASE && lac != ARGS_PHRASE)
                                break;
@@ -1044,6 +1042,13 @@ blk_full(MACRO_PROT_ARGS)
                        body = mdoc_body_alloc(mdoc, line, ppos, tok);
                        break;
                }
+               if (tok == MDOC_Rs) {
+                       mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse,
+                           line, la, "Rs %s", buf + la);
+                       break;
+               }
+               if (ac == ARGS_PUNCT)
+                       break;
 
                /*
                 * Emit leading punctuation (i.e., punctuation before
@@ -1100,7 +1105,7 @@ blk_full(MACRO_PROT_ARGS)
                return;
        if (head == NULL)
                head = mdoc_head_alloc(mdoc, line, ppos, tok);
-       if (nl)
+       if (nl && tok != MDOC_Rs)
                append_delims(mdoc, line, pos, buf);
        if (body != NULL)
                goto out;
index 8d218676f9146bbcf944ff39558663f18ebf2f9e..417e21615c43f22f66b3c852507e885e3fda974e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_validate.c,v 1.267 2015/02/04 16:38:56 schwarze Exp $ */
+/*     $Id: mdoc_validate.c,v 1.268 2015/02/04 18:03:47 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1658,19 +1658,17 @@ post_st(POST_ARGS)
 static void
 post_rs(POST_ARGS)
 {
-       struct mdoc_node *nn, *next, *prev;
+       struct mdoc_node *np, *nch, *next, *prev;
        int               i, j;
 
-       switch (mdoc->last->type) {
-       case MDOC_HEAD:
-               check_count(mdoc, MDOC_HEAD, CHECK_EQ, 0);
-               return;
-       case MDOC_BODY:
-               if (mdoc->last->child)
-                       break;
-               check_count(mdoc, MDOC_BODY, CHECK_GT, 0);
+       np = mdoc->last;
+
+       if (np->type != MDOC_BODY)
                return;
-       default:
+
+       if (np->child == NULL) {
+               mandoc_msg(MANDOCERR_RS_EMPTY, mdoc->parse,
+                   np->line, np->pos, "Rs");
                return;
        }
 
@@ -1681,38 +1679,38 @@ post_rs(POST_ARGS)
         */
 
        next = NULL;
-       for (nn = mdoc->last->child->next; nn; nn = next) {
-               /* Determine order of `nn'. */
+       for (nch = np->child->next; nch != NULL; nch = next) {
+               /* Determine order number of this child. */
                for (i = 0; i < RSORD_MAX; i++)
-                       if (rsord[i] == nn->tok)
+                       if (rsord[i] == nch->tok)
                                break;
 
                if (i == RSORD_MAX) {
                        mandoc_msg(MANDOCERR_RS_BAD,
-                           mdoc->parse, nn->line, nn->pos,
-                           mdoc_macronames[nn->tok]);
+                           mdoc->parse, nch->line, nch->pos,
+                           mdoc_macronames[nch->tok]);
                        i = -1;
-               } else if (MDOC__J == nn->tok || MDOC__B == nn->tok)
-                       mdoc->last->norm->Rs.quote_T++;
+               } else if (nch->tok == MDOC__J || nch->tok == MDOC__B)
+                       np->norm->Rs.quote_T++;
 
                /*
-                * Remove `nn' from the chain.  This somewhat
+                * Remove this child from the chain.  This somewhat
                 * repeats mdoc_node_unlink(), but since we're
                 * just re-ordering, there's no need for the
                 * full unlink process.
                 */
 
-               if (NULL != (next = nn->next))
-                       next->prev = nn->prev;
+               if ((next = nch->next) != NULL)
+                       next->prev = nch->prev;
 
-               if (NULL != (prev = nn->prev))
-                       prev->next = nn->next;
+               if ((prev = nch->prev) != NULL)
+                       prev->next = nch->next;
 
-               nn->prev = nn->next = NULL;
+               nch->prev = nch->next = NULL;
 
                /*
                 * Scan back until we reach a node that's
-                * ordered before `nn'.
+                * to be ordered before this child.
                 */
 
                for ( ; prev ; prev = prev->prev) {
@@ -1728,21 +1726,21 @@ post_rs(POST_ARGS)
                }
 
                /*
-                * Set `nn' back into its correct place in front
-                * of the `prev' node.
+                * Set this child back into its correct place
+                * in front of the `prev' node.
                 */
 
-               nn->prev = prev;
+               nch->prev = prev;
 
-               if (prev) {
-                       if (prev->next)
-                               prev->next->prev = nn;
-                       nn->next = prev->next;
-                       prev->next = nn;
+               if (prev == NULL) {
+                       np->child->prev = nch;
+                       nch->next = np->child;
+                       np->child = nch;
                } else {
-                       mdoc->last->child->prev = nn;
-                       nn->next = mdoc->last->child;
-                       mdoc->last->child = nn;
+                       if (prev->next)
+                               prev->next->prev = nch;
+                       nch->next = prev->next;
+                       prev->next = nch;
                }
        }
 }
diff --git a/read.c b/read.c
index ba69342cb982da4ad20bd7af96c071c95752522f..9027bb945d60c4f5ac60916dda00ab899b8b9935 100644 (file)
--- a/read.c
+++ b/read.c
@@ -1,4 +1,4 @@
-/*     $Id: read.c,v 1.121 2015/02/04 16:38:56 schwarze Exp $ */
+/*     $Id: read.c,v 1.122 2015/02/04 18:03:48 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -147,6 +147,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "missing font type, using \\fR",
        "unknown font type, using \\fR",
        "nothing follows prefix",
+       "empty reference block",
        "missing -std argument, adding it",
        "missing eqn box, using \"\"",