=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.370 retrieving revision 1.372 diff -u -p -r1.370 -r1.372 --- mandoc/mdoc_term.c 2018/12/13 11:55:47 1.370 +++ mandoc/mdoc_term.c 2019/01/04 03:39:01 1.372 @@ -1,7 +1,7 @@ -/* $Id: mdoc_term.c,v 1.370 2018/12/13 11:55:47 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.372 2019/01/04 03:39:01 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010, 2012-2018 Ingo Schwarze + * Copyright (c) 2010, 2012-2019 Ingo Schwarze * Copyright (c) 2013 Franco Fichtner * * Permission to use, copy, modify, and distribute this software for any @@ -251,7 +251,7 @@ static int fn_prio; void -terminal_mdoc(void *arg, const struct roff_man *mdoc) +terminal_mdoc(void *arg, const struct roff_meta *mdoc) { struct roff_node *n; struct termp *p; @@ -269,8 +269,7 @@ terminal_mdoc(void *arg, const struct roff_man *mdoc) if (n->tok == MDOC_Sh && n->sec == SEC_SYNOPSIS) { if (n->child->next->child != NULL) print_mdoc_nodelist(p, NULL, - &mdoc->meta, - n->child->next->child); + mdoc, n->child->next->child); term_newln(p); break; } @@ -280,8 +279,7 @@ terminal_mdoc(void *arg, const struct roff_man *mdoc) save_defindent = p->defindent; if (p->defindent == 0) p->defindent = 5; - term_begin(p, print_mdoc_head, print_mdoc_foot, - &mdoc->meta); + term_begin(p, print_mdoc_head, print_mdoc_foot, mdoc); while (n != NULL && (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT)) @@ -289,7 +287,7 @@ terminal_mdoc(void *arg, const struct roff_man *mdoc) if (n != NULL) { if (n->tok != MDOC_Sh) term_vspace(p); - print_mdoc_nodelist(p, NULL, &mdoc->meta, n); + print_mdoc_nodelist(p, NULL, mdoc, n); } term_end(p); p->defindent = save_defindent; @@ -314,6 +312,19 @@ print_mdoc_node(DECL_ARGS) size_t offset, rmargin; int chld; + /* + * In no-fill mode, break the output line at the beginning + * of new input lines except after \c, and nowhere else. + */ + + if (n->flags & NODE_NOFILL) { + if (n->flags & NODE_LINE && + (p->flags & TERMP_NONEWLINE) == 0) + term_newln(p); + p->flags |= TERMP_BRNEVER; + } else + p->flags &= ~TERMP_BRNEVER; + if (n->type == ROFFT_COMMENT || n->flags & NODE_NOPRT) return; @@ -343,9 +354,22 @@ print_mdoc_node(DECL_ARGS) switch (n->type) { case ROFFT_TEXT: - if (*n->string == ' ' && n->flags & NODE_LINE && - (p->flags & TERMP_NONEWLINE) == 0) - term_newln(p); + if (n->flags & NODE_LINE) { + switch (*n->string) { + case '\0': + if (p->flags & TERMP_NONEWLINE) + term_newln(p); + else + term_vspace(p); + return; + case ' ': + if ((p->flags & TERMP_NONEWLINE) == 0) + term_newln(p); + break; + default: + break; + } + } if (NODE_DELIMC & n->flags) p->flags |= TERMP_NOSPACE; term_word(p, n->string); @@ -1420,8 +1444,6 @@ termp_fa_pre(DECL_ARGS) static int termp_bd_pre(DECL_ARGS) { - size_t lm, len; - struct roff_node *nn; int offset; if (n->type == ROFFT_BLOCK) { @@ -1447,65 +1469,19 @@ termp_bd_pre(DECL_ARGS) p->tcol->offset += offset; } - /* - * If -ragged or -filled are specified, the block does nothing - * but change the indentation. If -unfilled or -literal are - * specified, text is printed exactly as entered in the display: - * for macro lines, a newline is appended to the line. Blank - * lines are allowed. - */ - - if (n->norm->Bd.type != DISP_literal && - n->norm->Bd.type != DISP_unfilled && - n->norm->Bd.type != DISP_centered) - return 1; - - if (n->norm->Bd.type == DISP_literal) { + switch (n->norm->Bd.type) { + case DISP_literal: term_tab_set(p, NULL); term_tab_set(p, "T"); term_tab_set(p, "8n"); + break; + case DISP_centered: + p->flags |= TERMP_CENTER; + break; + default: + break; } - - lm = p->tcol->offset; - p->flags |= TERMP_BRNEVER; - for (nn = n->child; nn != NULL; nn = nn->next) { - if (n->norm->Bd.type == DISP_centered) { - if (nn->type == ROFFT_TEXT) { - len = term_strlen(p, nn->string); - p->tcol->offset = len >= p->tcol->rmargin ? - 0 : lm + len >= p->tcol->rmargin ? - p->tcol->rmargin - len : - (lm + p->tcol->rmargin - len) / 2; - } else - p->tcol->offset = lm; - } - print_mdoc_node(p, pair, meta, nn); - /* - * If the printed node flushes its own line, then we - * needn't do it here as well. This is hacky, but the - * notion of selective eoln whitespace is pretty dumb - * anyway, so don't sweat it. - */ - if (nn->tok < ROFF_MAX) - continue; - switch (nn->tok) { - case MDOC_Sm: - case MDOC_Bl: - case MDOC_D1: - case MDOC_Dl: - case MDOC_Pp: - continue; - default: - break; - } - if (p->flags & TERMP_NONEWLINE || - (nn->next && ! (nn->next->flags & NODE_LINE))) - continue; - term_flushln(p); - p->flags |= TERMP_NOSPACE; - } - p->flags &= ~TERMP_BRNEVER; - return 0; + return 1; } static void @@ -1513,12 +1489,14 @@ termp_bd_post(DECL_ARGS) { if (n->type != ROFFT_BODY) return; - if (DISP_literal == n->norm->Bd.type || - DISP_unfilled == n->norm->Bd.type) + if (n->norm->Bd.type == DISP_unfilled || + n->norm->Bd.type == DISP_literal) p->flags |= TERMP_BRNEVER; p->flags |= TERMP_NOSPACE; term_newln(p); p->flags &= ~TERMP_BRNEVER; + if (n->norm->Bd.type == DISP_centered) + p->flags &= ~TERMP_CENTER; } static int