=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.286 retrieving revision 1.288 diff -u -p -r1.286 -r1.288 --- mandoc/term.c 2022/04/27 13:41:13 1.286 +++ mandoc/term.c 2022/08/15 13:04:43 1.288 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.286 2022/04/27 13:41:13 schwarze Exp $ */ +/* $Id: term.c,v 1.288 2022/08/15 13:04:43 schwarze Exp $ */ /* * Copyright (c) 2010-2022 Ingo Schwarze * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons @@ -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. @@ -268,22 +269,11 @@ term_fill(struct termp *p, size_t *nbr, size_t *vbr, s vis -= (*p->width)(p, p->tcol->buf[ic - 1]); continue; - case '\t': /* Normal ASCII whitespace. */ case ' ': case ASCII_BREAK: /* Escape \: (breakpoint). */ - switch (p->tcol->buf[ic]) { - case '\t': - vn = term_tab_next(vis); - break; - case ' ': - vn = vis + (*p->width)(p, ' '); - break; - case ASCII_BREAK: - vn = vis; - break; - default: - abort(); - } + vn = vis; + if (p->tcol->buf[ic] == ' ') + vn += (*p->width)(p, ' '); /* Can break at the end of a word. */ if (breakline || vn > vtarget) break; @@ -317,12 +307,21 @@ term_fill(struct termp *p, size_t *nbr, size_t *vbr, s *vbr = vis; continue; - case ASCII_NBRSP: /* Non-breakable space. */ - p->tcol->buf[ic] = ' '; - /* FALLTHROUGH */ - default: /* Printable character. */ + 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] = ' '; + /* FALLTHROUGH */ + default: /* Printable character. */ + vis += (*p->width)(p, p->tcol->buf[ic]); + break; + } graph = 1; - vis += (*p->width)(p, p->tcol->buf[ic]); if (vis > vtarget && *nbr > 0) return; continue; @@ -352,8 +351,8 @@ term_field(struct termp *p, size_t vbl, size_t nbr) { 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++) { @@ -368,13 +367,13 @@ term_field(struct termp *p, size_t vbl, size_t nbr) 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; @@ -436,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);