summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdoc_term.c5
-rw-r--r--term.c24
-rw-r--r--term.h1
3 files changed, 28 insertions, 2 deletions
diff --git a/mdoc_term.c b/mdoc_term.c
index 82723204..5247c2f9 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -274,6 +274,7 @@ terminal_mdoc(void *arg, const struct mdoc *mdoc)
p->overstep = 0;
p->maxrmargin = p->defrmargin;
+ p->tabwidth = 5;
if (NULL == p->symtab)
switch (p->enc) {
@@ -1593,6 +1594,7 @@ termp_fa_pre(DECL_ARGS)
static int
termp_bd_pre(DECL_ARGS)
{
+ size_t tabwidth;
int i, type;
size_t rm, rmax;
const struct mdoc_node *nn;
@@ -1622,6 +1624,8 @@ termp_bd_pre(DECL_ARGS)
if (MDOC_Literal != type && MDOC_Unfilled != type)
return(1);
+ tabwidth = p->tabwidth;
+ p->tabwidth = 8;
rm = p->rmargin;
rmax = p->maxrmargin;
p->rmargin = p->maxrmargin = TERM_MAXMARGIN;
@@ -1636,6 +1640,7 @@ termp_bd_pre(DECL_ARGS)
else if (NULL == nn->prev)
term_flushln(p);
}
+ p->tabwidth = tabwidth;
p->rmargin = rm;
p->maxrmargin = rmax;
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++;
diff --git a/term.h b/term.h
index b0df752f..043178e4 100644
--- a/term.h
+++ b/term.h
@@ -37,6 +37,7 @@ struct termp {
size_t maxrmargin; /* Max right margin. */
size_t maxcols; /* Max size of buf. */
size_t offset; /* Margin offest. */
+ size_t tabwidth; /* Distance of tab positions. */
size_t col; /* Bytes in buf. */
int overstep; /* See termp_flushln(). */
int flags;