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 | 32cbe85d8ce6eee87446621fa65138ae97b24bb8 (patch) | |
tree | ef7a96e354ccaf6e84ec022230ad8840df8ef74d /man.c | |
parent | 1f06d7b1d7dc62d0276312c7c411ee4ed3b842f8 (diff) | |
download | mandoc-32cbe85d8ce6eee87446621fa65138ae97b24bb8.tar.gz |
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 | 37 |
1 files changed, 34 insertions, 3 deletions
@@ -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 |