summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--regress/roff/esc/Makefile11
-rw-r--r--regress/roff/esc/V1.in10
-rw-r--r--regress/roff/esc/V1.out_ascii11
-rw-r--r--regress/roff/esc/V1.out_lint3
-rw-r--r--roff.78
-rw-r--r--roff.c11
-rw-r--r--roff_escape.c2
7 files changed, 47 insertions, 9 deletions
diff --git a/regress/roff/esc/Makefile b/regress/roff/esc/Makefile
index bd39e378..dd816f58 100644
--- a/regress/roff/esc/Makefile
+++ b/regress/roff/esc/Makefile
@@ -1,10 +1,10 @@
-# $OpenBSD: Makefile,v 1.21 2022/05/20 13:06:27 schwarze Exp $
+# $OpenBSD: Makefile,v 1.22 2022/05/30 22:50:40 schwarze Exp $
REGRESS_TARGETS = one two multi comment
-REGRESS_TARGETS += B bs_man bs_mdoc c c_man E1 e f h hneg l O1 o p r w z
+REGRESS_TARGETS += B bs_man bs_mdoc c c_man E1 e f h hneg l O1 o p r V1 w z
REGRESS_TARGETS += ignore invalid unsupp
HTML_TARGETS = f
-LINT_TARGETS = comment B h l O1 r w ignore invalid unsupp
+LINT_TARGETS = comment B h l O1 r V1 w ignore invalid unsupp
# mandoc defects:
# - \h with a negative argument replaces output characters
@@ -13,4 +13,9 @@ LINT_TARGETS = comment B h l O1 r w ignore invalid unsupp
SKIP_GROFF = hneg r
+# intentional difference:
+# - mandoc does not inspect the environment
+
+SKIP_GROFF += V1
+
.include <bsd.regress.mk>
diff --git a/regress/roff/esc/V1.in b/regress/roff/esc/V1.in
new file mode 100644
index 00000000..3f1d76f7
--- /dev/null
+++ b/regress/roff/esc/V1.in
@@ -0,0 +1,10 @@
+.\" $OpenBSD: V1.in,v 1.1 2022/05/30 22:50:40 schwarze Exp $
+.TH ESC-V1 1 "May 31, 2022"
+.SH NAME
+esc-V1 \- interpolate environment variables
+.SH DESCRIPTION
+single-character name: "\VN"
+.br
+double-character name: "\V(VN"
+.br
+multi-character name: "\V[VARNAME]"
diff --git a/regress/roff/esc/V1.out_ascii b/regress/roff/esc/V1.out_ascii
new file mode 100644
index 00000000..2f22e58e
--- /dev/null
+++ b/regress/roff/esc/V1.out_ascii
@@ -0,0 +1,11 @@
+ESC-V1(1) General Commands Manual ESC-V1(1)
+
+NNAAMMEE
+ esc-V1 - interpolate environment variables
+
+DDEESSCCRRIIPPTTIIOONN
+ single-character name: "${N}"
+ double-character name: "${VN}"
+ multi-character name: "${VARNAME}"
+
+OpenBSD May 31, 2022 ESC-V1(1)
diff --git a/regress/roff/esc/V1.out_lint b/regress/roff/esc/V1.out_lint
new file mode 100644
index 00000000..f580e4d2
--- /dev/null
+++ b/regress/roff/esc/V1.out_lint
@@ -0,0 +1,3 @@
+mandoc: V1.in:6:25: UNSUPP: unsupported feature: \VN
+mandoc: V1.in:8:25: UNSUPP: unsupported feature: \V(VN
+mandoc: V1.in:10:24: UNSUPP: unsupported feature: \V[VARNAME]
diff --git a/roff.7 b/roff.7
index 331a9217..a9f424d5 100644
--- a/roff.7
+++ b/roff.7
@@ -2188,12 +2188,16 @@ Horizontal tab; ignored by
Move up by half a line; ignored by
.Xr mandoc 1 .
.It Ic \eV[ Ns Ar name Ns Ic \&]
-Interpolate an environment variable; ignored by
-.Xr mandoc 1 .
+Interpolate an environment variable.
For short names, there are variants
.Ic \eV Ns Ar c
and
.Ic \eV( Ns Ar cc .
+This escape sequence is intentionally unsupported;
+.Xr mandoc 1
+prints the string
+.Dq Pf $ Brq Ar name
+instead of inspecting the environment.
.It Ic \ev\(aq Ns Ar number Ns Ic \(aq
Vertical motion; ignored by
.Xr mandoc 1 .
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;
}
diff --git a/roff_escape.c b/roff_escape.c
index fb7b92ed..51e3d897 100644
--- a/roff_escape.c
+++ b/roff_escape.c
@@ -157,13 +157,13 @@ roff_escape(const char *buf, const int ln, const int aesc,
case '$':
case '*':
+ case 'V':
case 'n':
rval = ESCAPE_EXPAND;
break;
case 'F':
case 'M':
case 'O':
- case 'V':
case 'Y':
case 'g':
case 'k':