summaryrefslogtreecommitdiffstats
path: root/man.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-03-22 05:59:32 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-03-22 05:59:32 +0000
commit32cbe85d8ce6eee87446621fa65138ae97b24bb8 (patch)
treeef7a96e354ccaf6e84ec022230ad8840df8ef74d /man.c
parent1f06d7b1d7dc62d0276312c7c411ee4ed3b842f8 (diff)
downloadmandoc-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.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/man.c b/man.c
index 35465c3a..01b4f89a 100644
--- a/man.c
+++ b/man.c
@@ -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