aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-06-14 22:51:25 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-06-14 22:51:25 +0000
commita5cb8b874ed422ba6f202f5cd0dc73e4689e168b (patch)
tree04995cd7ced1bad663ee8096460feda6fa6f3b5a
parente9ac0876da23cde98a17d36ab849630061754ff0 (diff)
downloadmandoc-a5cb8b874ed422ba6f202f5cd0dc73e4689e168b.tar.gz
mandoc-a5cb8b874ed422ba6f202f5cd0dc73e4689e168b.tar.zst
mandoc-a5cb8b874ed422ba6f202f5cd0dc73e4689e168b.zip
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 :).
-rw-r--r--mdoc_man.c3
-rw-r--r--regress/roff/Makefile2
-rw-r--r--regress/roff/po/Makefile5
-rw-r--r--regress/roff/po/basic-mdoc.in20
-rw-r--r--regress/roff/po/basic-mdoc.out_ascii17
-rw-r--r--roff.713
-rw-r--r--roff.c10
-rw-r--r--roff.h4
-rw-r--r--roff_html.c3
-rw-r--r--roff_term.c26
-rw-r--r--roff_validate.c3
11 files changed, 91 insertions, 15 deletions
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 <schwarze@openbsd.org>
*
@@ -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 <bsd.subdir.mk>
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 <bsd.regress.mk>
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 <kristaps@bsd.lv>
.\" Copyright (c) 2010,2011,2013-2015,2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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 <kristaps@bsd.lv>
* Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -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 <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,
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 <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 */
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 <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 */
@@ -153,6 +155,28 @@ roff_term_pre_mc(ROFF_TERM_ARGS)
}
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)
{
struct roffsu su;
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 <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 */