* mdocml: The \h escape sequence provides another method for moving
@ 2017-06-07 2:14 schwarze
0 siblings, 0 replies; only message in thread
From: schwarze @ 2017-06-07 2:14 UTC (permalink / raw)
To: source
Log Message:
-----------
The \h escape sequence provides another method for moving backwards,
and after that, previously written output gets overwritten, but
overwriting with blanks does *not* erase previously written content.
Yes, manual pages exist that are crazy enough to rely on that...
Modified Files:
--------------
mdocml:
term.c
term.h
Revision Data
-------------
Index: term.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/term.c,v
retrieving revision 1.264
retrieving revision 1.265
diff -Lterm.c -Lterm.c -u -p -r1.264 -r1.265
--- term.c
+++ 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 *w
}
}
/* 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
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
}
}
}
+ if (p->lastcol < p->col)
+ p->lastcol = p->col;
}
void
Index: term.h
===================================================================
RCS file: /home/cvs/mdocml/mdocml/term.h,v
retrieving revision 1.123
retrieving revision 1.124
diff -Lterm.h -Lterm.h -u -p -r1.123 -r1.124
--- term.h
+++ 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. */
--
To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-06-07 2:14 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-07 2:14 mdocml: The \h escape sequence provides another method for moving schwarze
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).