aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/roff.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-06-14 14:02:39 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-06-14 14:02:39 +0000
commit141881c887ec609a42b6025503a0082ee59cced0 (patch)
tree769552e2a43c2d4e8d362fa4ad1d4a349980c8a1 /roff.c
parentd7510635200bec5516c0a2f66d8a4fe42b453020 (diff)
downloadmandoc-141881c887ec609a42b6025503a0082ee59cced0.tar.gz
mandoc-141881c887ec609a42b6025503a0082ee59cced0.tar.zst
mandoc-141881c887ec609a42b6025503a0082ee59cced0.zip
implement the roff(7) d (macro or string defined) conditional
Diffstat (limited to 'roff.c')
-rw-r--r--roff.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/roff.c b/roff.c
index c5f2815c..6cd2011d 100644
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.309 2017/06/14 13:00:31 schwarze Exp $ */
+/* $Id: roff.c,v 1.310 2017/06/14 14:02:39 schwarze Exp $ */
/*
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -2065,7 +2065,7 @@ roff_evalcond(struct roff *r, int ln, char *v, int *pos)
{
char *cp, *name;
size_t sz;
- int number, savepos, wanttrue;
+ int number, savepos, istrue, wanttrue;
if ('!' == v[*pos]) {
wanttrue = 0;
@@ -2081,17 +2081,23 @@ roff_evalcond(struct roff *r, int ln, char *v, int *pos)
(*pos)++;
return wanttrue;
case 'c':
- case 'd':
case 'e':
case 't':
case 'v':
(*pos)++;
return !wanttrue;
+ case 'd':
case 'r':
- cp = name = v + ++*pos;
- sz = roff_getname(r, &cp, ln, *pos);
+ cp = v + *pos + 1;
+ while (*cp == ' ')
+ cp++;
+ name = cp;
+ sz = roff_getname(r, &cp, ln, cp - v);
+ istrue = sz && (v[*pos] == 'r' ? roff_hasregn(r, name, sz) :
+ (roff_getstrn(r, name, sz) != NULL ||
+ roff_getrenn(r, name, sz) != NULL));
*pos = cp - v;
- return (sz && roff_hasregn(r, name, sz)) == wanttrue;
+ return istrue == wanttrue;
default:
break;
}