=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/man_term.c,v retrieving revision 1.166 retrieving revision 1.167 diff -c -r1.166 -r1.167 *** src/usr.bin/mandoc/man_term.c 2018/08/16 23:40:19 1.166 --- src/usr.bin/mandoc/man_term.c 2018/08/17 20:31:52 1.167 *************** *** 1,4 **** ! /* $OpenBSD: man_term.c,v 1.166 2018/08/16 23:40:19 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: man_term.c,v 1.167 2018/08/17 20:31:52 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze *************** *** 49,55 **** struct roff_node *n, \ const struct roff_meta *meta ! struct termact { int (*pre)(DECL_ARGS); void (*post)(DECL_ARGS); int flags; --- 49,55 ---- struct roff_node *n, \ const struct roff_meta *meta ! struct man_term_act { int (*pre)(DECL_ARGS); void (*post)(DECL_ARGS); int flags; *************** *** 91,97 **** static void post_TP(DECL_ARGS); static void post_UR(DECL_ARGS); ! static const struct termact __termacts[MAN_MAX - MAN_TH] = { { NULL, NULL, 0 }, /* TH */ { pre_SH, post_SH, 0 }, /* SH */ { pre_SS, post_SS, 0 }, /* SS */ --- 91,97 ---- static void post_TP(DECL_ARGS); static void post_UR(DECL_ARGS); ! static const struct man_term_act man_term_acts[MAN_MAX - MAN_TH] = { { NULL, NULL, 0 }, /* TH */ { pre_SH, post_SH, 0 }, /* SH */ { pre_SS, post_SS, 0 }, /* SS */ *************** *** 130,138 **** { pre_UR, post_UR, 0 }, /* MT */ { NULL, NULL, 0 }, /* ME */ }; ! static const struct termact *termacts = __termacts - MAN_TH; void terminal_man(void *arg, const struct roff_man *man) { --- 130,145 ---- { pre_UR, post_UR, 0 }, /* MT */ { NULL, NULL, 0 }, /* ME */ }; ! static const struct man_term_act *man_term_act(enum roff_tok); + static const struct man_term_act * + man_term_act(enum roff_tok tok) + { + assert(tok >= MAN_TH && tok <= MAN_MAX); + return man_term_acts + (tok - MAN_TH); + } + void terminal_man(void *arg, const struct roff_man *man) { *************** *** 674,680 **** do { n = n->prev; } while (n != NULL && n->tok >= MAN_TH && ! termacts[n->tok].flags & MAN_NOTEXT); if (n == NULL || n->type == ROFFT_COMMENT || (n->tok == MAN_SS && n->body->child == NULL)) break; --- 681,687 ---- do { n = n->prev; } while (n != NULL && n->tok >= MAN_TH && ! man_term_act(n->tok)->flags & MAN_NOTEXT); if (n == NULL || n->type == ROFFT_COMMENT || (n->tok == MAN_SS && n->body->child == NULL)) break; *************** *** 737,743 **** do { n = n->prev; } while (n != NULL && n->tok >= MAN_TH && ! termacts[n->tok].flags & MAN_NOTEXT); if (n == NULL || n->type == ROFFT_COMMENT || (n->tok == MAN_SH && n->body->child == NULL)) break; --- 744,750 ---- do { n = n->prev; } while (n != NULL && n->tok >= MAN_TH && ! man_term_act(n->tok)->flags & MAN_NOTEXT); if (n == NULL || n->type == ROFFT_COMMENT || (n->tok == MAN_SH && n->body->child == NULL)) break; *************** *** 866,872 **** static void print_man_node(DECL_ARGS) { ! int c; switch (n->type) { case ROFFT_TEXT: --- 873,880 ---- static void print_man_node(DECL_ARGS) { ! const struct man_term_act *act; ! int c; switch (n->type) { case ROFFT_TEXT: *************** *** 912,931 **** return; } ! assert(n->tok >= MAN_TH && n->tok <= MAN_MAX); ! if ( ! (MAN_NOTEXT & termacts[n->tok].flags)) term_fontrepl(p, TERMFONT_NONE); c = 1; ! if (termacts[n->tok].pre) ! c = (*termacts[n->tok].pre)(p, mt, n, meta); if (c && n->child) print_man_nodelist(p, mt, n->child, meta); ! if (termacts[n->tok].post) ! (*termacts[n->tok].post)(p, mt, n, meta); ! if ( ! (MAN_NOTEXT & termacts[n->tok].flags)) term_fontrepl(p, TERMFONT_NONE); out: --- 920,939 ---- return; } ! act = man_term_act(n->tok); ! if ((act->flags & MAN_NOTEXT) == 0) term_fontrepl(p, TERMFONT_NONE); c = 1; ! if (act->pre != NULL) ! c = (*act->pre)(p, mt, n, meta); if (c && n->child) print_man_nodelist(p, mt, n->child, meta); ! if (act->post != NULL) ! (*act->post)(p, mt, n, meta); ! if ((act->flags & MAN_NOTEXT) == 0) term_fontrepl(p, TERMFONT_NONE); out: