From a5cb8b874ed422ba6f202f5cd0dc73e4689e168b Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Wed, 14 Jun 2017 22:51:25 +0000 Subject: 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 :). --- mdoc_man.c | 3 ++- regress/roff/Makefile | 2 +- regress/roff/po/Makefile | 5 +++++ regress/roff/po/basic-mdoc.in | 20 ++++++++++++++++++++ regress/roff/po/basic-mdoc.out_ascii | 17 +++++++++++++++++ roff.7 | 13 ++++++++++--- roff.c | 10 +++++----- roff.h | 4 ++-- roff_html.c | 3 ++- roff_term.c | 26 +++++++++++++++++++++++++- roff_validate.c | 3 ++- 11 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 regress/roff/po/Makefile create mode 100644 regress/roff/po/basic-mdoc.in create mode 100644 regress/roff/po/basic-mdoc.out_ascii diff --git a/mdoc_man.c b/mdoc_man.c index 65916cf4..cf552ce9 100644 --- a/mdoc_man.c +++ b/mdoc_man.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_man.c,v 1.121 2017/06/14 13:00:31 schwarze Exp $ */ +/* $Id: mdoc_man.c,v 1.122 2017/06/14 22:51:25 schwarze Exp $ */ /* * Copyright (c) 2011-2017 Ingo Schwarze * @@ -130,6 +130,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/regress/roff/Makefile b/regress/roff/Makefile index 0a464197..dae2ac37 100644 --- a/regress/roff/Makefile +++ b/regress/roff/Makefile @@ -1,7 +1,7 @@ # $OpenBSD: Makefile,v 1.20 2015/02/06 16:05:51 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/roff/po/Makefile b/regress/roff/po/Makefile new file mode 100644 index 00000000..dabc7c9e --- /dev/null +++ b/regress/roff/po/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2017/05/08 15:33:43 schwarze Exp $ + +REGRESS_TARGETS = basic-mdoc + +.include diff --git a/regress/roff/po/basic-mdoc.in b/regress/roff/po/basic-mdoc.in new file mode 100644 index 00000000..082be68c --- /dev/null +++ b/regress/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/roff/po/basic-mdoc.out_ascii b/regress/roff/po/basic-mdoc.out_ascii new file mode 100644 index 00000000..0b35c2bd --- /dev/null +++ b/regress/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/roff.7 b/roff.7 index 31bfcf42..1445b525 100644 --- a/roff.7 +++ b/roff.7 @@ -1,4 +1,4 @@ -.\" $Id: roff.7,v 1.91 2017/06/14 19:39:18 schwarze Exp $ +.\" $Id: roff.7,v 1.92 2017/06/14 22:51:25 schwarze Exp $ .\" .\" Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons .\" Copyright (c) 2010,2011,2013-2015,2017 Ingo Schwarze @@ -1441,8 +1441,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/roff.c b/roff.c index 8224639a..1577a9b8 100644 --- a/roff.c +++ b/roff.c @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.311 2017/06/14 19:39:18 schwarze Exp $ */ +/* $Id: roff.c,v 1.312 2017/06/14 22:51:25 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons * Copyright (c) 2010-2015, 2017 Ingo Schwarze @@ -223,8 +223,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", @@ -265,7 +265,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", @@ -335,6 +335,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 */ @@ -500,7 +501,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/roff.h b/roff.h index 7cc4ad27..8cc3c2eb 100644 --- a/roff.h +++ b/roff.h @@ -1,4 +1,4 @@ -/* $Id: roff.h,v 1.53 2017/06/14 13:00:31 schwarze Exp $ */ +/* $Id: roff.h,v 1.54 2017/06/14 22:51:25 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/roff_html.c b/roff_html.c index 7f440dfe..909604f8 100644 --- a/roff_html.c +++ b/roff_html.c @@ -1,4 +1,4 @@ -/* $Id: roff_html.c,v 1.9 2017/06/14 13:00:31 schwarze Exp $ */ +/* $Id: roff_html.c,v 1.10 2017/06/14 22:51:25 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/roff_term.c b/roff_term.c index db59db08..0b0b6fda 100644 --- a/roff_term.c +++ b/roff_term.c @@ -1,4 +1,4 @@ -/* $Id: roff_term.c,v 1.12 2017/06/14 17:51:15 schwarze Exp $ */ +/* $Id: roff_term.c,v 1.13 2017/06/14 22:51:25 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/roff_validate.c b/roff_validate.c index b76f12ce..801e9314 100644 --- a/roff_validate.c +++ b/roff_validate.c @@ -1,4 +1,4 @@ -/* $Id: roff_validate.c,v 1.8 2017/06/14 13:00:31 schwarze Exp $ */ +/* $Id: roff_validate.c,v 1.9 2017/06/14 22:51:25 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 */ -- cgit v1.2.3