summaryrefslogtreecommitdiffstats
path: root/man_term.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-06-18 17:36:52 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-06-18 17:36:52 +0000
commit56635f91688db2f5e34654a48a7297984673b807 (patch)
tree5e107a80c76ee6aa9df13e164f574c8a4ad94c72 /man_term.c
parent62c13020786d9253993bfb33adb6d6499e650572 (diff)
downloadmandoc-56635f91688db2f5e34654a48a7297984673b807.tar.gz
Allow RS/RE blocks to nest. This requires first the syntax tree to
accomodate for the fix, then for the front-ends. -T[x]html accepted the syntax tree natively, but -Tascii had to use relative offsets. It's quite a simple fix. From a TODO by {dcoppa,dsoares}@openbsd.
Diffstat (limited to 'man_term.c')
-rw-r--r--man_term.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/man_term.c b/man_term.c
index f390170b..090f2eb0 100644
--- a/man_term.c
+++ b/man_term.c
@@ -791,13 +791,12 @@ post_SH(DECL_ARGS)
}
}
-
/* ARGSUSED */
static int
pre_RS(DECL_ARGS)
{
- const struct man_node *nn;
- int ival;
+ int ival;
+ size_t sz;
switch (n->type) {
case (MAN_BLOCK):
@@ -809,40 +808,44 @@ pre_RS(DECL_ARGS)
break;
}
- if (NULL == (nn = n->parent->head->child)) {
- mt->offset = mt->lmargin + term_len(p, INDENT);
- p->offset = mt->offset;
- return(1);
- }
+ sz = term_len(p, INDENT);
- if ((ival = a2width(p, nn->string)) < 0)
- return(1);
+ if (NULL != (n = n->parent->head->child))
+ if ((ival = a2width(p, n->string)) >= 0)
+ sz = (size_t)ival;
- mt->offset = term_len(p, INDENT) + (size_t)ival;
+ mt->offset += sz;
p->offset = mt->offset;
return(1);
}
-
/* ARGSUSED */
static void
post_RS(DECL_ARGS)
{
+ int ival;
+ size_t sz;
switch (n->type) {
case (MAN_BLOCK):
- mt->offset = mt->lmargin = term_len(p, INDENT);
- break;
+ return;
case (MAN_HEAD):
- break;
+ return;
default:
term_newln(p);
- p->offset = term_len(p, INDENT);
break;
}
-}
+ sz = term_len(p, INDENT);
+
+ if (NULL != (n = n->parent->head->child))
+ if ((ival = a2width(p, n->string)) >= 0)
+ sz = (size_t)ival;
+
+ mt->offset = mt->offset < sz ? 0 : mt->offset - sz;
+ p->offset = mt->offset;
+}
static void
print_man_node(DECL_ARGS)