=================================================================== RCS file: /cvs/mandoc/man_macro.c,v retrieving revision 1.133 retrieving revision 1.146 diff -u -p -r1.133 -r1.146 --- mandoc/man_macro.c 2018/08/26 16:21:24 1.133 +++ mandoc/man_macro.c 2022/04/13 14:45:50 1.146 @@ -1,7 +1,7 @@ -/* $Id: man_macro.c,v 1.133 2018/08/26 16:21:24 schwarze Exp $ */ +/* $Id: man_macro.c,v 1.146 2022/04/13 14:45:50 schwarze Exp $ */ /* + * Copyright (c) 2012-2015,2017-2020,2022 Ingo Schwarze * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2012-2015, 2017, 2018 Ingo Schwarze * Copyright (c) 2013 Franco Fichtner * * Permission to use, copy, modify, and distribute this software for any @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -62,8 +63,6 @@ static const struct man_macro man_macros[MAN_MAX - MAN { in_line_eoln, MAN_NSCOPED | MAN_ESCOPED | MAN_JOIN }, /* I */ { in_line_eoln, 0 }, /* IR */ { in_line_eoln, 0 }, /* RI */ - { in_line_eoln, MAN_NSCOPED }, /* nf */ - { in_line_eoln, MAN_NSCOPED }, /* fi */ { blk_close, MAN_XSCOPE }, /* RE */ { blk_exp, MAN_XSCOPE }, /* RS */ { in_line_eoln, 0 }, /* DT */ @@ -105,12 +104,15 @@ man_unscope(struct roff_man *man, const struct roff_no if (man->flags & (MAN_BLINE | MAN_ELINE) && man_macro(n->tok)->flags & (MAN_BSCOPED | MAN_NSCOPED)) { - mandoc_vmsg(MANDOCERR_BLK_LINE, - man->parse, n->line, n->pos, + mandoc_msg(MANDOCERR_BLK_LINE, + n->line, n->pos, "EOF breaks %s", roff_name[n->tok]); - if (man->flags & MAN_ELINE) - man->flags &= ~MAN_ELINE; - else { + if (man->flags & MAN_ELINE) { + if (n->parent->type == ROFFT_ROOT || + (man_macro(n->parent->tok)->flags & + MAN_ESCOPED) == 0) + man->flags &= ~MAN_ELINE; + } else { assert(n->type == ROFFT_HEAD); n = n->parent; man->flags &= ~MAN_BLINE; @@ -123,7 +125,7 @@ man_unscope(struct roff_man *man, const struct roff_no if (n->type == ROFFT_BLOCK && man_macro(n->tok)->fp == blk_exp) mandoc_msg(MANDOCERR_BLK_NOEND, - man->parse, n->line, n->pos, + n->line, n->pos, "%s", roff_name[n->tok]); } @@ -201,27 +203,30 @@ blk_close(MACRO_PROT_ARGS) { enum roff_tok ctok, ntok; const struct roff_node *nn; - char *p; - int cline, cpos, nrew, target; + char *p, *ep; + int cline, cpos, la, nrew, target; nrew = 1; switch (tok) { case MAN_RE: ntok = MAN_RS; + la = *pos; 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') - mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse, - line, p - buf, "RE ... %s", p); + target = strtol(p, &ep, 10); + if (*ep != '\0') + mandoc_msg(MANDOCERR_ARG_EXCESS, line, + la + (buf[la] == '"') + (int)(ep - p), + "RE ... %s", ep); + free(p); if (target == 0) target = 1; nrew -= target; if (nrew < 1) { - mandoc_vmsg(MANDOCERR_RE_NOTOPEN, man->parse, + mandoc_msg(MANDOCERR_RE_NOTOPEN, line, ppos, "RE %d", target); return; } @@ -244,8 +249,8 @@ blk_close(MACRO_PROT_ARGS) break; if (nn == NULL) { - mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse, - line, ppos, roff_name[tok]); + mandoc_msg(MANDOCERR_BLK_NOTOPEN, + line, ppos, "%s", roff_name[tok]); rew_scope(man, MAN_PP); if (tok == MAN_RE) { roff_elem_alloc(man, line, ppos, ROFF_br); @@ -295,8 +300,10 @@ blk_exp(MACRO_PROT_ARGS) char *p; int la; - if (tok == MAN_RS) + if (tok == MAN_RS) { rew_scope(man, tok); + man->flags |= ROFF_NONOFILL; + } roff_block_alloc(man, line, ppos, tok); head = roff_head_alloc(man, line, ppos, tok); @@ -311,14 +318,16 @@ blk_exp(MACRO_PROT_ARGS) roff_setreg(man->roff, "an-margin", head->aux, '+'); } + free(p); } if (buf[*pos] != '\0') - mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse, line, - *pos, "%s ... %s", roff_name[tok], buf + *pos); + mandoc_msg(MANDOCERR_ARG_EXCESS, line, *pos, + "%s ... %s", roff_name[tok], buf + *pos); man_unscope(man, head); roff_body_alloc(man, line, ppos, tok); + man->flags &= ~ROFF_NONOFILL; } /* @@ -335,9 +344,10 @@ blk_imp(MACRO_PROT_ARGS) struct roff_node *n; rew_scope(man, tok); - n = roff_block_alloc(man, line, ppos, tok); - if (n->tok == MAN_SH || n->tok == MAN_SS) - man->flags &= ~MAN_LITERAL; + man->flags |= ROFF_NONOFILL; + if (tok == MAN_SH || tok == MAN_SS) + man->flags &= ~ROFF_NOFILL; + roff_block_alloc(man, line, ppos, tok); n = roff_head_alloc(man, line, ppos, tok); /* Add line arguments. */ @@ -347,6 +357,7 @@ blk_imp(MACRO_PROT_ARGS) if ( ! man_args(man, line, pos, buf, &p)) break; roff_word_alloc(man, line, la, p); + free(p); } /* @@ -365,6 +376,7 @@ blk_imp(MACRO_PROT_ARGS) man_unscope(man, n); roff_body_alloc(man, line, ppos, tok); + man->flags &= ~ROFF_NONOFILL; } void @@ -377,17 +389,15 @@ in_line_eoln(MACRO_PROT_ARGS) roff_elem_alloc(man, line, ppos, tok); n = man->last; + if (tok == MAN_EX) + man->flags |= ROFF_NOFILL; + else if (tok == MAN_EE) + man->flags &= ~ROFF_NOFILL; + for (;;) { - if (buf[*pos] != '\0' && (tok == MAN_fi || tok == MAN_nf)) { - mandoc_vmsg(MANDOCERR_ARG_SKIP, - man->parse, line, *pos, "%s %s", - roff_name[tok], buf + *pos); - break; - } if (buf[*pos] != '\0' && man->last != n && tok == MAN_PD) { - mandoc_vmsg(MANDOCERR_ARG_EXCESS, - man->parse, line, *pos, "%s ... %s", - roff_name[tok], buf + *pos); + mandoc_msg(MANDOCERR_ARG_EXCESS, line, *pos, + "%s ... %s", roff_name[tok], buf + *pos); break; } la = *pos; @@ -398,6 +408,7 @@ in_line_eoln(MACRO_PROT_ARGS) roff_word_append(man, p); else roff_word_alloc(man, line, la, p); + free(p); } /* @@ -426,7 +437,7 @@ in_line_eoln(MACRO_PROT_ARGS) /* Rewind our element scope. */ for ( ; man->last; man->last = man->last->parent) { - man_state(man, man->last); + man->last->flags |= NODE_VALID; if (man->last == n) break; } @@ -440,9 +451,7 @@ in_line_eoln(MACRO_PROT_ARGS) void man_endparse(struct roff_man *man) { - - man_unscope(man, man->first); - man->flags &= ~MAN_LITERAL; + man_unscope(man, man->meta.first); } static int @@ -457,6 +466,6 @@ man_args(struct roff_man *man, int line, int *pos, cha if ('\0' == *start) return 0; - *v = mandoc_getarg(man->parse, v, line, pos); + *v = roff_getarg(man->roff, v, line, pos); return 1; }