From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 28523 invoked from network); 15 Aug 2022 13:05:15 -0000 Received: from bsd.lv (HELO mandoc.bsd.lv) (66.111.2.12) by inbox.vuxu.org with ESMTPUTF8; 15 Aug 2022 13:05:15 -0000 Received: from fantadrom.bsd.lv (localhost [127.0.0.1]) by mandoc.bsd.lv (OpenSMTPD) with ESMTP id 3ab61c51 for ; Mon, 15 Aug 2022 08:05:13 -0500 (EST) Received: from localhost (mandoc.bsd.lv [local]) by mandoc.bsd.lv (OpenSMTPD) with ESMTPA id 44540cf9 for ; Mon, 15 Aug 2022 08:05:13 -0500 (EST) Date: Mon, 15 Aug 2022 08:05:13 -0500 (EST) X-Mailinglist: mandoc-source Reply-To: source@mandoc.bsd.lv MIME-Version: 1.0 From: schwarze@mandoc.bsd.lv To: source@mandoc.bsd.lv Subject: mandoc: In GNU, Heirloom, and Plan 9 roff, tab positions apply to X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Message-ID: <336a189e7f637b9c@mandoc.bsd.lv> 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