=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_macro.c,v retrieving revision 1.181 retrieving revision 1.182 diff -c -r1.181 -r1.182 *** src/usr.bin/mandoc/mdoc_macro.c 2017/05/30 16:21:07 1.181 --- src/usr.bin/mandoc/mdoc_macro.c 2018/08/17 20:31:52 1.182 *************** *** 1,7 **** ! /* $OpenBSD: mdoc_macro.c,v 1.181 2017/05/30 16:21:07 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons ! * Copyright (c) 2010, 2012-2017 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above --- 1,7 ---- ! /* $OpenBSD: mdoc_macro.c,v 1.182 2018/08/17 20:31:52 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons ! * Copyright (c) 2010, 2012-2018 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above *************** *** 58,64 **** static void rew_pending(struct roff_man *, const struct roff_node *); ! 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 */ --- 58,64 ---- static void rew_pending(struct roff_man *, const struct roff_node *); ! 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 */ *************** *** 199,207 **** { 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; /* * This is called at the end of parsing. It must traverse up the tree, * closing out open [implicit] scopes. Obviously, open explicit scopes --- 199,213 ---- { in_line_eoln, 0 }, /* %U */ { phrase_ta, MDOC_CALLABLE | MDOC_PARSED | MDOC_JOIN }, /* Ta */ }; + 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 *************** *** 219,225 **** for ( ; n; n = n->parent) if (n->type == ROFFT_BLOCK && ! mdoc_macros[n->tok].flags & MDOC_EXPLICIT) mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse, n->line, n->pos, roff_name[n->tok]); --- 225,231 ---- for ( ; n; n = n->parent) if (n->type == ROFFT_BLOCK && ! mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) mandoc_msg(MANDOCERR_BLK_NOEND, mdoc->parse, n->line, n->pos, roff_name[n->tok]); *************** *** 242,251 **** mdoc->flags &= ~MDOC_PHRASEQF; return TOKEN_NONE; } ! if (from == TOKEN_NONE || mdoc_macros[from].flags & MDOC_PARSED) { res = roffhash_find(mdoc->mdocmac, p, 0); if (res != TOKEN_NONE) { ! if (mdoc_macros[res].flags & MDOC_CALLABLE) return res; mandoc_msg(MANDOCERR_MACRO_CALL, mdoc->parse, line, ppos, p); --- 248,257 ---- mdoc->flags &= ~MDOC_PHRASEQF; return TOKEN_NONE; } ! if (from == TOKEN_NONE || mdoc_macro(from)->flags & MDOC_PARSED) { res = roffhash_find(mdoc->mdocmac, p, 0); if (res != TOKEN_NONE) { ! if (mdoc_macro(res)->flags & MDOC_CALLABLE) return res; mandoc_msg(MANDOCERR_MACRO_CALL, mdoc->parse, line, ppos, p); *************** *** 407,413 **** if (n->flags & NODE_ENDED) continue; if (n->type == ROFFT_BLOCK && ! mdoc_macros[n->tok].flags & MDOC_EXPLICIT) { irc = 1; break_intermediate(mdoc->last, target); if (target->type == ROFFT_HEAD) --- 413,419 ---- if (n->flags & NODE_ENDED) continue; if (n->type == ROFFT_BLOCK && ! mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) { irc = 1; break_intermediate(mdoc->last, target); if (target->type == ROFFT_HEAD) *************** *** 516,528 **** if (ntok == TOKEN_NONE) { dword(mdoc, line, ppos, p, DELIM_MAX, tok == TOKEN_NONE || ! mdoc_macros[tok].flags & MDOC_JOIN); return 0; } else { if (tok != TOKEN_NONE && ! mdoc_macros[tok].fp == in_line_eoln) rew_elem(mdoc, tok); ! mdoc_macro(mdoc, ntok, line, ppos, pos, buf); if (tok == TOKEN_NONE) append_delims(mdoc, line, pos, buf); return 1; --- 522,534 ---- if (ntok == TOKEN_NONE) { dword(mdoc, line, ppos, p, DELIM_MAX, tok == TOKEN_NONE || ! mdoc_macro(tok)->flags & MDOC_JOIN); return 0; } else { if (tok != TOKEN_NONE && ! mdoc_macro(tok)->fp == in_line_eoln) rew_elem(mdoc, tok); ! (*mdoc_macro(ntok)->fp)(mdoc, ntok, line, ppos, pos, buf); if (tok == TOKEN_NONE) append_delims(mdoc, line, pos, buf); return 1; *************** *** 686,692 **** mdoc_tail_alloc(mdoc, line, ppos, atok); } ! if ( ! (mdoc_macros[tok].flags & MDOC_PARSED)) { if (buf[*pos] != '\0') mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, line, ppos, --- 692,698 ---- mdoc_tail_alloc(mdoc, line, ppos, atok); } ! if ((mdoc_macro(tok)->flags & MDOC_PARSED) == 0) { if (buf[*pos] != '\0') mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, line, ppos, *************** *** 715,728 **** if (ntok == TOKEN_NONE) { dword(mdoc, line, lastarg, p, DELIM_MAX, ! MDOC_JOIN & mdoc_macros[tok].flags); continue; } if (n != NULL) rew_last(mdoc, n); mdoc->flags &= ~MDOC_NEWLINE; ! mdoc_macro(mdoc, ntok, line, lastarg, pos, buf); break; } --- 721,734 ---- if (ntok == TOKEN_NONE) { dword(mdoc, line, lastarg, p, DELIM_MAX, ! mdoc_macro(tok)->flags & MDOC_JOIN); continue; } if (n != NULL) rew_last(mdoc, n); mdoc->flags &= ~MDOC_NEWLINE; ! (*mdoc_macro(ntok)->fp)(mdoc, ntok, line, lastarg, pos, buf); break; } *************** *** 829,835 **** mdoc->parse, line, ppos, roff_name[tok]); } ! mdoc_macro(mdoc, ntok, line, la, pos, buf); if (nl) append_delims(mdoc, line, pos, buf); return; --- 835,842 ---- mdoc->parse, line, ppos, roff_name[tok]); } ! (*mdoc_macro(ntok)->fp)(mdoc, ntok, ! line, la, pos, buf); if (nl) append_delims(mdoc, line, pos, buf); return; *************** *** 873,879 **** } dword(mdoc, line, la, p, d, ! mdoc_macros[tok].flags & MDOC_JOIN); /* * If the first argument is a closing delimiter, --- 880,886 ---- } dword(mdoc, line, la, p, d, ! mdoc_macro(tok)->flags & MDOC_JOIN); /* * If the first argument is a closing delimiter, *************** *** 942,948 **** return; } ! if ( ! (mdoc_macros[tok].flags & MDOC_EXPLICIT)) { /* Here, tok is one of Sh Ss Nm Nd It. */ --- 949,955 ---- return; } ! if ((mdoc_macro(tok)->flags & MDOC_EXPLICIT) == 0) { /* Here, tok is one of Sh Ss Nm Nd It. */ *************** *** 967,973 **** break; } ! if (mdoc_macros[n->tok].flags & MDOC_EXPLICIT) { switch (tok) { case MDOC_Sh: case MDOC_Ss: --- 974,980 ---- break; } ! if (mdoc_macro(n->tok)->flags & MDOC_EXPLICIT) { switch (tok) { case MDOC_Sh: case MDOC_Ss: *************** *** 1337,1343 **** ac = mdoc_args(mdoc, line, pos, buf, tok, &p); if (ac == ARGS_WORD && state == -1 && ! ! (mdoc_macros[tok].flags & MDOC_IGNDELIM) && mdoc_isdelim(p) == DELIM_OPEN) { dword(mdoc, line, la, p, DELIM_OPEN, 0); continue; --- 1344,1350 ---- ac = mdoc_args(mdoc, line, pos, buf, tok, &p); if (ac == ARGS_WORD && state == -1 && ! (mdoc_macro(tok)->flags & MDOC_IGNDELIM) == 0 && mdoc_isdelim(p) == DELIM_OPEN) { dword(mdoc, line, la, p, DELIM_OPEN, 0); continue; *************** *** 1370,1380 **** rew_elem(mdoc, tok); state = -2; } ! mdoc_macro(mdoc, ntok, line, la, pos, buf); break; } ! if (mdoc_macros[tok].flags & MDOC_IGNDELIM || mdoc_isdelim(p) == DELIM_NONE) { if (state == -1) { mdoc_elem_alloc(mdoc, line, ppos, tok, arg); --- 1377,1388 ---- rew_elem(mdoc, tok); state = -2; } ! (*mdoc_macro(ntok)->fp)(mdoc, ntok, ! line, la, pos, buf); break; } ! if (mdoc_macro(tok)->flags & MDOC_IGNDELIM || mdoc_isdelim(p) == DELIM_NONE) { if (state == -1) { mdoc_elem_alloc(mdoc, line, ppos, tok, arg); *************** *** 1387,1393 **** } dword(mdoc, line, la, p, DELIM_MAX, ! mdoc_macros[tok].flags & MDOC_JOIN); } if (state == -1) { --- 1395,1401 ---- } dword(mdoc, line, la, p, DELIM_MAX, ! mdoc_macro(tok)->flags & MDOC_JOIN); } if (state == -1) {