]> git.cameronkatri.com Git - mandoc.git/commitdiff
Bringing spacing more in line with groff, patches from schwarze@openbsd.org. Pre...
authorKristaps Dzonsons <kristaps@bsd.lv>
Tue, 21 Jul 2009 13:34:13 +0000 (13:34 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Tue, 21 Jul 2009 13:34:13 +0000 (13:34 +0000)
mdoc_term.c
term.c
term.h

index bdd63db59a7c3d57ab870797d15f48a1c6acde9d..148aaaf54f175fb7f1736a2ec6398861d4f6b49d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.50 2009/07/21 12:47:52 kristaps Exp $ */
+/*     $Id: mdoc_term.c,v 1.51 2009/07/21 13:34:13 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -812,18 +812,22 @@ termp_it_pre(DECL_ARGS)
         * while diagonal bodies need two.
         */
 
+       p->flags |= TERMP_NOSPACE;
+
        switch (type) {
+       case (MDOC_Diag):
+               term_word(p, "\\ \\ ");
+               break;
        case (MDOC_Inset):
                if (MDOC_BODY == node->type) 
-                       p->flags &= ~TERMP_NOSPACE;
-               else
-                       p->flags |= TERMP_NOSPACE;
+                       term_word(p, "\\ ");
                break;
        default:
-               p->flags |= TERMP_NOSPACE;
                break;
        }
 
+       p->flags |= TERMP_NOSPACE;
+
        /*
         * Style flags.  Diagnostic heads need TTYPE_DIAG.
         */
@@ -869,7 +873,7 @@ termp_it_pre(DECL_ARGS)
                break;
        case (MDOC_Tag):
                if (MDOC_HEAD == node->type)
-                       p->flags |= TERMP_NOBREAK;
+                       p->flags |= TERMP_NOBREAK | TERMP_TWOSPACE;
                else
                        p->flags |= TERMP_NOLPAD;
 
@@ -1009,9 +1013,6 @@ termp_it_post(DECL_ARGS)
        assert(-1 != type);
 
        switch (type) {
-       case (MDOC_Diag):
-               term_word(p, "\\ ");
-               /* FALLTHROUGH */
        case (MDOC_Item):
                /* FALLTHROUGH */
        case (MDOC_Inset):
diff --git a/term.c b/term.c
index 4d33ce8dd426529193fbff066dd8f9d4bbca5944..f7b926976a8e6211f833d33d893dd52e4fe89f68 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/*     $Id: term.c,v 1.90 2009/07/19 21:26:27 kristaps Exp $ */
+/*     $Id: term.c,v 1.91 2009/07/21 13:34:13 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -184,6 +184,9 @@ term_isopendelim(const char *p)
  *    columns.  In short: don't print a newline and instead pad to the
  *    right margin.  Used in conjunction with TERMP_NOLPAD.
  *
+ *  - TERMP_TWOSPACE: when padding, make sure there are at least two
+ *    space characters of padding.  Otherwise, rather break the line.
+ *
  *  - TERMP_DANGLE: don't newline when TERMP_NOBREAK is specified and
  *    the line is overrun, and don't pad-right if it's underrun.
  *
@@ -214,7 +217,7 @@ term_flushln(struct termp *p)
 {
        int              i, j;
        size_t           vbl, vsz, vis, maxvis, mmax, bp;
-       static int       sv = -1;
+       static int       overstep = 0;
 
        /*
         * First, establish the maximum columns of "visible" content.
@@ -224,15 +227,11 @@ term_flushln(struct termp *p)
         */
 
        assert(p->offset < p->rmargin);
-       maxvis = p->rmargin - p->offset;
-       mmax = p->maxrmargin - p->offset;
+       maxvis = p->rmargin - p->offset - overstep;
+       mmax = p->maxrmargin - p->offset - overstep;
        bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;
        vis = 0;
-
-       if (sv >= 0) {
-               vis = (size_t)sv;
-               sv = -1;
-       }
+       overstep = 0;
 
        /*
         * If in the standard case (left-justified), then begin with our
@@ -302,38 +301,42 @@ term_flushln(struct termp *p)
                }
                vis += vsz;
        }
+       p->col = 0;
 
-       /*
-        * If we've overstepped our maximum visible no-break space, then
-        * cause a newline and offset at the right margin.
-        */
-
-       if ((TERMP_NOBREAK & p->flags) && vis >= maxvis) {
-               if ( ! (TERMP_DANGLE & p->flags) &&
-                               ! (TERMP_HANG & p->flags)) {
-                       putchar('\n');
-                       for (i = 0; i < (int)p->rmargin; i++)
-                               putchar(' ');
-               }
-               if (TERMP_HANG & p->flags)
-                       sv = (int)(vis - maxvis);
-               p->col = 0;
+       if ( ! (TERMP_NOBREAK & p->flags)) {
+               putchar('\n');
                return;
        }
 
-       /*
-        * If we're not to right-marginalise it (newline), then instead
-        * pad to the right margin and stay off.
-        */
+       if (TERMP_HANG & p->flags) {
 
-       if (p->flags & TERMP_NOBREAK) {
-               if ( ! (TERMP_DANGLE & p->flags))
-                       for ( ; vis < maxvis; vis++)
-                               putchar(' ');
-       } else
-               putchar('\n');
+               /* We need one blank after the tag. */
+               overstep = vis - maxvis + 1;
 
-       p->col = 0;
+               /*
+                * 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 (overstep >= -1)
+                       maxvis += overstep;
+               else
+                       overstep = 0;
+
+       } else if (TERMP_DANGLE & p->flags)
+               return;
+
+       if (maxvis > vis + ((TERMP_TWOSPACE & p->flags) ? 1 : 0))  /* pad */
+               for ( ; vis < maxvis; vis++)
+                       putchar(' ');
+       else {  /* break */
+               putchar('\n');
+               for (i = 0; i < (int)p->rmargin; i++)
+                       putchar(' ');
+       }
 }
 
 
diff --git a/term.h b/term.h
index e713cb65878084ba70372fed05b26f42c0f8046e..ecc6317d3e30308ced4a582e58e62584f6f7b63a 100644 (file)
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/*     $Id: term.h,v 1.39 2009/07/19 09:10:42 kristaps Exp $ */
+/*     $Id: term.h,v 1.40 2009/07/21 13:34:13 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -47,6 +47,7 @@ struct        termp {
 #define        TERMP_NONOSPACE  (1 << 7)       /* No space (no autounset). */
 #define        TERMP_DANGLE     (1 << 8)       /* See term_flushln(). */
 #define        TERMP_HANG       (1 << 9)       /* See term_flushln(). */
+#define        TERMP_TWOSPACE   (1 << 9)       /* See term_flushln(). */
        char             *buf;          /* Output buffer. */
        enum termenc      enc;          /* Type of encoding. */
        void             *symtab;       /* Encoded-symbol table. */