From: Kristaps Dzonsons Date: Mon, 6 Dec 2010 11:01:19 +0000 (+0000) Subject: Merge schwarze@'s relaxation of scope-breaking rules: allow implicit X-Git-Tag: VERSION_1_10_7~13 X-Git-Url: https://git.cameronkatri.com/mandoc.git/commitdiff_plain/8b3150eb7ea715f96295991892f92da415734e01 Merge schwarze@'s relaxation of scope-breaking rules: allow implicit ending of scopes and drop stray scope-endings. --- diff --git a/main.c b/main.c index 101ea941..92056e45 100644 --- 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 * Copyright (c) 2010 Ingo Schwarze @@ -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", diff --git a/mandoc.h b/mandoc.h index 7e84f8db..99f56b27 100644 --- 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 * @@ -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 b0f47e04..ef1fda64 100644 --- 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 * Copyright (c) 2010 Ingo Schwarze @@ -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); } diff --git a/mdoc_macro.c b/mdoc_macro.c index 3b696547..790437cc 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -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 * Copyright (c) 2010 Ingo Schwarze @@ -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);