version 1.289, 2022/08/15 18:12:30 |
version 1.291, 2023/04/28 19:11:04 |
Line 157 term_flushln(struct termp *p) |
|
Line 157 term_flushln(struct termp *p) |
|
/* Finally, print the field content. */ |
/* Finally, print the field content. */ |
|
|
term_field(p, vbl, nbr); |
term_field(p, vbl, nbr); |
p->tcol->taboff += vbr + (*p->width)(p, ' '); |
if (vbr < vtarget) |
|
p->tcol->taboff += vbr; |
|
else |
|
p->tcol->taboff += vtarget; |
|
p->tcol->taboff += (*p->width)(p, ' '); |
|
|
/* |
/* |
* If there is no text left in the field, exit the loop. |
* If there is no text left in the field, exit the loop. |
Line 177 term_flushln(struct termp *p) |
|
Line 181 term_flushln(struct termp *p) |
|
vbr += (*p->width)(p, ' '); |
vbr += (*p->width)(p, ' '); |
continue; |
continue; |
case '\n': |
case '\n': |
|
case ASCII_NBRZW: |
case ASCII_BREAK: |
case ASCII_BREAK: |
|
case ASCII_TABREF: |
continue; |
continue; |
default: |
default: |
break; |
break; |
Line 188 term_flushln(struct termp *p) |
|
Line 194 term_flushln(struct termp *p) |
|
break; |
break; |
|
|
/* |
/* |
* At the location of an automtic line break, input |
* At the location of an automatic line break, input |
* space characters are consumed by the line break. |
* space characters are consumed by the line break. |
*/ |
*/ |
|
|
Line 258 term_fill(struct termp *p, size_t *nbr, size_t *vbr, s |
|
Line 264 term_fill(struct termp *p, size_t *nbr, size_t *vbr, s |
|
size_t vn; /* Visual position of the next character. */ |
size_t vn; /* Visual position of the next character. */ |
int breakline; /* Break at the end of this word. */ |
int breakline; /* Break at the end of this word. */ |
int graph; /* Last character was non-blank. */ |
int graph; /* Last character was non-blank. */ |
|
int taboff; /* Temporary offset for literal tabs. */ |
|
|
*nbr = *vbr = vis = 0; |
*nbr = *vbr = vis = 0; |
breakline = graph = 0; |
breakline = graph = 0; |
|
taboff = p->tcol->taboff; |
for (ic = p->tcol->col; ic < p->tcol->lastcol; ic++) { |
for (ic = p->tcol->col; ic < p->tcol->lastcol; ic++) { |
switch (p->tcol->buf[ic]) { |
switch (p->tcol->buf[ic]) { |
case '\b': /* Escape \o (overstrike) or backspace markup. */ |
case '\b': /* Escape \o (overstrike) or backspace markup. */ |
Line 306 term_fill(struct termp *p, size_t *nbr, size_t *vbr, s |
|
Line 314 term_fill(struct termp *p, size_t *nbr, size_t *vbr, s |
|
*vbr = vis; |
*vbr = vis; |
continue; |
continue; |
|
|
|
case ASCII_TABREF: |
|
taboff = -vis - (*p->width)(p, ' '); |
|
continue; |
|
|
default: |
default: |
switch (p->tcol->buf[ic]) { |
switch (p->tcol->buf[ic]) { |
case '\t': |
case '\t': |
vis += p->tcol->taboff; |
if (taboff < 0 && (size_t)-taboff > vis) |
|
vis = 0; |
|
else |
|
vis += taboff; |
vis = term_tab_next(vis); |
vis = term_tab_next(vis); |
vis -= p->tcol->taboff; |
vis -= taboff; |
break; |
break; |
case ASCII_NBRZW: /* Non-breakable zero-width. */ |
case ASCII_NBRZW: /* Non-breakable zero-width. */ |
break; |
break; |
Line 354 term_field(struct termp *p, size_t vbl, size_t nbr) |
|
Line 369 term_field(struct termp *p, size_t vbl, size_t nbr) |
|
size_t vis; /* Visual position of the current character. */ |
size_t vis; /* Visual position of the current character. */ |
size_t vt; /* Visual position including tab offset. */ |
size_t vt; /* Visual position including tab offset. */ |
size_t dv; /* Visual width of the current character. */ |
size_t dv; /* Visual width of the current character. */ |
|
int taboff; /* Temporary offset for literal tabs. */ |
|
|
vis = 0; |
vis = 0; |
|
taboff = p->tcol->taboff; |
for (ic = p->tcol->col; ic < nbr; ic++) { |
for (ic = p->tcol->col; ic < nbr; ic++) { |
|
|
/* |
/* |
Line 368 term_field(struct termp *p, size_t vbl, size_t nbr) |
|
Line 385 term_field(struct termp *p, size_t vbl, size_t nbr) |
|
case ASCII_BREAK: |
case ASCII_BREAK: |
case ASCII_NBRZW: |
case ASCII_NBRZW: |
continue; |
continue; |
|
case ASCII_TABREF: |
|
taboff = -vis - (*p->width)(p, ' '); |
|
continue; |
case '\t': |
case '\t': |
case ' ': |
case ' ': |
case ASCII_NBRSP: |
case ASCII_NBRSP: |
if (p->tcol->buf[ic] == '\t') { |
if (p->tcol->buf[ic] == '\t') { |
vt = p->tcol->taboff + vis; |
if (taboff < 0 && (size_t)-taboff > vis) |
|
vt = 0; |
|
else |
|
vt = vis + taboff; |
dv = term_tab_next(vt) - vt; |
dv = term_tab_next(vt) - vt; |
} else |
} else |
dv = (*p->width)(p, ' '); |
dv = (*p->width)(p, ' '); |
Line 437 endline(struct termp *p) |
|
Line 460 endline(struct termp *p) |
|
void |
void |
term_newln(struct termp *p) |
term_newln(struct termp *p) |
{ |
{ |
p->tcol->taboff = 0; |
|
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
if (p->tcol->lastcol || p->viscol) |
if (p->tcol->lastcol || p->viscol) |
term_flushln(p); |
term_flushln(p); |
|
p->tcol->taboff = 0; |
} |
} |
|
|
/* |
/* |
Line 801 bufferc(struct termp *p, char c) |
|
Line 824 bufferc(struct termp *p, char c) |
|
p->tcol->lastcol = p->col; |
p->tcol->lastcol = p->col; |
} |
} |
|
|
|
void |
|
term_tab_ref(struct termp *p) |
|
{ |
|
if (p->tcol->lastcol && p->tcol->lastcol <= p->col && |
|
(p->flags & TERMP_NOBUF) == 0) |
|
bufferc(p, ASCII_TABREF); |
|
} |
|
|
/* |
/* |
* See encode(). |
* See encode(). |
* Do this for a single (probably unicode) value. |
* Do this for a single (probably unicode) value. |
Line 946 term_strlen(const struct termp *p, const char *cp) |
|
Line 977 term_strlen(const struct termp *p, const char *cp) |
|
const char *seq, *rhs; |
const char *seq, *rhs; |
enum mandoc_esc esc; |
enum mandoc_esc esc; |
static const char rej[] = { '\\', ASCII_NBRSP, ASCII_NBRZW, |
static const char rej[] = { '\\', ASCII_NBRSP, ASCII_NBRZW, |
ASCII_BREAK, ASCII_HYPH, '\0' }; |
ASCII_BREAK, ASCII_HYPH, ASCII_TABREF, '\0' }; |
|
|
/* |
/* |
* Account for escaped sequences within string length |
* Account for escaped sequences within string length |