]> git.cameronkatri.com Git - mandoc.git/commitdiff
Merge schwarze@'s relaxation of scope-breaking rules: allow implicit
authorKristaps Dzonsons <kristaps@bsd.lv>
Mon, 6 Dec 2010 11:01:19 +0000 (11:01 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Mon, 6 Dec 2010 11:01:19 +0000 (11:01 +0000)
ending of scopes and drop stray scope-endings.

main.c
mandoc.h
mdoc.c
mdoc_macro.c

diff --git a/main.c b/main.c
index 101ea94162b36f4e237edc3ffa7a0a10a6778805..92056e45b3020f5541bf0a180703510343df8c64 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/*     $Id: main.c,v 1.118 2010/12/05 15:55:01 kristaps Exp $ */
+/*     $Id: main.c,v 1.119 2010/12/06 11:01:19 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -187,6 +187,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "unsupported display type",
        "blocks badly nested",
        "no such block is open",
+       "missing end of block",
        "line scope broken, syntax violated",
        "argument count wrong, violates syntax",
        "child violates parent syntax",
index 7e84f8db25e4429c720acf33b83c32446bec239f..99f56b27afc08f76214c24ae8ec49c9dec7f917c 100644 (file)
--- a/mandoc.h
+++ b/mandoc.h
@@ -1,4 +1,4 @@
-/*     $Id: mandoc.h,v 1.29 2010/12/05 15:55:01 kristaps Exp $ */
+/*     $Id: mandoc.h,v 1.30 2010/12/06 11:01:19 kristaps Exp $ */
 /*
  * Copyright (c) 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -89,6 +89,7 @@ enum  mandocerr {
        MANDOCERR_LINESCOPE, /* line scope broken */
        MANDOCERR_ARGCOUNT, /* argument count wrong */
        MANDOCERR_NOSCOPE, /* no such block is open */
+       MANDOCERR_SCOPEBROKEN, /* missing end of block */
        MANDOCERR_SCOPEREP, /* scope already open */
        MANDOCERR_SCOPEEXIT, /* scope open on exit */
        MANDOCERR_UNAME, /* uname(3) system call failed */
diff --git a/mdoc.c b/mdoc.c
index b0f47e04bbf20e7d4f3deca0dc2c2080e40c3d86..ef1fda64ea9e6a6854351cd04395d557a698f8e6 100644 (file)
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mdoc.c,v 1.167 2010/12/01 16:38:57 kristaps Exp $ */
+/*     $Id: mdoc.c,v 1.168 2010/12/06 11:01:19 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -766,9 +766,7 @@ mdoc_pmacro(struct mdoc *m, int ln, char *buf, int offs)
 
        tok = (j > 1 || j < 4) ? mdoc_hash_find(mac) : MDOC_MAX;
        if (MDOC_MAX == tok) {
-               mdoc_vmsg(m, MANDOCERR_MACRO, ln, sv, 
-                   "unknown macro: %s%s", 
-                   buf, strlen(buf) > 3 ? "..." : "");
+               mdoc_vmsg(m, MANDOCERR_MACRO, ln, sv, "%s", buf + sv - 1);
                return(1);
        }
 
index 3b6965476a30777b284649f97442e3224d62de20..790437cc862e68ea2044c524d973e63837b69791 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_macro.c,v 1.97 2010/11/30 13:04:14 kristaps Exp $ */
+/*     $Id: mdoc_macro.c,v 1.98 2010/12/06 11:01:19 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -34,6 +34,7 @@ enum  rew {   /* see rew_dohalt() */
        REWIND_NONE,
        REWIND_THIS,
        REWIND_MORE,
+       REWIND_FORCE,
        REWIND_LATER,
        REWIND_ERROR
 };
@@ -320,6 +321,7 @@ rew_alt(enum mdoct tok)
  *   inside *p, so there is no need to rewind anything at all.
  * REWIND_THIS: *p matches tok, so rewind *p and nothing else.
  * REWIND_MORE: *p is implicit, rewind it and keep searching for tok.
+ * REWIND_FORCE: *p is explicit, but tok is full, force rewinding *p.
  * REWIND_LATER: *p is explicit and still open, postpone rewinding.
  * REWIND_ERROR: No tok block is open at all.
  */
@@ -413,16 +415,13 @@ rew_dohalt(enum mdoct tok, enum mdoc_type type,
                return(REWIND_MORE);
 
        /*
-        * Partial blocks allow delayed rewinding by default.
+        * By default, closing out full blocks
+        * forces closing of broken explicit blocks,
+        * while closing out partial blocks
+        * allows delayed rewinding by default.
         */
-       if (&blk_full != mdoc_macros[tok].fp)
-               return (REWIND_LATER);
-
-       /*
-        * Full blocks can only be rewound when matching
-        * or when there is an explicit rule.
-        */
-       return(REWIND_ERROR);
+       return (&blk_full == mdoc_macros[tok].fp ?
+           REWIND_FORCE : REWIND_LATER);
 }
 
 
@@ -513,9 +512,7 @@ make_pending(struct mdoc_node *broken, enum mdoct tok,
        /*
         * Found no matching block for tok.
         * Are you trying to close a block that is not open?
-        * XXX Make this non-fatal.
         */
-       mdoc_pmsg(m, line, ppos, MANDOCERR_SYNTNOSCOPE);
        return(0);
 }
 
@@ -533,17 +530,22 @@ rew_sub(enum mdoc_type t, struct mdoc *m,
                        return(1);
                case (REWIND_THIS):
                        break;
+               case (REWIND_FORCE):
+                       mdoc_vmsg(m, MANDOCERR_SCOPEBROKEN, line, ppos,
+                           "%s breaks %s", mdoc_macronames[tok],
+                           mdoc_macronames[n->tok]);
+                       /* FALLTHROUGH */
                case (REWIND_MORE):
                        n = n->parent;
                        continue;
                case (REWIND_LATER):
-                       return(make_pending(n, tok, m, line, ppos));
+                       if (make_pending(n, tok, m, line, ppos) ||
+                           MDOC_BLOCK != t)
+                               return(1);
+                       /* FALLTHROUGH */
                case (REWIND_ERROR):
-                       /* XXX Make this non-fatal. */
-                       mdoc_vmsg(m, MANDOCERR_SCOPEFATAL, line, ppos,
-                           "%s cannot break %s", mdoc_macronames[tok],
-                           mdoc_macronames[n->tok]);
-                       return 0;
+                       mdoc_pmsg(m, line, ppos, MANDOCERR_NOSCOPE);
+                       return(1);
                }
                break;
        }
@@ -671,8 +673,7 @@ blk_exp_close(MACRO_PROT_ARGS)
                         * postpone closing out the current block
                         * until the rew_sub() closing out the sub-block.
                         */
-                       if ( ! make_pending(later, tok, m, line, ppos))
-                               return(0);
+                       make_pending(later, tok, m, line, ppos);
 
                        /*
                         * Mark the place where the formatting - but not
@@ -1274,8 +1275,7 @@ blk_part_imp(MACRO_PROT_ARGS)
                if (MDOC_BLOCK == n->type &&
                    MDOC_EXPLICIT & mdoc_macros[n->tok].flags &&
                    ! (MDOC_VALID & n->flags)) {
-                       if ( ! make_pending(n, tok, m, line, ppos))
-                               return(0);
+                       make_pending(n, tok, m, line, ppos);
                        if ( ! mdoc_endbody_alloc(m, line, ppos,
                            tok, body, ENDBODY_NOSPACE))
                                return(0);