Dummy implementation of the roff(7) \V (interpolate environment variable)
authorschwarze <schwarze@openbsd.org>
Mon, 30 May 2022 22:50:40 +0000 (22:50 +0000)
committerschwarze <schwarze@openbsd.org>
Mon, 30 May 2022 22:50:40 +0000 (22:50 +0000)
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.

regress/usr.bin/mandoc/roff/esc/Makefile
regress/usr.bin/mandoc/roff/esc/V1.in [new file with mode: 0644]
regress/usr.bin/mandoc/roff/esc/V1.out_ascii [new file with mode: 0644]
regress/usr.bin/mandoc/roff/esc/V1.out_lint [new file with mode: 0644]
share/man/man7/roff.7
usr.bin/mandoc/roff.c
usr.bin/mandoc/roff_escape.c

index bd39e37..dd816f5 100644 (file)
@@ -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/usr.bin/mandoc/roff/esc/V1.in b/regress/usr.bin/mandoc/roff/esc/V1.in
new file mode 100644 (file)
index 0000000..3f1d76f
--- /dev/null
@@ -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/usr.bin/mandoc/roff/esc/V1.out_ascii b/regress/usr.bin/mandoc/roff/esc/V1.out_ascii
new file mode 100644 (file)
index 0000000..2f22e58
--- /dev/null
@@ -0,0 +1,11 @@
+ESC-V1(1)                   General Commands Manual                  ESC-V1(1)
+
+N\bNA\bAM\bME\bE
+       esc-V1 - interpolate environment variables
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       single-character name: "${N}"
+       double-character name: "${VN}"
+       multi-character name: "${VARNAME}"
+
+OpenBSD                          May 31, 2022                        ESC-V1(1)
diff --git a/regress/usr.bin/mandoc/roff/esc/V1.out_lint b/regress/usr.bin/mandoc/roff/esc/V1.out_lint
new file mode 100644 (file)
index 0000000..f580e4d
--- /dev/null
@@ -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]
index cd334c0..6e88503 100644 (file)
@@ -1,4 +1,4 @@
-.\" $OpenBSD: roff.7,v 1.98 2022/05/20 13:06:27 schwarze Exp $
+.\" $OpenBSD: roff.7,v 1.99 2022/05/30 22:50:40 schwarze Exp $
 .\"
 .\" Copyright (c) 2010-2019, 2022 Ingo Schwarze <schwarze@openbsd.org>
 .\" Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -15,7 +15,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: May 20 2022 $
+.Dd $Mdocdate: May 30 2022 $
 .Dt ROFF 7
 .Os
 .Sh NAME
@@ -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 .
index 783eba5..9986dff 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: roff.c,v 1.260 2022/05/19 15:17:51 schwarze Exp $ */
+/* $OpenBSD: roff.c,v 1.261 2022/05/30 22:50:40 schwarze Exp $ */
 /*
  * Copyright (c) 2010-2015, 2017-2022 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -1527,6 +1527,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",
@@ -1565,9 +1571,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;
 }
index 0780cce..0a71b99 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: roff_escape.c,v 1.2 2022/05/20 13:06:26 schwarze Exp $ */
+/* $OpenBSD: roff_escape.c,v 1.3 2022/05/30 22:50:40 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012, 2013, 2014, 2015, 2017, 2018, 2020, 2022
  *               Ingo Schwarze <schwarze@openbsd.org>
@@ -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':