=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/man_macro.c,v retrieving revision 1.52 retrieving revision 1.53 diff -c -r1.52 -r1.53 *** src/usr.bin/mandoc/man_macro.c 2014/11/03 23:17:21 1.52 --- src/usr.bin/mandoc/man_macro.c 2014/11/28 05:51:29 1.53 *************** *** 1,4 **** ! /* $OpenBSD: man_macro.c,v 1.52 2014/11/03 23:17:21 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2013, 2014 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: man_macro.c,v 1.53 2014/11/28 05:51:29 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2013, 2014 Ingo Schwarze *************** *** 34,47 **** REW_HALT }; ! static int blk_close(MACRO_PROT_ARGS); ! static int blk_exp(MACRO_PROT_ARGS); ! static int blk_imp(MACRO_PROT_ARGS); ! static int in_line_eoln(MACRO_PROT_ARGS); static int man_args(struct man *, int, int *, char *, char **); ! static int rew_scope(enum man_type, struct man *, enum mant); static enum rew rew_dohalt(enum mant, enum man_type, const struct man_node *); --- 34,47 ---- REW_HALT }; ! static void blk_close(MACRO_PROT_ARGS); ! static void blk_exp(MACRO_PROT_ARGS); ! static void blk_imp(MACRO_PROT_ARGS); ! static void in_line_eoln(MACRO_PROT_ARGS); static int man_args(struct man *, int, int *, char *, char **); ! static void rew_scope(enum man_type, struct man *, enum mant); static enum rew rew_dohalt(enum mant, enum man_type, const struct man_node *); *************** *** 93,99 **** const struct man_macro * const man_macros = __man_macros; ! int man_unscope(struct man *man, const struct man_node *to) { struct man_node *n; --- 93,99 ---- const struct man_macro * const man_macros = __man_macros; ! void man_unscope(struct man *man, const struct man_node *to) { struct man_node *n; *************** *** 139,146 **** man->last = n; n = n->parent; ! if ( ! man_valid_post(man)) ! return(0); } /* --- 139,145 ---- man->last = n; n = n->parent; ! man_valid_post(man); } /* *************** *** 152,167 **** man->next = (man->last == to) ? MAN_NEXT_CHILD : MAN_NEXT_SIBLING; - - return(1); } static enum rew rew_block(enum mant ntok, enum man_type type, const struct man_node *n) { ! if (MAN_BLOCK == type && ntok == n->parent->tok && ! MAN_BODY == n->parent->type) return(REW_REWIND); return(ntok == n->tok ? REW_HALT : REW_NOHALT); } --- 151,164 ---- man->next = (man->last == to) ? MAN_NEXT_CHILD : MAN_NEXT_SIBLING; } static enum rew rew_block(enum mant ntok, enum man_type type, const struct man_node *n) { ! if (type == MAN_BLOCK && ntok == n->parent->tok && ! n->parent->type == MAN_BODY) return(REW_REWIND); return(ntok == n->tok ? REW_HALT : REW_NOHALT); } *************** *** 244,250 **** * for example, the `SH' macro will close out any intervening `SS' * 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; --- 241,247 ---- * for example, the `SH' macro will close out any intervening `SS' * scopes. When a scope is closed, it must be validated and actioned. */ ! static void rew_scope(enum man_type type, struct man *man, enum mant tok) { struct man_node *n; *************** *** 258,264 **** */ c = rew_dohalt(tok, type, n); if (REW_HALT == c) ! return(1); if (REW_REWIND == c) break; } --- 255,261 ---- */ c = rew_dohalt(tok, type, n); if (REW_HALT == c) ! return; if (REW_REWIND == c) break; } *************** *** 267,282 **** * Rewind until the current point. Warn if we're a roff * instruction that's mowing over explicit scopes. */ - assert(n); ! return(man_unscope(man, n)); } /* * Close out a generic explicit macro. */ ! int blk_close(MACRO_PROT_ARGS) { enum mant ntok; --- 264,278 ---- * Rewind until the current point. Warn if we're a roff * instruction that's mowing over explicit scopes. */ ! man_unscope(man, n); } /* * Close out a generic explicit macro. */ ! void blk_close(MACRO_PROT_ARGS) { enum mant ntok; *************** *** 295,351 **** } for (nn = man->last->parent; nn; nn = nn->parent) ! if (ntok == nn->tok && MAN_BLOCK == nn->type) break; ! if (NULL == nn) { mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse, line, ppos, man_macronames[tok]); ! if ( ! rew_scope(MAN_BLOCK, man, MAN_PP)) ! return(0); } else man_unscope(man, nn); - - return(1); } ! int blk_exp(MACRO_PROT_ARGS) { struct man_node *n; int la; char *p; ! /* 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); ! break; ! } ! return(man_body_alloc(man, line, ppos, tok)); } /* --- 291,336 ---- } for (nn = man->last->parent; nn; nn = nn->parent) ! if (nn->tok == ntok && nn->type == MAN_BLOCK) break; ! if (nn == NULL) { mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse, line, ppos, man_macronames[tok]); ! rew_scope(MAN_BLOCK, man, MAN_PP); } else man_unscope(man, nn); } ! void blk_exp(MACRO_PROT_ARGS) { struct man_node *n; int la; char *p; ! rew_scope(MAN_BLOCK, man, tok); ! man_block_alloc(man, line, ppos, tok); ! man_head_alloc(man, line, ppos, tok); for (;;) { la = *pos; if ( ! man_args(man, line, pos, buf, &p)) break; ! man_word_alloc(man, line, la, p); } assert(man); assert(tok != MAN_MAX); ! for (n = man->last; n; n = n->parent) ! if (n->tok == tok) { ! assert(n->type == MAN_HEAD); ! man_unscope(man, n); ! break; ! } ! man_body_alloc(man, line, ppos, tok); } /* *************** *** 354,380 **** * scopes, such as `SH' closing out an `SS', are defined in the rew * routines. */ ! int blk_imp(MACRO_PROT_ARGS) { int la; char *p; struct man_node *n; ! /* 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. */ --- 339,355 ---- * scopes, such as `SH' closing out an `SS', are defined in the rew * routines. */ ! void blk_imp(MACRO_PROT_ARGS) { int la; char *p; struct man_node *n; ! rew_scope(MAN_BODY, man, tok); ! rew_scope(MAN_BLOCK, man, tok); ! man_block_alloc(man, line, ppos, tok); ! man_head_alloc(man, line, ppos, tok); n = man->last; /* Add line arguments. */ *************** *** 383,420 **** la = *pos; if ( ! man_args(man, line, pos, buf, &p)) break; ! if ( ! man_word_alloc(man, line, la, p)) ! return(0); } /* Close out head and open body (unless MAN_SCOPE). */ ! 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)); } ! int in_line_eoln(MACRO_PROT_ARGS) { int la; char *p; struct man_node *n; ! if ( ! man_elem_alloc(man, line, ppos, tok)) ! return(0); ! n = man->last; for (;;) { --- 358,390 ---- la = *pos; if ( ! man_args(man, line, pos, buf, &p)) break; ! man_word_alloc(man, line, la, p); } /* Close out head and open body (unless MAN_SCOPE). */ ! if (man_macros[tok].flags & MAN_SCOPED) { /* If we're forcing scope (`TP'), keep it open. */ ! if (man_macros[tok].flags & MAN_FSCOPED) { man->flags |= MAN_BLINE; ! return; } else if (n == man->last) { man->flags |= MAN_BLINE; ! return; } } ! rew_scope(MAN_HEAD, man, tok); ! man_body_alloc(man, line, ppos, tok); } ! void in_line_eoln(MACRO_PROT_ARGS) { int la; char *p; struct man_node *n; ! man_elem_alloc(man, line, ppos, tok); n = man->last; for (;;) { *************** *** 424,431 **** if (man_macros[tok].flags & MAN_JOIN && man->last->type == MAN_TEXT) man_word_append(man, p); ! else if ( ! man_word_alloc(man, line, la, p)) ! return(0); } /* --- 394,401 ---- if (man_macros[tok].flags & MAN_JOIN && man->last->type == MAN_TEXT) man_word_append(man, p); ! else ! man_word_alloc(man, line, la, p); } /* *************** *** 443,455 **** * 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); } ! assert(MAN_ROOT != man->last->type); man->next = MAN_NEXT_SIBLING; /* --- 413,425 ---- * waiting for terms to load into our context. */ ! if (n == man->last && man_macros[tok].flags & MAN_SCOPED) { ! assert( ! (man_macros[tok].flags & MAN_NSCOPED)); man->flags |= MAN_ELINE; ! return; } ! assert(man->last->type != MAN_ROOT); man->next = MAN_NEXT_SIBLING; /* *************** *** 463,470 **** break; if (man->last->type == MAN_ROOT) break; ! if ( ! man_valid_post(man)) ! return(0); } assert(man->last); --- 433,439 ---- break; if (man->last->type == MAN_ROOT) break; ! man_valid_post(man); } assert(man->last); *************** *** 473,490 **** * Same here regarding whether we're back at the root. */ ! if (man->last->type != MAN_ROOT && ! man_valid_post(man)) ! return(0); ! ! return(1); } ! int man_macroend(struct man *man) { ! return(man_unscope(man, man->first)); } static int --- 442,457 ---- * Same here regarding whether we're back at the root. */ ! if (man->last->type != MAN_ROOT) ! man_valid_post(man); } ! void man_macroend(struct man *man) { ! man_unscope(man, man->first); } static int