=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.280 retrieving revision 1.285 diff -u -p -r1.280 -r1.285 --- mandoc/term.c 2019/01/15 12:16:18 1.280 +++ mandoc/term.c 2022/01/10 18:01:35 1.285 @@ -1,7 +1,7 @@ -/* $Id: term.c,v 1.280 2019/01/15 12:16:18 schwarze Exp $ */ +/* $Id: term.c,v 1.285 2022/01/10 18:01:35 schwarze Exp $ */ /* + * Copyright (c) 2010-2022 Ingo Schwarze * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010-2019 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 @@ -38,8 +38,7 @@ static void bufferc(struct termp *, char); static void encode(struct termp *, const char *, size_t); static void encode1(struct termp *, int); static void endline(struct termp *); -static void term_field(struct termp *, size_t, size_t, - size_t, size_t); +static void term_field(struct termp *, size_t, size_t); static void term_fill(struct termp *, size_t *, size_t *, size_t); @@ -59,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); @@ -127,8 +127,7 @@ term_flushln(struct termp *p) * and with the BRNEVER flag, never break it at all. */ - vtarget = p->flags & TERMP_BRNEVER ? SIZE_MAX : - (p->flags & TERMP_NOBREAK) == 0 ? vfield : + vtarget = (p->flags & TERMP_NOBREAK) == 0 ? vfield : p->maxrmargin > p->viscol + vbl ? p->maxrmargin - p->viscol - vbl : 0; @@ -137,7 +136,8 @@ term_flushln(struct termp *p) * If there is whitespace only, print nothing. */ - term_fill(p, &nbr, &vbr, vtarget); + term_fill(p, &nbr, &vbr, + p->flags & TERMP_BRNEVER ? SIZE_MAX : vtarget); if (nbr == 0) break; @@ -156,7 +156,7 @@ term_flushln(struct termp *p) /* Finally, print the field content. */ - term_field(p, vbl, nbr, vbr, vtarget); + term_field(p, vbl, nbr); /* * If there is no text left in the field, exit the loop. @@ -281,6 +281,8 @@ term_fill(struct termp *p, size_t *nbr, size_t *vbr, s case ASCII_BREAK: vn = vis; break; + default: + abort(); } /* Can break at the end of a word. */ if (breakline || vn > vtarget) @@ -343,12 +345,10 @@ term_fill(struct termp *p, size_t *nbr, size_t *vbr, s /* * Print the contents of one field * with an indentation of vbl visual columns, - * an input string length of nbr characters, - * an output width of vbr visual columns, - * and a desired field width of vtarget visual columns. + * and an input string length of nbr characters. */ static void -term_field(struct termp *p, size_t vbl, size_t nbr, size_t vbr, size_t vtarget) +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. */ @@ -590,16 +590,18 @@ term_word(struct termp *p, const char *word) uc = *seq; break; case ESCAPE_FONTBOLD: + case ESCAPE_FONTCB: term_fontrepl(p, TERMFONT_BOLD); continue; case ESCAPE_FONTITALIC: + case ESCAPE_FONTCI: term_fontrepl(p, TERMFONT_UNDER); continue; case ESCAPE_FONTBI: term_fontrepl(p, TERMFONT_BI); continue; case ESCAPE_FONT: - case ESCAPE_FONTCW: + case ESCAPE_FONTCR: case ESCAPE_FONTROMAN: term_fontrepl(p, TERMFONT_NONE); continue; @@ -634,12 +636,14 @@ 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) + if (uc > 0) { + while (uc > 0) { bufferc(p, ASCII_NBRSP); - else if (p->col > (size_t)(-uc)) + uc -= term_len(p, 1); + } + } else if (p->col > (size_t)(-uc)) { p->col += uc; - else { + } else { uc += p->col; p->col = 0; if (p->tcol->offset > (size_t)(-uc)) {