]> git.cameronkatri.com Git - mandoc.git/blobdiff - term.c
integrate preconv(1) into mandoc(1);
[mandoc.git] / term.c
diff --git a/term.c b/term.c
index b0320ea6380335520c54a8af542cfe97d4c3b975..da1f20c9f381400c56742e7fd847dcede702a91f 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/*     $Id: term.c,v 1.222 2014/04/20 16:46:05 schwarze Exp $ */
+/*     $Id: term.c,v 1.228 2014/08/18 21:07:53 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,9 +15,7 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
 
 #include <sys/types.h>
 
@@ -222,7 +220,7 @@ term_flushln(struct termp *p)
                                break;
                        if (' ' == p->buf[i]) {
                                j = i;
-                               while (' ' == p->buf[i])
+                               while (i < p->col && ' ' == p->buf[i])
                                        i++;
                                dv = (i - j) * (*p->width)(p, ' ');
                                vbl += dv;
@@ -444,7 +442,7 @@ term_word(struct termp *p, const char *word)
                word++;
                esc = mandoc_escape(&word, &seq, &sz);
                if (ESCAPE_ERROR == esc)
-                       break;
+                       continue;
 
                if (TERMENC_ASCII != p->enc)
                        switch (esc) {
@@ -522,7 +520,7 @@ adjbuf(struct termp *p, size_t sz)
        while (sz >= p->maxcols)
                p->maxcols <<= 2;
 
-       p->buf = mandoc_realloc(p->buf, sizeof(int) * p->maxcols);
+       p->buf = mandoc_reallocarray(p->buf, p->maxcols, sizeof(int));
 }
 
 static void
@@ -683,7 +681,7 @@ term_strlen(const struct termp *p, const char *cp)
                        cp++;
                        esc = mandoc_escape(&cp, &seq, &ssz);
                        if (ESCAPE_ERROR == esc)
-                               return(sz);
+                               continue;
 
                        if (TERMENC_ASCII != p->enc)
                                switch (esc) {
@@ -769,31 +767,31 @@ term_vspan(const struct termp *p, const struct roffsu *su)
 
        switch (su->unit) {
        case SCALE_CM:
-               r = su->scale * 2;
+               r = su->scale * 2.0;
                break;
        case SCALE_IN:
-               r = su->scale * 6;
+               r = su->scale * 6.0;
                break;
        case SCALE_PC:
                r = su->scale;
                break;
        case SCALE_PT:
-               r = su->scale / 8;
+               r = su->scale / 8.0;
                break;
        case SCALE_MM:
-               r = su->scale / 1000;
+               r = su->scale / 1000.0;
                break;
        case SCALE_VS:
                r = su->scale;
                break;
        default:
-               r = su->scale - 1;
+               r = su->scale - 1.0;
                break;
        }
 
        if (r < 0.0)
                r = 0.0;
-       return((size_t)r);
+       return((size_t)(r + 0.0005));
 }
 
 size_t
@@ -801,8 +799,8 @@ term_hspan(const struct termp *p, const struct roffsu *su)
 {
        double           v;
 
-       v = ((*p->hspan)(p, su));
+       v = (*p->hspan)(p, su);
        if (v < 0.0)
                v = 0.0;
-       return((size_t)v);
+       return((size_t)(v + 0.0005));
 }