]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff_term.c
Finally get rid of the "overflow: auto" property of ".Bl-tag > dd"
[mandoc.git] / roff_term.c
index 9b251f49a32223b1d6de194a5e7d99c431f4c6aa..7f5058a43707161ef93ce6413b276a1d8c1a6257 100644 (file)
@@ -1,6 +1,6 @@
-/* $Id: roff_term.c,v 1.20 2020/06/22 19:20:40 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
@@ -210,6 +218,7 @@ roff_term_pre_ti(ROFF_TERM_ARGS)
 {
        struct roffsu    su;
        const char      *cp;
+       const size_t     maxoff = 72;
        int              len, sign;
 
        roff_term_pre_br(p, n);
@@ -230,17 +239,26 @@ roff_term_pre_ti(ROFF_TERM_ARGS)
                return;
        len = term_hen(p, &su);
 
-       if (sign == 0) {
+       switch (sign) {
+       case 1:
+               if (p->tcol->offset + len <= maxoff)
+                       p->ti = len;
+               else if (p->tcol->offset < maxoff)
+                       p->ti = maxoff - p->tcol->offset;
+               else
+                       p->ti = 0;
+               break;
+       case -1:
+               if ((size_t)len < p->tcol->offset)
+                       p->ti = -len;
+               else
+                       p->ti = -p->tcol->offset;
+               break;
+       default:
+               if ((size_t)len > maxoff)
+                       len = maxoff;
                p->ti = len - p->tcol->offset;
-               p->tcol->offset = len;
-       } else if (sign == 1) {
-               p->ti = len;
-               p->tcol->offset += len;
-       } else if ((size_t)len < p->tcol->offset) {
-               p->ti = -len;
-               p->tcol->offset -= len;
-       } else {
-               p->ti = -p->tcol->offset;
-               p->tcol->offset = 0;
+               break;
        }
+       p->tcol->offset += p->ti;
 }