aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--regress/roff/po/Makefile12
-rw-r--r--regress/roff/po/range.in24
-rw-r--r--regress/roff/po/range.out_ascii19
-rw-r--r--roff_term.c18
4 files changed, 66 insertions, 7 deletions
diff --git a/regress/roff/po/Makefile b/regress/roff/po/Makefile
index dabc7c9e..fa2f5774 100644
--- a/regress/roff/po/Makefile
+++ b/regress/roff/po/Makefile
@@ -1,5 +1,13 @@
-# $OpenBSD: Makefile,v 1.1 2017/05/08 15:33:43 schwarze Exp $
+# $OpenBSD: Makefile,v 1.2 2020/09/03 20:33:20 schwarze Exp $
-REGRESS_TARGETS = basic-mdoc
+REGRESS_TARGETS = basic-mdoc range
+
+# groff-1.22.4 defect:
+# - Negative page objects sometimes result in output lines starting
+# with backspace characters.
+# - Excessive page offsets cause excessive line lengths
+# instead of being truncated to resonable widths.
+
+SKIP_GROFF = range
.include <bsd.regress.mk>
diff --git a/regress/roff/po/range.in b/regress/roff/po/range.in
new file mode 100644
index 00000000..e90d0d48
--- /dev/null
+++ b/regress/roff/po/range.in
@@ -0,0 +1,24 @@
+.\" $OpenBSD: range.in,v 1.1 2020/09/03 20:33:20 schwarze Exp $
+.Dd $Mdocdate: September 3 2020 $
+.Dt PO-RANGE 1
+.Os
+.Sh NAME
+.Nm po-range
+.Nd page offsets out of range
+.Sh DESCRIPTION
+initial text
+.Pp
+.po -10n
+too small
+.Pp
+.po +10n
+back in range
+.Pp
+.po 80n
+too large
+.Pp
+.po -70n
+back in range
+.Pp
+.po 0
+final text
diff --git a/regress/roff/po/range.out_ascii b/regress/roff/po/range.out_ascii
new file mode 100644
index 00000000..cc55df27
--- /dev/null
+++ b/regress/roff/po/range.out_ascii
@@ -0,0 +1,19 @@
+PO-RANGE(1) General Commands Manual PO-RANGE(1)
+
+NNAAMMEE
+ ppoo--rraannggee - page offsets out of range
+
+DDEESSCCRRIIPPTTIIOONN
+ initial text
+
+too small
+
+ back in range
+
+ too large
+
+ back in range
+
+ final text
+
+OpenBSD September 3, 2020 OpenBSD
diff --git a/roff_term.c b/roff_term.c
index ebfb75ef..7f5058a4 100644
--- a/roff_term.c
+++ b/roff_term.c
@@ -1,6 +1,6 @@
-/* $Id: roff_term.c,v 1.21 2020/09/03 17:42:15 schwarze Exp $ */
+/* $OpenBSD: roff_term.c,v 1.20 2020/09/03 17:37:06 schwarze Exp $ */
/*
- * Copyright (c) 2010,2014,2015,2017-2019 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010,2014,2015,2017-2020 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -157,9 +157,13 @@ static void
roff_term_pre_po(ROFF_TERM_ARGS)
{
struct roffsu su;
- static int po, polast;
+ static int po, pouse, polast;
int ponew;
+ /* Revert the currently active page offset. */
+ p->tcol->offset -= pouse;
+
+ /* Determine the requested page offset. */
if (n->child != NULL &&
a2roffsu(n->child->string, &su, SCALE_EM) != NULL) {
ponew = term_hen(p, &su);
@@ -168,11 +172,15 @@ roff_term_pre_po(ROFF_TERM_ARGS)
ponew += po;
} else
ponew = polast;
+
+ /* Remeber both the previous and the newly requested offset. */
polast = po;
po = ponew;
- ponew = po - polast + (int)p->tcol->offset;
- p->tcol->offset = ponew > 0 ? ponew : 0;
+ /* Truncate to the range [-offset, 60], remember, and apply it. */
+ pouse = po >= 60 ? 60 :
+ po < -(int)p->tcol->offset ? -p->tcol->offset : po;
+ p->tcol->offset += pouse;
}
static void