=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/term.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -r1.3 -r1.4 *** src/usr.bin/mandoc/term.c 2009/06/15 00:57:06 1.3 --- src/usr.bin/mandoc/term.c 2009/06/21 19:53:47 1.4 *************** *** 1,4 **** ! /* $Id: term.c,v 1.3 2009/06/15 00:57:06 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * --- 1,4 ---- ! /* $Id: term.c,v 1.4 2009/06/21 19:53:47 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * *************** *** 37,44 **** static void term_nescape(struct termp *, const char *, size_t); static void term_chara(struct termp *, char); ! static void term_stringa(struct termp *, ! const char *, size_t); static int term_isopendelim(const char *, int); static int term_isclosedelim(const char *, int); --- 37,43 ---- static void term_nescape(struct termp *, const char *, size_t); static void term_chara(struct termp *, char); ! static void term_encodea(struct termp *, char); static int term_isopendelim(const char *, int); static int term_isclosedelim(const char *, int); *************** *** 407,416 **** { const char *rhs; size_t sz; ! if (NULL == (rhs = term_a2ascii(p->symtab, word, len, &sz))) ! return; ! term_stringa(p, rhs, sz); } --- 406,416 ---- { const char *rhs; size_t sz; + int i; ! if ((rhs = term_a2ascii(p->symtab, word, len, &sz))) ! for (i = 0; i < (int)sz; i++) ! term_encodea(p, rhs[i]); } *************** *** 519,579 **** * before the word. */ ! for (i = 0; i < len; i++) { ! if ('\\' == word[i]) { term_pescape(p, word, &i, len); ! continue; ! } - if (TERMP_STYLE & p->flags) { - if (TERMP_BOLD & p->flags) { - term_chara(p, word[i]); - term_chara(p, 8); - } - if (TERMP_UNDER & p->flags) { - term_chara(p, '_'); - term_chara(p, 8); - } - } - - term_chara(p, word[i]); - } - if (term_isopendelim(word, len)) p->flags |= TERMP_NOSPACE; } /* - * Like term_chara() but for arbitrary-length buffers. Resize the - * buffer by a factor of two (if the buffer is less than that) or the - * buffer's size. - */ - static void - term_stringa(struct termp *p, const char *c, size_t sz) - { - size_t s; - - if (0 == sz) - return; - - assert(c); - if (p->col + sz >= p->maxcols) { - if (0 == p->maxcols) - p->maxcols = 256; - s = sz > p->maxcols * 2 ? sz : p->maxcols * 2; - p->buf = realloc(p->buf, s); - if (NULL == p->buf) - err(1, "realloc"); - p->maxcols = s; - } - - (void)memcpy(&p->buf[(int)p->col], c, sz); - p->col += sz; - } - - - /* * Insert a single character into the line-buffer. If the buffer's * space is exceeded, then allocate more space by doubling the buffer * size. --- 519,536 ---- * before the word. */ ! for (i = 0; i < len; i++) ! if ('\\' == word[i]) term_pescape(p, word, &i, len); ! else ! term_encodea(p, word[i]); if (term_isopendelim(word, len)) p->flags |= TERMP_NOSPACE; } /* * Insert a single character into the line-buffer. If the buffer's * space is exceeded, then allocate more space by doubling the buffer * size. *************** *** 595,597 **** --- 552,571 ---- p->buf[(int)(p->col)++] = c; } + + static void + term_encodea(struct termp *p, char c) + { + + if (TERMP_STYLE & p->flags) { + if (TERMP_BOLD & p->flags) { + term_chara(p, c); + term_chara(p, 8); + } + if (TERMP_UNDER & p->flags) { + term_chara(p, '_'); + term_chara(p, 8); + } + } + term_chara(p, c); + }