summaryrefslogtreecommitdiffstatshomepage
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
commitf27e8dcec6089cf24702107e517e3c0c5950477d (patch)
tree820e7552a3bbb4dec58c8f24329f3bce76140c82 /man.c
parentb89219869bcc53798ee875bb243b8c4f60b23bda (diff)
downloadmandoc-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.c39
1 files changed, 35 insertions, 4 deletions
diff --git a/man.c b/man.c
index c3e5a894..d823a5d1 100644
--- a/man.c
+++ b/man.c
@@ -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