diff options
-rw-r--r-- | regress/roff/cond/close.in | 18 | ||||
-rw-r--r-- | regress/roff/cond/close.out_ascii | 12 | ||||
-rw-r--r-- | regress/roff/cond/close.out_lint | 4 | ||||
-rw-r--r-- | roff.c | 34 |
4 files changed, 58 insertions, 10 deletions
diff --git a/regress/roff/cond/close.in b/regress/roff/cond/close.in index 6bdf3781..74b402c8 100644 --- a/regress/roff/cond/close.in +++ b/regress/roff/cond/close.in @@ -1,5 +1,5 @@ .\" $OpenBSD: close.in,v 1.3 2017/07/04 14:53:26 schwarze Exp $ -.TH COND-CLOSE 1 2013-06-27 +.TH COND-CLOSE 1 "November 26, 2018" .SH NAME cond-close \- closing conditional macros .SH DESCRIPTION @@ -12,5 +12,21 @@ closing after an ignored macro .if t \{text \} closing after plain text .PP +.if n \{conditional content \} following words with whitespace +.PP +.if n \{conditional content\}following words without whitespace +.PP +preceding words +.if n \{\ +standard multi-line style +.\} +following words +.PP +preceding words +.if n \{ +non-standard multi-line style +\} +following words +.PP .if n \{ still open at the end of the file diff --git a/regress/roff/cond/close.out_ascii b/regress/roff/cond/close.out_ascii index 244d4154..d049154d 100644 --- a/regress/roff/cond/close.out_ascii +++ b/regress/roff/cond/close.out_ascii @@ -12,8 +12,18 @@ DDEESSCCRRIIPPTTIIOONN closing after plain text + conditional content following words with whitespace + + conditional contentfollowing words without whitespace + + preceding words standard multi-line style following words + + preceding words + + non-standard multi-line style following words + still open at the end of the file -OpenBSD 2013-06-27 COND-CLOSE(1) +OpenBSD November 26, 2018 COND-CLOSE(1) diff --git a/regress/roff/cond/close.out_lint b/regress/roff/cond/close.out_lint index 4387b057..d6f52146 100644 --- a/regress/roff/cond/close.out_lint +++ b/regress/roff/cond/close.out_lint @@ -1,2 +1,2 @@ -mandoc: close.in:15:2: ERROR: appending missing end of block: if -mandoc: close.in:15:9: WARNING: skipping paragraph macro: sp after PP +mandoc: close.in:31:2: ERROR: appending missing end of block: if +mandoc: close.in:31:9: WARNING: skipping paragraph macro: sp after PP @@ -2107,7 +2107,10 @@ roff_cond_sub(ROFF_ARGS) if (ep[0] == '\\' && ep[1] == '}') rr = 0; - /* Always check for the closing delimiter `\}'. */ + /* + * The closing delimiter `\}' rewinds the conditional scope + * but is otherwise ignored when interpreting the line. + */ while ((ep = strchr(ep, '\\')) != NULL) { switch (ep[1]) { @@ -2150,15 +2153,34 @@ roff_cond_text(ROFF_ARGS) if (roffnode_cleanscope(r)) irc |= endloop; + /* + * If `\}' occurs on a text line with neither preceding + * nor following characters, drop the line completely. + */ + ep = buf->buf + pos; + if (strcmp(ep, "\\}") == 0) + rr = 0; + + /* + * The closing delimiter `\}' rewinds the conditional scope + * but is otherwise ignored when interpreting the line. + */ + while ((ep = strchr(ep, '\\')) != NULL) { - if (*(++ep) == '}') { - *ep = '&'; - if (roff_ccond(r, ln, ep - buf->buf - 1)) + switch (ep[1]) { + case '}': + memmove(ep, ep + 2, strlen(ep + 2) + 1); + if (roff_ccond(r, ln, ep - buf->buf)) irc |= endloop; - } - if (*ep != '\0') + break; + case '\0': ++ep; + break; + default: + ep += 2; + break; + } } if (rr) irc |= ROFF_CONT; |