From 6de096f4ddc9a84c336d08544468721bab5898ec Mon Sep 17 00:00:00 2001 From: schwarze Date: Wed, 14 Jun 2017 13:00:13 +0000 Subject: [PATCH] implement roff(7) .rj (right justify) request --- share/man/man7/roff.7 | 6 ++++-- usr.bin/mandoc/mdoc_man.c | 19 ++++++++++--------- usr.bin/mandoc/roff.c | 18 +++++++++--------- usr.bin/mandoc/roff.h | 4 ++-- usr.bin/mandoc/roff_html.c | 3 ++- usr.bin/mandoc/roff_term.c | 32 +++++++++++++++++--------------- usr.bin/mandoc/roff_validate.c | 3 ++- 7 files changed, 46 insertions(+), 39 deletions(-) diff --git a/share/man/man7/roff.7 b/share/man/man7/roff.7 index b689e4816d4..499d1bb7e1c 100644 --- a/share/man/man7/roff.7 +++ b/share/man/man7/roff.7 @@ -1,4 +1,4 @@ -.\" $OpenBSD: roff.7,v 1.68 2017/06/14 01:31:19 schwarze Exp $ +.\" $OpenBSD: roff.7,v 1.69 2017/06/14 13:00:13 schwarze Exp $ .\" .\" Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons .\" Copyright (c) 2010,2011,2013-2015,2017 Ingo Schwarze @@ -1475,7 +1475,9 @@ This is a Heirloom extension and currently ignored. Justify the next .Ar N input lines to the right margin without filling. -Currently ignored. +.Ar N +defaults to 1. +An argument of 0 or less ends right adjustment. .It Ic \&rm Ar macroname Remove a request, macro or string. .It Ic \&rn Ar oldname newname diff --git a/usr.bin/mandoc/mdoc_man.c b/usr.bin/mandoc/mdoc_man.c index ab3be7aece8..61ca0219d5c 100644 --- a/usr.bin/mandoc/mdoc_man.c +++ b/usr.bin/mandoc/mdoc_man.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mdoc_man.c,v 1.118 2017/06/10 01:27:44 schwarze Exp $ */ +/* $OpenBSD: mdoc_man.c,v 1.119 2017/06/14 13:00:13 schwarze Exp $ */ /* * Copyright (c) 2011-2017 Ingo Schwarze * @@ -123,14 +123,15 @@ static void print_count(int *); static void print_node(DECL_ARGS); static const void_fp roff_manacts[ROFF_MAX] = { - pre_br, - pre_onearg, - pre_ft, - pre_onearg, - pre_onearg, - pre_sp, - pre_ta, - pre_onearg, + pre_br, /* br */ + pre_onearg, /* ce */ + pre_ft, /* ft */ + pre_onearg, /* ll */ + pre_onearg, /* mc */ + pre_onearg, /* rj */ + pre_sp, /* sp */ + pre_ta, /* ta */ + pre_onearg, /* ti */ }; static const struct manact __manacts[MDOC_MAX - MDOC_Dd] = { diff --git a/usr.bin/mandoc/roff.c b/usr.bin/mandoc/roff.c index 8a0396511be..7da74dd403d 100644 --- a/usr.bin/mandoc/roff.c +++ b/usr.bin/mandoc/roff.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff.c,v 1.180 2017/06/13 13:50:17 schwarze Exp $ */ +/* $OpenBSD: roff.c,v 1.181 2017/06/14 13:00:13 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017 Ingo Schwarze @@ -220,8 +220,8 @@ static enum rofferr roff_userdef(ROFF_ARGS); const char *__roff_name[MAN_MAX + 1] = { "br", "ce", "ft", "ll", - "mc", "sp", "ta", "ti", - NULL, + "mc", "rj", "sp", "ta", + "ti", NULL, "ab", "ad", "af", "aln", "als", "am", "am1", "ami", "ami1", "as", "as1", "asciify", @@ -265,7 +265,7 @@ const char *__roff_name[MAN_MAX + 1] = { "pn", "pnr", "po", "ps", "psbb", "pshape", "pso", "ptr", "pvs", "rchar", "rd", "recursionlimit", - "return", "rfschar", "rhang", "rj", + "return", "rfschar", "rhang", "rm", "rn", "rnn", "rr", "rs", "rt", "schar", "sentchar", "shc", "shift", "sizes", "so", @@ -332,6 +332,7 @@ static struct roffmac roffs[TOKEN_NONE] = { { roff_onearg, NULL, NULL, 0 }, /* ft */ { roff_onearg, NULL, NULL, 0 }, /* ll */ { roff_onearg, NULL, NULL, 0 }, /* mc */ + { roff_onearg, NULL, NULL, 0 }, /* rj */ { roff_onearg, NULL, NULL, 0 }, /* sp */ { roff_manyarg, NULL, NULL, 0 }, /* ta */ { roff_onearg, NULL, NULL, 0 }, /* ti */ @@ -509,7 +510,6 @@ static struct roffmac roffs[TOKEN_NONE] = { { roff_unsupp, NULL, NULL, 0 }, /* return */ { roff_unsupp, NULL, NULL, 0 }, /* rfschar */ { roff_line_ignore, NULL, NULL, 0 }, /* rhang */ - { roff_line_ignore, NULL, NULL, 0 }, /* rj */ { roff_rm, NULL, NULL, 0 }, /* rm */ { roff_rn, NULL, NULL, 0 }, /* rn */ { roff_unsupp, NULL, NULL, 0 }, /* rnn */ @@ -1547,7 +1547,7 @@ roff_parseln(struct roff *r, int ln, struct buf *buf, int *offs) /* Tables ignore most macros. */ if (r->tbl != NULL && (t == TOKEN_NONE || t == ROFF_TS || - t == ROFF_br || t == ROFF_ce || t == ROFF_sp)) { + t == ROFF_br || t == ROFF_ce || t == ROFF_rj || t == ROFF_sp)) { mandoc_msg(MANDOCERR_TBLMACRO, r->parse, ln, pos, buf->buf + spos); if (t != TOKEN_NONE) @@ -2878,7 +2878,7 @@ roff_onearg(ROFF_ARGS) (tok == ROFF_sp || tok == ROFF_ti)) man_breakscope(r->man, tok); - if (tok == ROFF_ce && roffce_node != NULL) { + if (roffce_node != NULL && (tok == ROFF_ce || tok == ROFF_rj)) { r->man->last = roffce_node; r->man->next = ROFF_NEXT_SIBLING; } @@ -2899,8 +2899,8 @@ roff_onearg(ROFF_ARGS) roff_word_alloc(r->man, ln, pos, buf->buf + pos); } - if (tok == ROFF_ce) { - if (r->man->last->tok == ROFF_ce) { + if (tok == ROFF_ce || tok == ROFF_rj) { + if (r->man->last->type == ROFFT_ELEM) { roff_word_alloc(r->man, ln, pos, "1"); r->man->last->flags |= NODE_NOSRC; } diff --git a/usr.bin/mandoc/roff.h b/usr.bin/mandoc/roff.h index 5f4df297751..c81bec340ed 100644 --- a/usr.bin/mandoc/roff.h +++ b/usr.bin/mandoc/roff.h @@ -1,4 +1,4 @@ -/* $OpenBSD: roff.h,v 1.34 2017/06/07 23:29:31 schwarze Exp $ */ +/* $OpenBSD: roff.h,v 1.35 2017/06/14 13:00:13 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze @@ -77,6 +77,7 @@ enum roff_tok { ROFF_ft, ROFF_ll, ROFF_mc, + ROFF_rj, ROFF_sp, ROFF_ta, ROFF_ti, @@ -257,7 +258,6 @@ enum roff_tok { ROFF_return, ROFF_rfschar, ROFF_rhang, - ROFF_rj, ROFF_rm, ROFF_rn, ROFF_rnn, diff --git a/usr.bin/mandoc/roff_html.c b/usr.bin/mandoc/roff_html.c index 32e2b158d93..91de5fc58ba 100644 --- a/usr.bin/mandoc/roff_html.c +++ b/usr.bin/mandoc/roff_html.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff_html.c,v 1.8 2017/06/08 12:54:40 schwarze Exp $ */ +/* $OpenBSD: roff_html.c,v 1.9 2017/06/14 13:00:13 schwarze Exp $ */ /* * Copyright (c) 2010 Kristaps Dzonsons * Copyright (c) 2014, 2017 Ingo Schwarze @@ -38,6 +38,7 @@ static const roff_html_pre_fp roff_html_pre_acts[ROFF_MAX] = { NULL, /* ft */ NULL, /* ll */ NULL, /* mc */ + roff_html_pre_ce, /* rj */ roff_html_pre_sp, /* sp */ NULL, /* ta */ NULL, /* ti */ diff --git a/usr.bin/mandoc/roff_term.c b/usr.bin/mandoc/roff_term.c index a22238dde13..608a9c509c9 100644 --- a/usr.bin/mandoc/roff_term.c +++ b/usr.bin/mandoc/roff_term.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff_term.c,v 1.10 2017/06/08 12:54:40 schwarze Exp $ */ +/* $OpenBSD: roff_term.c,v 1.11 2017/06/14 13:00:13 schwarze Exp $ */ /* * Copyright (c) 2010, 2014, 2015, 2017 Ingo Schwarze * @@ -42,6 +42,7 @@ static const roff_term_pre_fp roff_term_pre_acts[ROFF_MAX] = { roff_term_pre_ft, /* ft */ roff_term_pre_ll, /* ll */ roff_term_pre_mc, /* mc */ + roff_term_pre_ce, /* rj */ roff_term_pre_sp, /* sp */ roff_term_pre_ta, /* ta */ roff_term_pre_ti, /* ti */ @@ -69,33 +70,34 @@ roff_term_pre_br(ROFF_TERM_ARGS) static void roff_term_pre_ce(ROFF_TERM_ARGS) { - const struct roff_node *nch; + const struct roff_node *nc1, *nc2; size_t len, lm; roff_term_pre_br(p, n); lm = p->tcol->offset; - n = n->child->next; - while (n != NULL) { - nch = n; + nc1 = n->child->next; + while (nc1 != NULL) { + nc2 = nc1; len = 0; do { - if (n->type == ROFFT_TEXT) { + if (nc2->type == ROFFT_TEXT) { if (len) len++; - len += term_strlen(p, nch->string); + len += term_strlen(p, nc2->string); } - nch = nch->next; - } while (nch != NULL && (n->type != ROFFT_TEXT || - (n->flags & NODE_LINE) == 0)); + nc2 = nc2->next; + } while (nc2 != NULL && (nc2->type != ROFFT_TEXT || + (nc2->flags & NODE_LINE) == 0)); p->tcol->offset = len >= p->tcol->rmargin ? 0 : lm + len >= p->tcol->rmargin ? p->tcol->rmargin - len : + n->tok == ROFF_rj ? p->tcol->rmargin - len : (lm + p->tcol->rmargin - len) / 2; - while (n != nch) { - if (n->type == ROFFT_TEXT) - term_word(p, n->string); + while (nc1 != nc2) { + if (nc1->type == ROFFT_TEXT) + term_word(p, nc1->string); else - roff_term_pre(p, n); - n = n->next; + roff_term_pre(p, nc1); + nc1 = nc1->next; } p->flags |= TERMP_NOSPACE; term_flushln(p); diff --git a/usr.bin/mandoc/roff_validate.c b/usr.bin/mandoc/roff_validate.c index 68fcf5f67a1..4f1af9b3695 100644 --- a/usr.bin/mandoc/roff_validate.c +++ b/usr.bin/mandoc/roff_validate.c @@ -1,4 +1,4 @@ -/* $OpenBSD: roff_validate.c,v 1.7 2017/06/06 15:00:56 schwarze Exp $ */ +/* $OpenBSD: roff_validate.c,v 1.8 2017/06/14 13:00:13 schwarze Exp $ */ /* * Copyright (c) 2010, 2017 Ingo Schwarze * @@ -36,6 +36,7 @@ static const roff_valid_fp roff_valids[ROFF_MAX] = { roff_valid_ft, /* ft */ NULL, /* ll */ NULL, /* mc */ + NULL, /* rj */ NULL, /* sp */ NULL, /* ta */ NULL, /* ti */ -- 2.20.1