=================================================================== RCS file: /cvs/mandoc/mdoc_macro.c,v retrieving revision 1.90 retrieving revision 1.97 diff -u -p -r1.90 -r1.97 --- mandoc/mdoc_macro.c 2010/07/01 22:35:54 1.90 +++ mandoc/mdoc_macro.c 2010/11/30 13:04:14 1.97 @@ -1,6 +1,7 @@ -/* $Id: mdoc_macro.c,v 1.90 2010/07/01 22:35:54 schwarze Exp $ */ +/* $Id: mdoc_macro.c,v 1.97 2010/11/30 13:04:14 kristaps Exp $ */ /* - * Copyright (c) 2008, 2009 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons + * Copyright (c) 2010 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -34,7 +35,7 @@ enum rew { /* see rew_dohalt() */ REWIND_THIS, REWIND_MORE, REWIND_LATER, - REWIND_ERROR, + REWIND_ERROR }; static int blk_full(MACRO_PROT_ARGS); @@ -137,8 +138,8 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { blk_part_exp, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Eo */ { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Fx */ { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ms */ - { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* No */ - { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Ns */ + { in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_IGNDELIM }, /* No */ + { in_line_argn, MDOC_CALLABLE | MDOC_PARSED | MDOC_IGNDELIM }, /* Ns */ { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Nx */ { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Ox */ { blk_exp_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Pc */ @@ -206,14 +207,10 @@ mdoc_macroend(struct mdoc *m) n = MDOC_VALID & m->last->flags ? m->last->parent : m->last; - for ( ; n; n = n->parent) { - if (MDOC_BLOCK != n->type) - continue; - if ( ! (MDOC_EXPLICIT & mdoc_macros[n->tok].flags)) - continue; - mdoc_nmsg(m, n, MANDOCERR_SYNTSCOPE); - return(0); - } + for ( ; n; n = n->parent) + if (MDOC_BLOCK == n->type && + MDOC_EXPLICIT & mdoc_macros[n->tok].flags) + mdoc_nmsg(m, n, MANDOCERR_SCOPEEXIT); /* Rewind to the first. */ @@ -262,15 +259,11 @@ rew_last(struct mdoc *mdoc, const struct mdoc_node *to while (mdoc->last != to) { if ( ! mdoc_valid_post(mdoc)) return(0); - if ( ! mdoc_action_post(mdoc)) - return(0); mdoc->last = mdoc->last->parent; assert(mdoc->last); } - if ( ! mdoc_valid_post(mdoc)) - return(0); - return(mdoc_action_post(mdoc)); + return(mdoc_valid_post(mdoc)); } @@ -609,7 +602,7 @@ append_delims(struct mdoc *m, int line, int *pos, char * knowing which symbols break this behaviour, for * example, `. ;' shouldn't propogate the double-space. */ - if (mandoc_eos(p, strlen(p))) + if (mandoc_eos(p, strlen(p), 0)) m->last->flags |= MDOC_EOS; } @@ -699,10 +692,8 @@ blk_exp_close(MACRO_PROT_ARGS) if (later && MDOC_EXPLICIT & mdoc_macros[later->tok].flags) continue; - if (MDOC_CALLABLE & mdoc_macros[n->tok].flags) { - assert( ! (MDOC_ACTED & n->flags)); + if (MDOC_CALLABLE & mdoc_macros[n->tok].flags) later = n; - } } if ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) { @@ -793,7 +784,7 @@ in_line(MACRO_PROT_ARGS) /* FALLTHROUGH */ case (MDOC_Fl): /* FALLTHROUGH */ - case (MDOC_Lk): + case (MDOC_Mt): /* FALLTHROUGH */ case (MDOC_Nm): /* FALLTHROUGH */ @@ -1146,7 +1137,6 @@ blk_full(MACRO_PROT_ARGS) if (MDOC_BLOCK == n->type && MDOC_EXPLICIT & mdoc_macros[n->tok].flags && ! (MDOC_VALID & n->flags)) { - assert( ! (MDOC_ACTED & n->flags)); n->pending = head; return(1); } @@ -1265,7 +1255,7 @@ blk_part_imp(MACRO_PROT_ARGS) */ if (n && MDOC_TEXT == n->type && n->string) - if (mandoc_eos(n->string, strlen(n->string))) + if (mandoc_eos(n->string, strlen(n->string), 1)) n->flags |= MDOC_EOS; /* Up-propogate the end-of-space flag. */ @@ -1284,7 +1274,6 @@ blk_part_imp(MACRO_PROT_ARGS) if (MDOC_BLOCK == n->type && 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,