Two consecutive .SY blocks only get a blank line in between
authorschwarze <schwarze@openbsd.org>
Sat, 18 Aug 2018 14:02:52 +0000 (14:02 +0000)
committerschwarze <schwarze@openbsd.org>
Sat, 18 Aug 2018 14:02:52 +0000 (14:02 +0000)
if the first one is explicitly closed with .YS.

usr.bin/mandoc/man_macro.c
usr.bin/mandoc/man_term.c

index 7e760ad..6b17f1f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man_macro.c,v 1.90 2018/08/18 02:03:41 schwarze Exp $ */
+/*     $OpenBSD: man_macro.c,v 1.91 2018/08/18 14:02:52 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2012-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -69,7 +69,7 @@ static const struct man_macro man_macros[MAN_MAX - MAN_TH] = {
        { in_line_eoln, MAN_NSCOPED }, /* PD */
        { in_line_eoln, 0 }, /* AT */
        { in_line_eoln, MAN_NSCOPED }, /* in */
-       { blk_exp, MAN_BSCOPE }, /* SY */
+       { blk_imp, MAN_BSCOPE }, /* SY */
        { blk_close, MAN_BSCOPE }, /* YS */
        { in_line_eoln, 0 }, /* OP */
        { in_line_eoln, MAN_BSCOPE }, /* EX */
@@ -268,6 +268,13 @@ blk_close(MACRO_PROT_ARGS)
                *pos = strlen(buf);
                blk_imp(man, ctok, cline, cpos, pos, buf);
        }
+
+       /* Synopsis blocks need an explicit end marker for spacing. */
+
+       if (tok == MAN_YS && man->last == nn) {
+               roff_elem_alloc(man, line, ppos, tok);
+               man_unscope(man, man->last);
+       }
 }
 
 void
index 5cc0445..b7b806e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: man_term.c,v 1.169 2018/08/18 13:04:48 schwarze Exp $ */
+/*     $OpenBSD: man_term.c,v 1.170 2018/08/18 14:02:52 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -859,7 +859,8 @@ pre_SY(DECL_ARGS)
 
        switch (n->type) {
        case ROFFT_BLOCK:
-               print_bvspace(p, n, mt->pardist);
+               if (n->prev == NULL || n->prev->tok != MAN_SY)
+                       print_bvspace(p, n, mt->pardist);
                return 1;
        case ROFFT_HEAD:
        case ROFFT_BODY: