version 1.210, 2013/08/21 21:20:40 |
version 1.212, 2013/12/23 02:20:09 |
Line 83 term_end(struct termp *p) |
|
Line 83 term_end(struct termp *p) |
|
* - TERMP_NOBREAK: this is the most important and is used when making |
* - TERMP_NOBREAK: this is the most important and is used when making |
* columns. In short: don't print a newline and instead expect the |
* columns. In short: don't print a newline and instead expect the |
* next call to do the padding up to the start of the next column. |
* next call to do the padding up to the start of the next column. |
|
* p->trailspace may be set to 0, 1, or 2, depending on how many |
|
* space characters are required at the end of the column. |
* |
* |
* - TERMP_TWOSPACE: make sure there is room for at least two space |
|
* characters of padding. Otherwise, rather break the line. |
|
* |
|
* - TERMP_DANGLE: don't newline when TERMP_NOBREAK is specified and |
* - TERMP_DANGLE: don't newline when TERMP_NOBREAK is specified and |
* the line is overrun, and don't pad-right if it's underrun. |
* the line is overrun, and don't pad-right if it's underrun. |
* |
* |
Line 121 term_flushln(struct termp *p) |
|
Line 120 term_flushln(struct termp *p) |
|
* First, establish the maximum columns of "visible" content. |
* First, establish the maximum columns of "visible" content. |
* This is usually the difference between the right-margin and |
* This is usually the difference between the right-margin and |
* an indentation, but can be, for tagged lists or columns, a |
* an indentation, but can be, for tagged lists or columns, a |
* small set of values. |
* small set of values. |
|
* |
|
* The following unsigned-signed subtractions look strange, |
|
* but they are actually correct. If the int p->overstep |
|
* is negative, it gets sign extended. Subtracting that |
|
* very large size_t effectively adds a small number to dv. |
*/ |
*/ |
assert (p->rmargin >= p->offset); |
assert (p->rmargin >= p->offset); |
dv = p->rmargin - p->offset; |
dv = p->rmargin - p->offset; |
Line 200 term_flushln(struct termp *p) |
|
Line 204 term_flushln(struct termp *p) |
|
if (0 < ntab) |
if (0 < ntab) |
vbl += ntab * p->tabwidth; |
vbl += ntab * p->tabwidth; |
|
|
/* Remove the p->overstep width. */ |
/* |
|
* Remove the p->overstep width. |
|
* Again, if p->overstep is negative, |
|
* sign extension does the right thing. |
|
*/ |
|
|
bp += (size_t)p->overstep; |
bp += (size_t)p->overstep; |
p->overstep = 0; |
p->overstep = 0; |
Line 269 term_flushln(struct termp *p) |
|
Line 277 term_flushln(struct termp *p) |
|
} |
} |
|
|
if (TERMP_HANG & p->flags) { |
if (TERMP_HANG & p->flags) { |
/* We need one blank after the tag. */ |
p->overstep = (int)(vis - maxvis + |
p->overstep = (int)(vis - maxvis + (*p->width)(p, ' ')); |
p->trailspace * (*p->width)(p, ' ')); |
|
|
/* |
/* |
* If we have overstepped the margin, temporarily move |
* If we have overstepped the margin, temporarily move |
* it to the right and flag the rest of the line to be |
* it to the right and flag the rest of the line to be |
* shorter. |
* shorter. |
|
* If there is a request to keep the columns together, |
|
* allow negative overstep when the column is not full. |
*/ |
*/ |
if (p->overstep < 0) |
if (p->trailspace && p->overstep < 0) |
p->overstep = 0; |
p->overstep = 0; |
return; |
return; |
|
|
Line 285 term_flushln(struct termp *p) |
|
Line 295 term_flushln(struct termp *p) |
|
return; |
return; |
|
|
/* If the column was overrun, break the line. */ |
/* If the column was overrun, break the line. */ |
if (maxvis <= vis + |
if (maxvis < vis + p->trailspace * (*p->width)(p, ' ')) { |
((TERMP_TWOSPACE & p->flags) ? (*p->width)(p, ' ') : 0)) { |
|
(*p->endline)(p); |
(*p->endline)(p); |
p->viscol = 0; |
p->viscol = 0; |
} |
} |