From: schwarze@mandoc.bsd.lv
To: source@mandoc.bsd.lv
Subject: mandoc: In GNU, Heirloom, and Plan 9 roff, tab positions apply to
Date: Mon, 15 Aug 2022 08:05:13 -0500 (EST) [thread overview]
Message-ID: <336a189e7f637b9c@mandoc.bsd.lv> (raw)
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
reply other threads:[~2022-08-15 13:05 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=336a189e7f637b9c@mandoc.bsd.lv \
--to=schwarze@mandoc.bsd.lv \
--cc=source@mandoc.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).