aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/man_macro.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2015-01-24 01:58:33 +0000
committerIngo Schwarze <schwarze@openbsd.org>2015-01-24 01:58:33 +0000
commit84a5436e156c4265426ca376f5654c53dd3ac23b (patch)
treee0d1d8f95b1f4746a91962cac4a9025f9783b64d /man_macro.c
parent69bcff21a66e9383494117c083c088d16c778512 (diff)
downloadmandoc-84a5436e156c4265426ca376f5654c53dd3ac23b.tar.gz
mandoc-84a5436e156c4265426ca376f5654c53dd3ac23b.tar.zst
mandoc-84a5436e156c4265426ca376f5654c53dd3ac23b.zip
Support .RE with an argument; needed for audio/pms(1).
Diffstat (limited to 'man_macro.c')
-rw-r--r--man_macro.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/man_macro.c b/man_macro.c
index f1796f3c..042d133d 100644
--- a/man_macro.c
+++ b/man_macro.c
@@ -1,7 +1,7 @@
-/* $Id: man_macro.c,v 1.92 2014/12/16 17:26:00 schwarze Exp $ */
+/* $Id: man_macro.c,v 1.93 2015/01/24 01:58:33 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2012, 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
* Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de>
*
* Permission to use, copy, modify, and distribute this software for any
@@ -279,10 +279,30 @@ blk_close(MACRO_PROT_ARGS)
{
enum mant ntok;
const struct man_node *nn;
+ char *p;
+ int nrew, target;
+ nrew = 1;
switch (tok) {
case MAN_RE:
ntok = MAN_RS;
+ if ( ! man_args(man, line, pos, buf, &p))
+ break;
+ for (nn = man->last->parent; nn; nn = nn->parent)
+ if (nn->tok == ntok && nn->type == MAN_BLOCK)
+ nrew++;
+ target = strtol(p, &p, 10);
+ if (*p != '\0')
+ mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse,
+ line, p - buf, "RE ... %s", p);
+ if (target == 0)
+ target = 1;
+ nrew -= target;
+ if (nrew < 1) {
+ mandoc_vmsg(MANDOCERR_RE_NOTOPEN, man->parse,
+ line, ppos, "RE %d", target);
+ return;
+ }
break;
case MAN_UE:
ntok = MAN_UR;
@@ -293,7 +313,7 @@ blk_close(MACRO_PROT_ARGS)
}
for (nn = man->last->parent; nn; nn = nn->parent)
- if (nn->tok == ntok && nn->type == MAN_BLOCK)
+ if (nn->tok == ntok && nn->type == MAN_BLOCK && ! --nrew)
break;
if (nn == NULL) {