summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--TODO5
-rw-r--r--man_macro.c5
-rw-r--r--man_term.c37
3 files changed, 20 insertions, 27 deletions
diff --git a/TODO b/TODO
index 51b8d0ae..74687c53 100644
--- a/TODO
+++ b/TODO
@@ -120,11 +120,6 @@
--- missing man features -----------------------------------------------
-- .RS/.RE can be nested, see e.g. the x11/fluxbox manuals
- noticed by dcoppa@ Wed, Apr 13, 2011 at 04:58:14PM +0200:
- also affects p5-Net-SFTP-Foreign-1.65
- as reported by gsoares@ Wed, 18 May 2011 09:59:06 -0300
-
- groff an-ext.tmac macros (.UR, .UE) occur in xine(5)
reported by brad@ Sat, 15 Jan 2011 15:45:23 -0500
diff --git a/man_macro.c b/man_macro.c
index aff3fb00..e320a6e2 100644
--- a/man_macro.c
+++ b/man_macro.c
@@ -307,11 +307,6 @@ blk_exp(MACRO_PROT_ARGS)
* anywhere.
*/
- if ( ! rew_scope(MAN_BODY, m, tok))
- return(0);
- if ( ! rew_scope(MAN_BLOCK, m, tok))
- return(0);
-
if ( ! man_block_alloc(m, line, ppos, tok))
return(0);
if ( ! man_head_alloc(m, line, ppos, tok))
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)