=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.182 retrieving revision 1.186 diff -u -p -r1.182 -r1.186 --- mandoc/term.c 2011/03/22 14:05:45 1.182 +++ mandoc/term.c 2011/04/30 22:24:31 1.186 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.182 2011/03/22 14:05:45 kristaps Exp $ */ +/* $Id: term.c,v 1.186 2011/04/30 22:24:31 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -33,8 +33,7 @@ #include "term.h" #include "main.h" -static void spec(struct termp *, enum roffdeco, - const char *, size_t); +static void spec(struct termp *, const char *, size_t); static void res(struct termp *, const char *, size_t); static void bufferc(struct termp *, char); static void adjbuf(struct termp *p, size_t); @@ -48,7 +47,7 @@ term_free(struct termp *p) if (p->buf) free(p->buf); if (p->symtab) - chars_free(p->symtab); + mchars_free(p->symtab); free(p); } @@ -349,24 +348,23 @@ term_vspace(struct termp *p) static void numbered(struct termp *p, const char *word, size_t len) { - const char *rhs; + char c; - rhs = chars_num2char(word, len); - if (rhs) - encode(p, rhs, 1); + if ('\0' != (c = mchars_num2char(word, len))) + encode(p, &c, 1); } static void -spec(struct termp *p, enum roffdeco d, const char *word, size_t len) +spec(struct termp *p, const char *word, size_t len) { const char *rhs; size_t sz; - rhs = chars_spec2str(p->symtab, word, len, &sz); + rhs = mchars_spec2str(p->symtab, word, len, &sz); if (rhs) encode(p, rhs, sz); - else if (DECO_SSPECIAL == d) + else if (1 == len) encode(p, word, len); } @@ -377,7 +375,7 @@ res(struct termp *p, const char *word, size_t len) const char *rhs; size_t sz; - rhs = chars_res2str(p->symtab, word, len, &sz); + rhs = mchars_res2str(p->symtab, word, len, &sz); if (rhs) encode(p, rhs, sz); } @@ -456,12 +454,11 @@ term_fontpop(struct termp *p) void term_word(struct termp *p, const char *word) { - const char *sv, *seq; + const char *seq; + int sz; size_t ssz; - enum roffdeco deco; + enum mandoc_esc esc; - sv = word; - if ( ! (TERMP_NOSPACE & p->flags)) { if ( ! (TERMP_KEEP & p->flags)) { if (TERMP_PREKEEP & p->flags) @@ -480,7 +477,7 @@ term_word(struct termp *p, const char *word) p->flags &= ~(TERMP_SENTENCE | TERMP_IGNDELIM); - while (*word) { + while ('\0' != *word) { if ((ssz = strcspn(word, "\\")) > 0) encode(p, word, ssz); @@ -488,39 +485,40 @@ term_word(struct termp *p, const char *word) if ('\\' != *word) continue; - seq = ++word; - word += a2roffdeco(&deco, &seq, &ssz); + word++; + esc = mandoc_escape(&word, &seq, &sz); + if (ESCAPE_ERROR == esc) + break; - switch (deco) { - case (DECO_NUMBERED): - numbered(p, seq, ssz); + switch (esc) { + case (ESCAPE_NUMBERED): + numbered(p, seq, sz); break; - case (DECO_RESERVED): - res(p, seq, ssz); + case (ESCAPE_PREDEF): + res(p, seq, sz); break; - case (DECO_SPECIAL): - /* FALLTHROUGH */ - case (DECO_SSPECIAL): - spec(p, deco, seq, ssz); + case (ESCAPE_SPECIAL): + spec(p, seq, sz); break; - case (DECO_BOLD): + case (ESCAPE_FONTBOLD): term_fontrepl(p, TERMFONT_BOLD); break; - case (DECO_ITALIC): + case (ESCAPE_FONTITALIC): term_fontrepl(p, TERMFONT_UNDER); break; - case (DECO_ROMAN): + case (ESCAPE_FONTROMAN): term_fontrepl(p, TERMFONT_NONE); break; - case (DECO_PREVIOUS): + case (ESCAPE_FONTPREV): term_fontlast(p); break; + case (ESCAPE_NOSPACE): + if ('\0' == *word) + p->flags |= TERMP_NOSPACE; + break; default: break; } - - if (DECO_NOSPACE == deco && '\0' == *word) - p->flags |= TERMP_NOSPACE; } } @@ -602,33 +600,36 @@ term_len(const struct termp *p, size_t sz) size_t term_strlen(const struct termp *p, const char *cp) { - size_t sz, ssz, rsz, i; - enum roffdeco d; + size_t sz, rsz, i; + int ssz; + enum mandoc_esc esc; const char *seq, *rhs; - for (sz = 0; '\0' != *cp; ) - /* - * Account for escaped sequences within string length - * calculations. This follows the logic in term_word() - * as we must calculate the width of produced strings. - */ - if ('\\' == *cp) { - seq = ++cp; - cp += a2roffdeco(&d, &seq, &ssz); + /* + * Account for escaped sequences within string length + * calculations. This follows the logic in term_word() as we + * must calculate the width of produced strings. + */ - switch (d) { - case (DECO_RESERVED): - rhs = chars_res2str + sz = 0; + while ('\0' != *cp) + switch (*cp) { + case ('\\'): + ++cp; + esc = mandoc_escape(&cp, &seq, &ssz); + if (ESCAPE_ERROR == esc) + return(sz); + + switch (esc) { + case (ESCAPE_PREDEF): + rhs = mchars_res2str (p->symtab, seq, ssz, &rsz); break; - case (DECO_SPECIAL): - /* FALLTHROUGH */ - case (DECO_SSPECIAL): - rhs = chars_spec2str + case (ESCAPE_SPECIAL): + rhs = mchars_spec2str (p->symtab, seq, ssz, &rsz); - /* Allow for one-char escapes. */ - if (DECO_SSPECIAL != d || rhs) + if (ssz != 1 || rhs) break; rhs = seq; @@ -639,17 +640,24 @@ term_strlen(const struct termp *p, const char *cp) break; } - if (rhs) - for (i = 0; i < rsz; i++) - sz += (*p->width)(p, *rhs++); - } else if (ASCII_NBRSP == *cp) { + if (NULL == rhs) + break; + + for (i = 0; i < rsz; i++) + sz += (*p->width)(p, *rhs++); + break; + case (ASCII_NBRSP): sz += (*p->width)(p, ' '); cp++; - } else if (ASCII_HYPH == *cp) { + break; + case (ASCII_HYPH): sz += (*p->width)(p, '-'); cp++; - } else + break; + default: sz += (*p->width)(p, *cp++); + break; + } return(sz); }