=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.223 retrieving revision 1.232 diff -u -p -r1.223 -r1.232 --- mandoc/term.c 2014/04/23 21:06:41 1.223 +++ mandoc/term.c 2014/10/28 18:49:33 1.232 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.223 2014/04/23 21:06:41 schwarze Exp $ */ +/* $Id: term.c,v 1.232 2014/10/28 18:49:33 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -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 @@ -44,11 +42,7 @@ void term_free(struct termp *p) { - if (p->buf) - free(p->buf); - if (p->symtab) - mchars_free(p->symtab); - + free(p->buf); free(p); } @@ -222,7 +216,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,29 +438,16 @@ 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) { - case ESCAPE_UNICODE: - uc = mchars_num2uc(seq + 1, sz - 1); - if ('\0' == uc) - break; - encode1(p, uc); - continue; - case ESCAPE_SPECIAL: - uc = mchars_spec2cp(p->symtab, seq, sz); - if (uc <= 0) - break; - encode1(p, uc); - continue; - default: - break; - } - switch (esc) { case ESCAPE_UNICODE: - encode1(p, '?'); + uc = mchars_num2uc(seq + 1, sz - 1); + if (p->enc == TERMENC_ASCII) { + cp = ascii_uc2str(uc); + encode(p, cp, strlen(cp)); + } else + encode1(p, uc); break; case ESCAPE_NUMBERED: c = mchars_num2char(seq, sz); @@ -474,11 +455,16 @@ term_word(struct termp *p, const char *word) encode(p, &c, 1); break; case ESCAPE_SPECIAL: - cp = mchars_spec2str(p->symtab, seq, sz, &ssz); - if (NULL != cp) - encode(p, cp, ssz); - else if (1 == ssz) - encode(p, seq, sz); + if (p->enc == TERMENC_ASCII) { + cp = mchars_spec2str(p->symtab, + seq, sz, &ssz); + if (cp != NULL) + encode(p, cp, ssz); + } else { + uc = mchars_spec2cp(p->symtab, seq, sz); + if (uc > 0) + encode1(p, uc); + } break; case ESCAPE_FONTBOLD: term_fontrepl(p, TERMFONT_BOLD); @@ -683,33 +669,18 @@ 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) { - case ESCAPE_UNICODE: - c = mchars_num2uc(seq + 1, - ssz - 1); - if ('\0' == c) - break; - sz += cond_width(p, c, &skip); - continue; - case ESCAPE_SPECIAL: - c = mchars_spec2cp(p->symtab, - seq, ssz); - if (c <= 0) - break; - sz += cond_width(p, c, &skip); - continue; - default: - break; - } - rhs = NULL; switch (esc) { case ESCAPE_UNICODE: - sz += cond_width(p, '?', &skip); + c = mchars_num2uc(seq + 1, sz - 1); + if (p->enc == TERMENC_ASCII) { + rhs = ascii_uc2str(c); + rsz = strlen(rhs); + } else + sz += cond_width(p, c, &skip); break; case ESCAPE_NUMBERED: c = mchars_num2char(seq, ssz); @@ -717,14 +688,15 @@ term_strlen(const struct termp *p, const char *cp) sz += cond_width(p, c, &skip); break; case ESCAPE_SPECIAL: - rhs = mchars_spec2str(p->symtab, - seq, ssz, &rsz); - - if (ssz != 1 || rhs) - break; - - rhs = seq; - rsz = ssz; + if (p->enc == TERMENC_ASCII) + rhs = mchars_spec2str(p->symtab, + seq, ssz, &rsz); + else { + c = mchars_spec2cp(p->symtab, + seq, ssz); + if (c > 0) + sz += cond_width(p, c, &skip); + } break; case ESCAPE_SKIPCHAR: skip = 1; @@ -769,31 +741,31 @@ term_vspan(const struct termp *p, const struct roffsu 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 +773,8 @@ term_hspan(const struct termp *p, const struct roffsu { 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)); }