=================================================================== RCS file: /cvs/mandoc/man_macro.c,v retrieving revision 1.140 retrieving revision 1.149 diff -u -p -r1.140 -r1.149 --- mandoc/man_macro.c 2018/12/31 07:08:12 1.140 +++ mandoc/man_macro.c 2023/10/24 20:53:12 1.149 @@ -1,7 +1,7 @@ -/* $Id: man_macro.c,v 1.140 2018/12/31 07:08:12 schwarze Exp $ */ +/* $Id: man_macro.c,v 1.149 2023/10/24 20:53:12 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 @@ -26,6 +26,9 @@ #include #include +#if DEBUG_MEMORY +#include "mandoc_dbg.h" +#endif #include "mandoc.h" #include "roff.h" #include "man.h" @@ -65,10 +68,10 @@ static const struct man_macro man_macros[MAN_MAX - MAN { in_line_eoln, 0 }, /* RI */ { blk_close, MAN_XSCOPE }, /* RE */ { blk_exp, MAN_XSCOPE }, /* RS */ - { in_line_eoln, 0 }, /* DT */ - { in_line_eoln, 0 }, /* UC */ + { in_line_eoln, MAN_NSCOPED }, /* DT */ + { in_line_eoln, MAN_NSCOPED }, /* UC */ { in_line_eoln, MAN_NSCOPED }, /* PD */ - { in_line_eoln, 0 }, /* AT */ + { in_line_eoln, MAN_NSCOPED }, /* AT */ { in_line_eoln, MAN_NSCOPED }, /* in */ { blk_imp, MAN_XSCOPE }, /* SY */ { blk_close, MAN_XSCOPE }, /* YS */ @@ -79,6 +82,7 @@ static const struct man_macro man_macros[MAN_MAX - MAN { blk_close, MAN_XSCOPE }, /* UE */ { blk_exp, MAN_XSCOPE }, /* MT */ { blk_close, MAN_XSCOPE }, /* ME */ + { in_line_eoln, 0 }, /* MR */ }; @@ -107,9 +111,12 @@ man_unscope(struct roff_man *man, const struct roff_no 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; @@ -297,8 +304,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); @@ -322,6 +331,7 @@ blk_exp(MACRO_PROT_ARGS) man_unscope(man, head); roff_body_alloc(man, line, ppos, tok); + man->flags &= ~ROFF_NONOFILL; } /* @@ -338,6 +348,7 @@ blk_imp(MACRO_PROT_ARGS) struct roff_node *n; rew_scope(man, tok); + man->flags |= ROFF_NONOFILL; if (tok == MAN_SH || tok == MAN_SS) man->flags &= ~ROFF_NOFILL; roff_block_alloc(man, line, ppos, tok); @@ -369,6 +380,7 @@ blk_imp(MACRO_PROT_ARGS) man_unscope(man, n); roff_body_alloc(man, line, ppos, tok); + man->flags &= ~ROFF_NONOFILL; } void @@ -381,6 +393,16 @@ 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; + +#if DEBUG_MEMORY + if (tok == MAN_TH) + mandoc_dbg_name(buf); +#endif + for (;;) { if (buf[*pos] != '\0' && man->last != n && tok == MAN_PD) { mandoc_msg(MANDOCERR_ARG_EXCESS, line, *pos, @@ -424,7 +446,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; }