summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-07-04 22:52:00 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-07-04 22:52:00 +0000
commit7f6c894d1a180fce14611c9af352e193310d8bd3 (patch)
tree036355cde4f8b2d672025cd7830ee245fae6e6ef
parent5341a1c8ccff685f8aeaa889962ec2dd4b718df8 (diff)
downloadmandoc-7f6c894d1a180fce14611c9af352e193310d8bd3.tar.gz
Fix handling of \} on roff request lines.
Cures bogus error messages in pages generated with pod2man(1).
-rw-r--r--regress/roff/cond/ie.in12
-rw-r--r--regress/roff/cond/ie.out_ascii3
-rw-r--r--roff.c36
3 files changed, 33 insertions, 18 deletions
diff --git a/regress/roff/cond/ie.in b/regress/roff/cond/ie.in
index bb76765d..580f4270 100644
--- a/regress/roff/cond/ie.in
+++ b/regress/roff/cond/ie.in
@@ -1,5 +1,5 @@
-.\" $OpenBSD: ie.in,v 1.5 2017/07/04 14:53:26 schwarze Exp $
-.TH IE 1 "December 16, 2014"
+.\" $OpenBSD: ie.in,v 1.6 2017/07/04 22:49:59 schwarze Exp $
+.TH IE 1 "July 4, 2017"
.SH NAME
if \- the roff conditional instruction with else-clause
.SH DESCRIPTION
@@ -10,6 +10,14 @@ Text following the true condition.
.el One-line else after true.
.el Another else after true.
.br
+.ie n \{\
+Two-line
+true condition.
+.br\}
+.el \{\
+Two-line
+else after true.
+.br\}
.ie t One-line false condition.
Text following the false condition.
.br
diff --git a/regress/roff/cond/ie.out_ascii b/regress/roff/cond/ie.out_ascii
index 73d3d97c..3dee8d40 100644
--- a/regress/roff/cond/ie.out_ascii
+++ b/regress/roff/cond/ie.out_ascii
@@ -8,6 +8,7 @@ NNAAMMEE
DDEESSCCRRIIPPTTIIOONN
One-line true condition.
Text following the true condition.
+ Two-line true condition.
Text following the false condition.
Two-line else after false.
Else after empty condition.
@@ -16,4 +17,4 @@ DDEESSCCRRIIPPTTIIOONN
-OpenBSD December 16, 2014 IE(1)
+OpenBSD July 4, 2017 IE(1)
diff --git a/roff.c b/roff.c
index c2b79034..2527fbcd 100644
--- a/roff.c
+++ b/roff.c
@@ -1926,15 +1926,6 @@ roff_cond_sub(ROFF_ARGS)
rr = r->last->rule;
roffnode_cleanscope(r);
- t = roff_parse(r, buf->buf, &pos, ln, ppos);
-
- /*
- * Fully handle known macros when they are structurally
- * required or when the conditional evaluated to true.
- */
-
- if (t != TOKEN_NONE && (rr || roffs[t].flags & ROFFMAC_STRUCT))
- return (*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs);
/*
* If `\}' occurs on a macro line without a preceding macro,
@@ -1948,14 +1939,29 @@ roff_cond_sub(ROFF_ARGS)
/* Always check for the closing delimiter `\}'. */
while ((ep = strchr(ep, '\\')) != NULL) {
- if (*(++ep) == '}') {
- *ep = '&';
- roff_ccond(r, ln, ep - buf->buf - 1);
- }
- if (*ep != '\0')
+ switch (ep[1]) {
+ case '}':
+ memmove(ep, ep + 2, strlen(ep + 2) + 1);
+ roff_ccond(r, ln, ep - buf->buf);
+ break;
+ case '\0':
++ep;
+ break;
+ default:
+ ep += 2;
+ break;
+ }
}
- return rr ? ROFF_CONT : ROFF_IGN;
+
+ /*
+ * Fully handle known macros when they are structurally
+ * required or when the conditional evaluated to true.
+ */
+
+ t = roff_parse(r, buf->buf, &pos, ln, ppos);
+ return t != TOKEN_NONE && (rr || roffs[t].flags & ROFFMAC_STRUCT)
+ ? (*roffs[t].proc)(r, t, buf, ln, ppos, pos, offs) : rr
+ ? ROFF_CONT : ROFF_IGN;
}
static enum rofferr