diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-02-17 19:28:11 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-02-17 19:28:11 +0000 |
commit | 0ccb80a8db5f7dcd3b3ed2b3515a63db8fd9eb8d (patch) | |
tree | 2ff45806c12edbd43e789e30ab2ab76c7df9ea15 /mdoc_macro.c | |
parent | 8b651017045b6d0c838fc6c177ca83e694c6196a (diff) | |
download | mandoc-0ccb80a8db5f7dcd3b3ed2b3515a63db8fd9eb8d.tar.gz |
Made `Xr' compatible with groff calling conventions where arguments following the
trailing section are implicitly `Ns'd. Based on a patch submitted by Ingo Schwarze.
Diffstat (limited to 'mdoc_macro.c')
-rw-r--r-- | mdoc_macro.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c index 65464c7d..3b7e9aa2 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -100,7 +100,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = { { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* St */ { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Va */ { ctx_synopsis, MDOC_CALLABLE | MDOC_PARSED }, /* Vt */ - { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Xr */ + { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Xr */ { in_line_eoln, 0 }, /* %A */ { in_line_eoln, 0 }, /* %B */ { in_line_eoln, 0 }, /* %D */ @@ -1180,6 +1180,9 @@ in_line_argn(MACRO_PROT_ARGS) case (MDOC_Ux): maxargs = 0; break; + case (MDOC_Xr): + maxargs = 2; + break; default: maxargs = 1; break; @@ -1245,7 +1248,20 @@ in_line_argn(MACRO_PROT_ARGS) return(0); flushed = 1; } - + + /* + * XXX: this is a hack to work around groff's ugliness + * as regards `Xr' and extraneous arguments. It should + * ideally be deprecated behaviour, but because this is + * code is no here, it's unlikely to be removed. + */ + if (MDOC_Xr == tok && j == maxargs) { + if ( ! mdoc_elem_alloc(m, line, ppos, MDOC_Ns, NULL)) + return(0); + if ( ! rew_elem(m, MDOC_Ns)) + return(0); + } + if ( ! mdoc_word_alloc(m, line, la, p)) return(0); } |