version 1.91, 2009/07/21 13:34:13 |
version 1.94, 2009/07/27 12:02:49 |
Line 34 static void term_free(struct termp *); |
|
Line 34 static void term_free(struct termp *); |
|
static void term_pescape(struct termp *, const char **); |
static void term_pescape(struct termp *, const char **); |
static void term_nescape(struct termp *, |
static void term_nescape(struct termp *, |
const char *, size_t); |
const char *, size_t); |
|
static void term_sescape(struct termp *, |
|
const char *, size_t); |
static void term_chara(struct termp *, char); |
static void term_chara(struct termp *, char); |
static void term_encodea(struct termp *, char); |
static void term_encodea(struct termp *, char); |
static int term_isopendelim(const char *); |
static int term_isopendelim(const char *); |
Line 227 term_flushln(struct termp *p) |
|
Line 229 term_flushln(struct termp *p) |
|
*/ |
*/ |
|
|
assert(p->offset < p->rmargin); |
assert(p->offset < p->rmargin); |
maxvis = p->rmargin - p->offset - overstep; |
assert((int)(p->rmargin - p->offset) - overstep > 0); |
mmax = p->maxrmargin - p->offset - overstep; |
|
|
maxvis = /* LINTED */ |
|
p->rmargin - p->offset - overstep; |
|
mmax = /* LINTED */ |
|
p->maxrmargin - p->offset - overstep; |
|
|
bp = TERMP_NOBREAK & p->flags ? mmax : maxvis; |
bp = TERMP_NOBREAK & p->flags ? mmax : maxvis; |
vis = 0; |
vis = 0; |
overstep = 0; |
overstep = 0; |
Line 254 term_flushln(struct termp *p) |
|
Line 261 term_flushln(struct termp *p) |
|
|
|
/* LINTED */ |
/* LINTED */ |
for (j = i, vsz = 0; j < (int)p->col; j++) { |
for (j = i, vsz = 0; j < (int)p->col; j++) { |
if (' ' == p->buf[j]) |
if (j && ' ' == p->buf[j]) |
break; |
break; |
else if (8 == p->buf[j]) |
else if (8 == p->buf[j]) |
vsz--; |
vsz--; |
Line 309 term_flushln(struct termp *p) |
|
Line 316 term_flushln(struct termp *p) |
|
} |
} |
|
|
if (TERMP_HANG & p->flags) { |
if (TERMP_HANG & p->flags) { |
|
|
/* We need one blank after the tag. */ |
/* We need one blank after the tag. */ |
overstep = vis - maxvis + 1; |
overstep = /* LINTED */ |
|
vis - maxvis + 1; |
|
|
/* |
/* |
* Behave exactly the same way as groff: |
* Behave exactly the same way as groff: |
* If we have overstepped the margin, temporarily move it |
* If we have overstepped the margin, temporarily move |
* to the right and flag the rest of the line to be shorter. |
* it to the right and flag the rest of the line to be |
|
* shorter. |
* If we landed right at the margin, be happy. |
* If we landed right at the margin, be happy. |
* If we are one step before the margin, temporarily move it |
* If we are one step before the margin, temporarily |
* one step LEFT and flag the rest of the line to be longer. |
* move it one step LEFT and flag the rest of the line |
|
* to be longer. |
*/ |
*/ |
if (overstep >= -1) |
if (overstep >= -1) { |
|
assert((int)maxvis + overstep >= 0); |
|
/* LINTED */ |
maxvis += overstep; |
maxvis += overstep; |
else |
} else |
overstep = 0; |
overstep = 0; |
|
|
} else if (TERMP_DANGLE & p->flags) |
} else if (TERMP_DANGLE & p->flags) |
return; |
return; |
|
|
if (maxvis > vis + ((TERMP_TWOSPACE & p->flags) ? 1 : 0)) /* pad */ |
/* Right-pad. */ |
|
if (maxvis > vis + /* LINTED */ |
|
((TERMP_TWOSPACE & p->flags) ? 1 : 0)) |
for ( ; vis < maxvis; vis++) |
for ( ; vis < maxvis; vis++) |
putchar(' '); |
putchar(' '); |
else { /* break */ |
else { /* ...or newline break. */ |
putchar('\n'); |
putchar('\n'); |
for (i = 0; i < (int)p->rmargin; i++) |
for (i = 0; i < (int)p->rmargin; i++) |
putchar(' '); |
putchar(' '); |
Line 388 term_nescape(struct termp *p, const char *word, size_t |
|
Line 401 term_nescape(struct termp *p, const char *word, size_t |
|
|
|
rhs = term_a2ascii(p->symtab, word, len, &sz); |
rhs = term_a2ascii(p->symtab, word, len, &sz); |
|
|
if (rhs) |
if (NULL == rhs) |
for (i = 0; i < (int)sz; i++) |
return; |
term_encodea(p, rhs[i]); |
for (i = 0; i < (int)sz; i++) |
|
term_encodea(p, rhs[i]); |
} |
} |
|
|
|
|
|
static void |
|
term_sescape(struct termp *p, const char *word, size_t len) |
|
{ |
|
const char *rhs; |
|
size_t sz; |
|
int i; |
|
|
|
rhs = term_a2res(p->symtab, word, len, &sz); |
|
|
|
if (NULL == rhs) |
|
return; |
|
for (i = 0; i < (int)sz; i++) |
|
term_encodea(p, rhs[i]); |
|
} |
|
|
|
|
/* |
/* |
* Handle an escape sequence: determine its length and pass it to the |
* Handle an escape sequence: determine its length and pass it to the |
* escape-symbol look table. Note that we assume mdoc(3) has validated |
* escape-symbol look table. Note that we assume mdoc(3) has validated |
Line 437 term_pescape(struct termp *p, const char **word) |
|
Line 467 term_pescape(struct termp *p, const char **word) |
|
return; |
return; |
} |
} |
|
|
term_nescape(p, wp, 2); |
term_sescape(p, wp, 2); |
*word = ++wp; |
*word = ++wp; |
return; |
return; |
case ('['): |
case ('['): |
break; |
break; |
default: |
default: |
term_nescape(p, wp, 1); |
term_sescape(p, wp, 1); |
*word = wp; |
*word = wp; |
return; |
return; |
} |
} |