=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mdoc_term.c,v retrieving revision 1.270 retrieving revision 1.271 diff -c -r1.270 -r1.271 *** src/usr.bin/mandoc/mdoc_term.c 2018/12/30 00:48:48 1.270 --- src/usr.bin/mandoc/mdoc_term.c 2019/01/04 03:37:42 1.271 *************** *** 1,7 **** ! /* $OpenBSD: mdoc_term.c,v 1.270 2018/12/30 00:48:48 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons ! * Copyright (c) 2010, 2012-2018 Ingo Schwarze * Copyright (c) 2013 Franco Fichtner * * Permission to use, copy, modify, and distribute this software for any --- 1,7 ---- ! /* $OpenBSD: mdoc_term.c,v 1.271 2019/01/04 03:37:42 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons ! * Copyright (c) 2010, 2012-2019 Ingo Schwarze * Copyright (c) 2013 Franco Fichtner * * Permission to use, copy, modify, and distribute this software for any *************** *** 310,315 **** --- 310,328 ---- 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; *************** *** 339,347 **** switch (n->type) { case ROFFT_TEXT: ! if (*n->string == ' ' && n->flags & NODE_LINE && ! (p->flags & TERMP_NONEWLINE) == 0) ! term_newln(p); if (NODE_DELIMC & n->flags) p->flags |= TERMP_NOSPACE; term_word(p, n->string); --- 352,373 ---- switch (n->type) { case ROFFT_TEXT: ! 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); *************** *** 1416,1423 **** static int termp_bd_pre(DECL_ARGS) { - size_t lm, len; - struct roff_node *nn; int offset; if (n->type == ROFFT_BLOCK) { --- 1442,1447 ---- *************** *** 1443,1507 **** 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) { term_tab_set(p, NULL); term_tab_set(p, "T"); term_tab_set(p, "8n"); } ! ! 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; } static void --- 1467,1485 ---- p->tcol->offset += offset; } ! 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; } ! return 1; } static void *************** *** 1509,1520 **** { if (n->type != ROFFT_BODY) return; ! if (DISP_literal == n->norm->Bd.type || ! DISP_unfilled == n->norm->Bd.type) p->flags |= TERMP_BRNEVER; p->flags |= TERMP_NOSPACE; term_newln(p); p->flags &= ~TERMP_BRNEVER; } static int --- 1487,1500 ---- { if (n->type != ROFFT_BODY) return; ! 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