summaryrefslogtreecommitdiffstats
path: root/usr.bin/mandoc/mdoc_man.c
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2012-12-31 22:34:01 +0000
committerschwarze <schwarze@openbsd.org>2012-12-31 22:34:01 +0000
commita14e0b203cb198751d379335fb5d870efe7d83f2 (patch)
tree1c252c2f8cf38f36b732f0649298194424862ba3 /usr.bin/mandoc/mdoc_man.c
parentDo not mail out diffs of the /etc/moduli file. (diff)
downloadwireguard-openbsd-a14e0b203cb198751d379335fb5d870efe7d83f2.tar.xz
wireguard-openbsd-a14e0b203cb198751d379335fb5d870efe7d83f2.zip
Rewrite indentation handling for nested lists in a more systematic way
to fix multiple issues reported by Todd Miller; thanks! Specifically, - avoid double indentation after .Bd inside .Bl - set up correct indentation after .Bl inside .Bl - set up correct indentation after .Dl and .D1 inside .Bl While here, also - set up correct indentation *inside* .Dl and .D1 inside .Bl.
Diffstat (limited to 'usr.bin/mandoc/mdoc_man.c')
-rw-r--r--usr.bin/mandoc/mdoc_man.c84
1 files changed, 49 insertions, 35 deletions
diff --git a/usr.bin/mandoc/mdoc_man.c b/usr.bin/mandoc/mdoc_man.c
index 52483989b4b..e8cf9c82a86 100644
--- a/usr.bin/mandoc/mdoc_man.c
+++ b/usr.bin/mandoc/mdoc_man.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_man.c,v 1.45 2012/11/19 02:14:39 schwarze Exp $ */
+/* $Id: mdoc_man.c,v 1.46 2012/12/31 22:34:01 schwarze Exp $ */
/*
* Copyright (c) 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -39,6 +39,7 @@ static int cond_body(DECL_ARGS);
static int cond_head(DECL_ARGS);
static void font_push(char);
static void font_pop(void);
+static void mid_it(void);
static void post__t(DECL_ARGS);
static void post_bd(DECL_ARGS);
static void post_bf(DECL_ARGS);
@@ -438,6 +439,9 @@ print_offs(const char *v)
print_word(buf);
}
+/*
+ * Set up the indentation for a list item; used from pre_it().
+ */
void
print_width(const char *v, const struct mdoc_node *child, size_t defsz)
{
@@ -466,16 +470,8 @@ print_width(const char *v, const struct mdoc_node *child, size_t defsz)
chsz = (NULL != child && MDOC_TEXT == child->type) ?
strlen(child->string) : 0;
- /*
- * If we are inside an enclosing list,
- * preserve its indentation.
- */
- if (Bl_stack_len && Bl_stack[Bl_stack_len - 1]) {
- print_line(".RS", MMAN_Bk_susp);
- snprintf(buf, sizeof(buf), "%ldn",
- Bl_stack[Bl_stack_len - 1]);
- print_word(buf);
- }
+ /* Maybe we are inside an enclosing list? */
+ mid_it();
/*
* Save our own indentation,
@@ -834,7 +830,6 @@ pre_bd(DECL_ARGS)
static void
post_bd(DECL_ARGS)
{
- char buf[24];
/* Close out this display. */
print_line(".RE", MMAN_nl);
@@ -842,20 +837,9 @@ post_bd(DECL_ARGS)
DISP_literal == n->norm->Bd.type)
print_line(".fi", MMAN_nl);
- /*
- * If we are inside an enclosing list and the current
- * list item is not yet finished, restore the correct
- * indentation for what remains of that item.
- */
- if (NULL != n->parent->next &&
- Bl_stack_len && Bl_stack[Bl_stack_len - 1]) {
- print_line(".RS", MMAN_Bk_susp);
- snprintf(buf, sizeof(buf), "%ldn",
- Bl_stack[Bl_stack_len - 1]);
- print_word(buf);
- /* Remeber to close out this .RS block later. */
- Bl_stack_post[Bl_stack_len - 1] = 1;
- }
+ /* Maybe we are inside an enclosing list? */
+ if (NULL != n->parent->next)
+ mid_it();
}
static int
@@ -954,6 +938,11 @@ post_bl(DECL_ARGS)
}
outflags |= MMAN_PP | MMAN_nl;
outflags &= ~(MMAN_sp | MMAN_br);
+
+ /* Maybe we are inside an enclosing list? */
+ if (NULL != n->parent->next)
+ mid_it();
+
}
static int
@@ -988,7 +977,9 @@ static int
pre_dl(DECL_ARGS)
{
- print_line(".RS 6n", MMAN_nl);
+ print_line(".RS", MMAN_Bk_susp);
+ print_offs("6n");
+ outflags |= MMAN_nl;
return(1);
}
@@ -997,6 +988,10 @@ post_dl(DECL_ARGS)
{
print_line(".RE", MMAN_nl);
+
+ /* Maybe we are inside an enclosing list? */
+ if (NULL != n->parent->next)
+ mid_it();
}
static int
@@ -1259,6 +1254,32 @@ pre_it(DECL_ARGS)
return(1);
}
+/*
+ * This function is called after closing out an indented block.
+ * If we are inside an enclosing list, restore its indentation.
+ */
+static void
+mid_it(void)
+{
+ char buf[24];
+
+ /* Nothing to do outside a list. */
+ if (0 == Bl_stack_len || 0 == Bl_stack[Bl_stack_len - 1])
+ return;
+
+ /* The indentation has already been set up. */
+ if (Bl_stack_post[Bl_stack_len - 1])
+ return;
+
+ /* Restore the indentation of the enclosing list. */
+ print_line(".RS", MMAN_Bk_susp);
+ snprintf(buf, sizeof(buf), "%ldn", Bl_stack[Bl_stack_len - 1]);
+ print_word(buf);
+
+ /* Remeber to close out this .RS block later. */
+ Bl_stack_post[Bl_stack_len - 1] = 1;
+}
+
static void
post_it(DECL_ARGS)
{
@@ -1298,20 +1319,13 @@ post_it(DECL_ARGS)
/*
* Our indentation had to be restored
- * after a child display.
+ * after a child display or child list.
* Close out that indentation block now.
*/
if (Bl_stack_post[Bl_stack_len]) {
print_line(".RE", MMAN_nl);
Bl_stack_post[Bl_stack_len] = 0;
}
-
- /*
- * We are inside an enclosing list.
- * Restore the indentation of that list.
- */
- if (Bl_stack_len && Bl_stack[Bl_stack_len - 1])
- print_line(".RE", MMAN_nl);
break;
case (LIST_column):
if (NULL != n->next) {