summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-02 12:09:32 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-02 12:09:32 +0000
commitaaee43f80d524f98453fc13d60a657085867666f (patch)
treef6b8376da6ae9f8513fd063a8964c90196ea74b0
parente903ad85303a8374b9733895ec177aa5d7b558a7 (diff)
downloadmandoc-aaee43f80d524f98453fc13d60a657085867666f.tar.gz
Support for maxrmargin-breaking with TERMP_NOBREAK.
Tabs auto-converted to spaces.
-rw-r--r--mdoc.h1
-rw-r--r--mdocterm.c36
-rw-r--r--strings.c5
-rw-r--r--term.c10
-rw-r--r--term.h2
5 files changed, 47 insertions, 7 deletions
diff --git a/mdoc.h b/mdoc.h
index 8b7dea49..8b8ca2a2 100644
--- a/mdoc.h
+++ b/mdoc.h
@@ -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 52c46551..98ad4cd3 100644
--- a/mdocterm.c
+++ b/mdocterm.c
@@ -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]);
}
diff --git a/strings.c b/strings.c
index 493ab96b..1abe92da 100644
--- a/strings.c
+++ b/strings.c
@@ -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 66a967b2..d742795b 100644
--- a/term.c
+++ b/term.c
@@ -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 17e2d02c..f603d351 100644
--- a/term.h
+++ b/term.h
@@ -21,6 +21,8 @@
#include "mdoc.h"
+#define INDENT 6
+
__BEGIN_DECLS
struct termp {