=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.118 retrieving revision 1.122 diff -u -p -r1.118 -r1.122 --- mandoc/term.c 2009/10/30 18:50:11 1.118 +++ mandoc/term.c 2009/11/05 08:40:16 1.122 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.118 2009/10/30 18:50:11 kristaps Exp $ */ +/* $Id: term.c,v 1.122 2009/11/05 08:40:16 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -15,7 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include -#include +#include #include #include #include @@ -79,7 +79,7 @@ term_alloc(enum termenc enc) p = calloc(1, sizeof(struct termp)); if (NULL == p) { - fprintf(stderr, "memory exhausted\n"); + perror(NULL); exit(EXIT_FAILURE); } p->maxrmargin = 78; @@ -147,9 +147,11 @@ term_flushln(struct termp *p) assert(p->offset < p->rmargin); maxvis = (int)(p->rmargin - p->offset) - overstep < 0 ? - 0 : p->rmargin - p->offset - overstep; + /* LINTED */ + 0 : p->rmargin - p->offset - overstep; mmax = (int)(p->maxrmargin - p->offset) - overstep < 0 ? - 0 : p->maxrmargin - p->offset - overstep; + /* LINTED */ + 0 : p->maxrmargin - p->offset - overstep; bp = TERMP_NOBREAK & p->flags ? mmax : maxvis; @@ -228,7 +230,12 @@ term_flushln(struct termp *p) for ( ; i < (int)p->col; i++) { if (' ' == p->buf[i]) break; - putchar(p->buf[i]); + + /* The unit sep. is a non-breaking space. */ + if (31 == p->buf[i]) + putchar(' '); + else + putchar(p->buf[i]); } vis += vsz; } @@ -367,7 +374,7 @@ do_reserved(struct termp *p, const char *word, size_t static void do_escaped(struct termp *p, const char **word) { - int j, type; + int j, type, sv; const char *wp; wp = *word; @@ -422,16 +429,29 @@ do_escaped(struct termp *p, const char **word) } switch (*wp) { + case ('3'): + /* FALLTHROUGH */ case ('B'): - p->bold++; + p->metamask = p->metafont; + p->metafont |= METAF_BOLD; break; + case ('2'): + /* FALLTHROUGH */ case ('I'): - p->under++; + p->metamask = p->metafont; + p->metafont |= METAF_UNDER; break; case ('P'): + sv = p->metamask; + p->metamask = p->metafont; + p->metafont = sv; + break; + case ('1'): /* FALLTHROUGH */ case ('R'): - p->bold = p->under = 0; + p->metamask = p->metafont; + p->metafont &= ~METAF_UNDER; + p->metafont &= ~METAF_BOLD; break; default: break; @@ -544,7 +564,7 @@ buffer(struct termp *p, char c) s = p->maxcols * 2; p->buf = realloc(p->buf, s); if (NULL == p->buf) { - fprintf(stderr, "memory exhausted\n"); + perror(NULL); exit(EXIT_FAILURE); } p->maxcols = s; @@ -557,12 +577,12 @@ static void encode(struct termp *p, char c) { - if (' ' != c) { - if (p->under) { + if (isgraph((u_char)c)) { + if (p->under || METAF_UNDER & p->metafont) { buffer(p, '_'); buffer(p, 8); } - if (p->bold) { + if (p->bold || METAF_BOLD & p->metafont) { buffer(p, c); buffer(p, 8); }