diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2018-08-17 20:33:37 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2018-08-17 20:33:37 +0000 |
commit | a55868d2cb7c07237689f307d3a55b33b257de09 (patch) | |
tree | 6e622b38423ae091b6a8a02b0843ea2bfb7958b4 /mdoc_macro.c | |
parent | f6077aba4f0b9ece3ceff820c0c651d148df1a37 (diff) | |
download | mandoc-a55868d2cb7c07237689f307d3a55b33b257de09.tar.gz |
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 'mdoc_macro.c')
-rw-r--r-- | mdoc_macro.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c index 50d9159f..022dd032 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -1,7 +1,7 @@ /* $Id$ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> - * Copyright (c) 2010, 2012-2017 Ingo Schwarze <schwarze@openbsd.org> + * Copyright (c) 2010, 2012-2018 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -60,7 +60,7 @@ static void rew_last(struct roff_man *, const struct roff_node *); static void rew_pending(struct roff_man *, const struct roff_node *); -const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_Dd] = { +static const struct mdoc_macro mdoc_macros[MDOC_MAX - MDOC_Dd] = { { in_line_eoln, MDOC_PROLOGUE }, /* Dd */ { in_line_eoln, MDOC_PROLOGUE }, /* Dt */ { in_line_eoln, MDOC_PROLOGUE }, /* Os */ @@ -201,9 +201,15 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX - MDOC_Dd] = { { in_line_eoln, 0 }, /* %U */ { phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */ }; -const struct mdoc_macro *const mdoc_macros = __mdoc_macros - MDOC_Dd; +const struct mdoc_macro * +mdoc_macro(enum roff_tok tok) +{ + assert(tok >= MDOC_Dd && tok < MDOC_MAX); + return mdoc_macros + (tok - MDOC_Dd); +} + /* * This is called at the end of parsing. It must traverse up the tree, * closing out open [implicit] scopes. Obviously, open explicit scopes @@ -221,7 +227,7 @@ mdoc_endparse(struct roff_man *mdoc) for ( ; n; n = n->parent) if (n->type == ROFFT_BLOCK && - mdoc_macros[n->tok].flags & MDOC_EXPLICIT) + mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse, n->line, n->pos, roff_name[n->tok]); @@ -244,10 +250,10 @@ lookup(struct roff_man *mdoc, int from, int line, int ppos, const char *p) mdoc->flags &= ~MDOC_PHRASEQF; return TOKEN_NONE; } - if (from == TOKEN_NONE || mdoc_macros[from].flags & MDOC_PARSED) { + if (from == TOKEN_NONE || mdoc_macro(from)->flags & MDOC_PARSED) { res = roffhash_find(mdoc->mdocmac, p, 0); if (res != TOKEN_NONE) { - if (mdoc_macros[res].flags & MDOC_CALLABLE) + if (mdoc_macro(res)->flags & MDOC_CALLABLE) return res; mandoc_msg(MANDOCERR_MACRO_CALL, mdoc->parse, line, ppos, p); @@ -409,7 +415,7 @@ find_pending(struct roff_man *mdoc, enum roff_tok tok, int line, int ppos, if (n->flags & NODE_ENDED) continue; if (n->type == ROFFT_BLOCK && - mdoc_macros[n->tok].flags & MDOC_EXPLICIT) { + mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) { irc = 1; break_intermediate(mdoc->last, target); if (target->type == ROFFT_HEAD) @@ -518,13 +524,13 @@ macro_or_word(MACRO_PROT_ARGS, int parsed) if (ntok == TOKEN_NONE) { dword(mdoc, line, ppos, p, DELIM_MAX, tok == TOKEN_NONE || - mdoc_macros[tok].flags & MDOC_JOIN); + mdoc_macro(tok)->flags & MDOC_JOIN); return 0; } else { if (tok != TOKEN_NONE && - mdoc_macros[tok].fp == in_line_eoln) + mdoc_macro(tok)->fp == in_line_eoln) rew_elem(mdoc, tok); - mdoc_macro(mdoc, ntok, line, ppos, pos, buf); + (*mdoc_macro(ntok)->fp)(mdoc, ntok, line, ppos, pos, buf); if (tok == TOKEN_NONE) append_delims(mdoc, line, pos, buf); return 1; @@ -688,7 +694,7 @@ blk_exp_close(MACRO_PROT_ARGS) mdoc_tail_alloc(mdoc, line, ppos, atok); } - if ( ! (mdoc_macros[tok].flags & MDOC_PARSED)) { + if ((mdoc_macro(tok)->flags & MDOC_PARSED) == 0) { if (buf[*pos] != '\0') mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, line, ppos, @@ -717,14 +723,14 @@ blk_exp_close(MACRO_PROT_ARGS) if (ntok == TOKEN_NONE) { dword(mdoc, line, lastarg, p, DELIM_MAX, - MDOC_JOIN & mdoc_macros[tok].flags); + mdoc_macro(tok)->flags & MDOC_JOIN); continue; } if (n != NULL) rew_last(mdoc, n); mdoc->flags &= ~MDOC_NEWLINE; - mdoc_macro(mdoc, ntok, line, lastarg, pos, buf); + (*mdoc_macro(ntok)->fp)(mdoc, ntok, line, lastarg, pos, buf); break; } @@ -831,7 +837,8 @@ in_line(MACRO_PROT_ARGS) mdoc->parse, line, ppos, roff_name[tok]); } - mdoc_macro(mdoc, ntok, line, la, pos, buf); + (*mdoc_macro(ntok)->fp)(mdoc, ntok, + line, la, pos, buf); if (nl) append_delims(mdoc, line, pos, buf); return; @@ -875,7 +882,7 @@ in_line(MACRO_PROT_ARGS) } dword(mdoc, line, la, p, d, - mdoc_macros[tok].flags & MDOC_JOIN); + mdoc_macro(tok)->flags & MDOC_JOIN); /* * If the first argument is a closing delimiter, @@ -944,7 +951,7 @@ blk_full(MACRO_PROT_ARGS) return; } - if ( ! (mdoc_macros[tok].flags & MDOC_EXPLICIT)) { + if ((mdoc_macro(tok)->flags & MDOC_EXPLICIT) == 0) { /* Here, tok is one of Sh Ss Nm Nd It. */ @@ -969,7 +976,7 @@ blk_full(MACRO_PROT_ARGS) break; } - if (mdoc_macros[n->tok].flags & MDOC_EXPLICIT) { + if (mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) { switch (tok) { case MDOC_Sh: case MDOC_Ss: @@ -1339,7 +1346,7 @@ in_line_argn(MACRO_PROT_ARGS) ac = mdoc_args(mdoc, line, pos, buf, tok, &p); if (ac == ARGS_WORD && state == -1 && - ! (mdoc_macros[tok].flags & MDOC_IGNDELIM) && + (mdoc_macro(tok)->flags & MDOC_IGNDELIM) == 0 && mdoc_isdelim(p) == DELIM_OPEN) { dword(mdoc, line, la, p, DELIM_OPEN, 0); continue; @@ -1372,11 +1379,12 @@ in_line_argn(MACRO_PROT_ARGS) rew_elem(mdoc, tok); state = -2; } - mdoc_macro(mdoc, ntok, line, la, pos, buf); + (*mdoc_macro(ntok)->fp)(mdoc, ntok, + line, la, pos, buf); break; } - if (mdoc_macros[tok].flags & MDOC_IGNDELIM || + if (mdoc_macro(tok)->flags & MDOC_IGNDELIM || mdoc_isdelim(p) == DELIM_NONE) { if (state == -1) { mdoc_elem_alloc(mdoc, line, ppos, tok, arg); @@ -1389,7 +1397,7 @@ in_line_argn(MACRO_PROT_ARGS) } dword(mdoc, line, la, p, DELIM_MAX, - mdoc_macros[tok].flags & MDOC_JOIN); + mdoc_macro(tok)->flags & MDOC_JOIN); } if (state == -1) { |