version 1.263, 2017/06/04 18:50:35 |
version 1.264, 2017/06/04 22:44:15 |
Line 36 static void adjbuf(struct termp *p, size_t); |
|
Line 36 static void adjbuf(struct termp *p, size_t); |
|
static void bufferc(struct termp *, char); |
static void bufferc(struct termp *, char); |
static void encode(struct termp *, const char *, size_t); |
static void encode(struct termp *, const char *, size_t); |
static void encode1(struct termp *, int); |
static void encode1(struct termp *, int); |
|
static void endline(struct termp *); |
|
|
|
|
void |
void |
Line 169 term_flushln(struct termp *p) |
|
Line 170 term_flushln(struct termp *p) |
|
* Find out whether we would exceed the right margin. |
* Find out whether we would exceed the right margin. |
* If so, break to the next line. |
* If so, break to the next line. |
*/ |
*/ |
if (vend > bp && 0 == jhy && vis > 0) { |
if (vend > bp && 0 == jhy && vis > 0 && |
|
(p->flags & TERMP_BRNEVER) == 0) { |
vend -= vis; |
vend -= vis; |
(*p->endline)(p); |
endline(p); |
p->viscol = 0; |
|
|
|
/* Use pending tabs on the new line. */ |
/* Use pending tabs on the new line. */ |
|
|
Line 243 term_flushln(struct termp *p) |
|
Line 244 term_flushln(struct termp *p) |
|
vis = 0; |
vis = 0; |
|
|
p->col = 0; |
p->col = 0; |
|
p->minbl = p->trailspace; |
p->flags &= ~(TERMP_BACKAFTER | TERMP_BACKBEFORE | TERMP_NOPAD); |
p->flags &= ~(TERMP_BACKAFTER | TERMP_BACKBEFORE | TERMP_NOPAD); |
|
|
if ( ! (TERMP_NOBREAK & p->flags)) { |
|
p->viscol = 0; |
|
p->minbl = 0; |
|
(*p->endline)(p); |
|
return; |
|
} |
|
|
|
if (TERMP_HANG & p->flags) { |
|
p->minbl = p->trailspace; |
|
return; |
|
} |
|
|
|
/* Trailing whitespace is significant in some columns. */ |
/* Trailing whitespace is significant in some columns. */ |
if (vis && vbl && (TERMP_BRTRSP & p->flags)) |
if (vis && vbl && (TERMP_BRTRSP & p->flags)) |
vis += vbl; |
vis += vbl; |
|
|
/* If the column was overrun, break the line. */ |
/* If the column was overrun, break the line. */ |
if (maxvis < vis + p->trailspace * (*p->width)(p, ' ')) { |
if ((p->flags & TERMP_NOBREAK) == 0 || |
(*p->endline)(p); |
((p->flags & TERMP_HANG) == 0 && |
p->viscol = 0; |
vis + p->trailspace * (*p->width)(p, ' ') > maxvis)) |
p->minbl = 0; |
endline(p); |
} else |
|
p->minbl = p->trailspace; |
|
} |
} |
|
|
|
static void |
|
endline(struct termp *p) |
|
{ |
|
if ((p->flags & (TERMP_NEWMC | TERMP_ENDMC)) == TERMP_ENDMC) { |
|
p->mc = NULL; |
|
p->flags &= ~TERMP_ENDMC; |
|
} |
|
if (p->mc != NULL) { |
|
if (p->viscol && p->maxrmargin >= p->viscol) |
|
(*p->advance)(p, p->maxrmargin - p->viscol + 1); |
|
p->flags |= TERMP_NOBUF | TERMP_NOSPACE; |
|
term_word(p, p->mc); |
|
p->flags &= ~(TERMP_NOBUF | TERMP_NEWMC); |
|
} |
|
p->viscol = 0; |
|
p->minbl = 0; |
|
(*p->endline)(p); |
|
} |
|
|
/* |
/* |
* A newline only breaks an existing line; it won't assert vertical |
* A newline only breaks an existing line; it won't assert vertical |
* space. All data in the output buffer is flushed prior to the newline |
* space. All data in the output buffer is flushed prior to the newline |
Line 296 term_vspace(struct termp *p) |
|
Line 303 term_vspace(struct termp *p) |
|
|
|
term_newln(p); |
term_newln(p); |
p->viscol = 0; |
p->viscol = 0; |
|
p->minbl = 0; |
if (0 < p->skipvsp) |
if (0 < p->skipvsp) |
p->skipvsp--; |
p->skipvsp--; |
else |
else |
Line 370 term_word(struct termp *p, const char *word) |
|
Line 378 term_word(struct termp *p, const char *word) |
|
size_t csz, lsz, ssz; |
size_t csz, lsz, ssz; |
enum mandoc_esc esc; |
enum mandoc_esc esc; |
|
|
if ( ! (TERMP_NOSPACE & p->flags)) { |
if ((p->flags & TERMP_NOBUF) == 0) { |
if ( ! (TERMP_KEEP & p->flags)) { |
if ((p->flags & TERMP_NOSPACE) == 0) { |
bufferc(p, ' '); |
if ((p->flags & TERMP_KEEP) == 0) { |
if (TERMP_SENTENCE & p->flags) |
|
bufferc(p, ' '); |
bufferc(p, ' '); |
} else |
if (p->flags & TERMP_SENTENCE) |
bufferc(p, ASCII_NBRSP); |
bufferc(p, ' '); |
|
} else |
|
bufferc(p, ASCII_NBRSP); |
|
} |
|
if (p->flags & TERMP_PREKEEP) |
|
p->flags |= TERMP_KEEP; |
|
if (p->flags & TERMP_NONOSPACE) |
|
p->flags |= TERMP_NOSPACE; |
|
else |
|
p->flags &= ~TERMP_NOSPACE; |
|
p->flags &= ~(TERMP_SENTENCE | TERMP_NONEWLINE); |
|
p->skipvsp = 0; |
} |
} |
if (TERMP_PREKEEP & p->flags) |
|
p->flags |= TERMP_KEEP; |
|
|
|
if ( ! (p->flags & TERMP_NONOSPACE)) |
|
p->flags &= ~TERMP_NOSPACE; |
|
else |
|
p->flags |= TERMP_NOSPACE; |
|
|
|
p->flags &= ~(TERMP_SENTENCE | TERMP_NONEWLINE); |
|
p->skipvsp = 0; |
|
|
|
while ('\0' != *word) { |
while ('\0' != *word) { |
if ('\\' != *word) { |
if ('\\' != *word) { |
if (TERMP_NBRWORD & p->flags) { |
if (TERMP_NBRWORD & p->flags) { |
Line 590 adjbuf(struct termp *p, size_t sz) |
|
Line 598 adjbuf(struct termp *p, size_t sz) |
|
static void |
static void |
bufferc(struct termp *p, char c) |
bufferc(struct termp *p, char c) |
{ |
{ |
|
if (p->flags & TERMP_NOBUF) { |
|
(*p->letter)(p, c); |
|
return; |
|
} |
if (p->col + 1 >= p->maxcols) |
if (p->col + 1 >= p->maxcols) |
adjbuf(p, p->col + 1); |
adjbuf(p, p->col + 1); |
|
|
p->buf[p->col++] = c; |
p->buf[p->col++] = c; |
} |
} |
|
|
Line 607 encode1(struct termp *p, int c) |
|
Line 617 encode1(struct termp *p, int c) |
|
{ |
{ |
enum termfont f; |
enum termfont f; |
|
|
|
if (p->flags & TERMP_NOBUF) { |
|
(*p->letter)(p, c); |
|
return; |
|
} |
|
|
if (p->col + 7 >= p->maxcols) |
if (p->col + 7 >= p->maxcols) |
adjbuf(p, p->col + 7); |
adjbuf(p, p->col + 7); |
|
|
|
|
encode(struct termp *p, const char *word, size_t sz) |
encode(struct termp *p, const char *word, size_t sz) |
{ |
{ |
size_t i; |
size_t i; |
|
|
|
if (p->flags & TERMP_NOBUF) { |
|
for (i = 0; i < sz; i++) |
|
(*p->letter)(p, word[i]); |
|
return; |
|
} |
|
|
if (p->col + 2 + (sz * 5) >= p->maxcols) |
if (p->col + 2 + (sz * 5) >= p->maxcols) |
adjbuf(p, p->col + 2 + (sz * 5)); |
adjbuf(p, p->col + 2 + (sz * 5)); |