Naive implementation of the roff(7) .po (page offset) request.
authorschwarze <schwarze@openbsd.org>
Wed, 14 Jun 2017 22:50:37 +0000 (22:50 +0000)
committerschwarze <schwarze@openbsd.org>
Wed, 14 Jun 2017 22:50:37 +0000 (22:50 +0000)
This clearly works when .po is called on the top level, but might
not be sophisticated enough if people call .po inside indentation-changing
contexts, but i haven't seen that in manual pages (yet :).

regress/usr.bin/mandoc/roff/Makefile
regress/usr.bin/mandoc/roff/po/Makefile [new file with mode: 0644]
regress/usr.bin/mandoc/roff/po/basic-mdoc.in [new file with mode: 0644]
regress/usr.bin/mandoc/roff/po/basic-mdoc.out_ascii [new file with mode: 0644]
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 7c180a3..9d32cba 100644 (file)
@@ -1,7 +1,7 @@
-# $OpenBSD: Makefile,v 1.22 2017/05/08 15:33:43 schwarze Exp $
+# $OpenBSD: Makefile,v 1.23 2017/06/14 22:50:37 schwarze Exp $
 
 SUBDIR  = args cond esc scale string
-SUBDIR += br cc de ds ft ig it ll na nr ps rm sp ta ti tr
+SUBDIR += br cc de ds ft ig it ll na nr po ps rm sp ta ti tr
 
 .include "../Makefile.sub"
 .include <bsd.subdir.mk>
diff --git a/regress/usr.bin/mandoc/roff/po/Makefile b/regress/usr.bin/mandoc/roff/po/Makefile
new file mode 100644 (file)
index 0000000..76a7691
--- /dev/null
@@ -0,0 +1,5 @@
+# $OpenBSD: Makefile,v 1.1 2017/06/14 22:50:37 schwarze Exp $
+
+REGRESS_TARGETS        = basic-mdoc
+
+.include <bsd.regress.mk>
diff --git a/regress/usr.bin/mandoc/roff/po/basic-mdoc.in b/regress/usr.bin/mandoc/roff/po/basic-mdoc.in
new file mode 100644 (file)
index 0000000..082be68
--- /dev/null
@@ -0,0 +1,20 @@
+.Dd June 14, 2017
+.Dt PO-BASIC-MDOC 1
+.Os OpenBSD
+.Sh NAME
+.Nm po-basic-mdoc
+.Nd the roff page offset request
+.Sh DESCRIPTION
+initial text
+.Pp
+.po -2n
+shifted left
+.Pp
+.po +5n
+shifted right
+.Pp
+.po XXX
+shifted left
+.Pp
+.po 0
+final text
diff --git a/regress/usr.bin/mandoc/roff/po/basic-mdoc.out_ascii b/regress/usr.bin/mandoc/roff/po/basic-mdoc.out_ascii
new file mode 100644 (file)
index 0000000..0b35c2b
--- /dev/null
@@ -0,0 +1,17 @@
+PO-BASIC-MDOC(1)            General Commands Manual           PO-BASIC-MDOC(1)
+
+N\bNA\bAM\bME\bE
+     p\bpo\bo-\b-b\bba\bas\bsi\bic\bc-\b-m\bmd\bdo\boc\bc - the roff page offset request
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+     initial text
+
+   shifted left
+
+        shifted right
+
+   shifted left
+
+     final text
+
+OpenBSD                          June 14, 2017                         OpenBSD
index 0bdb963..9409bb1 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: roff.7,v 1.71 2017/06/14 19:39:05 schwarze Exp $
+.\"    $OpenBSD: roff.7,v 1.72 2017/06/14 22:50:37 schwarze Exp $
 .\"
 .\" Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
 .\" Copyright (c) 2010,2011,2013-2015,2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -1439,8 +1439,15 @@ Currently ignored.
 Print all number registers on standard error output.
 Currently ignored.
 .It Ic \&po Op Oo Cm + Ns | Ns Cm - Oc Ns Ar offset
-Set horizontal page offset.
-Currently ignored.
+Set a horizontal page offset.
+If no argument is specified, the page offset is reverted to its
+previous value.
+If a sign is specified, the new page offset is calculated relative
+to the current one; otherwise, it is absolute.
+The argument follows the syntax of
+.Sx Scaling Widths
+and the default scaling unit is
+.Cm m .
 .It Ic \&ps Op Oo Cm + Ns | Ns Cm - Oc Ns size
 Change point size.
 Currently ignored.
index 61ca021..d89a4d6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mdoc_man.c,v 1.119 2017/06/14 13:00:13 schwarze Exp $ */
+/*     $OpenBSD: mdoc_man.c,v 1.120 2017/06/14 22:50:37 schwarze Exp $ */
 /*
  * Copyright (c) 2011-2017 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -128,6 +128,7 @@ static      const void_fp roff_manacts[ROFF_MAX] = {
        pre_ft,         /* ft */
        pre_onearg,     /* ll */
        pre_onearg,     /* mc */
+       pre_onearg,     /* po */
        pre_onearg,     /* rj */
        pre_sp,         /* sp */
        pre_ta,         /* ta */
