summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2015-01-30 21:28:21 +0000
committerschwarze <schwarze@openbsd.org>2015-01-30 21:28:21 +0000
commit45fad4aeee4bd934b84b2055634d7719bbf6e608 (patch)
tree22b431b0d9b356f4e1ec7dad87d5d4c198ae7298
parentimprove argv checking. drive name, if given, must match something. (diff)
downloadwireguard-openbsd-45fad4aeee4bd934b84b2055634d7719bbf6e608.tar.xz
wireguard-openbsd-45fad4aeee4bd934b84b2055634d7719bbf6e608.zip
starting a tbl(7) breaks man(7) next-line scope;
triggered by a bug report from jsg@
-rw-r--r--regress/usr.bin/mandoc/man/TS/Makefile11
-rw-r--r--regress/usr.bin/mandoc/man/TS/break.in33
-rw-r--r--regress/usr.bin/mandoc/man/TS/break.out_ascii29
-rw-r--r--regress/usr.bin/mandoc/man/TS/break.out_lint4
-rw-r--r--usr.bin/mandoc/man.c125
5 files changed, 141 insertions, 61 deletions
diff --git a/regress/usr.bin/mandoc/man/TS/Makefile b/regress/usr.bin/mandoc/man/TS/Makefile
index abcf90ea63a..23a163b782b 100644
--- a/regress/usr.bin/mandoc/man/TS/Makefile
+++ b/regress/usr.bin/mandoc/man/TS/Makefile
@@ -1,6 +1,13 @@
-# $OpenBSD: Makefile,v 1.2 2014/08/14 01:58:51 schwarze Exp $
+# $OpenBSD: Makefile,v 1.3 2015/01/30 21:28:21 schwarze Exp $
-REGRESS_TARGETS=vspace
+REGRESS_TARGETS = break vspace
+LINT_TARGETS = break
+
+# groff-1.22.3 defect:
+# - Starting a table in next-line scope confuses font handling,
+# and in the case of .TP indentation as well.
+
+SKIP_GROFF = break
TBL=/usr/local/bin/tbl
diff --git a/regress/usr.bin/mandoc/man/TS/break.in b/regress/usr.bin/mandoc/man/TS/break.in
new file mode 100644
index 00000000000..31dfe631bb6
--- /dev/null
+++ b/regress/usr.bin/mandoc/man/TS/break.in
@@ -0,0 +1,33 @@
+.TH TBL-BREAK 1 "January 30, 2015" OpenBSD
+.SH NAME
+tbl-break \- tables breaking blocks
+.SH DESCRIPTION
+tagged paragraph:
+.TP 6n
+.TS
+l.
+first line
+second line
+.TE
+section:
+.SH
+.TS
+l.
+first line
+second line
+.TE
+subsection:
+.SS
+.TS
+l.
+first line
+second line
+.TE
+bold:
+.B
+.TS
+l.
+first line
+second line
+.TE
+final text
diff --git a/regress/usr.bin/mandoc/man/TS/break.out_ascii b/regress/usr.bin/mandoc/man/TS/break.out_ascii
new file mode 100644
index 00000000000..57634e020f5
--- /dev/null
+++ b/regress/usr.bin/mandoc/man/TS/break.out_ascii
@@ -0,0 +1,29 @@
+TBL-BREAK(1) General Commands Manual TBL-BREAK(1)
+
+
+
+NNAAMMEE
+ tbl-break - tables breaking blocks
+
+DDEESSCCRRIIPPTTIIOONN
+ tagged paragraph:
+
+ first line
+ second line
+ section:
+
+ first line
+ second line
+ subsection:
+
+ first line
+ second line
+ bold:
+
+ first line
+ second line
+ final text
+
+
+
+OpenBSD January 30, 2015 TBL-BREAK(1)
diff --git a/regress/usr.bin/mandoc/man/TS/break.out_lint b/regress/usr.bin/mandoc/man/TS/break.out_lint
new file mode 100644
index 00000000000..4bff2ea109a
--- /dev/null
+++ b/regress/usr.bin/mandoc/man/TS/break.out_lint
@@ -0,0 +1,4 @@
+mandoc: break.in:6:2: WARNING: line scope broken: TS breaks TP
+mandoc: break.in:13:2: WARNING: line scope broken: TS breaks SH
+mandoc: break.in:20:2: WARNING: line scope broken: TS breaks SS
+mandoc: break.in:27:2: WARNING: line scope broken: TS breaks B
diff --git a/usr.bin/mandoc/man.c b/usr.bin/mandoc/man.c
index 7e38742a237..385004f09c7 100644
--- a/usr.bin/mandoc/man.c
+++ b/usr.bin/mandoc/man.c
@@ -1,7 +1,7 @@
-/* $OpenBSD: man.c,v 1.96 2015/01/24 02:41:32 schwarze Exp $ */
+/* $OpenBSD: man.c,v 1.97 2015/01/30 21:28:21 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2011 Joerg Sonnenberger <joerg@netbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -46,6 +46,10 @@ const char *const __man_macronames[MAN_MAX] = {
const char * const *man_macronames = __man_macronames;
+static void man_alloc1(struct man *);
+static void man_breakscope(struct man *, enum mant);
+static void man_descope(struct man *, int, int);
+static void man_free1(struct man *);
static struct man_node *man_node_alloc(struct man *, int, int,
enum man_type, enum mant);
static void man_node_append(struct man *, struct man_node *);
@@ -54,9 +58,6 @@ static void man_node_unlink(struct man *,
struct man_node *);
static int man_ptext(struct man *, int, char *, int);
static int man_pmacro(struct man *, int, char *, int);
-static void man_free1(struct man *);
-static void man_alloc1(struct man *);
-static void man_descope(struct man *, int, int);
const struct man_node *
@@ -335,6 +336,7 @@ man_addspan(struct man *man, const struct tbl_span *sp)
{
struct man_node *n;
+ man_breakscope(man, MAN_MAX);
n = man_node_alloc(man, sp->line, 0, MAN_TBL, MAN_MAX);
n->span = sp;
man_node_append(man, n);
@@ -491,62 +493,11 @@ man_pmacro(struct man *man, int ln, char *buf, int offs)
ln, offs - 1, NULL);
/*
- * Remove prior ELINE macro, as it's being clobbered by a new
- * macro. Note that NSCOPED macros do not close out ELINE
- * macros---they don't print text---so we let those slip by.
+ * Some macros break next-line scopes; otherwise, remember
+ * whether we are in next-line scope for a block head.
*/
- if ( ! (man_macros[tok].flags & MAN_NSCOPED) &&
- man->flags & MAN_ELINE) {
- n = man->last;
- assert(MAN_TEXT != n->type);
-
- /* Remove repeated NSCOPED macros causing ELINE. */
-
- if (man_macros[n->tok].flags & MAN_NSCOPED)
- n = n->parent;
-
- mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse, n->line,
- n->pos, "%s breaks %s", man_macronames[tok],
- man_macronames[n->tok]);
-
- man_node_delete(man, n);
- man->flags &= ~MAN_ELINE;
- }
-
- /*
- * Remove prior BLINE macro that is being clobbered.
- */
- if ((man->flags & MAN_BLINE) &&
- (man_macros[tok].flags & MAN_BSCOPE)) {
- n = man->last;
-
- /* Might be a text node like 8 in
- * .TP 8
- * .SH foo
- */
- if (n->type == MAN_TEXT)
- n = n->parent;
-
- /* Remove element that didn't end BLINE, if any. */
- if ( ! (man_macros[n->tok].flags & MAN_BSCOPE))
- n = n->parent;
-
- assert(n->type == MAN_HEAD);
- n = n->parent;
- assert(n->type == MAN_BLOCK);
- assert(man_macros[n->tok].flags & MAN_SCOPED);
-
- mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse, n->line,
- n->pos, "%s breaks %s", man_macronames[tok],
- man_macronames[n->tok]);
-
- man_node_delete(man, n);
- man->flags &= ~MAN_BLINE;
- }
-
- /* Remember whether we are in next-line scope for a block head. */
-
+ man_breakscope(man, tok);
bline = man->flags & MAN_BLINE;
/* Call to handler... */
@@ -581,6 +532,62 @@ man_pmacro(struct man *man, int ln, char *buf, int offs)
return(1);
}
+void
+man_breakscope(struct man *man, enum mant tok)
+{
+ struct man_node *n;
+
+ /*
+ * An element next line scope is open,
+ * and the new macro is not allowed inside elements.
+ * Delete the element that is being broken.
+ */
+
+ if (man->flags & MAN_ELINE && (tok == MAN_MAX ||
+ ! (man_macros[tok].flags & MAN_NSCOPED))) {
+ n = man->last;
+ assert(n->type != MAN_TEXT);
+ if (man_macros[n->tok].flags & MAN_NSCOPED)
+ n = n->parent;
+
+ mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse,
+ n->line, n->pos, "%s breaks %s",
+ tok == MAN_MAX ? "TS" : man_macronames[tok],
+ man_macronames[n->tok]);
+
+ man_node_delete(man, n);
+ man->flags &= ~MAN_ELINE;
+ }
+
+ /*
+ * A block header next line scope is open,
+ * and the new macro is not allowed inside block headers.
+ * Delete the block that is being broken.
+ */
+
+ if (man->flags & MAN_BLINE && (tok == MAN_MAX ||
+ man_macros[tok].flags & MAN_BSCOPE)) {
+ n = man->last;
+ if (n->type == MAN_TEXT)
+ n = n->parent;
+ if ( ! (man_macros[n->tok].flags & MAN_BSCOPE))
+ n = n->parent;
+
+ assert(n->type == MAN_HEAD);
+ n = n->parent;
+ assert(n->type == MAN_BLOCK);
+ assert(man_macros[n->tok].flags & MAN_SCOPED);
+
+ mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse,
+ n->line, n->pos, "%s breaks %s",
+ tok == MAN_MAX ? "TS" : man_macronames[tok],
+ man_macronames[n->tok]);
+
+ man_node_delete(man, n);
+ man->flags &= ~MAN_BLINE;
+ }
+}
+
/*
* Unlink a node from its context. If "man" is provided, the last parse
* point will also be adjusted accordingly.