]> git.cameronkatri.com Git - mandoc.git/blobdiff - term.c
Make sure that the configuration file is always read, even when
[mandoc.git] / term.c
diff --git a/term.c b/term.c
index a807150eba8655746c007dbf68cacaa7f6a3a266..f4adf9522a4f5edf166a3a855a31ed8e6f005ff4 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
-/*     $Id: term.c,v 1.278 2019/01/03 19:59:55 schwarze Exp $ */
+/* $Id: term.c,v 1.284 2021/10/04 18:56:31 schwarze Exp $ */
 /*
+ * Copyright (c) 2010-2021 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010-2019 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
@@ -38,8 +38,7 @@ static        void             bufferc(struct termp *, char);
 static void             encode(struct termp *, const char *, size_t);
 static void             encode1(struct termp *, int);
 static void             endline(struct termp *);
-static void             term_field(struct termp *, size_t, size_t,
-                               size_t, size_t);
+static void             term_field(struct termp *, size_t, size_t);
 static void             term_fill(struct termp *, size_t *, size_t *,
                                size_t);
 
@@ -59,6 +58,7 @@ term_setcol(struct termp *p, size_t maxtcol)
 void
 term_free(struct termp *p)
 {
+       term_tab_free();
        for (p->tcol = p->tcols; p->tcol < p->tcols + p->maxtcol; p->tcol++)
                free(p->tcol->buf);
        free(p->tcols);
@@ -127,22 +127,36 @@ term_flushln(struct termp *p)
                 * and with the BRNEVER flag, never break it at all.
                 */
 
-               vtarget = p->flags & TERMP_BRNEVER ? SIZE_MAX :
-                   (p->flags & TERMP_NOBREAK) == 0 ? vfield :
+               vtarget = (p->flags & TERMP_NOBREAK) == 0 ? vfield :
                    p->maxrmargin > p->viscol + vbl ?
                    p->maxrmargin - p->viscol - vbl : 0;
 
                /*
                 * Figure out how much text will fit in the field.
                 * If there is whitespace only, print nothing.
-                * Otherwise, print the field content.
                 */
 
-               term_fill(p, &nbr, &vbr, vtarget);
+               term_fill(p, &nbr, &vbr,
+                   p->flags & TERMP_BRNEVER ? SIZE_MAX : vtarget);
                if (nbr == 0)
                        break;
 
-               term_field(p, vbl, nbr, vbr, vtarget);
+               /*
+                * With the CENTER or RIGHT flag, increase the indentation
+                * to center the text between the left and right margins
+                * or to adjust it to the right margin, respectively.
+                */
+
+               if (vbr < vtarget) {
+                       if (p->flags & TERMP_CENTER)
+                               vbl += (vtarget - vbr) / 2;
+                       else if (p->flags & TERMP_RIGHT)
+                               vbl += vtarget - vbr;
+               }
+
+               /* Finally, print the field content. */
+
+               term_field(p, vbl, nbr);
 
                /*
                 * If there is no text left in the field, exit the loop.
@@ -267,6 +281,8 @@ term_fill(struct termp *p, size_t *nbr, size_t *vbr, size_t vtarget)
                        case ASCII_BREAK:
                                vn = vis;
                                break;
+                       default:
+                               abort();
                        }
                        /* Can break at the end of a word. */
                        if (breakline || vn > vtarget)
@@ -329,12 +345,10 @@ term_fill(struct termp *p, size_t *nbr, size_t *vbr, size_t vtarget)
 /*
  * Print the contents of one field
  * with an indentation of       vbl      visual columns,
- * an input string length of    nbr      characters,
- * an output width of           vbr      visual columns,
- * and a desired field width of         vtarget  visual columns.
+ * and an input string length of nbr     characters.
  */
 static void
-term_field(struct termp *p, size_t vbl, size_t nbr, size_t vbr, size_t vtarget)
+term_field(struct termp *p, size_t vbl, size_t nbr)
 {
        size_t   ic;    /* Character position in the input buffer. */
        size_t   vis;   /* Visual position of the current character. */
@@ -360,8 +374,9 @@ term_field(struct termp *p, size_t vbl, size_t nbr, size_t vbr, size_t vtarget)
                        continue;
                case ' ':
                case ASCII_NBRSP:
-                       vbl++;
-                       vis++;
+                       dv = (*p->width)(p, ' ');
+                       vbl += dv;
+                       vis += dv;
                        continue;
                default:
                        break;
@@ -575,16 +590,18 @@ term_word(struct termp *p, const char *word)
                        uc = *seq;
                        break;
                case ESCAPE_FONTBOLD:
+               case ESCAPE_FONTCB:
                        term_fontrepl(p, TERMFONT_BOLD);
                        continue;
                case ESCAPE_FONTITALIC:
+               case ESCAPE_FONTCI:
                        term_fontrepl(p, TERMFONT_UNDER);
                        continue;
                case ESCAPE_FONTBI:
                        term_fontrepl(p, TERMFONT_BI);
                        continue;
                case ESCAPE_FONT:
-               case ESCAPE_FONTCW:
+               case ESCAPE_FONTCR:
                case ESCAPE_FONTROMAN:
                        term_fontrepl(p, TERMFONT_NONE);
                        continue;