=================================================================== RCS file: /cvs/mandoc/term.c,v retrieving revision 1.233 retrieving revision 1.237 diff -u -p -r1.233 -r1.237 --- mandoc/term.c 2014/10/29 00:17:43 1.233 +++ mandoc/term.c 2014/12/02 10:08:06 1.237 @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.233 2014/10/29 00:17:43 schwarze Exp $ */ +/* $Id: term.c,v 1.237 2014/12/02 10:08:06 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -100,7 +100,7 @@ term_flushln(struct termp *p) size_t j; /* temporary loop index for p->buf */ size_t jhy; /* last hyph before overflow w/r/t j */ size_t maxvis; /* output position of visible boundary */ - size_t mmax; /* used in calculating bp */ + size_t rmargin; /* the rightmost of the two margins */ /* * First, establish the maximum columns of "visible" content. @@ -113,13 +113,17 @@ term_flushln(struct termp *p) * is negative, it gets sign extended. Subtracting that * very large size_t effectively adds a small number to dv. */ - assert (p->rmargin >= p->offset); - dv = p->rmargin - p->offset; + rmargin = p->rmargin > p->offset ? p->rmargin : p->offset; + dv = p->rmargin - p->offset; maxvis = (int)dv > p->overstep ? dv - (size_t)p->overstep : 0; - dv = p->maxrmargin - p->offset; - mmax = (int)dv > p->overstep ? dv - (size_t)p->overstep : 0; - bp = TERMP_NOBREAK & p->flags ? mmax : maxvis; + if (p->flags & TERMP_NOBREAK) { + dv = p->maxrmargin > p->offset ? + p->maxrmargin - p->offset : 0; + bp = (int)dv > p->overstep ? + dv - (size_t)p->overstep : 0; + } else + bp = maxvis; /* * Calculate the required amount of padding. @@ -188,8 +192,8 @@ term_flushln(struct termp *p) (*p->endline)(p); p->viscol = 0; if (TERMP_BRIND & p->flags) { - vbl = p->rmargin; - vend += p->rmargin - p->offset; + vbl = rmargin; + vend += rmargin - p->offset; } else vbl = p->offset; @@ -254,8 +258,10 @@ term_flushln(struct termp *p) * If there was trailing white space, it was not printed; * so reset the cursor position accordingly. */ - if (vis) + if (vis > vbl) vis -= vbl; + else + vis = 0; p->col = 0; p->overstep = 0; @@ -411,7 +417,7 @@ term_word(struct termp *p, const char *word) else p->flags |= TERMP_NOSPACE; - p->flags &= ~TERMP_SENTENCE; + p->flags &= ~(TERMP_SENTENCE | TERMP_NONEWLINE); while ('\0' != *word) { if ('\\' != *word) { @@ -481,7 +487,7 @@ term_word(struct termp *p, const char *word) if (TERMP_SKIPCHAR & p->flags) p->flags &= ~TERMP_SKIPCHAR; else if ('\0' == *word) - p->flags |= TERMP_NOSPACE; + p->flags |= (TERMP_NOSPACE | TERMP_NONEWLINE); continue; case ESCAPE_SKIPCHAR: p->flags |= TERMP_SKIPCHAR; @@ -684,7 +690,7 @@ term_strlen(const struct termp *p, const char *cp) switch (esc) { case ESCAPE_UNICODE: - uc = mchars_num2uc(seq + 1, sz - 1); + uc = mchars_num2uc(seq + 1, ssz - 1); break; case ESCAPE_NUMBERED: uc = mchars_num2char(seq, ssz);