summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--term.c41
-rw-r--r--term.h3
2 files changed, 29 insertions, 15 deletions
diff --git a/term.c b/term.c
index b9bdc9b9..26c93a79 100644
--- a/term.c
+++ b/term.c
@@ -117,13 +117,13 @@ term_flushln(struct termp *p)
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;
@@ -138,7 +138,7 @@ term_flushln(struct termp *p)
* 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;
@@ -193,14 +193,14 @@ term_flushln(struct termp *p)
}
/* 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;
@@ -243,7 +243,7 @@ term_flushln(struct termp *p)
else
vis = 0;
- p->col = 0;
+ p->col = p->lastcol = 0;
p->minbl = p->trailspace;
p->flags &= ~(TERMP_BACKAFTER | TERMP_BACKBEFORE | TERMP_NOPAD);
@@ -287,7 +287,7 @@ term_newln(struct termp *p)
{
p->flags |= TERMP_NOSPACE;
- if (p->col || p->viscol)
+ if (p->lastcol || p->viscol)
term_flushln(p);
}
@@ -556,10 +556,12 @@ term_word(struct termp *p, const char *word)
}
}
/* 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;
@@ -604,7 +606,10 @@ bufferc(struct termp *p, char c)
}
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;
}
/*
@@ -646,7 +651,10 @@ encode1(struct termp *p, int c)
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;
@@ -672,7 +680,10 @@ encode(struct termp *p, const char *word, size_t sz)
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
@@ -686,6 +697,8 @@ encode(struct termp *p, const char *word, size_t sz)
}
}
}
+ if (p->lastcol < p->col)
+ p->lastcol = p->col;
}
void
diff --git a/term.h b/term.h
index a4dbdf42..fa51d633 100644
--- a/term.h
+++ b/term.h
@@ -62,7 +62,8 @@ struct termp {
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. */