From c6e959568733601f6b74e21b18a4243e63f53f3b Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Mon, 2 Mar 2009 12:09:32 +0000 Subject: Support for maxrmargin-breaking with TERMP_NOBREAK. Tabs auto-converted to spaces. --- mdocterm.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'mdocterm.c') diff --git a/mdocterm.c b/mdocterm.c index 499c4da1..7a0e1230 100644 --- a/mdocterm.c +++ b/mdocterm.c @@ -1,4 +1,4 @@ -/* $Id: mdocterm.c,v 1.23 2009/03/01 23:23:55 kristaps Exp $ */ +/* $Id: mdocterm.c,v 1.24 2009/03/02 12:09:32 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -85,6 +85,7 @@ static void footer(struct termp *, static void pword(struct termp *, const char *, size_t); static void pescape(struct termp *, const char *, size_t *, size_t); +static void pgraph(struct termp *, char); static void nescape(struct termp *, const char *, size_t); static void chara(struct termp *, char); @@ -199,7 +200,8 @@ flushln(struct termp *p) * * If we're not breaking... * - * Don't let the visible size exceed the full margin. + * Don't let the visible size exceed the full right + * margin. */ if ( ! (TERMP_NOBREAK & p->flags)) { @@ -210,8 +212,12 @@ flushln(struct termp *p) vis = 0; } else if (vis + vsz > maxvis) errx(1, "word breaks right margin"); - } else if (vis + vsz > p->maxrmargin) - errx(1, "word breaks right margin"); + } else if (vis + vsz > p->maxrmargin - p->offset) { + putchar('\n'); + for (j = 0; j < p->rmargin; j++) + putchar(' '); + vis = p->rmargin; + } /* * Write out the word and a trailing space. Omit the @@ -424,6 +430,26 @@ nescape(struct termp *p, const char *word, size_t len) } +static void +pgraph(struct termp *p, char byte) +{ + int i; + + switch (byte) { + case (' '): + chara(p, ' '); + break; + case ('\t'): + for (i = 0; i < INDENT; i++) + chara(p, ' '); + break; + default: + warnx("unknown non-graphing character"); + break; + } +} + + static void pescape(struct termp *p, const char *word, size_t *i, size_t len) { @@ -527,6 +553,10 @@ pword(struct termp *p, const char *word, size_t len) pescape(p, word, &i, len); continue; } + if ( ! isgraph((int)word[i])) { + pgraph(p, word[i]); + continue; + } chara(p, word[i]); } -- cgit v1.2.3-56-ge451