From af1e8f15b7f08549080de19ba7fac4441ea53f94 Mon Sep 17 00:00:00 2001 From: schwarze Date: Wed, 14 Jun 2017 22:50:37 +0000 Subject: [PATCH] Naive implementation of the roff(7) .po (page offset) request. 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 | 4 +-- regress/usr.bin/mandoc/roff/po/Makefile | 5 ++++ regress/usr.bin/mandoc/roff/po/basic-mdoc.in | 20 ++++++++++++++ .../mandoc/roff/po/basic-mdoc.out_ascii | 17 ++++++++++++ share/man/man7/roff.7 | 13 +++++++--- usr.bin/mandoc/mdoc_man.c | 3 ++- usr.bin/mandoc/roff.c | 10 +++---- usr.bin/mandoc/roff.h | 4 +-- usr.bin/mandoc/roff_html.c | 3 ++- usr.bin/mandoc/roff_term.c | 26 ++++++++++++++++++- usr.bin/mandoc/roff_validate.c | 3 ++- 11 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 regress/usr.bin/mandoc/roff/po/Makefile create mode 100644 regress/usr.bin/mandoc/roff/po/basic-mdoc.in create mode 100644 regress/usr.bin/mandoc/roff/po/basic-mdoc.out_ascii diff --git a/regress/usr.bin/mandoc/roff/Makefile b/regress/usr.bin/mandoc/roff/Makefile index 7c180a341d6..9d32cba9e0f 100644 --- a/regress/usr.bin/mandoc/roff/Makefile +++ b/regress/usr.bin/mandoc/roff/Makefile @@ -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 diff --git a/regress/usr.bin/mandoc/roff/po/Makefile b/regress/usr.bin/mandoc/roff/po/Makefile new file mode 100644 index 00000000000..76a76915745 --- /dev/null +++ b/regress/usr.bin/mandoc/roff/po/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2017/06/14 22:50:37 schwarze Exp $ + +REGRESS_TARGETS = basic-mdoc + +.include 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 index 00000000000..082be68ca3f --- /dev/null +++ b/regress/usr.bin/mandoc/roff/po/basic-mdoc.in @@ -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 index 00000000000..0b35c2bddc4 --- /dev/null +++ b/regress/usr.bin/mandoc/roff/po/basic-mdoc.out_ascii @@ -0,0 +1,17 @@ +PO-BASIC-MDOC(1) General Commands Manual PO-BASIC-MDOC(1) + +NNAAMMEE + ppoo--bbaassiicc--mmddoocc - the roff page offset request + +DDEESSCCRRIIPPTTIIOONN + initial text + + shifted left + + shifted right + + shifted left + + final text + +OpenBSD June 14, 2017 OpenBSD diff --git a/share/man/man7/roff.7 b/share/man/man7/roff.7 index 0bdb963f7b7..9409bb19419 100644 --- a/share/man/man7/roff.7 +++ b/share/man/man7/roff.7 @@ -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 .\" Copyright (c) 2010,2011,2013-2015,2017 Ingo Schwarze @@ -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. diff --git a/usr.bin/mandoc/mdoc_man.c b/usr.bin/mandoc/mdoc_man.c index 61ca0219d5c..d89a4d65f9d 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.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 * @@ -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 */ diff --git a/usr.bin/mandoc/roff.c b/usr.bin/mandoc/roff.c index 950d0c1435c..7193bdba615 100644 --- a/usr.bin/mandoc/roff.c +++ b/usr.bin/mandoc/roff.c @@ -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 * Copyright (c) 2010-2015, 2017 Ingo Schwarze @@ -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 */ diff --git a/usr.bin/mandoc/roff.h b/usr.bin/mandoc/roff.h index c81bec340ed..ae8b99755e4 100644 --- a/usr.bin/mandoc/roff.h +++ b/usr.bin/mandoc/roff.h @@ -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 * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze @@ -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, diff --git a/usr.bin/mandoc/roff_html.c b/usr.bin/mandoc/roff_html.c index 91de5fc58ba..9674ba9f6cf 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.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 * 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 */ + NULL, /* po */ roff_html_pre_ce, /* rj */ roff_html_pre_sp, /* sp */ NULL, /* ta */ diff --git a/usr.bin/mandoc/roff_term.c b/usr.bin/mandoc/roff_term.c index e561b43b57c..a3d9418201b 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.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 * @@ -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) { diff --git a/usr.bin/mandoc/roff_validate.c b/usr.bin/mandoc/roff_validate.c index 4f1af9b3695..8a4f5ae6efc 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.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 * @@ -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 */ -- 2.20.1