summaryrefslogtreecommitdiffstats
path: root/term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2010-05-24 21:34:16 +0000
committerIngo Schwarze <schwarze@openbsd.org>2010-05-24 21:34:16 +0000
commitd0f1de7c988060895fa78550174754f334d3b8ff (patch)
treec38044c47a818a179479eeabe5568f73aa96cd7d /term.c
parent1168cba5930f4bb623acc6ddd0637b0d1ac272a5 (diff)
downloadmandoc-d0f1de7c988060895fa78550174754f334d3b8ff.tar.gz
Handle literal tab characters both in literal context (.Bd -literal)
and outside. In literal context, tab stops are at each eigth column; outside, they are at each fifth column. from OpenBSD mdoc_term.c rev. 1.75; "commit" kristaps@
Diffstat (limited to 'term.c')
-rw-r--r--term.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/term.c b/term.c
index 0424fb38..471056c4 100644
--- a/term.c
+++ b/term.c
@@ -84,6 +84,7 @@ term_alloc(enum termenc enc, size_t width)
perror(NULL);
exit(EXIT_FAILURE);
}
+ p->tabwidth = 5;
p->enc = enc;
/* Enforce some lower boundary. */
if (width < 60)
@@ -171,6 +172,17 @@ term_flushln(struct termp *p)
while (i < (int)p->col) {
/*
+ * Handle literal tab characters.
+ */
+ for (j = i; j < (int)p->col; j++) {
+ if ('\t' != p->buf[j])
+ break;
+ vend = (vis/p->tabwidth+1)*p->tabwidth;
+ vbl += vend - vis;
+ vis = vend;
+ }
+
+ /*
* Count up visible word characters. Control sequences
* (starting with the CSI) aren't counted. A space
* generates a non-printing word, which is valid (the
@@ -178,8 +190,8 @@ term_flushln(struct termp *p)
*/
/* LINTED */
- for (j = i; j < (int)p->col; j++) {
- if (j && ' ' == p->buf[j])
+ for ( ; j < (int)p->col; j++) {
+ if ((j && ' ' == p->buf[j]) || '\t' == p->buf[j])
break;
if (8 == p->buf[j])
vend--;
@@ -209,8 +221,16 @@ term_flushln(struct termp *p)
p->overstep = 0;
}
+ /*
+ * Skip leading tabs, they were handled above.
+ */
+ while (i < (int)p->col && '\t' == p->buf[i])
+ i++;
+
/* Write out the [remaining] word. */
for ( ; i < (int)p->col; i++) {
+ if ('\t' == p->buf[i])
+ break;
if (' ' == p->buf[i]) {
while (' ' == p->buf[i]) {
vbl++;