From c6e959568733601f6b74e21b18a4243e63f53f3b Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Mon, 2 Mar 2009 12:09:32 +0000 Subject: [PATCH] Support for maxrmargin-breaking with TERMP_NOBREAK. Tabs auto-converted to spaces. --- mdoc.h | 3 ++- mdocterm.c | 38 ++++++++++++++++++++++++++++++++++---- strings.c | 11 ++++++++--- term.c | 12 +++++++----- term.h | 4 +++- 5 files changed, 54 insertions(+), 14 deletions(-) diff --git a/mdoc.h b/mdoc.h index 96f55de9..6ec0e467 100644 --- a/mdoc.h +++ b/mdoc.h @@ -1,4 +1,4 @@ -/* $Id: mdoc.h,v 1.35 2009/02/24 14:52:55 kristaps Exp $ */ +/* $Id: mdoc.h,v 1.36 2009/03/02 12:09:32 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -220,6 +220,7 @@ enum mdoc_att { ATT_v6, ATT_v7, ATT_32v, + ATT_V, ATT_V1, ATT_V2, ATT_V3, 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]); } diff --git a/strings.c b/strings.c index 896971a9..4910e308 100644 --- a/strings.c +++ b/strings.c @@ -1,4 +1,4 @@ -/* $Id: strings.c,v 1.22 2009/02/27 10:55:16 kristaps Exp $ */ +/* $Id: strings.c,v 1.23 2009/03/02 12:09:32 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -190,9 +190,9 @@ mdoc_atotime(const char *p) (void)memset(&tm, 0, sizeof(struct tm)); - if (xstrcmp(p, "$Mdocdate: February 27 2009 $")) + if (xstrcmp(p, "$Mdocdate: March 2 2009 $")) return(time(NULL)); - if ((pp = strptime(p, "$Mdocdate: February 27 2009 $", &tm)) && 0 == *pp) + if ((pp = strptime(p, "$Mdocdate: March 2 2009 $", &tm)) && 0 == *pp) return(mktime(&tm)); /* XXX - this matches "June 1999", which is wrong. */ if ((pp = strptime(p, "%b %d %Y", &tm)) && 0 == *pp) @@ -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; diff --git a/term.c b/term.c index 2f10c0a5..e1fa44da 100644 --- a/term.c +++ b/term.c @@ -1,4 +1,4 @@ -/* $Id: term.c,v 1.33 2009/03/01 23:27:14 kristaps Exp $ */ +/* $Id: term.c,v 1.34 2009/03/02 12:09:32 kristaps Exp $ */ /* * Copyright (c) 2009 Kristaps Dzonsons * @@ -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"); } diff --git a/term.h b/term.h index 95e75d2a..48162221 100644 --- a/term.h +++ b/term.h @@ -1,4 +1,4 @@ -/* $Id: term.h,v 1.12 2009/03/01 13:06:49 kristaps Exp $ */ +/* $Id: term.h,v 1.13 2009/03/02 12:09:32 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -21,6 +21,8 @@ #include "mdoc.h" +#define INDENT 6 + __BEGIN_DECLS struct termp { -- 2.47.1