source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mandoc: In GNU, Heirloom, and Plan 9 roff, tab positions apply to
@ 2022-08-15 13:05 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2022-08-15 13:05 UTC (permalink / raw)
  To: source

Log Message:
-----------
In GNU, Heirloom, and Plan 9 roff, tab positions apply to *input* lines,
not to *output* lines.  In particular, if an input line gets broken in
fill mode and a tab occurs in the second output line, it advances to a
position of at least (width of the first output line) + (width of a
space character even though this is never printed) + (width of the part
of the second output line that precedes the tab).

Implement the same logic in mandoc.

Again, do not use tabs in filled text: they have surprising effects,
including this one.

Modified Files:
--------------
    mandoc:
        man_term.c
        term.c
        term.h

Revision Data
-------------
Index: man_term.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/man_term.c,v
retrieving revision 1.237
retrieving revision 1.238
diff -Lman_term.c -Lman_term.c -u -p -r1.237 -r1.238
--- man_term.c
+++ man_term.c
@@ -975,6 +975,7 @@ out:
 	    ! (p->flags & (TERMP_NOBREAK | TERMP_NONEWLINE)) &&
 	    (n->next == NULL || n->next->flags & NODE_LINE)) {
 		p->flags |= TERMP_BRNEVER | TERMP_NOSPACE;
+		p->tcol->taboff = 0;
 		if (n->string != NULL && *n->string != '\0')
 			term_flushln(p);
 		else
Index: term.h
===================================================================
RCS file: /home/cvs/mandoc/mandoc/term.h,v
retrieving revision 1.132
retrieving revision 1.133
diff -Lterm.h -Lterm.h -u -p -r1.132 -r1.133
--- term.h
+++ term.h
@@ -56,6 +56,7 @@ struct	termp_col {
 	size_t		  col;		/* Byte in buf to be written. */
 	size_t		  rmargin;	/* Current right margin. */
 	size_t		  offset;	/* Current left margin. */
+	size_t		  taboff;	/* Offset for literal tabs. */
 };
 
 struct	termp {
Index: term.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/term.c,v
retrieving revision 1.287
retrieving revision 1.288
diff -Lterm.c -Lterm.c -u -p -r1.287 -r1.288
--- term.c
+++ term.c
@@ -157,6 +157,7 @@ term_flushln(struct termp *p)
 		/* Finally, print the field content. */
 
 		term_field(p, vbl, nbr);
+		p->tcol->taboff += vbr + (*p->width)(p, ' ');
 
 		/*
 		 * If there is no text left in the field, exit the loop.
@@ -309,7 +310,9 @@ term_fill(struct termp *p, size_t *nbr, 
 		default:
 			switch (p->tcol->buf[ic]) {
 			case '\t':
+				vis += p->tcol->taboff;
 				vis = term_tab_next(vis);
+				vis -= p->tcol->taboff;
 				break;
 			case ASCII_NBRSP:  /* Non-breakable space. */
 				p->tcol->buf[ic] = ' ';
@@ -348,8 +351,8 @@ term_field(struct termp *p, size_t vbl, 
 {
 	size_t	 ic;	/* Character position in the input buffer. */
 	size_t	 vis;	/* Visual position of the current character. */
+	size_t	 vt;	/* Visual position including tab offset. */
 	size_t	 dv;	/* Visual width of the current character. */
-	size_t	 vn;	/* Visual position of the next character. */
 
 	vis = 0;
 	for (ic = p->tcol->col; ic < nbr; ic++) {
@@ -364,13 +367,13 @@ term_field(struct termp *p, size_t vbl, 
 		case ASCII_BREAK:
 			continue;
 		case '\t':
-			vn = term_tab_next(vis);
-			vbl += vn - vis;
-			vis = vn;
-			continue;
 		case ' ':
 		case ASCII_NBRSP:
-			dv = (*p->width)(p, ' ');
+			if (p->tcol->buf[ic] == '\t') {
+				vt = p->tcol->taboff + vis;
+				dv = term_tab_next(vt) - vt;
+			} else
+				dv = (*p->width)(p, ' ');
 			vbl += dv;
 			vis += dv;
 			continue;
@@ -432,7 +435,7 @@ endline(struct termp *p)
 void
 term_newln(struct termp *p)
 {
-
+	p->tcol->taboff = 0;
 	p->flags |= TERMP_NOSPACE;
 	if (p->tcol->lastcol || p->viscol)
 		term_flushln(p);
--
 To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-08-15 13:05 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-15 13:05 mandoc: In GNU, Heirloom, and Plan 9 roff, tab positions apply to 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).