index 950d0c1..7193bdb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff.c,v 1.183 2017/06/14 19:39:05 schwarze Exp $ */
+/*     $OpenBSD: roff.c,v 1.184 2017/06/14 22:50:37 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -221,8 +221,8 @@ static      enum rofferr     roff_userdef(ROFF_ARGS);
 
 const char *__roff_name[MAN_MAX + 1] = {
        "br",           "ce",           "ft",           "ll",
-       "mc",           "rj",           "sp",           "ta",
-       "ti",           NULL,
+       "mc",           "po",           "rj",           "sp",
+       "ta",           "ti",           NULL,
        "ab",           "ad",           "af",           "aln",
        "als",          "am",           "am1",          "ami",
        "ami1",         "as",           "as1",          "asciify",
@@ -263,7 +263,7 @@ const char *__roff_name[MAN_MAX + 1] = {
        "open",         "opena",        "os",           "output",
        "padj",         "papersize",    "pc",           "pev",
        "pi",           "PI",           "pl",           "pm",
-       "pn",           "pnr",          "po",           "ps",
+       "pn",           "pnr",          "ps",
        "psbb",         "pshape",       "pso",          "ptr",
        "pvs",          "rchar",        "rd",           "recursionlimit",
        "return",       "rfschar",      "rhang",
@@ -333,6 +333,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 },  /* po */
        { roff_onearg, NULL, NULL, 0 },  /* rj */
        { roff_onearg, NULL, NULL, 0 },  /* sp */
        { roff_manyarg, NULL, NULL, 0 },  /* ta */
@@ -498,7 +499,6 @@ static      struct roffmac   roffs[TOKEN_NONE] = {
        { roff_line_ignore, NULL, NULL, 0 },  /* pm */
        { roff_line_ignore, NULL, NULL, 0 },  /* pn */
        { roff_line_ignore, NULL, NULL, 0 },  /* pnr */
-       { roff_line_ignore, NULL, NULL, 0 },  /* po */
        { roff_line_ignore, NULL, NULL, 0 },  /* ps */
        { roff_unsupp, NULL, NULL, 0 },  /* psbb */
        { roff_unsupp, NULL, NULL, 0 },  /* pshape */
index c81bec3..ae8b997 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff.h,v 1.35 2017/06/14 13:00:13 schwarze Exp $      */
+/*     $OpenBSD: roff.h,v 1.36 2017/06/14 22:50:37 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_po,
        ROFF_rj,
        ROFF_sp,
        ROFF_ta,
@@ -245,7 +246,6 @@ enum        roff_tok {
        ROFF_pm,
        ROFF_pn,
        ROFF_pnr,
-       ROFF_po,
        ROFF_ps,
        ROFF_psbb,
        ROFF_pshape,
index 91de5fc..9674ba9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff_html.c,v 1.9 2017/06/14 13:00:13 schwarze Exp $ */
+/*     $OpenBSD: roff_html.c,v 1.10 2017/06/14 22:50:37 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 */
+       NULL,  /* po */
        roff_html_pre_ce,  /* rj */
        roff_html_pre_sp,  /* sp */
        NULL,  /* ta */
index e561b43..a3d9418 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff_term.c,v 1.12 2017/06/14 17:50:43 schwarze Exp $ */
+/*     $OpenBSD: roff_term.c,v 1.13 2017/06/14 22:50:37 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -32,6 +32,7 @@ static        void      roff_term_pre_ce(ROFF_TERM_ARGS);
 static void      roff_term_pre_ft(ROFF_TERM_ARGS);
 static void      roff_term_pre_ll(ROFF_TERM_ARGS);
 static void      roff_term_pre_mc(ROFF_TERM_ARGS);
+static void      roff_term_pre_po(ROFF_TERM_ARGS);
 static void      roff_term_pre_sp(ROFF_TERM_ARGS);
 static void      roff_term_pre_ta(ROFF_TERM_ARGS);
 static void      roff_term_pre_ti(ROFF_TERM_ARGS);
@@ -42,6 +43,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_po,  /* po */
        roff_term_pre_ce,  /* rj */
        roff_term_pre_sp,  /* sp */
        roff_term_pre_ta,  /* ta */
@@ -152,6 +154,28 @@ roff_term_pre_mc(ROFF_TERM_ARGS)
                p->flags |= TERMP_ENDMC;
 }
 
+static void
+roff_term_pre_po(ROFF_TERM_ARGS)
+{
+       struct roffsu    su;
+       static int       po, polast;
+       int              ponew;
+
+       if (n->child != NULL &&
+           a2roffsu(n->child->string, &su, SCALE_EM) != NULL) {
+               ponew = term_hen(p, &su);
+               if (*n->child->string == '+' ||
+                   *n->child->string == '-')
+                       ponew += po;
+       } else
+               ponew = polast;
+       polast = po;
+       po = ponew;
+
+       ponew = po - polast + (int)p->tcol->offset;
+       p->tcol->offset = ponew > 0 ? ponew : 0;
+}
+
 static void
 roff_term_pre_sp(ROFF_TERM_ARGS)
 {
index 4f1af9b..8a4f5ae 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: roff_validate.c,v 1.8 2017/06/14 13:00:13 schwarze Exp $ */
+/*     $OpenBSD: roff_validate.c,v 1.9 2017/06/14 22:50:37 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,  /* po */
        NULL,  /* rj */
        NULL,  /* sp */
        NULL,  /* ta */