diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-03-22 05:59:32 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-03-22 05:59:32 +0000 |
commit | f27e8dcec6089cf24702107e517e3c0c5950477d (patch) | |
tree | 820e7552a3bbb4dec58c8f24329f3bce76140c82 /man.c | |
parent | b89219869bcc53798ee875bb243b8c4f60b23bda (diff) | |
download | mandoc-f27e8dcec6089cf24702107e517e3c0c5950477d.tar.gz mandoc-f27e8dcec6089cf24702107e517e3c0c5950477d.tar.zst mandoc-f27e8dcec6089cf24702107e517e3c0c5950477d.zip |
Accomodate (libman) for next-line macros followed by non-text macros `na', `sp', and `br'.
Based on a patch by Ingo Schwarze.
Diffstat (limited to 'man.c')
-rw-r--r-- | man.c | 39 |
1 files changed, 35 insertions, 4 deletions
@@ -1,4 +1,4 @@ -/* $Id: man.c,v 1.49 2010/01/07 10:24:43 kristaps Exp $ */ +/* $Id: man.c,v 1.50 2010/03/22 05:59:32 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se> * @@ -534,15 +534,29 @@ man_pmacro(struct man *m, int ln, char *buf) if ( ! man_pwarn(m, ln, i - 1, WTSPACE)) goto err; - /* Remove prior ELINE macro, if applicable. */ + /* + * Remove prior ELINE macro, as a macro is clobbering it by + * being invoked without prior text. Note that NSCOPED macros + * do not close out ELINE macros, as they print no text. + */ - if (m->flags & MAN_ELINE) { + if (m->flags & MAN_ELINE && + ! (MAN_NSCOPED & man_macros[c].flags)) { n = m->last; assert(NULL == n->child); assert(0 == n->nchild); if ( ! man_nwarn(m, n, WLNSCOPE)) return(0); + /* FIXME: when called as in: + * + * .B + * .br + * .B + * .br + * hello + */ + if (n->prev) { assert(n != n->parent->child); assert(n == n->prev->next); @@ -568,8 +582,25 @@ man_pmacro(struct man *m, int ln, char *buf) goto err; out: - if ( ! (MAN_BLINE & fl)) + /* + * We weren't in a block-line scope when entering the + * above-parsed macro, so return. + */ + + if ( ! (MAN_BLINE & fl)) { + m->flags &= ~MAN_ILINE; return(1); + } + + /* + * If we're in a block scope, then allow this macro to slip by + * without closing scope around it. + */ + + if (MAN_ILINE & m->flags) { + m->flags &= ~MAN_ILINE; + return(1); + } /* * If we've opened a new next-line element scope, then return |