]> git.cameronkatri.com Git - mandoc.git/blobdiff - man_term.c
Backed-out warning messages (lots).
[mandoc.git] / man_term.c
index 0a012d04cd17e13de066e71cfaaa1b085ee328de..0f6b4c03113379836951ee63b698c878d1fc7b1b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_term.c,v 1.56 2010/03/22 05:59:32 kristaps Exp $ */
+/*     $Id: man_term.c,v 1.67 2010/05/15 20:51:40 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -139,6 +139,14 @@ static     const struct termact termacts[MAN_MAX] = {
        { pre_ign, NULL, 0 }, /* DT */
        { pre_ign, NULL, 0 }, /* UC */
        { pre_ign, NULL, 0 }, /* PD */
+       { pre_sp, NULL, MAN_NOTEXT }, /* Sp */
+       { pre_nf, NULL, 0 }, /* Vb */
+       { pre_fi, NULL, 0 }, /* Ve */
+       { pre_ign, NULL, MAN_NOTEXT }, /* de */
+       { pre_ign, NULL, MAN_NOTEXT }, /* dei */
+       { pre_ign, NULL, MAN_NOTEXT }, /* am */
+       { pre_ign, NULL, MAN_NOTEXT }, /* ami */
+       { NULL, NULL, 0 }, /* . */
 };
 
 
@@ -153,6 +161,9 @@ terminal_man(void *arg, const struct man *man)
 
        p = (struct termp *)arg;
 
+       p->overstep = 0;
+       p->maxrmargin = p->defrmargin;
+
        if (NULL == p->symtab)
                switch (p->enc) {
                case (TERMENC_ASCII):
@@ -258,9 +269,8 @@ static int
 pre_nf(DECL_ARGS)
 {
 
-       term_newln(p);
        mt->fl |= MANT_LITERAL;
-       return(1);
+       return(MAN_Vb != n->tok);
 }
 
 
@@ -358,7 +368,7 @@ pre_sp(DECL_ARGS)
 
        if (0 == len)
                term_newln(p);
-       for (i = 0; i < len; i++)
+       for (i = 0; i <= len; i++)
                term_vspace(p);
 
        return(0);
@@ -473,7 +483,6 @@ pre_IP(DECL_ARGS)
                break;
        case (MAN_HEAD):
                p->flags |= TERMP_NOBREAK;
-               p->flags |= TERMP_TWOSPACE;
                break;
        case (MAN_BLOCK):
                print_bvspace(p, n);
@@ -534,7 +543,6 @@ post_IP(DECL_ARGS)
        case (MAN_HEAD):
                term_flushln(p);
                p->flags &= ~TERMP_NOBREAK;
-               p->flags &= ~TERMP_TWOSPACE;
                p->rmargin = p->maxrmargin;
                break;
        case (MAN_BODY):
@@ -699,6 +707,9 @@ pre_SH(DECL_ARGS)
                if (n->prev && MAN_SH == n->prev->tok)
                        if (NULL == n->prev->body->child)
                                break;
+               /* If the first macro, no vspae. */
+               if (NULL == n->prev)
+                       break;
                term_vspace(p);
                break;
        case (MAN_HEAD):
@@ -776,6 +787,8 @@ post_RS(DECL_ARGS)
        case (MAN_BLOCK):
                mt->offset = mt->lmargin = INDENT;
                break;
+       case (MAN_HEAD):
+               break;
        default:
                term_newln(p);
                p->offset = INDENT;
@@ -787,6 +800,7 @@ post_RS(DECL_ARGS)
 static void
 print_man_node(DECL_ARGS)
 {
+       size_t           rm, rmax;
        int              c;
 
        c = 1;
@@ -803,8 +817,13 @@ print_man_node(DECL_ARGS)
                /* FIXME: this means that macro lines are munged!  */
 
                if (MANT_LITERAL & mt->fl) {
+                       rm = p->rmargin;
+                       rmax = p->maxrmargin;
+                       p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
                        p->flags |= TERMP_NOSPACE;
                        term_flushln(p);
+                       p->rmargin = rm;
+                       p->maxrmargin = rmax;
                }
                break;
        default:
@@ -824,6 +843,9 @@ print_man_node(DECL_ARGS)
                if ( ! (MAN_NOTEXT & termacts[n->tok].flags))
                        term_fontrepl(p, TERMFONT_NONE);
        }
+
+       if (MAN_EOS & n->flags)
+               p->flags |= TERMP_SENTENCE;
 }
 
 
@@ -873,18 +895,30 @@ static void
 print_man_head(struct termp *p, const struct man_meta *m)
 {
        char            buf[BUFSIZ], title[BUFSIZ];
+       size_t          buflen, titlen;
+
+       /*
+        * Note that old groff would spit out some spaces before the
+        * header.  We discontinue this strange behaviour, but at one
+        * point we did so here.
+        */
 
        p->rmargin = p->maxrmargin;
+
        p->offset = 0;
        buf[0] = title[0] = '\0';
 
        if (m->vol)
                strlcpy(buf, m->vol, BUFSIZ);
+       buflen = strlen(buf);
 
-       snprintf(title, BUFSIZ, "%s(%d)", m->title, m->msec);
+       snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);
+       titlen = strlen(title);
 
        p->offset = 0;
-       p->rmargin = (p->maxrmargin - strlen(buf) + 1) / 2;
+       p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ?
+           (p->maxrmargin - strlen(buf) + 1) / 2 :
+           p->maxrmargin - buflen;
        p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
 
        term_word(p, title);
@@ -892,20 +926,31 @@ print_man_head(struct termp *p, const struct man_meta *m)
 
        p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
        p->offset = p->rmargin;
-       p->rmargin = p->maxrmargin - strlen(title);
+       p->rmargin = p->offset + buflen + titlen < p->maxrmargin ?
+           p->maxrmargin - titlen : p->maxrmargin;
 
        term_word(p, buf);
        term_flushln(p);
 
-       p->offset = p->rmargin;
-       p->rmargin = p->maxrmargin;
        p->flags &= ~TERMP_NOBREAK;
-       p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
-
-       term_word(p, title);
-       term_flushln(p);
+       if (p->rmargin + titlen <= p->maxrmargin) {
+               p->flags |= TERMP_NOLPAD | TERMP_NOSPACE;
+               p->offset = p->rmargin;
+               p->rmargin = p->maxrmargin;
+               term_word(p, title);
+               term_flushln(p);
+       }
 
        p->rmargin = p->maxrmargin;
        p->offset = 0;
        p->flags &= ~TERMP_NOSPACE;
+
+       /* 
+        * Groff likes to have some leading spaces before content.  Well
+        * that's fine by me.
+        */
+
+       term_vspace(p);
+       term_vspace(p);
+       term_vspace(p);
 }