]> git.cameronkatri.com Git - mandoc.git/blobdiff - man_term.c
Two minor tweaks regarding the fallback from -u/-d to default mode:
[mandoc.git] / man_term.c
index 73f501a6598f67dc771faa5b0b9a5ebbc7bc1210..5a659503e3876c9813e7e0e2f28d205b7893e63c 100644 (file)
@@ -1,7 +1,7 @@
-/*     $Id: man_term.c,v 1.135 2012/11/17 00:26:33 schwarze Exp $ */
+/*     $Id: man_term.c,v 1.145 2014/04/08 07:13:11 schwarze Exp $ */
 /*
  * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010-2014 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
@@ -78,11 +78,13 @@ static      int               pre_RS(DECL_ARGS);
 static int               pre_SH(DECL_ARGS);
 static int               pre_SS(DECL_ARGS);
 static int               pre_TP(DECL_ARGS);
+static int               pre_UR(DECL_ARGS);
 static int               pre_alternate(DECL_ARGS);
 static int               pre_ft(DECL_ARGS);
 static int               pre_ign(DECL_ARGS);
 static int               pre_in(DECL_ARGS);
 static int               pre_literal(DECL_ARGS);
+static int               pre_ll(DECL_ARGS);
 static int               pre_sp(DECL_ARGS);
 
 static void              post_IP(DECL_ARGS);
@@ -91,6 +93,7 @@ static        void              post_RS(DECL_ARGS);
 static void              post_SH(DECL_ARGS);
 static void              post_SS(DECL_ARGS);
 static void              post_TP(DECL_ARGS);
+static void              post_UR(DECL_ARGS);
 
 static const struct termact termacts[MAN_MAX] = {
        { pre_sp, NULL, MAN_NOTEXT }, /* br */
@@ -129,6 +132,9 @@ static      const struct termact termacts[MAN_MAX] = {
        { pre_OP, NULL, 0 }, /* OP */
        { pre_literal, NULL, 0 }, /* EX */
        { pre_literal, NULL, 0 }, /* EE */
+       { pre_UR, post_UR, 0 }, /* UR */
+       { NULL, NULL, 0 }, /* UE */
+       { pre_ll, NULL, MAN_NOTEXT }, /* ll */
 };
 
 
@@ -231,6 +237,16 @@ pre_ign(DECL_ARGS)
 }
 
 
+/* ARGSUSED */
+static int
+pre_ll(DECL_ARGS)
+{
+
+       term_setwidth(p, n->nchild ? n->child->string : NULL);
+       return(0);
+}
+
+
 /* ARGSUSED */
 static int
 pre_I(DECL_ARGS)
@@ -261,7 +277,8 @@ pre_literal(DECL_ARGS)
        if (MAN_HP == n->parent->tok && p->rmargin < p->maxrmargin) {
                p->offset = p->rmargin;
                p->rmargin = p->maxrmargin;
-               p->flags &= ~(TERMP_NOBREAK | TERMP_TWOSPACE);
+               p->trailspace = 0;
+               p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND);
                p->flags |= TERMP_NOSPACE;
        }
 
@@ -530,8 +547,8 @@ pre_HP(DECL_ARGS)
        }
 
        if ( ! (MANT_LITERAL & mt->fl)) {
-               p->flags |= TERMP_NOBREAK;
-               p->flags |= TERMP_TWOSPACE;
+               p->flags |= TERMP_NOBREAK | TERMP_BRIND;
+               p->trailspace = 2;
        }
 
        len = mt->lmargin[mt->lmargincur];
@@ -564,9 +581,9 @@ post_HP(DECL_ARGS)
 
        switch (n->type) {
        case (MAN_BODY):
-               term_flushln(p);
-               p->flags &= ~TERMP_NOBREAK;
-               p->flags &= ~TERMP_TWOSPACE;
+               term_newln(p);
+               p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND);
+               p->trailspace = 0;
                p->offset = mt->offset;
                p->rmargin = p->maxrmargin;
                break;
@@ -609,6 +626,7 @@ pre_IP(DECL_ARGS)
                break;
        case (MAN_HEAD):
                p->flags |= TERMP_NOBREAK;
+               p->trailspace = 1;
                break;
        case (MAN_BLOCK):
                print_bvspace(p, n, mt->pardist);
@@ -652,7 +670,8 @@ pre_IP(DECL_ARGS)
                return(0);
        case (MAN_BODY):
                p->offset = mt->offset + len;
-               p->rmargin = p->maxrmargin;
+               p->rmargin = p->maxrmargin > p->offset ?
+                               p->maxrmargin : p->offset;
                break;
        default:
                break;
@@ -671,10 +690,12 @@ post_IP(DECL_ARGS)
        case (MAN_HEAD):
                term_flushln(p);
                p->flags &= ~TERMP_NOBREAK;
+               p->trailspace = 0;
                p->rmargin = p->maxrmargin;
                break;
        case (MAN_BODY):
                term_newln(p);
+               p->offset = mt->offset;
                break;
        default:
                break;
