]> git.cameronkatri.com Git - mandoc.git/blobdiff - term.c
Make the generated man(7) code more portable by using .PD
[mandoc.git] / term.c
diff --git a/term.c b/term.c
index a10fce7a2dbf9a6e3d98cdacf7fcac80da456e4f..6229031285e3721b3daecb5c93c22abb29bbe83e 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/*     $Id: term.c,v 1.203 2012/05/31 22:29:13 schwarze Exp $ */
+/*     $Id: term.c,v 1.206 2012/11/16 17:16:55 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
@@ -106,6 +106,7 @@ void
 term_flushln(struct termp *p)
 {
        int              i;     /* current input position in p->buf */
+       int              ntab;  /* number of tabs to prepend */
        size_t           vis;   /* current visual position on output */
        size_t           vbl;   /* number of blanks to prepend to output */
        size_t           vend;  /* end of word visual position on output */
@@ -144,10 +145,12 @@ term_flushln(struct termp *p)
                 * Handle literal tab characters: collapse all
                 * subsequent tabs into a single huge set of spaces.
                 */
+               ntab = 0;
                while (i < p->col && '\t' == p->buf[i]) {
                        vend = (vis / p->tabwidth + 1) * p->tabwidth;
                        vbl += vend - vis;
                        vis = vend;
+                       ntab++;
                        i++;
                }
 
@@ -192,6 +195,11 @@ term_flushln(struct termp *p)
                        } else
                                vbl = p->offset;
 
+                       /* use pending tabs on the new line */
+
+                       if (0 < ntab)
+                               vbl += ntab * p->tabwidth;
+
                        /* Remove the p->overstep width. */
 
                        bp += (size_t)p->overstep;
@@ -265,16 +273,11 @@ term_flushln(struct termp *p)
                p->overstep = (int)(vis - maxvis + (*p->width)(p, ' '));
 
                /*
-                * Behave exactly the same way as groff:
                 * If we have overstepped the margin, temporarily move
                 * it to the right and flag the rest of the line to be
                 * shorter.
-                * If we landed right at the margin, be happy.
-                * If we are one step before the margin, temporarily
-                * move it one step LEFT and flag the rest of the line
-                * to be longer.
                 */
-               if (p->overstep < -1)
+               if (p->overstep < 0)
                        p->overstep = 0;
                return;
 
@@ -373,7 +376,7 @@ void
 term_fontpopq(struct termp *p, const void *key)
 {
 
-       while (p->fonti >= 0 && key != &p->fontq[p->fonti])
+       while (p->fonti >= 0 && key < (void *)(p->fontq + p->fonti))
                p->fonti--;
        assert(p->fonti >= 0);
 }