diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-06-18 17:36:52 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-06-18 17:36:52 +0000 |
commit | 56635f91688db2f5e34654a48a7297984673b807 (patch) | |
tree | 5e107a80c76ee6aa9df13e164f574c8a4ad94c72 | |
parent | 62c13020786d9253993bfb33adb6d6499e650572 (diff) | |
download | mandoc-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-- | TODO | 5 | ||||
-rw-r--r-- | man_macro.c | 5 | ||||
-rw-r--r-- | man_term.c | 37 |
3 files changed, 20 insertions, 27 deletions
@@ -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)) @@ -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) |