aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/roff.c
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
commit755753869db767ba371ee733bb746571813258a3 (patch)
tree774b92925403d34e7dc3eb74ab58b49f02cb6f7d /roff.c
parentbd583bd3f95456437bb2299aad23115a3fe82c04 (diff)
downloadmandoc-755753869db767ba371ee733bb746571813258a3.tar.gz
mandoc-755753869db767ba371ee733bb746571813258a3.tar.zst
mandoc-755753869db767ba371ee733bb746571813258a3.zip
Fix handling of \} on roff request lines.
Cures bogus error messages in pages generated with pod2man(1).
Diffstat (limited to 'roff.c')
-rw-r--r--roff.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/roff.c b/roff.c
index 5a0fcd85..d1d2490c 100644
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.317 2017/06/25 11:42:02 schwarze Exp $ */
+/* $Id: roff.c,v 1.318 2017/07/04 22:52:00 schwarze Exp $ */
/*
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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