aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/roff_term.c
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 /roff_term.c
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 :).
Diffstat (limited to 'roff_term.c')
-rw-r--r--roff_term.c26
1 files changed, 25 insertions, 1 deletions
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;