@@ -693,6 +714,7 @@ pre_TP(DECL_ARGS)
        switch (n->type) {
        case (MAN_HEAD):
                p->flags |= TERMP_NOBREAK;
+               p->trailspace = 1;
                break;
        case (MAN_BODY):
                p->flags |= TERMP_NOSPACE;
@@ -710,7 +732,7 @@ pre_TP(DECL_ARGS)
        /* Calculate offset. */
 
        if (NULL != (nn = n->parent->head->child))
-               if (nn->string && nn->parent->line == nn->line)
+               if (nn->string && 0 == (MAN_LINE & nn->flags))
                        if ((ival = a2width(p, nn->string)) >= 0)
                                len = (size_t)ival;
 
@@ -727,9 +749,14 @@ pre_TP(DECL_ARGS)
                mt->fl &= ~MANT_LITERAL;
 
                /* Don't print same-line elements. */
-               for (nn = n->child; nn; nn = nn->next)
-                       if (nn->line > n->line)
-                               print_man_node(p, mt, nn, meta);
+               nn = n->child;
+               while (NULL != nn && 0 == (MAN_LINE & nn->flags))
+                       nn = nn->next;
+
+               while (NULL != nn) {
+                       print_man_node(p, mt, nn, meta);
+                       nn = nn->next;
+               }
 
                if (savelit)
                        mt->fl |= MANT_LITERAL;
@@ -739,9 +766,10 @@ pre_TP(DECL_ARGS)
                return(0);
        case (MAN_BODY):
                p->offset = mt->offset + len;
-               p->rmargin = p->maxrmargin;
+               p->rmargin = p->maxrmargin > p->offset ?
+                               p->maxrmargin : p->offset;
+               p->trailspace = 0;
                p->flags &= ~TERMP_NOBREAK;
-               p->flags &= ~TERMP_TWOSPACE;
                break;
        default:
                break;
@@ -762,6 +790,7 @@ post_TP(DECL_ARGS)
                break;
        case (MAN_BODY):
                term_newln(p);
+               p->offset = mt->offset;
                break;
        default:
                break;
@@ -899,8 +928,9 @@ pre_RS(DECL_ARGS)
                        sz = (size_t)ival;
 
        mt->offset += sz;
-       p->rmargin = p->maxrmargin;
-       p->offset = mt->offset < p->rmargin ? mt->offset : p->rmargin;
+       p->offset = mt->offset;
+       p->rmargin = p->maxrmargin > p->offset ?
+                       p->maxrmargin : p->offset;
 
        if (++mt->lmarginsz < MAXMARGINS)
                mt->lmargincur = mt->lmarginsz;
@@ -939,6 +969,32 @@ post_RS(DECL_ARGS)
                mt->lmargincur = mt->lmarginsz;
 }
 
+/* ARGSUSED */
+static int
+pre_UR(DECL_ARGS)
+{
+
+       return (MAN_HEAD != n->type);
+}
+
+/* ARGSUSED */
+static void
+post_UR(DECL_ARGS)
+{
+
+       if (MAN_BLOCK != n->type)
+               return;
+
+       term_word(p, "<");
+       p->flags |= TERMP_NOSPACE;
+
+       if (NULL != n->child->child)
+               print_man_node(p, mt, n->child->child, meta);
+
+       p->flags |= TERMP_NOSPACE;
+       term_word(p, ">");
+}
+
 static void
 print_man_node(DECL_ARGS)
 {
@@ -1001,7 +1057,7 @@ out:
         * more specific than this.
         */
        if (MANT_LITERAL & mt->fl && ! (TERMP_NOBREAK & p->flags) &&
-           NULL != n->next && n->next->line > n->line) {
+           (NULL == n->next || MAN_LINE & n->next->flags)) {
                rm = p->rmargin;
                rmax = p->maxrmargin;
                p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
@@ -1069,6 +1125,7 @@ print_man_foot(struct termp *p, const void *arg)
        /* Bottom left corner: manual source. */
 
        p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
+       p->trailspace = 1;
        p->offset = 0;
        p->rmargin = (p->maxrmargin - datelen + term_len(p, 1)) / 2;
 
@@ -1091,6 +1148,7 @@ print_man_foot(struct termp *p, const void *arg)
 
        p->flags &= ~TERMP_NOBREAK;
        p->flags |= TERMP_NOSPACE;
+       p->trailspace = 0;
        p->offset = p->rmargin;
        p->rmargin = p->maxrmargin;
 
@@ -1122,6 +1180,7 @@ print_man_head(struct termp *p, const void *arg)
        titlen = term_strlen(p, title);
 
        p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
+       p->trailspace = 1;
        p->offset = 0;
        p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ?
            (p->maxrmargin - 
@@ -1144,6 +1203,7 @@ print_man_head(struct termp *p, const void *arg)
        /* Top right corner: title and section, again. */
 
        p->flags &= ~TERMP_NOBREAK;
+       p->trailspace = 0;
        if (p->rmargin + titlen <= p->maxrmargin) {
                p->flags |= TERMP_NOSPACE;
                p->offset = p->rmargin;