=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.284 retrieving revision 1.287 diff -u -p -r1.284 -r1.287 --- mandoc/term.c 2021/10/04 18:56:31 1.284 +++ mandoc/term.c 2022/08/15 10:22:14 1.287 @@ -1,6 +1,6 @@ -/* $Id: term.c,v 1.284 2021/10/04 18:56:31 schwarze Exp $ */ +/* $Id: term.c,v 1.287 2022/08/15 10:22:14 schwarze Exp $ */ /* - * Copyright (c) 2010-2021 Ingo Schwarze + * Copyright (c) 2010-2022 Ingo Schwarze * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any @@ -268,22 +268,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 +306,19 @@ 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 = term_tab_next(vis); + 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; @@ -628,6 +624,10 @@ term_word(struct termp *p, const char *word) encode(p, "utf8", 4); continue; case ESCAPE_HORIZ: + if (p->flags & TERMP_BACKAFTER) { + p->flags &= ~TERMP_BACKAFTER; + continue; + } if (*seq == '|') { seq++; uc = -p->col; @@ -636,12 +636,24 @@ term_word(struct termp *p, const char *word) if (a2roffsu(seq, &su, SCALE_EM) == NULL) continue; uc += term_hen(p, &su); - if (uc > 0) - while (uc-- > 0) - bufferc(p, ASCII_NBRSP); - else if (p->col > (size_t)(-uc)) + if (uc >= 0) { + while (uc > 0) { + uc -= term_len(p, 1); + if (p->flags & TERMP_BACKBEFORE) + p->flags &= ~TERMP_BACKBEFORE; + else + bufferc(p, ASCII_NBRSP); + } + continue; + } + if (p->flags & TERMP_BACKBEFORE) { + p->flags &= ~TERMP_BACKBEFORE; + assert(p->col > 0); + p->col--; + } + if (p->col >= (size_t)(-uc)) { p->col += uc; - else { + } else { uc += p->col; p->col = 0; if (p->tcol->offset > (size_t)(-uc)) {