summaryrefslogtreecommitdiffstats
path: root/man_macro.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-06-13 19:34:40 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-06-13 19:34:40 +0000
commit28aefcdcb96546f06ba44462300a9e7edaa5e9be (patch)
tree3c066807aadfef5ee75f853bf04465ef8596ccab /man_macro.c
parentf4493a0401398099216efffb5687a8a698a1d20c (diff)
downloadmandoc-28aefcdcb96546f06ba44462300a9e7edaa5e9be.tar.gz
Partial support for the \n[an-margin] number register.
Manuals autogenerated from reStructuredText are reckless enough to peek at this non-portable, implementation-dependent, highly groff-specific internal register - for no good reason, because the man(7) language natively provides in a much simpler way what they are trying to emulate here with much fragility. A full implementation would be very hard because it would require access to output-device-specific formatting data at the roff(7) preprocessor stage, which mandoc doesn't support at all. So hardcode a few magic numbers as reStructuredText expects them for terminal output. For other output modes (like HTML), code using this register is utterly broken anyway.
Diffstat (limited to 'man_macro.c')
-rw-r--r--man_macro.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/man_macro.c b/man_macro.c
index 7b4f8de8..4f00ff0a 100644
--- a/man_macro.c
+++ b/man_macro.c
@@ -235,6 +235,10 @@ blk_close(MACRO_PROT_ARGS)
ntok = man->last->tok;
man_unscope(man, nn);
+ if (tok == MAN_RE && nn->head->aux > 0)
+ roff_setreg(man->roff, "an-margin",
+ nn->head->aux, '-');
+
/* Move a trailing paragraph behind the block. */
if (ntok == MAN_LP || ntok == MAN_PP || ntok == MAN_P) {
@@ -256,8 +260,17 @@ blk_exp(MACRO_PROT_ARGS)
head = roff_head_alloc(man, line, ppos, tok);
la = *pos;
- if (man_args(man, line, pos, buf, &p))
+ if (man_args(man, line, pos, buf, &p)) {
roff_word_alloc(man, line, la, p);
+ if (tok == MAN_RS) {
+ if (roff_getreg(man->roff, "an-margin") == 0)
+ roff_setreg(man->roff, "an-margin",
+ 7 * 24, '=');
+ if ((head->aux = strtod(p, NULL) * 24.0) > 0)
+ roff_setreg(man->roff, "an-margin",
+ head->aux, '+');
+ }
+ }
if (buf[*pos] != '\0')
mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse, line,