diff options
-rw-r--r-- | mdoc_term.c | 5 | ||||
-rw-r--r-- | term.c | 24 | ||||
-rw-r--r-- | term.h | 1 |
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; @@ -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++; @@ -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; |