summaryrefslogtreecommitdiffstats
path: root/roff.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2022-05-30 23:03:47 +0000
committerIngo Schwarze <schwarze@openbsd.org>2022-05-30 23:03:47 +0000
commitd677d96107effef249eb44f9d28860fe7a0fe029 (patch)
treea2ceebb9647eed1188d39e6eba6108f948ed0a1d /roff.c
parent1b20206767c4c7b1861876c71172d99fb14c8113 (diff)
downloadmandoc-d677d96107effef249eb44f9d28860fe7a0fe029.tar.gz
Dummy implementation of the roff(7) \V (interpolate environment variable)
escape sequence. This is needed to get \V into the correct parsing class, ESCAPE_EXPAND. It is intentional that mandoc(1) output is *not* influenced by environment variables, so interpolate the name of the variable with some decorating punctuation rather than interpolating its value.
Diffstat (limited to 'roff.c')
-rw-r--r--roff.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/roff.c b/roff.c
index c76be9b8..e89ca000 100644
--- a/roff.c
+++ b/roff.c
@@ -1529,6 +1529,12 @@ roff_expand(struct roff *r, struct buf *buf, int ln, int pos, char ec)
ubuf[1] = '\0';
res = ubuf;
break;
+ case 'V':
+ mandoc_msg(MANDOCERR_UNSUPP, ln, iesc,
+ "%.*s", iend - iesc, buf->buf + iesc);
+ roff_expand_patch(buf, iendarg, "}", iend);
+ roff_expand_patch(buf, iesc, "${", iarg);
+ continue;
case 'n':
if (iendarg > iarg)
(void)snprintf(ubuf, sizeof(ubuf), "%d",
@@ -1567,9 +1573,8 @@ roff_expand_patch(struct buf *buf, int start, const char *repl, int end)
{
char *nbuf;
- buf->buf[start] = '\0';
- buf->sz = mandoc_asprintf(&nbuf, "%s%s%s", buf->buf, repl,
- buf->buf + end) + 1;
+ buf->sz = mandoc_asprintf(&nbuf, "%.*s%s%s", start, buf->buf,
+ repl, buf->buf + end) + 1;
free(buf->buf);
buf->buf = nbuf;
}