=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/term.c,v retrieving revision 1.126 retrieving revision 1.127 diff -c -r1.126 -r1.127 *** src/usr.bin/mandoc/term.c 2017/06/07 17:38:08 1.126 --- src/usr.bin/mandoc/term.c 2017/06/07 20:01:07 1.127 *************** *** 1,4 **** ! /* $OpenBSD: term.c,v 1.126 2017/06/07 17:38:08 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2017 Ingo Schwarze --- 1,4 ---- ! /* $OpenBSD: term.c,v 1.127 2017/06/07 20:01:07 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2017 Ingo Schwarze *************** *** 93,99 **** void term_flushln(struct termp *p) { - size_t i; /* current input position in p->tcol->buf */ size_t vis; /* current visual position on output */ size_t vbl; /* number of blanks to prepend to output */ size_t vend; /* end of word visual position on output */ --- 93,98 ---- *************** *** 114,133 **** p->maxrmargin > p->viscol + vbl ? p->maxrmargin - p->viscol - vbl : 0; vis = vend = 0; - i = 0; ! while (i < p->lastcol) { /* * Handle literal tab characters: collapse all * subsequent tabs into a single huge set of spaces. */ ntab = 0; ! while (i < p->lastcol && p->tcol->buf[i] == '\t') { vend = term_tab_next(vis); vbl += vend - vis; vis = vend; ntab++; ! i++; } /* --- 113,136 ---- p->maxrmargin > p->viscol + vbl ? p->maxrmargin - p->viscol - vbl : 0; vis = vend = 0; ! if (p->lasttcol == 0) ! p->tcol->col = 0; ! while (p->tcol->col < p->lastcol) { ! /* * Handle literal tab characters: collapse all * subsequent tabs into a single huge set of spaces. */ + ntab = 0; ! while (p->tcol->col < p->lastcol && ! p->tcol->buf[p->tcol->col] == '\t') { vend = term_tab_next(vis); vbl += vend - vis; vis = vend; ntab++; ! p->tcol->col++; } /* *************** *** 137,143 **** * space is printed according to regular spacing rules). */ ! for (j = i, jhy = 0; j < p->lastcol; j++) { if (p->tcol->buf[j] == ' ' || p->tcol->buf[j] == '\t') break; --- 140,147 ---- * space is printed according to regular spacing rules). */ ! jhy = 0; ! for (j = p->tcol->col; j < p->lastcol; j++) { if (p->tcol->buf[j] == ' ' || p->tcol->buf[j] == '\t') break; *************** *** 169,178 **** * Find out whether we would exceed the right margin. * If so, break to the next line. */ ! if (vend > bp && 0 == jhy && vis > 0 && (p->flags & TERMP_BRNEVER) == 0) { ! vend -= vis; endline(p); /* Use pending tabs on the new line. */ --- 173,186 ---- * Find out whether we would exceed the right margin. * If so, break to the next line. */ ! ! if (vend > bp && jhy == 0 && vis > 0 && (p->flags & TERMP_BRNEVER) == 0) { ! if (p->lasttcol) ! return; ! endline(p); + vend -= vis; /* Use pending tabs on the new line. */ *************** *** 192,218 **** p->maxrmargin > vbl ? p->maxrmargin - vbl : 0; } ! /* Write out the [remaining] word. */ ! for ( ; i < p->lastcol; i++) { ! if (vend > bp && jhy > 0 && i > jhy) break; ! if (p->tcol->buf[i] == '\t') break; ! if (p->tcol->buf[i] == ' ') { ! j = i; ! while (i < p->lastcol && ! p->tcol->buf[i] == ' ') ! i++; ! dv = (i - j) * (*p->width)(p, ' '); vbl += dv; vend += dv; break; } ! if (p->tcol->buf[i] == ASCII_NBRSP) { vbl += (*p->width)(p, ' '); continue; } ! if (p->tcol->buf[i] == ASCII_BREAK) continue; /* --- 200,229 ---- p->maxrmargin > vbl ? p->maxrmargin - vbl : 0; } ! /* ! * Write out the rest of the word. ! */ ! ! for ( ; p->tcol->col < p->lastcol; p->tcol->col++) { ! if (vend > bp && jhy > 0 && p->tcol->col > jhy) break; ! if (p->tcol->buf[p->tcol->col] == '\t') break; ! if (p->tcol->buf[p->tcol->col] == ' ') { ! j = p->tcol->col; ! while (p->tcol->col < p->lastcol && ! p->tcol->buf[p->tcol->col] == ' ') ! p->tcol->col++; ! dv = (p->tcol->col - j) * (*p->width)(p, ' '); vbl += dv; vend += dv; break; } ! if (p->tcol->buf[p->tcol->col] == ASCII_NBRSP) { vbl += (*p->width)(p, ' '); continue; } ! if (p->tcol->buf[p->tcol->col] == ASCII_BREAK) continue; /* *************** *** 226,236 **** vbl = 0; } ! (*p->letter)(p, p->tcol->buf[i]); ! if (p->tcol->buf[i] == '\b') ! p->viscol -= (*p->width)(p, p->tcol->buf[i-1]); else ! p->viscol += (*p->width)(p, p->tcol->buf[i]); } vis = vend; } --- 237,249 ---- vbl = 0; } ! (*p->letter)(p, p->tcol->buf[p->tcol->col]); ! if (p->tcol->buf[p->tcol->col] == '\b') ! p->viscol -= (*p->width)(p, ! p->tcol->buf[p->tcol->col - 1]); else ! p->viscol += (*p->width)(p, ! p->tcol->buf[p->tcol->col]); } vis = vend; } *************** *** 239,244 **** --- 252,258 ---- * If there was trailing white space, it was not printed; * so reset the cursor position accordingly. */ + if (vis > vbl) vis -= vbl; else *************** *** 249,254 **** --- 263,269 ---- p->flags &= ~(TERMP_BACKAFTER | TERMP_BACKBEFORE | TERMP_NOPAD); /* Trailing whitespace is significant in some columns. */ + if (vis && vbl && (TERMP_BRTRSP & p->flags)) vis += vbl;