From 252b7e4a254433a84f7a8d6891815c794ac159d1 Mon Sep 17 00:00:00 2001 From: schwarze Date: Tue, 14 Aug 2018 01:26:12 +0000 Subject: [PATCH] support tail arguments on the .ME and .UE macros, used for example in the ditroff(7) manual of the groff package --- regress/usr.bin/mandoc/man/MT/args.in | 10 ++++- regress/usr.bin/mandoc/man/MT/args.out_ascii | 6 ++- regress/usr.bin/mandoc/man/MT/args.out_lint | 10 ++--- regress/usr.bin/mandoc/man/UR/args.in | 10 ++++- regress/usr.bin/mandoc/man/UR/args.out_ascii | 7 +++- regress/usr.bin/mandoc/man/UR/args.out_lint | 10 ++--- usr.bin/mandoc/man_macro.c | 41 ++++++++++++-------- usr.bin/mandoc/man_term.c | 4 +- usr.bin/mandoc/tree.c | 4 +- 9 files changed, 65 insertions(+), 37 deletions(-) diff --git a/regress/usr.bin/mandoc/man/MT/args.in b/regress/usr.bin/mandoc/man/MT/args.in index c6ea1526222..591464fb2cd 100644 --- a/regress/usr.bin/mandoc/man/MT/args.in +++ b/regress/usr.bin/mandoc/man/MT/args.in @@ -1,13 +1,19 @@ -.\" $OpenBSD: args.in,v 1.2 2017/07/04 14:53:23 schwarze Exp $ -.TH MT-ARGS 1 "June 25, 2017" +.\" $OpenBSD: args.in,v 1.3 2018/08/14 01:26:12 schwarze Exp $ +.TH MT-ARGS 1 "August 13, 2018" .SH NAME MT-args \- argument handling of the man-ext mailto macro .SH DESCRIPTION +argument, text, and tail: +.MT test@example.com +text +.ME tail args +.PP argument plus text: .MT test@example.com invalid address .ME +next line .PP argument but no text: .MT test@example.com diff --git a/regress/usr.bin/mandoc/man/MT/args.out_ascii b/regress/usr.bin/mandoc/man/MT/args.out_ascii index 05939dcb21d..09dd4cd1482 100644 --- a/regress/usr.bin/mandoc/man/MT/args.out_ascii +++ b/regress/usr.bin/mandoc/man/MT/args.out_ascii @@ -6,7 +6,9 @@ NNAAMMEE MT-args - argument handling of the man-ext mailto macro DDEESSCCRRIIPPTTIIOONN - argument plus text: invalid address + argument, text, and tail: text tail args + + argument plus text: invalid address next line argument but no text: @@ -20,4 +22,4 @@ DDEESSCCRRIIPPTTIIOONN -OpenBSD June 25, 2017 MT-ARGS(1) +OpenBSD August 13, 2018 MT-ARGS(1) diff --git a/regress/usr.bin/mandoc/man/MT/args.out_lint b/regress/usr.bin/mandoc/man/MT/args.out_lint index e94e63de826..b06ec906691 100644 --- a/regress/usr.bin/mandoc/man/MT/args.out_lint +++ b/regress/usr.bin/mandoc/man/MT/args.out_lint @@ -1,5 +1,5 @@ -mandoc: args.in:22:11: ERROR: skipping excess arguments: MT ... second -mandoc: args.in:27:11: ERROR: skipping excess arguments: MT ... second -mandoc: args.in:13:2: WARNING: empty block: MT -mandoc: args.in:17:2: WARNING: missing resource identifier, using "": MT -mandoc: args.in:27:2: WARNING: empty block: MT +mandoc: args.in:28:11: ERROR: skipping excess arguments: MT ... second +mandoc: args.in:33:11: ERROR: skipping excess arguments: MT ... second +mandoc: args.in:19:2: WARNING: empty block: MT +mandoc: args.in:23:2: WARNING: missing resource identifier, using "": MT +mandoc: args.in:33:2: WARNING: empty block: MT diff --git a/regress/usr.bin/mandoc/man/UR/args.in b/regress/usr.bin/mandoc/man/UR/args.in index 183269e854a..16330b94261 100644 --- a/regress/usr.bin/mandoc/man/UR/args.in +++ b/regress/usr.bin/mandoc/man/UR/args.in @@ -1,13 +1,19 @@ -.\" $OpenBSD: args.in,v 1.2 2017/07/04 14:53:24 schwarze Exp $ -.TH UR-ARGS 1 "October 17, 2013" +.\" $OpenBSD: args.in,v 1.3 2018/08/14 01:26:12 schwarze Exp $ +.TH UR-ARGS 1 "August 14, 2018" .SH NAME UR-basic \- argument handling of the man-ext URI macro .SH DESCRIPTION +argument, text, and tail: +.UR http://www.openbsd.org/ +text +.UE tail argument +.PP argument plus text: .UR http://www.openbsd.org/ OpenBSD homepage .UE +next line .PP argument but no text: .UR http://www.netbsd.org/ diff --git a/regress/usr.bin/mandoc/man/UR/args.out_ascii b/regress/usr.bin/mandoc/man/UR/args.out_ascii index 9368974ad04..9b1d2ec3573 100644 --- a/regress/usr.bin/mandoc/man/UR/args.out_ascii +++ b/regress/usr.bin/mandoc/man/UR/args.out_ascii @@ -6,7 +6,10 @@ NNAAMMEE UR-basic - argument handling of the man-ext URI macro DDEESSCCRRIIPPTTIIOONN - argument plus text: OpenBSD homepage + argument, text, and tail: text tail argument + + argument plus text: OpenBSD homepage next + line argument but no text: @@ -20,4 +23,4 @@ DDEESSCCRRIIPPTTIIOONN -OpenBSD October 17, 2013 UR-ARGS(1) +OpenBSD August 14, 2018 UR-ARGS(1) diff --git a/regress/usr.bin/mandoc/man/UR/args.out_lint b/regress/usr.bin/mandoc/man/UR/args.out_lint index 262c9886b35..b1525e0f3b2 100644 --- a/regress/usr.bin/mandoc/man/UR/args.out_lint +++ b/regress/usr.bin/mandoc/man/UR/args.out_lint @@ -1,5 +1,5 @@ -mandoc: args.in:22:11: ERROR: skipping excess arguments: UR ... second -mandoc: args.in:27:11: ERROR: skipping excess arguments: UR ... second -mandoc: args.in:13:2: WARNING: empty block: UR -mandoc: args.in:17:2: WARNING: missing resource identifier, using "": UR -mandoc: args.in:27:2: WARNING: empty block: UR +mandoc: args.in:28:11: ERROR: skipping excess arguments: UR ... second +mandoc: args.in:33:11: ERROR: skipping excess arguments: UR ... second +mandoc: args.in:19:2: WARNING: empty block: UR +mandoc: args.in:23:2: WARNING: missing resource identifier, using "": UR +mandoc: args.in:33:2: WARNING: empty block: UR diff --git a/usr.bin/mandoc/man_macro.c b/usr.bin/mandoc/man_macro.c index 8ee22eb56dd..737f393b01b 100644 --- a/usr.bin/mandoc/man_macro.c +++ b/usr.bin/mandoc/man_macro.c @@ -1,7 +1,7 @@ -/* $OpenBSD: man_macro.c,v 1.85 2017/06/25 07:23:53 bentley Exp $ */ +/* $OpenBSD: man_macro.c,v 1.86 2018/08/14 01:26:12 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2012-2015, 2017 Ingo Schwarze + * Copyright (c) 2012-2015, 2017, 2018 Ingo Schwarze * Copyright (c) 2013 Franco Fichtner * * Permission to use, copy, modify, and distribute this software for any @@ -187,10 +187,10 @@ rew_scope(struct roff_man *man, enum roff_tok tok) void blk_close(MACRO_PROT_ARGS) { - enum roff_tok ntok; + enum roff_tok ctok, ntok; const struct roff_node *nn; char *p; - int nrew, target; + int cline, cpos, nrew, target; nrew = 1; switch (tok) { @@ -232,22 +232,29 @@ blk_close(MACRO_PROT_ARGS) mandoc_msg(MANDOCERR_BLK_NOTOPEN, man->parse, line, ppos, roff_name[tok]); rew_scope(man, MAN_PP); - } else { - line = man->last->line; - ppos = man->last->pos; - ntok = man->last->tok; - man_unscope(man, nn); + return; + } - if (tok == MAN_RE && nn->head->aux > 0) - roff_setreg(man->roff, "an-margin", - nn->head->aux, '-'); + cline = man->last->line; + cpos = man->last->pos; + ctok = man->last->tok; + man_unscope(man, nn); - /* Move a trailing paragraph behind the block. */ + if (tok == MAN_RE && nn->head->aux > 0) + roff_setreg(man->roff, "an-margin", nn->head->aux, '-'); - if (ntok == MAN_LP || ntok == MAN_PP || ntok == MAN_P) { - *pos = strlen(buf); - blk_imp(man, ntok, line, ppos, pos, buf); - } + /* Trailing text. */ + + if (buf[*pos] != '\0') { + roff_word_alloc(man, line, ppos, buf + *pos); + man->last->flags |= NODE_DELIMC; + } + + /* Move a trailing paragraph behind the block. */ + + if (ctok == MAN_LP || ctok == MAN_PP || ctok == MAN_P) { + *pos = strlen(buf); + blk_imp(man, ctok, line, ppos, pos, buf); } } diff --git a/usr.bin/mandoc/man_term.c b/usr.bin/mandoc/man_term.c index aff828f1b3e..6197f65a0c4 100644 --- a/usr.bin/mandoc/man_term.c +++ b/usr.bin/mandoc/man_term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: man_term.c,v 1.164 2018/06/10 15:12:32 schwarze Exp $ */ +/* $OpenBSD: man_term.c,v 1.165 2018/08/14 01:26:12 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze @@ -882,6 +882,8 @@ print_man_node(DECL_ARGS) } else if (*n->string == ' ' && n->flags & NODE_LINE && (p->flags & TERMP_NONEWLINE) == 0) term_newln(p); + else if (n->flags & NODE_DELIMC) + p->flags |= TERMP_NOSPACE; term_word(p, n->string); goto out; diff --git a/usr.bin/mandoc/tree.c b/usr.bin/mandoc/tree.c index 65c23c8ff75..00f7cb18ae9 100644 --- a/usr.bin/mandoc/tree.c +++ b/usr.bin/mandoc/tree.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tree.c,v 1.45 2018/04/11 17:10:35 schwarze Exp $ */ +/* $OpenBSD: tree.c,v 1.46 2018/08/14 01:26:12 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2011, 2014 Kristaps Dzonsons * Copyright (c) 2013,2014,2015,2017,2018 Ingo Schwarze @@ -287,6 +287,8 @@ print_man(const struct roff_node *n, int indent) if (NODE_LINE & n->flags) putchar('*'); printf("%d:%d", n->line, n->pos + 1); + if (NODE_DELIMC & n->flags) + putchar(')'); if (NODE_EOS & n->flags) putchar('.'); putchar('\n'); -- 2.20.1