-/* $OpenBSD: term.c,v 1.124 2017/06/04 22:43:50 schwarze Exp $ */
+/* $OpenBSD: term.c,v 1.125 2017/06/07 02:13:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
vis = vend = 0;
i = 0;
- while (i < p->col) {
+ while (i < p->lastcol) {
/*
* Handle literal tab characters: collapse all
* subsequent tabs into a single huge set of spaces.
*/
ntab = 0;
- while (i < p->col && p->buf[i] == '\t') {
+ while (i < p->lastcol && p->buf[i] == '\t') {
vend = term_tab_next(vis);
vbl += vend - vis;
vis = vend;
* space is printed according to regular spacing rules).
*/
- for (j = i, jhy = 0; j < p->col; j++) {
+ for (j = i, jhy = 0; j < p->lastcol; j++) {
if (' ' == p->buf[j] || '\t' == p->buf[j])
break;
}
/* Write out the [remaining] word. */
- for ( ; i < p->col; i++) {
+ for ( ; i < p->lastcol; i++) {
if (vend > bp && jhy > 0 && i > jhy)
break;
if ('\t' == p->buf[i])
break;
if (' ' == p->buf[i]) {
j = i;
- while (i < p->col && ' ' == p->buf[i])
+ while (i < p->lastcol && ' ' == p->buf[i])
i++;
dv = (i - j) * (*p->width)(p, ' ');
vbl += dv;
else
vis = 0;
- p->col = 0;
+ p->col = p->lastcol = 0;
p->minbl = p->trailspace;
p->flags &= ~(TERMP_BACKAFTER | TERMP_BACKBEFORE | TERMP_NOPAD);
{
p->flags |= TERMP_NOSPACE;
- if (p->col || p->viscol)
+ if (p->lastcol || p->viscol)
term_flushln(p);
}
}
}
/* Trim trailing backspace/blank pair. */
- if (p->col > 2 &&
- (p->buf[p->col - 1] == ' ' ||
- p->buf[p->col - 1] == '\t'))
- p->col -= 2;
+ if (p->lastcol > 2 &&
+ (p->buf[p->lastcol - 1] == ' ' ||
+ p->buf[p->lastcol - 1] == '\t'))
+ p->lastcol -= 2;
+ if (p->col > p->lastcol)
+ p->col = p->lastcol;
continue;
default:
continue;
}
if (p->col + 1 >= p->maxcols)
adjbuf(p, p->col + 1);
- p->buf[p->col++] = c;
+ if (p->lastcol <= p->col || (c != ' ' && c != ASCII_NBRSP))
+ p->buf[p->col] = c;
+ if (p->lastcol < ++p->col)
+ p->lastcol = p->col;
}
/*
p->buf[p->col++] = c;
p->buf[p->col++] = 8;
}
- p->buf[p->col++] = c;
+ if (p->lastcol <= p->col || (c != ' ' && c != ASCII_NBRSP))
+ p->buf[p->col] = c;
+ if (p->lastcol < ++p->col)
+ p->lastcol = p->col;
if (p->flags & TERMP_BACKAFTER) {
p->flags |= TERMP_BACKBEFORE;
p->flags &= ~TERMP_BACKAFTER;
isgraph((unsigned char)word[i]))
encode1(p, word[i]);
else {
- p->buf[p->col++] = word[i];
+ if (p->lastcol <= p->col ||
+ (word[i] != ' ' && word[i] != ASCII_NBRSP))
+ p->buf[p->col] = word[i];
+ p->col++;
/*
* Postpone the effect of \z while handling
}
}
}
+ if (p->lastcol < p->col)
+ p->lastcol = p->col;
}
void
-/* $OpenBSD: term.h,v 1.67 2017/06/04 22:43:50 schwarze Exp $ */
+/* $OpenBSD: term.h,v 1.68 2017/06/07 02:13:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
size_t maxrmargin; /* Max right margin. */
size_t maxcols; /* Max size of buf. */
size_t offset; /* Margin offest. */
- size_t col; /* Bytes in buf. */
+ size_t col; /* Byte position in buf. */
+ size_t lastcol; /* Bytes in buf. */
size_t viscol; /* Chars on current line. */
size_t trailspace; /* See termp_flushln(). */
size_t minbl; /* Minimum blanks before next field. */