summaryrefslogtreecommitdiffstats
path: root/man.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-08-21 12:12:12 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-08-21 12:12:12 +0000
commitd8d8e19a17345326342a05e737487b04fa994353 (patch)
tree761cd03a2f8a171fc09d2d039c72505cafb59db8 /man.c
parent2a2e4af01790aa6afe854a5284be8b7ff895e9b5 (diff)
downloadmandoc-d8d8e19a17345326342a05e737487b04fa994353.tar.gz
Open explicit scope on libman exit now only generates warning.
Consecutive ELINE scopes are now pruned (with a warning).
Diffstat (limited to 'man.c')
-rw-r--r--man.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/man.c b/man.c
index f3f28c6b..c2f51ed5 100644
--- a/man.c
+++ b/man.c
@@ -454,8 +454,9 @@ descope:
int
man_pmacro(struct man *m, int ln, char *buf)
{
- int i, j, c, ppos, fl;
- char mac[5];
+ int i, j, c, ppos, fl;
+ char mac[5];
+ struct man_node *n;
/* Comments and empties are quickly ignored. */
@@ -512,6 +513,29 @@ man_pmacro(struct man *m, int ln, char *buf)
while (buf[i] && ' ' == buf[i])
i++;
+ /* Remove prior ELINE macro, if applicable. */
+
+ if (m->flags & MAN_ELINE) {
+ n = m->last;
+ assert(NULL == n->child);
+ if ( ! man_nwarn(m, n, WLNSCOPE))
+ return(0);
+
+ if (n->prev) {
+ assert(n != n->parent->child);
+ assert(n == n->prev->next);
+ n->prev->next = NULL;
+ m->last = n->prev;
+ } else {
+ assert(n == n->parent->child);
+ n->parent->child = NULL;
+ m->last = n->parent;
+ }
+
+ man_node_free(n);
+ m->flags &= ~MAN_ELINE;
+ }
+
/* Begin recursive parse sequence. */
assert(man_macros[c].fp);
@@ -533,8 +557,6 @@ out:
/* Close out the block scope opened in the prior line. */
- /* XXX - this should be in man_action.c. */
-
assert(MAN_BLINE & m->flags);
m->flags &= ~MAN_BLINE;