=================================================================== RCS file: /cvs/mandoc/roff_term.c,v retrieving revision 1.16 retrieving revision 1.20 diff -u -p -r1.16 -r1.20 --- mandoc/roff_term.c 2018/12/14 01:18:26 1.16 +++ mandoc/roff_term.c 2020/06/22 19:20:40 1.20 @@ -1,6 +1,6 @@ -/* $Id: roff_term.c,v 1.16 2018/12/14 01:18:26 schwarze Exp $ */ +/* $Id: roff_term.c,v 1.20 2020/06/22 19:20:40 schwarze Exp $ */ /* - * Copyright (c) 2010,2014,2015,2017,2018 Ingo Schwarze + * Copyright (c) 2010,2014,2015,2017-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 @@ -14,10 +14,13 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include "config.h" + #include #include #include +#include #include "mandoc.h" #include "roff.h" @@ -41,9 +44,11 @@ static void roff_term_pre_ti(ROFF_TERM_ARGS); static const roff_term_pre_fp roff_term_pre_acts[ROFF_MAX] = { roff_term_pre_br, /* br */ roff_term_pre_ce, /* ce */ + roff_term_pre_br, /* fi */ roff_term_pre_ft, /* ft */ roff_term_pre_ll, /* ll */ roff_term_pre_mc, /* mc */ + roff_term_pre_br, /* nf */ roff_term_pre_po, /* po */ roff_term_pre_ce, /* rj */ roff_term_pre_sp, /* sp */ @@ -66,7 +71,9 @@ roff_term_pre_br(ROFF_TERM_ARGS) if (p->flags & TERMP_BRIND) { p->tcol->offset = p->tcol->rmargin; p->tcol->rmargin = p->maxrmargin; + p->trailspace = 0; p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND); + p->flags |= TERMP_NOSPACE; } } @@ -74,27 +81,16 @@ static void roff_term_pre_ce(ROFF_TERM_ARGS) { const struct roff_node *nc1, *nc2; - size_t len, lm; roff_term_pre_br(p, n); - lm = p->tcol->offset; + p->flags |= n->tok == ROFF_ce ? TERMP_CENTER : TERMP_RIGHT; nc1 = n->child->next; while (nc1 != NULL) { nc2 = nc1; - len = 0; do { - if (nc2->type == ROFFT_TEXT) { - if (len) - len++; - len += term_strlen(p, nc2->string); - } nc2 = nc2->next; } while (nc2 != NULL && (nc2->type != ROFFT_TEXT || (nc2->flags & NODE_LINE) == 0)); - p->tcol->offset = len >= p->tcol->rmargin ? 0 : - lm + len >= p->tcol->rmargin ? p->tcol->rmargin - len : - n->tok == ROFF_rj ? p->tcol->rmargin - len : - (lm + p->tcol->rmargin - len) / 2; while (nc1 != nc2) { if (nc1->type == ROFFT_TEXT) term_word(p, nc1->string); @@ -105,7 +101,7 @@ roff_term_pre_ce(ROFF_TERM_ARGS) p->flags |= TERMP_NOSPACE; term_flushln(p); } - p->tcol->offset = lm; + p->flags &= ~(TERMP_CENTER | TERMP_RIGHT); } static void @@ -113,25 +109,22 @@ roff_term_pre_ft(ROFF_TERM_ARGS) { const char *cp; - if (*(cp = n->child->string) == 'C') - cp++; - - switch (*cp) { - case '4': - case '3': - case 'B': + cp = n->child->string; + switch (mandoc_font(cp, (int)strlen(cp))) { + case ESCAPE_FONTBOLD: term_fontrepl(p, TERMFONT_BOLD); break; - case '2': - case 'I': + case ESCAPE_FONTITALIC: term_fontrepl(p, TERMFONT_UNDER); break; - case 'P': + case ESCAPE_FONTBI: + term_fontrepl(p, TERMFONT_BI); + break; + case ESCAPE_FONTPREV: term_fontlast(p); break; - case '1': - case 'C': - case 'R': + case ESCAPE_FONTROMAN: + case ESCAPE_FONTCW: term_fontrepl(p, TERMFONT_NONE); break; default: