=================================================================== RCS file: /cvs/mandoc/roff_term.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -p -r1.21 -r1.22 --- mandoc/roff_term.c 2020/09/03 17:42:15 1.21 +++ mandoc/roff_term.c 2020/09/03 20:43:15 1.22 @@ -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.22 2020/09/03 20:43:15 schwarze Exp $ */ /* - * Copyright (c) 2010,2014,2015,2017-2019 Ingo Schwarze + * Copyright (c) 2010,2014,2015,2017-2020 Ingo Schwarze * * 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