summaryrefslogtreecommitdiffstats
path: root/mdoc_man.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2012-07-13 14:19:49 +0000
committerIngo Schwarze <schwarze@openbsd.org>2012-07-13 14:19:49 +0000
commit1d9f222c71514edbb38c172df3c47de91a0113fd (patch)
tree6f01ba21f99dddc0940c8ae490e47966ef083c30 /mdoc_man.c
parent00dbc3009d4f54812c18b39ea2af11c5f2d1b31c (diff)
downloadmandoc-1d9f222c71514edbb38c172df3c47de91a0113fd.tar.gz
In -man -Tascii, support .sp with negative argument.
In -mdoc -Tman, improve the framework to control vertical spacing. Use both to support .Bl -compact (surprisingly hard to get right). OpenBSD rev. 1.85 and 1.34, respectively.
Diffstat (limited to 'mdoc_man.c')
-rw-r--r--mdoc_man.c151
1 files changed, 82 insertions, 69 deletions
diff --git a/mdoc_man.c b/mdoc_man.c
index 2c03f237..adfd3659 100644
--- a/mdoc_man.c
+++ b/mdoc_man.c
@@ -102,6 +102,8 @@ static int pre_vt(DECL_ARGS);
static int pre_ux(DECL_ARGS);
static int pre_xr(DECL_ARGS);
static void print_word(const char *);
+static void print_line(const char *, int);
+static void print_block(const char *, int);
static void print_offs(const char *);
static void print_width(const char *,
const struct mdoc_node *, size_t);
@@ -241,15 +243,16 @@ static const struct manact manacts[MDOC_MAX + 1] = {
};
static int outflags;
-#define MMAN_spc (1 << 0)
-#define MMAN_spc_force (1 << 1)
-#define MMAN_nl (1 << 2)
-#define MMAN_br (1 << 3)
-#define MMAN_sp (1 << 4)
-#define MMAN_Sm (1 << 5)
-#define MMAN_Bk (1 << 6)
-#define MMAN_An_split (1 << 7)
-#define MMAN_An_nosplit (1 << 8)
+#define MMAN_spc (1 << 0) /* blank character before next word */
+#define MMAN_spc_force (1 << 1) /* even before trailing punctuation */
+#define MMAN_nl (1 << 2) /* break man(7) code line */
+#define MMAN_br (1 << 3) /* break output line */
+#define MMAN_sp (1 << 4) /* insert a blank output line */
+#define MMAN_PP (1 << 5) /* reset indentation etc. */
+#define MMAN_Sm (1 << 6) /* horizontal spacing mode */
+#define MMAN_Bk (1 << 7) /* word keep mode */
+#define MMAN_An_split (1 << 8) /* author mode is "split" */
+#define MMAN_An_nosplit (1 << 9) /* author mode is "nosplit" */
static struct {
char *head;
@@ -287,17 +290,21 @@ static void
print_word(const char *s)
{
- if ((MMAN_sp | MMAN_br | MMAN_nl) & outflags) {
+ if ((MMAN_PP | MMAN_sp | MMAN_br | MMAN_nl) & outflags) {
/*
* If we need a newline, print it now and start afresh.
*/
- if (MMAN_sp & outflags)
+ if (MMAN_PP & outflags) {
+ if ( ! (MMAN_sp & outflags))
+ printf("\n.sp -1v");
+ printf("\n.PP\n");
+ } else if (MMAN_sp & outflags)
printf("\n.sp\n");
else if (MMAN_br & outflags)
printf("\n.br\n");
else if (MMAN_nl & outflags)
putchar('\n');
- outflags &= ~(MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc);
+ outflags &= ~(MMAN_PP|MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc);
} else if (MMAN_spc & outflags && '\0' != s[0])
/*
* If we need a space, only print it if
@@ -341,6 +348,30 @@ print_word(const char *s)
}
static void
+print_line(const char *s, int newflags)
+{
+
+ outflags &= ~MMAN_br;
+ outflags |= MMAN_nl;
+ print_word(s);
+ outflags |= newflags;
+}
+
+static void
+print_block(const char *s, int newflags)
+{
+
+ outflags &= ~MMAN_PP;
+ if (MMAN_sp & outflags)
+ outflags &= ~(MMAN_sp | MMAN_br);
+ else
+ print_line(".sp -1v", 0);
+ outflags |= MMAN_nl;
+ print_word(s);
+ outflags |= newflags;
+}
+
+static void
print_offs(const char *v)
{
char buf[24];
@@ -381,9 +412,9 @@ print_width(const char *v, const struct mdoc_node *child, size_t defsz)
sz = su.scale;
else {
if (chsz)
- print_word(".HP");
+ print_block(".HP", 0);
else
- print_word(".TP");
+ print_block(".TP", 0);
print_word(v);
return;
}
@@ -391,9 +422,9 @@ print_width(const char *v, const struct mdoc_node *child, size_t defsz)
sz = strlen(v);
if (chsz > sz)
- print_word(".HP");
+ print_block(".HP", 0);
else
- print_word(".TP");
+ print_block(".TP", 0);
snprintf(buf, sizeof(buf), "%ldn", sz + 2);
print_word(buf);
}
@@ -597,8 +628,8 @@ pre_sect(DECL_ARGS)
if (MDOC_HEAD != n->type)
return(1);
- outflags |= MMAN_nl;
- print_word(manacts[n->tok].prefix);
+ outflags |= MMAN_sp;
+ print_block(manacts[n->tok].prefix, 0);
print_word("\"");
outflags &= ~MMAN_spc;
return(1);
@@ -697,15 +728,14 @@ static int
pre_bd(DECL_ARGS)
{
- if (0 == n->norm->Bd.comp)
- outflags |= MMAN_sp;
+ outflags &= ~(MMAN_PP | MMAN_sp | MMAN_br);
+
if (DISP_unfilled == n->norm->Bd.type ||
- DISP_literal == n->norm->Bd.type) {
- outflags |= MMAN_nl;
- print_word(".nf");
- }
- outflags |= MMAN_nl;
- print_word(".RS");
+ DISP_literal == n->norm->Bd.type)
+ print_line(".nf", 0);
+ if (0 == n->norm->Bd.comp && NULL != n->parent->prev)
+ outflags |= MMAN_sp;
+ print_line(".RS", 0);
print_offs(n->norm->Bd.offs);
outflags |= MMAN_nl;
return(1);
@@ -715,14 +745,10 @@ static void
post_bd(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".RE");
+ print_line(".RE", MMAN_nl);
if (DISP_unfilled == n->norm->Bd.type ||
- DISP_literal == n->norm->Bd.type) {
- outflags |= MMAN_nl;
- print_word(".fi");
- }
- outflags |= MMAN_nl;
+ DISP_literal == n->norm->Bd.type)
+ print_line(".fi", MMAN_nl);
}
static int
@@ -797,12 +823,11 @@ pre_bl(DECL_ARGS)
return(1);
}
- outflags |= MMAN_nl;
- print_word(".TS");
- outflags |= MMAN_nl;
+ print_line(".TS", MMAN_nl);
for (icol = 0; icol < n->norm->Bl.ncols; icol++)
print_word("l");
print_word(".");
+ outflags |= MMAN_nl;
return(1);
}
@@ -811,17 +836,17 @@ post_bl(DECL_ARGS)
{
switch (n->norm->Bl.type) {
+ case (LIST_column):
+ print_line(".TE", 0);
+ break;
case (LIST_enum):
n->norm->Bl.count = 0;
break;
- case (LIST_column):
- outflags |= MMAN_nl;
- print_word(".TE");
- break;
default:
break;
}
- outflags |= MMAN_br;
+ outflags |= MMAN_PP | MMAN_nl;
+ outflags &= ~(MMAN_sp | MMAN_br);
}
static int
@@ -856,9 +881,7 @@ static int
pre_dl(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".RS 6n");
- outflags |= MMAN_nl;
+ print_line(".RS 6n", MMAN_nl);
return(1);
}
@@ -866,9 +889,7 @@ static void
post_dl(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".RE");
- outflags |= MMAN_nl;
+ print_line(".RE", MMAN_nl);
}
static int
@@ -1070,28 +1091,24 @@ pre_it(DECL_ARGS)
switch (n->type) {
case (MDOC_HEAD):
- outflags |= MMAN_nl;
+ outflags |= MMAN_PP | MMAN_nl;
bln = n->parent->parent;
+ if (0 == bln->norm->Bl.comp ||
+ NULL == bln->parent->prev)
+ outflags |= MMAN_sp;
+ outflags &= ~MMAN_br;
switch (bln->norm->Bl.type) {
case (LIST_item):
- if (bln->norm->Bl.comp)
- outflags |= MMAN_br;
- else
- outflags |= MMAN_sp;
return(0);
case (LIST_inset):
/* FALLTHROUGH */
case (LIST_diag):
/* FALLTHROUGH */
case (LIST_ohang):
- if (bln->norm->Bl.comp)
- outflags |= MMAN_br;
- else
- outflags |= MMAN_sp;
if (bln->norm->Bl.type == LIST_diag)
- print_word(".B \"");
+ print_line(".B \"", 0);
else
- print_word(".R \"");
+ print_line(".R \"", 0);
outflags &= ~MMAN_spc;
return(1);
case (LIST_bullet):
@@ -1254,12 +1271,10 @@ static int
pre_pp(DECL_ARGS)
{
- outflags |= MMAN_nl;
- if (MDOC_It == n->parent->tok)
- print_word(".sp");
- else
- print_word(".PP");
- outflags |= MMAN_nl;
+ if (MDOC_It != n->parent->tok)
+ outflags |= MMAN_PP;
+ outflags |= MMAN_sp | MMAN_nl;
+ outflags &= ~MMAN_br;
return(0);
}
@@ -1268,9 +1283,8 @@ pre_rs(DECL_ARGS)
{
if (SEC_SEE_ALSO == n->sec) {
- outflags |= MMAN_nl;
- print_word(".PP");
- outflags |= MMAN_nl;
+ outflags |= MMAN_PP | MMAN_sp | MMAN_nl;
+ outflags &= ~MMAN_br;
}
return(1);
}
@@ -1291,8 +1305,7 @@ static int
pre_sp(DECL_ARGS)
{
- outflags |= MMAN_nl;
- print_word(".sp");
+ print_line(".sp", MMAN_nl);
return(1);
}