=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/term.c,v retrieving revision 1.107 retrieving revision 1.108 diff -c -r1.107 -r1.108 *** src/usr.bin/mandoc/term.c 2015/04/04 17:46:58 1.107 --- src/usr.bin/mandoc/term.c 2015/04/29 18:32:57 1.108 *************** *** 1,4 **** ! /* $OpenBSD: term.c,v 1.107 2015/04/04 17:46:58 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: term.c,v 1.108 2015/04/29 18:32:57 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze *************** *** 263,268 **** --- 263,269 ---- p->col = 0; p->overstep = 0; + p->flags &= ~(TERMP_BACKAFTER | TERMP_BACKBEFORE); if ( ! (TERMP_NOBREAK & p->flags)) { p->viscol = 0; *************** *** 415,425 **** while ('\0' != *word) { if ('\\' != *word) { - if (TERMP_SKIPCHAR & p->flags) { - p->flags &= ~TERMP_SKIPCHAR; - word++; - continue; - } if (TERMP_NBRWORD & p->flags) { if (' ' == *word) { encode(p, nbrsp, 1); --- 416,421 ---- *************** *** 478,490 **** term_fontlast(p); continue; case ESCAPE_NOSPACE: ! if (TERMP_SKIPCHAR & p->flags) ! p->flags &= ~TERMP_SKIPCHAR; ! else if ('\0' == *word) p->flags |= (TERMP_NOSPACE | TERMP_NONEWLINE); continue; case ESCAPE_SKIPCHAR: ! p->flags |= TERMP_SKIPCHAR; continue; case ESCAPE_OVERSTRIKE: cp = seq + sz; --- 474,486 ---- term_fontlast(p); continue; case ESCAPE_NOSPACE: ! if (p->flags & TERMP_BACKAFTER) ! p->flags &= ~TERMP_BACKAFTER; ! else if (*word == '\0') p->flags |= (TERMP_NOSPACE | TERMP_NONEWLINE); continue; case ESCAPE_SKIPCHAR: ! p->flags |= TERMP_BACKAFTER; continue; case ESCAPE_OVERSTRIKE: cp = seq + sz; *************** *** 494,502 **** continue; } encode1(p, *seq++); ! if (seq < cp) ! encode(p, "\b", 1); } default: continue; } --- 490,503 ---- continue; } encode1(p, *seq++); ! if (seq < cp) { ! if (p->flags & TERMP_BACKBEFORE) ! p->flags |= TERMP_BACKAFTER; ! else ! p->flags |= TERMP_BACKBEFORE; ! } } + continue; default: continue; } *************** *** 551,566 **** { enum termfont f; ! if (TERMP_SKIPCHAR & p->flags) { ! p->flags &= ~TERMP_SKIPCHAR; ! return; ! } ! if (p->col + 6 >= p->maxcols) ! adjbuf(p, p->col + 6); ! f = p->fontq[p->fonti]; ! if (TERMFONT_UNDER == f || TERMFONT_BI == f) { p->buf[p->col++] = '_'; p->buf[p->col++] = 8; --- 552,567 ---- { enum termfont f; ! if (p->col + 7 >= p->maxcols) ! adjbuf(p, p->col + 7); ! f = (c == ASCII_HYPH || isgraph(c)) ? ! p->fontq[p->fonti] : TERMFONT_NONE; ! if (p->flags & TERMP_BACKBEFORE) { ! p->buf[p->col++] = 8; ! p->flags &= ~TERMP_BACKBEFORE; ! } if (TERMFONT_UNDER == f || TERMFONT_BI == f) { p->buf[p->col++] = '_'; p->buf[p->col++] = 8; *************** *** 573,578 **** --- 574,583 ---- p->buf[p->col++] = 8; } p->buf[p->col++] = c; + if (p->flags & TERMP_BACKAFTER) { + p->flags |= TERMP_BACKBEFORE; + p->flags &= ~TERMP_BACKAFTER; + } } static void *************** *** 580,608 **** { size_t i; ! if (TERMP_SKIPCHAR & p->flags) { ! p->flags &= ~TERMP_SKIPCHAR; ! return; ! } ! ! /* ! * Encode and buffer a string of characters. If the current ! * font mode is unset, buffer directly, else encode then buffer ! * character by character. ! */ ! ! if (p->fontq[p->fonti] == TERMFONT_NONE) { ! if (p->col + sz >= p->maxcols) ! adjbuf(p, p->col + sz); ! for (i = 0; i < sz; i++) ! p->buf[p->col++] = word[i]; ! return; ! } ! ! /* Pre-buffer, assuming worst-case. */ ! ! if (p->col + 1 + (sz * 5) >= p->maxcols) ! adjbuf(p, p->col + 1 + (sz * 5)); for (i = 0; i < sz; i++) { if (ASCII_HYPH == word[i] || --- 585,592 ---- { size_t i; ! if (p->col + 2 + (sz * 5) >= p->maxcols) ! adjbuf(p, p->col + 2 + (sz * 5)); for (i = 0; i < sz; i++) { if (ASCII_HYPH == word[i] ||