source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* 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).