=================================================================== RCS file: /cvs/mandoc/term_ps.c,v retrieving revision 1.4 retrieving revision 1.8 diff -u -p -r1.4 -r1.8 --- mandoc/term_ps.c 2010/06/09 08:07:13 1.4 +++ mandoc/term_ps.c 2010/06/11 15:26:39 1.8 @@ -1,4 +1,4 @@ -/* $Id: term_ps.c,v 1.4 2010/06/09 08:07:13 kristaps Exp $ */ +/* $Id: term_ps.c,v 1.8 2010/06/11 15:26:39 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -58,6 +58,7 @@ static void ps_begin(struct termp *); static void ps_end(struct termp *); static void ps_advance(struct termp *, size_t); static void ps_endline(struct termp *); +static void ps_pletter(struct termp *, char); static void ps_printf(struct termp *, const char *, ...); static void ps_putchar(struct termp *, char); @@ -125,6 +126,8 @@ ps_printf(struct termp *p, const char *fmt, ...) pos = (int)p->engine.ps.psmargcur; vsnprintf(&p->engine.ps.psmarg[pos], PS_BUFSLOP, fmt, ap); p->engine.ps.psmargcur = strlen(p->engine.ps.psmarg); + + va_end(ap); } @@ -143,7 +146,7 @@ ps_putchar(struct termp *p, char c) PS_GROWBUF(p, 2); pos = (int)p->engine.ps.psmargcur++; - p->engine.ps.psmarg[pos] = c; + p->engine.ps.psmarg[pos++] = c; p->engine.ps.psmarg[pos] = '\0'; } @@ -159,6 +162,8 @@ ps_end(struct termp *p) * well as just one. */ + assert(0 == p->engine.ps.psstate); + assert('\0' == p->engine.ps.last); assert(p->engine.ps.psmarg && p->engine.ps.psmarg[0]); printf("%s", p->engine.ps.psmarg); printf("showpage\n"); @@ -224,7 +229,7 @@ ps_begin(struct termp *p) static void -ps_letter(struct termp *p, char c) +ps_pletter(struct termp *p, char c) { if ( ! (PS_INLINE & p->engine.ps.psstate)) { @@ -264,15 +269,53 @@ ps_letter(struct termp *p, char c) static void +ps_letter(struct termp *p, char c) +{ + char cc; + + 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; + } + + return(ps_pletter(p, c)); +} + + +static void ps_advance(struct termp *p, size_t len) { + size_t i; + if ('\0' != p->engine.ps.last) { + ps_pletter(p, p->engine.ps.last); + p->engine.ps.last = '\0'; + } + 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; } @@ -281,10 +324,20 @@ static void ps_endline(struct termp *p) { + if ('\0' != p->engine.ps.last) { + ps_pletter(p, p->engine.ps.last); + p->engine.ps.last = '\0'; + } + 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;