diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2018-08-17 20:31:53 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2018-08-17 20:31:53 +0000 |
commit | bbc22c979845c539463fd9fc9d807a514cd456b8 (patch) | |
tree | ac2701add3cf75e4a713e9cdcb2af4d091cc7b3c /usr.bin/mandoc/man_macro.c | |
parent | f766f23c3824e58e080eb75ed3c727ff0734eca5 (diff) |
Remove more pointer arithmetic passing via regions outside the array
that is undefined according to the C standard. Robert Elz <kre at
munnari dot oz dot au> pointed out i wasn't quite done yet.
Diffstat (limited to 'usr.bin/mandoc/man_macro.c')
-rw-r--r-- | usr.bin/mandoc/man_macro.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/usr.bin/mandoc/man_macro.c b/usr.bin/mandoc/man_macro.c index 6191777300a..30c26ba4da2 100644 --- a/usr.bin/mandoc/man_macro.c +++ b/usr.bin/mandoc/man_macro.c @@ -1,4 +1,4 @@ -/* $OpenBSD: man_macro.c,v 1.88 2018/08/16 23:40:19 schwarze Exp $ */ +/* $OpenBSD: man_macro.c,v 1.89 2018/08/17 20:31:52 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2012-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -38,7 +38,7 @@ static int man_args(struct roff_man *, int, int *, char *, char **); static void rew_scope(struct roff_man *, enum roff_tok); -const struct man_macro __man_macros[MAN_MAX - MAN_TH] = { +static const struct man_macro man_macros[MAN_MAX - MAN_TH] = { { in_line_eoln, MAN_BSCOPE }, /* TH */ { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SH */ { blk_imp, MAN_BSCOPE | MAN_SCOPED }, /* SS */ @@ -77,9 +77,15 @@ const struct man_macro __man_macros[MAN_MAX - MAN_TH] = { { blk_exp, MAN_BSCOPE }, /* MT */ { blk_close, MAN_BSCOPE }, /* ME */ }; -const struct man_macro *const man_macros = __man_macros - MAN_TH; +const struct man_macro * +man_macro(enum roff_tok tok) +{ + assert(tok >= MAN_TH && tok <= MAN_MAX); + return man_macros + (tok - MAN_TH); +} + void man_unscope(struct roff_man *man, const struct roff_node *to) { @@ -93,7 +99,7 @@ man_unscope(struct roff_man *man, const struct roff_node *to) if (to == NULL && ! (n->flags & NODE_VALID)) { if (man->flags & (MAN_BLINE | MAN_ELINE) && - man_macros[n->tok].flags & MAN_SCOPED) { + man_macro(n->tok)->flags & MAN_SCOPED) { mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse, n->line, n->pos, "EOF breaks %s", roff_name[n->tok]); @@ -110,7 +116,7 @@ man_unscope(struct roff_man *man, const struct roff_node *to) continue; } if (n->type == ROFFT_BLOCK && - man_macros[n->tok].fp == blk_exp) + man_macro(n->tok)->fp == blk_exp) mandoc_msg(MANDOCERR_BLK_NOEND, man->parse, n->line, n->pos, roff_name[n->tok]); @@ -174,7 +180,7 @@ rew_scope(struct roff_man *man, enum roff_tok tok) } if (tok != MAN_SH && (n->tok == MAN_SH || (tok != MAN_SS && (n->tok == MAN_SS || - man_macros[n->tok].fp == blk_exp)))) + man_macro(n->tok)->fp == blk_exp)))) return; man_unscope(man, n); n = man->last; @@ -325,7 +331,7 @@ blk_imp(MACRO_PROT_ARGS) * For `TP', always keep the head open. */ - if (man_macros[tok].flags & MAN_SCOPED && + if (man_macro(tok)->flags & MAN_SCOPED && (tok == MAN_TP || tok == MAN_TQ || n == man->last)) { man->flags |= MAN_BLINE; return; @@ -363,7 +369,7 @@ in_line_eoln(MACRO_PROT_ARGS) la = *pos; if ( ! man_args(man, line, pos, buf, &p)) break; - if (man_macros[tok].flags & MAN_JOIN && + if (man_macro(tok)->flags & MAN_JOIN && man->last->type == ROFFT_TEXT) roff_word_append(man, p); else @@ -385,8 +391,8 @@ in_line_eoln(MACRO_PROT_ARGS) * 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)); + if (n == man->last && man_macro(tok)->flags & MAN_SCOPED) { + assert((man_macro(tok)->flags & MAN_NSCOPED) == 0); man->flags |= MAN_ELINE; return; } |