diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-03-02 12:09:32 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2009-03-02 12:09:32 +0000 |
commit | aaee43f80d524f98453fc13d60a657085867666f (patch) | |
tree | f6b8376da6ae9f8513fd063a8964c90196ea74b0 | |
parent | e903ad85303a8374b9733895ec177aa5d7b558a7 (diff) | |
download | mandoc-aaee43f80d524f98453fc13d60a657085867666f.tar.gz |
Support for maxrmargin-breaking with TERMP_NOBREAK.
Tabs auto-converted to spaces.
-rw-r--r-- | mdoc.h | 1 | ||||
-rw-r--r-- | mdocterm.c | 36 | ||||
-rw-r--r-- | strings.c | 5 | ||||
-rw-r--r-- | term.c | 10 | ||||
-rw-r--r-- | term.h | 2 |
5 files changed, 47 insertions, 7 deletions
@@ -220,6 +220,7 @@ enum mdoc_att { ATT_v6, ATT_v7, ATT_32v, + ATT_V, ATT_V1, ATT_V2, ATT_V3, @@ -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 @@ -425,6 +431,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) { size_t j; @@ -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]); } @@ -358,6 +358,8 @@ mdoc_atoatt(const char *p) return(ATT_v7); else if (0 == strcmp(p, "32v")) return(ATT_32v); + else if (0 == strcmp(p, "V")) + return(ATT_V); else if (0 == strcmp(p, "V.1")) return(ATT_V1); else if (0 == strcmp(p, "V.2")) @@ -719,6 +721,9 @@ mdoc_att2a(enum mdoc_att c) case(ATT_32v): p = "Version 32V AT&T UNIX"; break; + case(ATT_V): + p = "AT&T System V UNIX"; + break; case(ATT_V1): p = "AT&T System V.1 UNIX"; break; @@ -25,8 +25,6 @@ #include "term.h" -#define INDENT 6 - /* * Performs actions on nodes of the abstract syntax tree. Both pre- and * post-fix operations are defined here. @@ -934,6 +932,9 @@ static int termp_ft_pre(DECL_ARGS) { + if (SEC_SYNOPSIS == node->sec) + if (node->prev && MDOC_Fo == node->prev->tok) + vspace(p); TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_FUNC_TYPE]); return(1); } @@ -944,7 +945,7 @@ static void termp_ft_post(DECL_ARGS) { - if (node->sec == SEC_SYNOPSIS) + if (SEC_SYNOPSIS == node->sec) newln(p); } @@ -1141,7 +1142,8 @@ static void termp_bx_post(DECL_ARGS) { - p->flags |= TERMP_NOSPACE; + if (node->child) + p->flags |= TERMP_NOSPACE; word(p, "BSD"); } @@ -21,6 +21,8 @@ #include "mdoc.h" +#define INDENT 6 + __BEGIN_DECLS struct termp { |