=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.149 retrieving revision 1.157 diff -u -p -r1.149 -r1.157 --- mandoc/term.c 2010/06/25 18:53:14 1.149 +++ mandoc/term.c 2010/07/02 10:50:50 1.157 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.149 2010/06/25 18:53:14 kristaps Exp $ */ +/* $Id: term.c,v 1.157 2010/07/02 10:50:50 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -31,8 +31,6 @@ #include "chars.h" #include "out.h" #include "term.h" -#include "man.h" -#include "mdoc.h" #include "main.h" static void spec(struct termp *, const char *, size_t); @@ -135,9 +133,10 @@ term_flushln(struct termp *p) size_t vbl; /* number of blanks to prepend to output */ size_t vend; /* end of word visual position on output */ size_t bp; /* visual right border position */ - int j; /* temporary loop index */ - int jhy; /* last hyphen before line overflow */ - size_t maxvis, mmax; + int j; /* temporary loop index for p->buf */ + int jhy; /* last hyph before overflow w/r/t j */ + size_t maxvis; /* output position of visible boundary */ + size_t mmax; /* used in calculating bp */ /* * First, establish the maximum columns of "visible" content. @@ -162,21 +161,17 @@ term_flushln(struct termp *p) */ vbl = p->flags & TERMP_NOLPAD ? 0 : p->offset; - /* - * FIXME: if bp is zero, we still output the first word before - * breaking the line. - */ - vis = vend = i = 0; - while (i < (int)p->col) { + while (i < (int)p->col) { /* - * Handle literal tab characters. + * Handle literal tab characters: collapse all + * subsequent tabs into a single huge set of spaces. */ for (j = i; j < (int)p->col; j++) { if ('\t' != p->buf[j]) break; - vend = (vis/p->tabwidth+1)*p->tabwidth; + vend = (vis / p->tabwidth + 1) * p->tabwidth; vbl += vend - vis; vis = vend; } @@ -192,13 +187,21 @@ term_flushln(struct termp *p) for (jhy = 0; j < (int)p->col; j++) { if ((j && ' ' == p->buf[j]) || '\t' == p->buf[j]) break; - if (8 != p->buf[j]) { - if (vend > vis && vend < bp && - ASCII_HYPH == p->buf[j]) - jhy = j; - vend++; - } else - vend--; + + /* Back over the the last printed character. */ + if (8 == p->buf[j]) { + assert(j); + vend -= (*p->width)(p, p->buf[j - 1]); + continue; + } + + /* Regular word. */ + /* Break at the hyphen point if we overrun. */ + if (vend > vis && vend < bp && + ASCII_HYPH == p->buf[j]) + jhy = j; + + vend += (*p->width)(p, p->buf[j]); } /* @@ -238,13 +241,13 @@ term_flushln(struct termp *p) break; if (' ' == p->buf[i]) { while (' ' == p->buf[i]) { - vbl++; + vbl += (*p->width)(p, p->buf[i]); i++; } break; } if (ASCII_NBRSP == p->buf[i]) { - vbl++; + vbl += (*p->width)(p, ' '); continue; } @@ -259,12 +262,13 @@ term_flushln(struct termp *p) vbl = 0; } - if (ASCII_HYPH == p->buf[i]) + if (ASCII_HYPH == p->buf[i]) { (*p->letter)(p, '-'); - else + p->viscol += (*p->width)(p, '-'); + } else { (*p->letter)(p, p->buf[i]); - - p->viscol += 1; + p->viscol += (*p->width)(p, p->buf[i]); + } } vend += vbl; vis = vend; @@ -282,7 +286,7 @@ term_flushln(struct termp *p) if (TERMP_HANG & p->flags) { /* We need one blank after the tag. */ p->overstep = /* LINTED */ - vis - maxvis + 1; + vis - maxvis + (*p->width)(p, ' '); /* * Behave exactly the same way as groff: @@ -306,7 +310,8 @@ term_flushln(struct termp *p) /* Right-pad. */ if (maxvis > vis + /* LINTED */ - ((TERMP_TWOSPACE & p->flags) ? 1 : 0)) { + ((TERMP_TWOSPACE & p->flags) ? + (*p->width)(p, ' ') : 0)) { p->viscol += maxvis - vis; (*p->advance)(p, maxvis - vis); vis += (maxvis - vis); @@ -482,9 +487,14 @@ term_word(struct termp *p, const char *word) } if ( ! (TERMP_NOSPACE & p->flags)) { - bufferc(p, ' '); - if (TERMP_SENTENCE & p->flags) + if ( ! (TERMP_KEEP & p->flags)) { + if (TERMP_PREKEEP & p->flags) + p->flags |= TERMP_KEEP; bufferc(p, ' '); + if (TERMP_SENTENCE & p->flags) + bufferc(p, ' '); + } else + bufferc(p, ASCII_NBRSP); } if ( ! (p->flags & TERMP_NONOSPACE)) @@ -643,6 +653,7 @@ term_strlen(const struct termp *p, const char *cp) } +/* ARGSUSED */ size_t term_vspan(const struct termp *p, const struct roffsu *su) { @@ -682,39 +693,11 @@ term_vspan(const struct termp *p, const struct roffsu size_t term_hspan(const struct termp *p, const struct roffsu *su) { - double r; + double v; - /* XXX: CM, IN, and PT are approximations. */ - - switch (su->unit) { - case (SCALE_CM): - r = 4 * su->scale; - break; - case (SCALE_IN): - /* XXX: this is an approximation. */ - r = 10 * su->scale; - break; - case (SCALE_PC): - r = (10 * su->scale) / 6; - break; - case (SCALE_PT): - r = (10 * su->scale) / 72; - break; - case (SCALE_MM): - r = su->scale / 1000; /* FIXME: double-check. */ - break; - case (SCALE_VS): - r = su->scale * 2 - 1; /* FIXME: double-check. */ - break; - default: - r = su->scale; - break; - } - - if (r < 0.0) - r = 0.0; - return((size_t)/* LINTED */ - r); + v = ((*p->hspan)(p, su)); + if (v < 0.0) + v = 0.0; + return((size_t) /* LINTED */ + v); } - -