=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/man_macro.c,v retrieving revision 1.37 retrieving revision 1.38 diff -c -r1.37 -r1.38 *** src/usr.bin/mandoc/man_macro.c 2012/07/07 17:39:05 1.37 --- src/usr.bin/mandoc/man_macro.c 2012/11/17 00:25:20 1.38 *************** *** 1,4 **** ! /* $Id: man_macro.c,v 1.37 2012/07/07 17:39:05 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012 Ingo Schwarze --- 1,4 ---- ! /* $Id: man_macro.c,v 1.38 2012/11/17 00:25:20 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012 Ingo Schwarze *************** *** 93,99 **** * Warn when "n" is an explicit non-roff macro. */ static void ! rew_warn(struct man *m, struct man_node *n, enum mandocerr er) { if (er == MANDOCERR_MAX || MAN_BLOCK != n->type) --- 93,99 ---- * Warn when "n" is an explicit non-roff macro. */ static void ! rew_warn(struct man *man, struct man_node *n, enum mandocerr er) { if (er == MANDOCERR_MAX || MAN_BLOCK != n->type) *************** *** 104,110 **** return; assert(er < MANDOCERR_FATAL); ! man_nmsg(m, n, er); } --- 104,110 ---- return; assert(er < MANDOCERR_FATAL); ! man_nmsg(man, n, er); } *************** *** 113,145 **** * will be used if an explicit block scope is being closed out. */ int ! man_unscope(struct man *m, const struct man_node *to, enum mandocerr er) { struct man_node *n; assert(to); ! m->next = MAN_NEXT_SIBLING; /* LINTED */ ! while (m->last != to) { /* * Save the parent here, because we may delete the ! * m->last node in the post-validation phase and reset ! * it to m->last->parent, causing a step in the closing * out to be lost. */ ! n = m->last->parent; ! rew_warn(m, m->last, er); ! if ( ! man_valid_post(m)) return(0); ! m->last = n; ! assert(m->last); } ! rew_warn(m, m->last, er); ! if ( ! man_valid_post(m)) return(0); return(1); --- 113,145 ---- * will be used if an explicit block scope is being closed out. */ int ! man_unscope(struct man *man, const struct man_node *to, enum mandocerr er) { struct man_node *n; assert(to); ! man->next = MAN_NEXT_SIBLING; /* LINTED */ ! while (man->last != to) { /* * Save the parent here, because we may delete the ! * man->last node in the post-validation phase and reset ! * it to man->last->parent, causing a step in the closing * out to be lost. */ ! n = man->last->parent; ! rew_warn(man, man->last, er); ! if ( ! man_valid_post(man)) return(0); ! man->last = n; ! assert(man->last); } ! rew_warn(man, man->last, er); ! if ( ! man_valid_post(man)) return(0); return(1); *************** *** 237,249 **** * scopes. When a scope is closed, it must be validated and actioned. */ static int ! rew_scope(enum man_type type, struct man *m, enum mant tok) { struct man_node *n; enum rew c; /* LINTED */ ! for (n = m->last; n; n = n->parent) { /* * Whether we should stop immediately (REW_HALT), stop * and rewind until this point (REW_REWIND), or keep --- 237,249 ---- * scopes. When a scope is closed, it must be validated and actioned. */ static int ! rew_scope(enum man_type type, struct man *man, enum mant tok) { struct man_node *n; enum rew c; /* LINTED */ ! for (n = man->last; n; n = n->parent) { /* * Whether we should stop immediately (REW_HALT), stop * and rewind until this point (REW_REWIND), or keep *************** *** 262,268 **** */ assert(n); ! return(man_unscope(m, n, MANDOCERR_MAX)); } --- 262,268 ---- */ assert(n); ! return(man_unscope(man, n, MANDOCERR_MAX)); } *************** *** 285,298 **** /* NOTREACHED */ } ! for (nn = m->last->parent; nn; nn = nn->parent) if (ntok == nn->tok && MAN_BLOCK == nn->type) break; if (NULL != nn) ! man_unscope(m, nn, MANDOCERR_MAX); else ! man_pmsg(m, line, ppos, MANDOCERR_NOSCOPE); return(1); } --- 285,298 ---- /* NOTREACHED */ } ! for (nn = man->last->parent; nn; nn = nn->parent) if (ntok == nn->tok && MAN_BLOCK == nn->type) break; if (NULL != nn) ! man_unscope(man, nn, MANDOCERR_MAX); else ! man_pmsg(man, line, ppos, MANDOCERR_NOSCOPE); return(1); } *************** *** 308,341 **** /* Close out prior implicit scopes. */ ! if ( ! rew_scope(MAN_BLOCK, m, tok)) return(0); ! if ( ! man_block_alloc(m, line, ppos, tok)) return(0); ! if ( ! man_head_alloc(m, line, ppos, tok)) return(0); for (;;) { la = *pos; ! if ( ! man_args(m, line, pos, buf, &p)) break; ! if ( ! man_word_alloc(m, line, la, p)) return(0); } ! assert(m); assert(tok != MAN_MAX); ! for (n = m->last; n; n = n->parent) { if (n->tok != tok) continue; assert(MAN_HEAD == n->type); ! man_unscope(m, n, MANDOCERR_MAX); break; } ! return(man_body_alloc(m, line, ppos, tok)); } --- 308,341 ---- /* Close out prior implicit scopes. */ ! if ( ! rew_scope(MAN_BLOCK, man, tok)) return(0); ! if ( ! man_block_alloc(man, line, ppos, tok)) return(0); ! if ( ! man_head_alloc(man, line, ppos, tok)) return(0); for (;;) { la = *pos; ! if ( ! man_args(man, line, pos, buf, &p)) break; ! if ( ! man_word_alloc(man, line, la, p)) return(0); } ! assert(man); assert(tok != MAN_MAX); ! for (n = man->last; n; n = n->parent) { if (n->tok != tok) continue; assert(MAN_HEAD == n->type); ! man_unscope(man, n, MANDOCERR_MAX); break; } ! return(man_body_alloc(man, line, ppos, tok)); } *************** *** 356,382 **** /* Close out prior scopes. */ ! if ( ! rew_scope(MAN_BODY, m, tok)) return(0); ! if ( ! rew_scope(MAN_BLOCK, m, tok)) return(0); /* Allocate new block & head scope. */ ! if ( ! man_block_alloc(m, line, ppos, tok)) return(0); ! if ( ! man_head_alloc(m, line, ppos, tok)) return(0); ! n = m->last; /* Add line arguments. */ for (;;) { la = *pos; ! if ( ! man_args(m, line, pos, buf, &p)) break; ! if ( ! man_word_alloc(m, line, la, p)) return(0); } --- 356,382 ---- /* Close out prior scopes. */ ! if ( ! rew_scope(MAN_BODY, man, tok)) return(0); ! if ( ! rew_scope(MAN_BLOCK, man, tok)) return(0); /* Allocate new block & head scope. */ ! if ( ! man_block_alloc(man, line, ppos, tok)) return(0); ! if ( ! man_head_alloc(man, line, ppos, tok)) return(0); ! n = man->last; /* Add line arguments. */ for (;;) { la = *pos; ! if ( ! man_args(man, line, pos, buf, &p)) break; ! if ( ! man_word_alloc(man, line, la, p)) return(0); } *************** *** 385,401 **** if (MAN_SCOPED & man_macros[tok].flags) { /* If we're forcing scope (`TP'), keep it open. */ if (MAN_FSCOPED & man_macros[tok].flags) { ! m->flags |= MAN_BLINE; return(1); ! } else if (n == m->last) { ! m->flags |= MAN_BLINE; return(1); } } ! if ( ! rew_scope(MAN_HEAD, m, tok)) return(0); ! return(man_body_alloc(m, line, ppos, tok)); } --- 385,401 ---- if (MAN_SCOPED & man_macros[tok].flags) { /* If we're forcing scope (`TP'), keep it open. */ if (MAN_FSCOPED & man_macros[tok].flags) { ! man->flags |= MAN_BLINE; return(1); ! } else if (n == man->last) { ! man->flags |= MAN_BLINE; return(1); } } ! if ( ! rew_scope(MAN_HEAD, man, tok)) return(0); ! return(man_body_alloc(man, line, ppos, tok)); } *************** *** 407,422 **** char *p; struct man_node *n; ! if ( ! man_elem_alloc(m, line, ppos, tok)) return(0); ! n = m->last; for (;;) { la = *pos; ! if ( ! man_args(m, line, pos, buf, &p)) break; ! if ( ! man_word_alloc(m, line, la, p)) return(0); } --- 407,422 ---- char *p; struct man_node *n; ! if ( ! man_elem_alloc(man, line, ppos, tok)) return(0); ! n = man->last; for (;;) { la = *pos; ! if ( ! man_args(man, line, pos, buf, &p)) break; ! if ( ! man_word_alloc(man, line, la, p)) return(0); } *************** *** 426,434 **** * waiting for terms to load into our context. */ ! if (n == m->last && MAN_SCOPED & man_macros[tok].flags) { assert( ! (MAN_NSCOPED & man_macros[tok].flags)); ! m->flags |= MAN_ELINE; return(1); } --- 426,434 ---- * waiting for terms to load into our context. */ ! if (n == man->last && MAN_SCOPED & man_macros[tok].flags) { assert( ! (MAN_NSCOPED & man_macros[tok].flags)); ! man->flags |= MAN_ELINE; return(1); } *************** *** 436,446 **** if (MAN_NSCOPED & man_macros[tok].flags) { assert( ! (MAN_SCOPED & man_macros[tok].flags)); ! m->flags |= MAN_ILINE; } ! assert(MAN_ROOT != m->last->type); ! m->next = MAN_NEXT_SIBLING; /* * Rewind our element scope. Note that when TH is pruned, we'll --- 436,446 ---- if (MAN_NSCOPED & man_macros[tok].flags) { assert( ! (MAN_SCOPED & man_macros[tok].flags)); ! man->flags |= MAN_ILINE; } ! assert(MAN_ROOT != man->last->type); ! man->next = MAN_NEXT_SIBLING; /* * Rewind our element scope. Note that when TH is pruned, we'll *************** *** 448,469 **** * its sibling. */ ! for ( ; m->last; m->last = m->last->parent) { ! if (m->last == n) break; ! if (m->last->type == MAN_ROOT) break; ! if ( ! man_valid_post(m)) return(0); } ! assert(m->last); /* * Same here regarding whether we're back at the root. */ ! if (m->last->type != MAN_ROOT && ! man_valid_post(m)) return(0); return(1); --- 448,469 ---- * its sibling. */ ! for ( ; man->last; man->last = man->last->parent) { ! if (man->last == n) break; ! if (man->last->type == MAN_ROOT) break; ! if ( ! man_valid_post(man)) return(0); } ! assert(man->last); /* * Same here regarding whether we're back at the root. */ ! if (man->last->type != MAN_ROOT && ! man_valid_post(man)) return(0); return(1); *************** *** 471,484 **** int ! man_macroend(struct man *m) { ! return(man_unscope(m, m->first, MANDOCERR_SCOPEEXIT)); } static int ! man_args(struct man *m, int line, int *pos, char *buf, char **v) { char *start; --- 471,484 ---- int ! man_macroend(struct man *man) { ! return(man_unscope(man, man->first, MANDOCERR_SCOPEEXIT)); } static int ! man_args(struct man *man, int line, int *pos, char *buf, char **v) { char *start; *************** *** 489,494 **** if ('\0' == *start) return(0); ! *v = mandoc_getarg(m->parse, v, line, pos); return(1); } --- 489,494 ---- if ('\0' == *start) return(0); ! *v = mandoc_getarg(man->parse, v, line, pos); return(1); }