=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.283 retrieving revision 1.286 diff -u -p -r1.283 -r1.286 --- mandoc/term.c 2021/08/10 12:55:04 1.283 +++ mandoc/term.c 2022/04/27 13:41:13 1.286 @@ -1,7 +1,7 @@ -/* $Id: term.c,v 1.283 2021/08/10 12:55:04 schwarze Exp $ */ +/* $Id: term.c,v 1.286 2022/04/27 13:41:13 schwarze Exp $ */ /* + * Copyright (c) 2010-2022 Ingo Schwarze * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010-2020 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -58,6 +58,7 @@ term_setcol(struct termp *p, size_t maxtcol) void term_free(struct termp *p) { + term_tab_free(); for (p->tcol = p->tcols; p->tcol < p->tcols + p->maxtcol; p->tcol++) free(p->tcol->buf); free(p->tcols); @@ -627,6 +628,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; @@ -635,12 +640,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)) {