]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_term.c
While I'm rooting around, note that we depend on sqlite3 now, not berkeley.
[mandoc.git] / mdoc_term.c
index 7f68c229a2eb948478eec5a4c11a06fa585ebb4d..533356644448ea56e6bf227e8bf7b69203454ede 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.234 2011/09/19 22:36:16 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.238 2011/11/13 13:15:14 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -34,9 +34,6 @@
 #include "mdoc.h"
 #include "main.h"
 
-#define        INDENT            5
-#define        HALFINDENT        3
-
 struct termpair {
        struct termpair  *ppair;
        int               count;
@@ -194,7 +191,7 @@ static      const struct termact termacts[MDOC_MAX] = {
        { NULL, NULL }, /* Ec */ /* FIXME: no space */
        { NULL, NULL }, /* Ef */
        { termp_under_pre, NULL }, /* Em */ 
-       { NULL, NULL }, /* Eo */
+       { termp_quote_pre, termp_quote_post }, /* Eo */
        { termp_xx_pre, NULL }, /* Fx */
        { termp_bold_pre, NULL }, /* Ms */
        { termp_igndelim_pre, NULL }, /* No */
@@ -259,6 +256,9 @@ terminal_mdoc(void *arg, const struct mdoc *mdoc)
 
        p = (struct termp *)arg;
 
+       if (0 == p->defindent)
+               p->defindent = 5;
+
        p->overstep = 0;
        p->maxrmargin = p->defrmargin;
        p->tabwidth = term_len(p, 5);
@@ -458,13 +458,11 @@ static void
 print_mdoc_head(struct termp *p, const void *arg)
 {
        char            buf[BUFSIZ], title[BUFSIZ];
+       size_t          buflen, titlen;
        const struct mdoc_meta *m;
 
        m = (const struct mdoc_meta *)arg;
 
-       p->rmargin = p->maxrmargin;
-       p->offset = 0;
-
        /*
         * The header is strange.  It has three components, which are
         * really two with the first duplicated.  It goes like this:
@@ -478,8 +476,12 @@ print_mdoc_head(struct termp *p, const void *arg)
         * switches on the manual section.
         */
 
+       p->offset = 0;
+       p->rmargin = p->maxrmargin;
+
        assert(m->vol);
        strlcpy(buf, m->vol, BUFSIZ);
+       buflen = term_strlen(p, buf);
 
        if (m->arch) {
                strlcat(buf, " (", BUFSIZ);
@@ -488,33 +490,38 @@ print_mdoc_head(struct termp *p, const void *arg)
        }
 
        snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec);
+       titlen = term_strlen(p, title);
 
-       p->offset = 0;
-       p->rmargin = (p->maxrmargin - 
-                       term_strlen(p, buf) + term_len(p, 1)) / 2;
        p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
+       p->offset = 0;
+       p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ?
+           (p->maxrmargin -
+            term_strlen(p, buf) + term_len(p, 1)) / 2 :
+           p->maxrmargin - buflen;
 
        term_word(p, title);
        term_flushln(p);
 
-       p->offset = p->rmargin;
-       p->rmargin = p->maxrmargin - term_strlen(p, title);
        p->flags |= TERMP_NOSPACE;
+       p->offset = p->rmargin;
+       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_NOSPACE;
-
-       term_word(p, title);
-       term_flushln(p);
+       if (p->rmargin + titlen <= p->maxrmargin) {
+               p->flags |= TERMP_NOSPACE;
+               p->offset = p->rmargin;
+               p->rmargin = p->maxrmargin;
+               term_word(p, title);
+               term_flushln(p);
+       }
 
+       p->flags &= ~TERMP_NOSPACE;
        p->offset = 0;
        p->rmargin = p->maxrmargin;
-       p->flags &= ~TERMP_NOSPACE;
 }
 
 
@@ -555,9 +562,9 @@ a2offs(const struct termp *p, const char *v)
        else if (0 == strcmp(v, "left"))
                return(0);
        else if (0 == strcmp(v, "indent"))
-               return(term_len(p, INDENT + 1));
+               return(term_len(p, p->defindent + 1));
        else if (0 == strcmp(v, "indent-two"))
-               return(term_len(p, (INDENT + 1) * 2));
+               return(term_len(p, (p->defindent + 1) * 2));
        else if ( ! a2roffsu(v, &su, SCALE_MAX))
                SCALE_HS_INIT(&su, term_strlen(p, v));
 
@@ -577,6 +584,8 @@ print_bvspace(struct termp *p,
 {
        const struct mdoc_node  *nn;
 
+       assert(n);
+
        term_newln(p);
 
        if (MDOC_Bd == bl->tok && bl->norm->Bd.comp)
@@ -1415,7 +1424,7 @@ termp_sh_pre(DECL_ARGS)
                term_fontpush(p, TERMFONT_BOLD);
                break;
        case (MDOC_BODY):
-               p->offset = term_len(p, INDENT);
+               p->offset = term_len(p, p->defindent);
                break;
        default:
                break;
@@ -1483,7 +1492,7 @@ termp_d1_pre(DECL_ARGS)
        if (MDOC_BLOCK != n->type)
                return(1);
        term_newln(p);
-       p->offset += term_len(p, (INDENT + 1));
+       p->offset += term_len(p, p->defindent + 1);
        return(1);
 }
 
@@ -1788,7 +1797,7 @@ termp_ss_pre(DECL_ARGS)
                break;
        case (MDOC_HEAD):
                term_fontpush(p, TERMFONT_BOLD);
-               p->offset = term_len(p, HALFINDENT);
+               p->offset = term_len(p, (p->defindent+1)/2);
                break;
        default:
                break;
@@ -1916,6 +1925,8 @@ termp_quote_pre(DECL_ARGS)
        case (MDOC_Dq):
                term_word(p, "``");
                break;
+       case (MDOC_Eo):
+               break;
        case (MDOC_Po):
                /* FALLTHROUGH */
        case (MDOC_Pq):
@@ -1980,6 +1991,8 @@ termp_quote_post(DECL_ARGS)
        case (MDOC_Dq):
                term_word(p, "''");
                break;
+       case (MDOC_Eo):
+               break;
        case (MDOC_Po):
                /* FALLTHROUGH */
        case (MDOC_Pq):