=================================================================== RCS file: /cvs/mandoc/term_ps.c,v retrieving revision 1.5 retrieving revision 1.7 diff -u -p -r1.5 -r1.7 --- mandoc/term_ps.c 2010/06/09 08:31:18 1.5 +++ mandoc/term_ps.c 2010/06/11 07:23:04 1.7 @@ -1,4 +1,4 @@ -/* $Id: term_ps.c,v 1.5 2010/06/09 08:31:18 kristaps Exp $ */ +/* $Id: term_ps.c,v 1.7 2010/06/11 07:23:04 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -228,6 +228,7 @@ ps_begin(struct termp *p) static void ps_letter(struct termp *p, char c) { + char cc; if ( ! (PS_INLINE & p->engine.ps.psstate)) { /* @@ -240,6 +241,24 @@ ps_letter(struct termp *p, char c) p->engine.ps.psstate |= PS_INLINE; } + if ('\0' == p->engine.ps.last) { + assert(8 != c); + p->engine.ps.last = c; + return; + } else if (8 == p->engine.ps.last) { + assert(8 != c); + p->engine.ps.last = c; + return; + } else if (8 == c) { + assert(8 != p->engine.ps.last); + p->engine.ps.last = c; + return; + } else { + cc = p->engine.ps.last; + p->engine.ps.last = c; + c = cc; + } + /* * We need to escape these characters as per the PostScript * specification. We would also escape non-graphable characters @@ -268,13 +287,19 @@ ps_letter(struct termp *p, char c) static void ps_advance(struct termp *p, size_t len) { + size_t i; if (PS_INLINE & p->engine.ps.psstate) { - /* Dump out any existing line scope. */ - ps_printf(p, ") show\n"); - p->engine.ps.psstate &= ~PS_INLINE; + assert(8 != p->engine.ps.last); + if (p->engine.ps.last) + ps_letter(p, p->engine.ps.last); + p->engine.ps.last = '\0'; + for (i = 0; i < len; i++) + ps_letter(p, ' '); + return; } + assert('\0' == p->engine.ps.last); p->engine.ps.pscol += len ? len * PS_CHAR_WIDTH : 0; } @@ -284,9 +309,14 @@ ps_endline(struct termp *p) { if (PS_INLINE & p->engine.ps.psstate) { + assert(8 != p->engine.ps.last); + if (p->engine.ps.last) + ps_letter(p, p->engine.ps.last); + p->engine.ps.last = '\0'; ps_printf(p, ") show\n"); p->engine.ps.psstate &= ~PS_INLINE; - } + } else + assert('\0' == p->engine.ps.last); if (PS_MARGINS & p->engine.ps.psstate) return;