=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.188 retrieving revision 1.191 diff -u -p -r1.188 -r1.191 --- mandoc/term.c 2011/05/14 18:15:20 1.188 +++ mandoc/term.c 2011/05/15 22:29:50 1.191 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.188 2011/05/14 18:15:20 kristaps Exp $ */ +/* $Id: term.c,v 1.191 2011/05/15 22:29:50 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -33,13 +33,10 @@ #include "term.h" #include "main.h" -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, int); -static void encode(struct termp *, const char *, size_t); +static void adjbuf(struct termp *p, int); +static void bufferc(struct termp *, char); +static void encode(struct termp *, const char *, size_t); - void term_free(struct termp *p) { @@ -344,43 +341,6 @@ term_vspace(struct termp *p) (*p->endline)(p); } - -static void -numbered(struct termp *p, const char *word, size_t len) -{ - char c; - - if ('\0' != (c = mchars_num2char(word, len))) - encode(p, &c, 1); -} - - -static void -spec(struct termp *p, const char *word, size_t len) -{ - const char *rhs; - size_t sz; - - rhs = mchars_spec2str(p->symtab, word, len, &sz); - if (rhs) - encode(p, rhs, sz); - else if (1 == len) - encode(p, word, len); -} - - -static void -res(struct termp *p, const char *word, size_t len) -{ - const char *rhs; - size_t sz; - - rhs = mchars_res2str(p->symtab, word, len, &sz); - if (rhs) - encode(p, rhs, sz); -} - - void term_fontlast(struct termp *p) { @@ -445,7 +405,6 @@ term_fontpop(struct termp *p) p->fonti--; } - /* * Handle pwords, partial words, which may be either a single word or a * phrase that cannot be broken down (such as a literal string). This @@ -454,7 +413,8 @@ term_fontpop(struct termp *p) void term_word(struct termp *p, const char *word) { - const char *seq; + const char *seq, *cp; + char c; int sz; size_t ssz; enum mandoc_esc esc; @@ -492,13 +452,20 @@ term_word(struct termp *p, const char *word) switch (esc) { case (ESCAPE_NUMBERED): - numbered(p, seq, sz); + if ('\0' != (c = mchars_num2char(seq, sz))) + encode(p, &c, 1); break; case (ESCAPE_PREDEF): - res(p, seq, sz); + cp = mchars_res2str(p->symtab, seq, sz, &ssz); + if (NULL != cp) + encode(p, cp, ssz); break; case (ESCAPE_SPECIAL): - spec(p, seq, sz); + cp = mchars_spec2str(p->symtab, seq, sz, &ssz); + if (NULL != cp) + encode(p, cp, ssz); + else if (1 == ssz) + encode(p, seq, sz); break; case (ESCAPE_FONTBOLD): term_fontrepl(p, TERMFONT_BOLD); @@ -522,7 +489,6 @@ term_word(struct termp *p, const char *word) } } - static void adjbuf(struct termp *p, int sz) { @@ -536,7 +502,6 @@ adjbuf(struct termp *p, int sz) (p->buf, sizeof(int) * (size_t)p->maxcols); } - static void bufferc(struct termp *p, char c) { @@ -547,7 +512,6 @@ bufferc(struct termp *p, char c) p->buf[p->col++] = c; } - static void encode(struct termp *p, const char *word, size_t sz) { @@ -592,7 +556,6 @@ encode(struct termp *p, const char *word, size_t sz) } } - size_t term_len(const struct termp *p, size_t sz) { @@ -605,9 +568,9 @@ size_t term_strlen(const struct termp *p, const char *cp) { size_t sz, rsz, i; - int ssz; - enum mandoc_esc esc; + int ssz, c; const char *seq, *rhs; + static const char rej[] = { '\\', ASCII_HYPH, ASCII_NBRSP, '\0' }; /* * Account for escaped sequences within string length @@ -616,15 +579,23 @@ term_strlen(const struct termp *p, const char *cp) */ sz = 0; - while ('\0' != *cp) + while ('\0' != *cp) { + rsz = strcspn(cp, rej); + for (i = 0; i < rsz; i++) + sz += (*p->width)(p, *cp++); + switch (*cp) { case ('\\'): - ++cp; - esc = mandoc_escape(&cp, &seq, &ssz); - if (ESCAPE_ERROR == esc) + cp++; + rhs = NULL; + switch (mandoc_escape(&cp, &seq, &ssz)) { + case (ESCAPE_ERROR): return(sz); - - switch (esc) { + 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); @@ -640,7 +611,6 @@ term_strlen(const struct termp *p, const char *cp) rsz = ssz; break; default: - rhs = NULL; break; } @@ -659,14 +629,13 @@ term_strlen(const struct termp *p, const char *cp) cp++; break; default: - sz += (*p->width)(p, *cp++); break; } + } return(sz); } - /* ARGSUSED */ size_t term_vspan(const struct termp *p, const struct roffsu *su) @@ -702,7 +671,6 @@ term_vspan(const struct termp *p, const struct roffsu return(/* LINTED */(size_t) r); } - size_t term_hspan(const struct termp *p, const struct roffsu *su)