=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.194 retrieving revision 1.199 diff -u -p -r1.194 -r1.199 --- mandoc/term.c 2011/05/17 22:32:45 1.194 +++ mandoc/term.c 2011/09/18 21:18:19 1.199 @@ -1,6 +1,6 @@ -/* $Id: term.c,v 1.194 2011/05/17 22:32:45 kristaps Exp $ */ +/* $Id: term.c,v 1.199 2011/09/18 21:18:19 schwarze Exp $ */ /* - * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any @@ -439,25 +439,33 @@ term_word(struct termp *p, const char *word) if (ESCAPE_ERROR == esc) break; - switch (esc) { - case (ESCAPE_UNICODE): - if (TERMENC_ASCII == p->enc) { - encode1(p, '?'); + 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; } - uc = mchars_num2uc(seq + 1, sz - 1); - if ('\0' != uc) - encode1(p, uc); + + switch (esc) { + case (ESCAPE_UNICODE): + encode1(p, '?'); break; case (ESCAPE_NUMBERED): - if ('\0' != (c = mchars_num2char(seq, sz))) + c = mchars_num2char(seq, sz); + if ('\0' != c) encode(p, &c, 1); break; - case (ESCAPE_PREDEF): - cp = mchars_res2str(p->symtab, seq, sz, &ssz); - if (NULL != cp) - encode(p, cp, ssz); - break; case (ESCAPE_SPECIAL): cp = mchars_spec2str(p->symtab, seq, sz, &ssz); if (NULL != cp) @@ -471,6 +479,8 @@ term_word(struct termp *p, const char *word) case (ESCAPE_FONTITALIC): term_fontrepl(p, TERMFONT_UNDER); break; + case (ESCAPE_FONT): + /* FALLTHROUGH */ case (ESCAPE_FONTROMAN): term_fontrepl(p, TERMFONT_NONE); break; @@ -566,13 +576,16 @@ encode(struct termp *p, const char *word, size_t sz) adjbuf(p, p->col + 1 + (len * 3)); for (i = 0; i < len; i++) { - if ( ! isgraph((unsigned char)word[i])) { + if (ASCII_HYPH != word[i] && + ! isgraph((unsigned char)word[i])) { p->buf[p->col++] = word[i]; continue; } if (TERMFONT_UNDER == f) p->buf[p->col++] = '_'; + else if (ASCII_HYPH == word[i]) + p->buf[p->col++] = '-'; else p->buf[p->col++] = word[i]; @@ -595,6 +608,7 @@ term_strlen(const struct termp *p, const char *cp) size_t sz, rsz, i; int ssz, c; const char *seq, *rhs; + enum mandoc_esc esc; static const char rej[] = { '\\', ASCII_HYPH, ASCII_NBRSP, '\0' }; /* @@ -613,27 +627,40 @@ term_strlen(const struct termp *p, const char *cp) switch (*cp) { case ('\\'): cp++; - rhs = NULL; - switch (mandoc_escape(&cp, &seq, &ssz)) { - case (ESCAPE_ERROR): + esc = mandoc_escape(&cp, &seq, &ssz); + if (ESCAPE_ERROR == esc) return(sz); - case (ESCAPE_UNICODE): - if (TERMENC_ASCII != p->enc) { - sz += (*p->width)(p, '?'); + + if (TERMENC_ASCII != p->enc) + switch (esc) { + case (ESCAPE_UNICODE): + c = mchars_num2uc + (seq + 1, ssz - 1); + if ('\0' == c) + break; + sz += (*p->width)(p, c); + continue; + case (ESCAPE_SPECIAL): + c = mchars_spec2cp + (p->symtab, seq, ssz); + if (c <= 0) + break; + sz += (*p->width)(p, c); + continue; + default: break; } - c = mchars_num2uc(seq + 1, ssz - 1); - if ('\0' != c) - sz += (*p->width)(p, c); + + rhs = NULL; + + switch (esc) { + case (ESCAPE_UNICODE): + sz += (*p->width)(p, '?'); break; case (ESCAPE_NUMBERED): c = mchars_num2char(seq, ssz); if ('\0' != c) sz += (*p->width)(p, c); - break; - case (ESCAPE_PREDEF): - rhs = mchars_res2str - (p->symtab, seq, ssz, &rsz); break; case (ESCAPE_SPECIAL): rhs = mchars_spec2str