]> git.cameronkatri.com Git - mandoc.git/blobdiff - term.c
Put tbl_alloc function right into the addspan() one, as this is the only
[mandoc.git] / term.c
diff --git a/term.c b/term.c
index b609b0e8615d65391ec2d53ca41f2509eb298d13..2116639f5aab2ace8786abfe01cb3fd831903755 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
-/*     $Id: term.c,v 1.172 2010/09/23 20:26:00 schwarze Exp $ */
+/*     $Id: term.c,v 1.177 2011/01/30 16:05:37 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2011 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
@@ -146,24 +146,21 @@ term_flushln(struct termp *p)
         * an indentation, but can be, for tagged lists or columns, a
         * small set of values. 
         */
-
-       assert(p->offset < p->rmargin);
-
-       maxvis = (int)(p->rmargin - p->offset) - p->overstep < 0 ?
-               /* LINTED */ 
-               0 : p->rmargin - p->offset - p->overstep;
-       mmax = (int)(p->maxrmargin - p->offset) - p->overstep < 0 ?
-               /* LINTED */
-               0 : p->maxrmargin - p->offset - p->overstep;
+       assert  (p->rmargin >= p->offset);
+       dv     = p->rmargin - p->offset;
+       maxvis = (int)dv > p->overstep ? dv - (size_t)p->overstep : 0;
+       dv     = p->maxrmargin - p->offset;
+       mmax   = (int)dv > p->overstep ? dv - (size_t)p->overstep : 0;
 
        bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;
 
        /*
         * Indent the first line of a paragraph.
         */
-       vbl = p->flags & TERMP_NOLPAD ? 0 : p->offset;
+       vbl = p->flags & TERMP_NOLPAD ? (size_t)0 : p->offset;
 
-       vis = vend = i = 0;
+       vis = vend = 0;
+       i = 0;
 
        while (i < (int)p->col) {
                /*
@@ -184,7 +181,6 @@ term_flushln(struct termp *p)
                 * space is printed according to regular spacing rules).
                 */
 
-               /* LINTED */
                for (j = i, jhy = 0; j < (int)p->col; j++) {
                        if ((j && ' ' == p->buf[j]) || '\t' == p->buf[j])
                                break;
@@ -223,8 +219,7 @@ term_flushln(struct termp *p)
 
                        /* Remove the p->overstep width. */
 
-                       bp += (int)/* LINTED */
-                               p->overstep;
+                       bp += (size_t)p->overstep;
                        p->overstep = 0;
                }
 
@@ -238,7 +233,7 @@ term_flushln(struct termp *p)
                                j = i;
                                while (' ' == p->buf[i])
                                        i++;
-                               dv = (i - j) * (*p->width)(p, ' ');
+                               dv = (size_t)(i - j) * (*p->width)(p, ' ');
                                vbl += dv;
                                vend += dv;
                                break;
@@ -287,8 +282,7 @@ term_flushln(struct termp *p)
 
        if (TERMP_HANG & p->flags) {
                /* We need one blank after the tag. */
-               p->overstep = /* LINTED */
-                       vis - maxvis + (*p->width)(p, ' ');
+               p->overstep = (int)(vis - maxvis + (*p->width)(p, ' '));
 
                /*
                 * Behave exactly the same way as groff:
@@ -302,8 +296,7 @@ term_flushln(struct termp *p)
                 */
                if (p->overstep >= -1) {
                        assert((int)maxvis + p->overstep >= 0);
-                       /* LINTED */
-                       maxvis += p->overstep;
+                       maxvis += (size_t)p->overstep;
                } else
                        p->overstep = 0;
 
@@ -311,9 +304,8 @@ term_flushln(struct termp *p)
                return;
 
        /* Right-pad. */
-       if (maxvis > vis + /* LINTED */
-                       ((TERMP_TWOSPACE & p->flags) ? 
-                        (*p->width)(p, ' ') : 0)) {
+       if (maxvis > vis +
+           ((TERMP_TWOSPACE & p->flags) ? (*p->width)(p, ' ') : 0)) {
                p->viscol += maxvis - vis;
                (*p->advance)(p, maxvis - vis);
                vis += (maxvis - vis);
@@ -360,6 +352,17 @@ term_vspace(struct termp *p)
 }
 
 
+static void
+numbered(struct termp *p, const char *word, size_t len)
+{
+       const char      *rhs;
+
+       rhs = chars_num2char(word, len);
+       if (rhs) 
+               encode(p, rhs, 1);
+}
+
+
 static void
 spec(struct termp *p, enum roffdeco d, const char *word, size_t len)
 {
@@ -505,7 +508,7 @@ term_word(struct termp *p, const char *word)
        else
                p->flags |= TERMP_NOSPACE;
 
-       p->flags &= ~TERMP_SENTENCE;
+       p->flags &= ~(TERMP_SENTENCE | TERMP_IGNDELIM);
 
        while (*word) {
                if ((ssz = strcspn(word, "\\")) > 0)
@@ -519,6 +522,9 @@ term_word(struct termp *p, const char *word)
                word += a2roffdeco(&deco, &seq, &ssz);
 
                switch (deco) {
+               case (DECO_NUMBERED):
+                       numbered(p, seq, ssz);
+                       break;
                case (DECO_RESERVED):
                        res(p, seq, ssz);
                        break;
@@ -685,6 +691,12 @@ term_strlen(const struct termp *p, const char *cp)
                        if (rhs)
                                for (i = 0; i < rsz; i++)
                                        sz += (*p->width)(p, *rhs++);
+               } else if (ASCII_NBRSP == *cp) {
+                       sz += (*p->width)(p, ' ');
+                       cp++;
+               } else if (ASCII_HYPH == *cp) {
+                       sz += (*p->width)(p, '-');
+                       cp++;
                } else
                        sz += (*p->width)(p, *cp++);