implement roff(7) .rj (right justify) request
authorschwarze <schwarze@openbsd.org>
Wed, 14 Jun 2017 13:00:13 +0000 (13:00 +0000)
committerschwarze <schwarze@openbsd.org>
Wed, 14 Jun 2017 13:00:13 +0000 (13:00 +0000)
share/man/man7/roff.7
usr.bin/mandoc/mdoc_man.c
usr.bin/mandoc/roff.c
usr.bin/mandoc/roff.h
usr.bin/mandoc/roff_html.c
usr.bin/mandoc/roff_term.c
usr.bin/mandoc/roff_validate.c

index b689e48..499d1bb 100644 (file)
@@ -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 <kristaps@bsd.lv>
 .\" Copyright (c) 2010,2011,2013-2015,2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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
index ab3be7a..61ca021 100644 (file)
@@ -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 <schwarze@openbsd.org>
  *
@@ -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] = {
index 8a03965..7da74dd 100644 (file)
@@ -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 <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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;
                }
index 5f4df29..c81bec3 100644 (file)
@@ -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 <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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,
index 32e2b15..91de5fc 100644 (file)
@@ -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 <kristaps@bsd.lv>
  * Copyright (c) 2014, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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 */
index a22238d..608a9c5 100644 (file)
@@ -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 <schwarze@openbsd.org>
  *
@@ -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);
index 68fcf5f..4f1af9b 100644 (file)
@@ -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 <schwarze@openbsd.org>
  *
@@ -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 */