Fix handling of \} on roff request lines.
authorschwarze <schwarze@openbsd.org>
Tue, 4 Jul 2017 22:49:59 +0000 (22:49 +0000)
committerschwarze <schwarze@openbsd.org>
Tue, 4 Jul 2017 22:49:59 +0000 (22:49 +0000)
Cures bogus error messages in pages generated with pod2man(1).

regress/usr.bin/mandoc/roff/cond/ie.in
regress/usr.bin/mandoc/roff/cond/ie.out_ascii
usr.bin/mandoc/roff.c

index bb76765..580f427 100644 (file)
@@ -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
index 73d3d97..3dee8d4 100644 (file)
@@ -8,6 +8,7 @@ N\bNA\bAM\bME\bE
 D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
        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 @@ D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
 
 
 
-OpenBSD                        December 16, 2014                         IE(1)
+OpenBSD                          July 4, 2017                            IE(1)
index 1311d48..6d085c5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff.c,v 1.189 2017/06/25 07:23:53 bentley Exp $ */
+/*     $OpenBSD: roff.c,v 1.190 2017/07/04 22:49:59 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -1924,15 +1924,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,
@@ -1946,14 +1937,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