=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.278 retrieving revision 1.283 diff -u -p -r1.278 -r1.283 --- mandoc/term.c 2019/01/03 19:59:55 1.278 +++ mandoc/term.c 2021/08/10 12:55:04 1.283 @@ -1,7 +1,7 @@ -/* $Id: term.c,v 1.278 2019/01/03 19:59:55 schwarze Exp $ */ +/* $Id: term.c,v 1.283 2021/08/10 12:55:04 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010-2019 Ingo Schwarze + * 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 @@ -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); @@ -127,23 +126,37 @@ 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; /* * Figure out how much text will fit in the field. * If there is whitespace only, print nothing. - * Otherwise, print the field content. */ - term_fill(p, &nbr, &vbr, vtarget); + term_fill(p, &nbr, &vbr, + p->flags & TERMP_BRNEVER ? SIZE_MAX : vtarget); if (nbr == 0) break; - term_field(p, vbl, nbr, vbr, vtarget); + /* + * With the CENTER or RIGHT flag, increase the indentation + * to center the text between the left and right margins + * or to adjust it to the right margin, respectively. + */ + if (vbr < vtarget) { + if (p->flags & TERMP_CENTER) + vbl += (vtarget - vbr) / 2; + else if (p->flags & TERMP_RIGHT) + vbl += vtarget - vbr; + } + + /* Finally, print the field content. */ + + term_field(p, vbl, nbr); + /* * If there is no text left in the field, exit the loop. * If the BRTRSP flag is set, consider trailing @@ -267,6 +280,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) @@ -329,12 +344,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. */ @@ -360,8 +373,9 @@ term_field(struct termp *p, size_t vbl, size_t nbr, si continue; case ' ': case ASCII_NBRSP: - vbl++; - vis++; + dv = (*p->width)(p, ' '); + vbl += dv; + vis += dv; continue; default: break; @@ -575,16 +589,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;