aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mdoc_man.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2012-12-31 22:34:48 +0000
committerIngo Schwarze <schwarze@openbsd.org>2012-12-31 22:34:48 +0000
commitcd9c1d618ab51852afade9dfca94e0383afa2ba0 (patch)
tree0baca101f867e4de3ea3c9abe4f8ed609f91ae40 /mdoc_man.c
parente0775496049b1f1c4aa21434142ccda12eb3146b (diff)
downloadmandoc-cd9c1d618ab51852afade9dfca94e0383afa2ba0.tar.gz
mandoc-cd9c1d618ab51852afade9dfca94e0383afa2ba0.tar.zst
mandoc-cd9c1d618ab51852afade9dfca94e0383afa2ba0.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 'mdoc_man.c')
-rw-r--r--mdoc_man.c84
1 files changed, 49 insertions, 35 deletions
diff --git a/mdoc_man.c b/mdoc_man.c
index acf4f16c..44ea270a 100644
--- a/mdoc_man.c
+++ b/mdoc_man.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_man.c,v 1.46 2012/11/19 02:14:45 schwarze Exp $ */
+/* $Id: mdoc_man.c,v 1.47 2012/12/31 22:34:48 schwarze Exp $ */
/*
* Copyright (c) 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -43,6 +43,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);
@@ -442,6 +443,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)
{
@@ -470,16 +474,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,
@@ -838,7 +834,6 @@ pre_bd(DECL_ARGS)
static void
post_bd(DECL_ARGS)
{
- char buf[24];
/* Close out this display. */
print_line(".RE", MMAN_nl);
@@ -846,20 +841,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
@@ -958,6 +942,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
@@ -992,7 +981,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);
}
@@ -1001,6 +992,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
@@ -1263,6 +1258,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)
{
@@ -1302,20 +1323,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) {