=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_macro.c,v retrieving revision 1.58 retrieving revision 1.59 diff -c -r1.58 -r1.59 *** src/usr.bin/mandoc/mdoc_macro.c 2010/10/16 13:38:29 1.58 --- src/usr.bin/mandoc/mdoc_macro.c 2010/10/24 18:15:43 1.59 *************** *** 1,4 **** ! /* $Id: mdoc_macro.c,v 1.58 2010/10/16 13:38:29 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010 Ingo Schwarze --- 1,4 ---- ! /* $Id: mdoc_macro.c,v 1.59 2010/10/24 18:15:43 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010 Ingo Schwarze *************** *** 30,35 **** --- 30,36 ---- REWIND_NONE, REWIND_THIS, REWIND_MORE, + REWIND_FORCE, REWIND_LATER, REWIND_ERROR }; *************** *** 324,329 **** --- 325,331 ---- * 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. */ *************** *** 417,432 **** return(REWIND_MORE); /* ! * Partial blocks allow 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); } --- 419,431 ---- return(REWIND_MORE); /* ! * By default, closing out full blocks ! * forces closing of broken explicit blocks, ! * while closing out partial blocks ! * allows delayed rewinding by default. */ ! return (&blk_full == mdoc_macros[tok].fp ? ! REWIND_FORCE : REWIND_LATER); } *************** *** 517,525 **** /* * 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); } --- 516,522 ---- *************** *** 537,553 **** return(1); case (REWIND_THIS): break; case (REWIND_MORE): n = n->parent; continue; case (REWIND_LATER): ! return(make_pending(n, tok, m, line, ppos)); 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; } break; } --- 534,555 ---- 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): ! if (make_pending(n, tok, m, line, ppos) || ! MDOC_BLOCK != t) ! return(1); ! /* FALLTHROUGH */ case (REWIND_ERROR): ! mdoc_pmsg(m, line, ppos, MANDOCERR_NOSCOPE); ! return(1); } break; } *************** *** 675,682 **** * 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); /* * Mark the place where the formatting - but not --- 677,683 ---- * postpone closing out the current block * until the rew_sub() closing out the sub-block. */ ! make_pending(later, tok, m, line, ppos); /* * Mark the place where the formatting - but not *************** *** 1282,1289 **** MDOC_EXPLICIT & mdoc_macros[n->tok].flags && ! (MDOC_VALID & n->flags)) { assert( ! (MDOC_ACTED & n->flags)); ! if ( ! make_pending(n, tok, m, line, ppos)) ! return(0); if ( ! mdoc_endbody_alloc(m, line, ppos, tok, body, ENDBODY_NOSPACE)) return(0); --- 1283,1289 ---- MDOC_EXPLICIT & mdoc_macros[n->tok].flags && ! (MDOC_VALID & n->flags)) { assert( ! (MDOC_ACTED & n->flags)); ! make_pending(n, tok, m, line, ppos); if ( ! mdoc_endbody_alloc(m, line, ppos, tok, body, ENDBODY_NOSPACE)) return(0);