=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/man_macro.c,v retrieving revision 1.62 retrieving revision 1.63 diff -c -r1.62 -r1.63 *** src/usr.bin/mandoc/man_macro.c 2015/03/20 14:47:20 1.62 --- src/usr.bin/mandoc/man_macro.c 2015/04/02 21:03:18 1.63 *************** *** 1,4 **** ! /* $OpenBSD: man_macro.c,v 1.62 2015/03/20 14:47:20 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2013, 2014, 2015 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: man_macro.c,v 1.63 2015/04/02 21:03:18 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2012, 2013, 2014, 2015 Ingo Schwarze *************** *** 8,16 **** * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * ! * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ! * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF --- 8,16 ---- * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * ! * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ! * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *************** *** 23,30 **** #include #include - #include "man.h" #include "mandoc.h" #include "libmandoc.h" #include "libman.h" --- 23,31 ---- #include #include #include "mandoc.h" + #include "roff.h" + #include "man.h" #include "libmandoc.h" #include "libman.h" *************** *** 41,51 **** 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 *); ! static enum rew rew_block(enum mant, enum man_type, const struct man_node *); const struct man_macro __man_macros[MAN_MAX] = { --- 42,52 ---- static int man_args(struct man *, int, int *, char *, char **); ! static void rew_scope(enum roff_type, struct man *, enum mant); ! static enum rew rew_dohalt(enum mant, enum roff_type, const struct man_node *); ! static enum rew rew_block(enum mant, enum roff_type, const struct man_node *); const struct man_macro __man_macros[MAN_MAX] = { *************** *** 113,119 **** if (man->flags & MAN_ELINE) man->flags &= ~MAN_ELINE; else { ! assert(n->type == MAN_HEAD); n = n->parent; man->flags &= ~MAN_BLINE; } --- 114,120 ---- if (man->flags & MAN_ELINE) man->flags &= ~MAN_ELINE; else { ! assert(n->type == ROFFT_HEAD); n = n->parent; man->flags &= ~MAN_BLINE; } *************** *** 122,128 **** man_node_delete(man, man->last); continue; } ! if (n->type == MAN_BLOCK && man_macros[n->tok].fp == blk_exp) mandoc_msg(MANDOCERR_BLK_NOEND, man->parse, n->line, n->pos, --- 123,129 ---- man_node_delete(man, man->last); continue; } ! if (n->type == ROFFT_BLOCK && man_macros[n->tok].fp == blk_exp) mandoc_msg(MANDOCERR_BLK_NOEND, man->parse, n->line, n->pos, *************** *** 153,163 **** } 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); } --- 154,164 ---- } static enum rew ! rew_block(enum mant ntok, enum roff_type type, const struct man_node *n) { ! if (type == ROFFT_BLOCK && n->parent->tok == ntok && ! n->parent->type == ROFFT_BODY) return(REW_REWIND); return(ntok == n->tok ? REW_HALT : REW_NOHALT); } *************** *** 168,185 **** * sections and subsections). */ static enum rew ! rew_dohalt(enum mant tok, enum man_type type, const struct man_node *n) { enum rew c; /* We cannot progress beyond the root ever. */ ! if (MAN_ROOT == n->type) return(REW_HALT); assert(n->parent); /* Normal nodes shouldn't go to the level of the root. */ ! if (MAN_ROOT == n->parent->type) return(REW_REWIND); /* Already-validated nodes should be closed out. */ --- 169,186 ---- * sections and subsections). */ static enum rew ! rew_dohalt(enum mant tok, enum roff_type type, const struct man_node *n) { enum rew c; /* We cannot progress beyond the root ever. */ ! if (n->type == ROFFT_ROOT) return(REW_HALT); assert(n->parent); /* Normal nodes shouldn't go to the level of the root. */ ! if (n->parent->type == ROFFT_ROOT) return(REW_REWIND); /* Already-validated nodes should be closed out. */ *************** *** 241,247 **** * 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; enum rew c; --- 242,248 ---- * scopes. When a scope is closed, it must be validated and actioned. */ static void ! rew_scope(enum roff_type type, struct man *man, enum mant tok) { struct man_node *n; enum rew c; *************** *** 286,292 **** if ( ! man_args(man, line, pos, buf, &p)) break; for (nn = man->last->parent; nn; nn = nn->parent) ! if (nn->tok == ntok && nn->type == MAN_BLOCK) nrew++; target = strtol(p, &p, 10); if (*p != '\0') --- 287,293 ---- if ( ! man_args(man, line, pos, buf, &p)) break; for (nn = man->last->parent; nn; nn = nn->parent) ! if (nn->tok == ntok && nn->type == ROFFT_BLOCK) nrew++; target = strtol(p, &p, 10); if (*p != '\0') *************** *** 310,322 **** } for (nn = man->last->parent; nn; nn = nn->parent) ! if (nn->tok == ntok && nn->type == MAN_BLOCK && ! --nrew) break; if (nn == NULL) { mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse, line, ppos, man_macronames[tok]); ! rew_scope(MAN_BLOCK, man, MAN_PP); } else { line = man->last->line; ppos = man->last->pos; --- 311,323 ---- } for (nn = man->last->parent; nn; nn = nn->parent) ! if (nn->tok == ntok && nn->type == ROFFT_BLOCK && ! --nrew) break; if (nn == NULL) { mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse, line, ppos, man_macronames[tok]); ! rew_scope(ROFFT_BLOCK, man, MAN_PP); } else { line = man->last->line; ppos = man->last->pos; *************** *** 339,345 **** char *p; int la; ! rew_scope(MAN_BLOCK, man, tok); man_block_alloc(man, line, ppos, tok); man_head_alloc(man, line, ppos, tok); head = man->last; --- 340,346 ---- char *p; int la; ! rew_scope(ROFFT_BLOCK, man, tok); man_block_alloc(man, line, ppos, tok); man_head_alloc(man, line, ppos, tok); head = man->last; *************** *** 358,365 **** } /* ! * Parse an implicit-block macro. These contain a MAN_HEAD and a ! * MAN_BODY contained within a MAN_BLOCK. Rules for closing out other * scopes, such as `SH' closing out an `SS', are defined in the rew * routines. */ --- 359,366 ---- } /* ! * Parse an implicit-block macro. These contain a ROFFT_HEAD and a ! * ROFFT_BODY contained within a ROFFT_BLOCK. Rules for closing out other * scopes, such as `SH' closing out an `SS', are defined in the rew * routines. */ *************** *** 370,377 **** 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; --- 371,378 ---- char *p; struct man_node *n; ! rew_scope(ROFFT_BODY, man, tok); ! rew_scope(ROFFT_BLOCK, man, tok); man_block_alloc(man, line, ppos, tok); man_head_alloc(man, line, ppos, tok); n = man->last; *************** *** 399,405 **** /* Close out the head and open the body. */ ! rew_scope(MAN_HEAD, man, tok); man_body_alloc(man, line, ppos, tok); } --- 400,406 ---- /* Close out the head and open the body. */ ! rew_scope(ROFFT_HEAD, man, tok); man_body_alloc(man, line, ppos, tok); } *************** *** 432,438 **** if ( ! man_args(man, line, pos, buf, &p)) break; 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); --- 433,439 ---- if ( ! man_args(man, line, pos, buf, &p)) break; if (man_macros[tok].flags & MAN_JOIN && ! man->last->type == ROFFT_TEXT) man_word_append(man, p); else man_word_alloc(man, line, la, p); *************** *** 459,465 **** return; } ! assert(man->last->type != MAN_ROOT); man->next = MAN_NEXT_SIBLING; /* --- 460,466 ---- return; } ! assert(man->last->type != ROFFT_ROOT); man->next = MAN_NEXT_SIBLING; /* *************** *** 471,477 **** for ( ; man->last; man->last = man->last->parent) { if (man->last == n) break; ! if (man->last->type == MAN_ROOT) break; man_valid_post(man); } --- 472,478 ---- for ( ; man->last; man->last = man->last->parent) { if (man->last == n) break; ! if (man->last->type == ROFFT_ROOT) break; man_valid_post(man); } *************** *** 482,488 **** * Same here regarding whether we're back at the root. */ ! if (man->last->type != MAN_ROOT) man_valid_post(man); } --- 483,489 ---- * Same here regarding whether we're back at the root. */ ! if (man->last->type != ROFFT_ROOT) man_valid_post(man); }