summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--regress/roff/args/man.out_lint2
-rw-r--r--regress/roff/args/mdoc.out_lint2
-rw-r--r--regress/roff/cond/register.in31
-rw-r--r--regress/roff/cond/register.out_ascii10
-rw-r--r--regress/roff/cond/string.in29
-rw-r--r--regress/roff/cond/string.out_ascii8
-rw-r--r--regress/roff/de/escname.in27
-rw-r--r--regress/roff/de/escname.out_ascii15
-rw-r--r--regress/roff/de/escname.out_lint16
-rw-r--r--regress/roff/ds/Makefile7
-rw-r--r--regress/roff/nr/escname.in8
-rw-r--r--regress/roff/nr/escname.out_ascii4
-rw-r--r--regress/roff/nr/escname.out_lint7
-rw-r--r--regress/roff/string/Makefile7
-rw-r--r--regress/roff/string/name.in12
-rw-r--r--regress/roff/string/name.out_ascii6
-rw-r--r--regress/roff/string/name.out_lint31
-rw-r--r--roff.c58
18 files changed, 222 insertions, 58 deletions
diff --git a/regress/roff/args/man.out_lint b/regress/roff/args/man.out_lint
index 6d6bbd84..5aaebd9e 100644
--- a/regress/roff/args/man.out_lint
+++ b/regress/roff/args/man.out_lint
@@ -6,4 +6,4 @@ mandoc: man.in:87:26: STYLE: whitespace at end of input line
mandoc: man.in:91:27: STYLE: whitespace at end of input line
mandoc: man.in:104:5: STYLE: unterminated quoted argument
mandoc: man.in:107:9: STYLE: unterminated quoted argument
-mandoc: man.in:131:1: ERROR: escaped character not allowed in a name: IB\(
+mandoc: man.in:131:1: ERROR: escaped character not allowed in a name: IB\(lq
diff --git a/regress/roff/args/mdoc.out_lint b/regress/roff/args/mdoc.out_lint
index 4422d754..1691cf2d 100644
--- a/regress/roff/args/mdoc.out_lint
+++ b/regress/roff/args/mdoc.out_lint
@@ -14,4 +14,4 @@ mandoc: mdoc.in:112:5: STYLE: unterminated quoted argument
mandoc: mdoc.in:112:11: STYLE: whitespace at end of input line
mandoc: mdoc.in:113:9: STYLE: unterminated quoted argument
mandoc: mdoc.in:113:15: STYLE: whitespace at end of input line
-mandoc: mdoc.in:121:1: ERROR: escaped character not allowed in a name: Fl\(
+mandoc: mdoc.in:121:1: ERROR: escaped character not allowed in a name: Fl\(lq
diff --git a/regress/roff/cond/register.in b/regress/roff/cond/register.in
index 879c573c..7f137c9c 100644
--- a/regress/roff/cond/register.in
+++ b/regress/roff/cond/register.in
@@ -1,5 +1,5 @@
-.\" $OpenBSD: register.in,v 1.3 2019/02/06 20:54:28 schwarze Exp $
-.TH REGISTER 1 "February 6, 2019"
+.\" $OpenBSD: register.in,v 1.4 2022/06/03 11:50:25 schwarze Exp $
+.TH REGISTER 1 "June 3, 2022"
.SH NAME
register \- conditional testing whether a register is defined
.SH DESCRIPTION
@@ -11,10 +11,35 @@ register \- conditional testing whether a register is defined
.el OOPS
.if !rmyreg OOPS
.PP
-identifier + identifier:
+tab after identifier:
.ie rmyreg myreg is defined
.el OOPS
.PP
escape sequence after identifier:
.ie rmyreg\(enmyreg is defined
.el OOPS
+.PP
+backslash in name:
+.nr \\ 0
+.ie r\\ \e is defined
+.el OOPS
+.rr \\
+.if r\\ is still defined!?
+.PP
+dot in name:
+.nr . 0
+.ie r. \&. is defined
+.el OOPS
+.ie r\. \e. is defined
+.el OOPS
+.rr \.
+.if r. is still defined!?
+.PP
+invalid escape in name:
+.nr G 0
+.ie rG G is defined
+.el OOPS
+.ie r\G \eG is defined
+.el OOPS
+.rr \G
+.if rG is still defined!?
diff --git a/regress/roff/cond/register.out_ascii b/regress/roff/cond/register.out_ascii
index 928c6138..673b9f12 100644
--- a/regress/roff/cond/register.out_ascii
+++ b/regress/roff/cond/register.out_ascii
@@ -7,8 +7,14 @@ DDEESSCCRRIIPPTTIIOONN
not yet defined
now defined
- identifier + identifier: myreg is defined
+ tab after identifier: myreg is defined
escape sequence after identifier: -myreg is defined
-OpenBSD February 6, 2019 REGISTER(1)
+ backslash in name: \ is defined
+
+ dot in name: . is defined \. is defined
+
+ invalid escape in name: G is defined \G is defined
+
+OpenBSD June 3, 2022 REGISTER(1)
diff --git a/regress/roff/cond/string.in b/regress/roff/cond/string.in
index 273984be..fedb4d81 100644
--- a/regress/roff/cond/string.in
+++ b/regress/roff/cond/string.in
@@ -1,5 +1,5 @@
-.\" $OpenBSD: string.in,v 1.4 2019/02/06 20:54:28 schwarze Exp $
-.TH STRING 1 "February 6, 2019"
+.\" $OpenBSD: string.in,v 1.5 2022/06/03 11:50:25 schwarze Exp $
+.TH STRING 1 "June 3, 2022"
.SH NAME
string \- conditional testing whether a string is defined
.SH DESCRIPTION
@@ -40,3 +40,28 @@ identifier and tab:
escape sequence after identifier:
.ie d mystr\(enmystr is defined
.el OOPS
+.PP
+backslash in name:
+.ds \\ value
+.ie d \\ \e is defined
+.el OOPS
+.rm \\
+.if d \\ still defined!?
+.PP
+dot in name:
+.ds . value
+.ie d . \&. is defined
+.el OOPS
+.ie d \. \e. is defined
+.el OOPS
+.rm .
+.if d . still defined!?
+.PP
+invalid escape in name:
+.ds G value
+.ie d G G is defined
+.el OOPS
+.ie d \G \eG is defined
+.el OOPS
+.rm \G
+.if d G still defined!?
diff --git a/regress/roff/cond/string.out_ascii b/regress/roff/cond/string.out_ascii
index 2d80a903..c67c0c55 100644
--- a/regress/roff/cond/string.out_ascii
+++ b/regress/roff/cond/string.out_ascii
@@ -19,4 +19,10 @@ DDEESSCCRRIIPPTTIIOONN
escape sequence after identifier: -mystr is defined
-OpenBSD February 6, 2019 STRING(1)
+ backslash in name: \ is defined
+
+ dot in name: . is defined \. is defined
+
+ invalid escape in name: G is defined \G is defined
+
+OpenBSD June 3, 2022 STRING(1)
diff --git a/regress/roff/de/escname.in b/regress/roff/de/escname.in
index 8c346846..8c1824b5 100644
--- a/regress/roff/de/escname.in
+++ b/regress/roff/de/escname.in
@@ -1,4 +1,4 @@
-.\" $OpenBSD: escname.in,v 1.4 2017/07/04 14:53:27 schwarze Exp $
+.\" $OpenBSD: escname.in,v 1.5 2022/06/03 11:50:25 schwarze Exp $
.Dd $Mdocdate$
.Dt DE-ESCNAME 1
.Os
@@ -23,10 +23,33 @@ define first = val1
val1
..
.Pp
-Values (first, second, first\esecond):
+define first\e.second = val_dot
+.de first\.second
+val_dot
+..
+.Pp
+define first\eGsecond = val_inval
+.de first\Gsecond
+val_inval
+..
+.Pp
+Values:
+.Bl -tag -width first_.second -compact
+.It first
.first
+.It second
.second
+.It first\esecond
.first\\second
+.It first.second
+.first.second
+.It first\e.second
+.first\.second
+.It firstGsecond
+.firstGsecond
+.It first\eGsecond
+.first\Gsecond
+.El
.Pp
Remove all but second:
.rm first\\second first\esecond second
diff --git a/regress/roff/de/escname.out_ascii b/regress/roff/de/escname.out_ascii
index 367b5d0f..e096fd71 100644
--- a/regress/roff/de/escname.out_ascii
+++ b/regress/roff/de/escname.out_ascii
@@ -12,7 +12,18 @@ DDEESSCCRRIIPPTTIIOONN
define first = val1
- Values (first, second, first\second): val1 val2 val3
+ define first\.second = val_dot
+
+ define first\Gsecond = val_inval
+
+ Values:
+ first val1
+ second val2
+ first\second val3
+ first.second val_dot
+ first\.second val_dot
+ firstGsecond val_inval
+ first\Gsecond val_inval
Remove all but second: val2
@@ -20,4 +31,4 @@ DDEESSCCRRIIPPTTIIOONN
final text
-OpenBSD July 4, 2017 OpenBSD
+OpenBSD June 3, 2022 OpenBSD
diff --git a/regress/roff/de/escname.out_lint b/regress/roff/de/escname.out_lint
index a3f9396f..5dba1973 100644
--- a/regress/roff/de/escname.out_lint
+++ b/regress/roff/de/escname.out_lint
@@ -1,8 +1,10 @@
mandoc: escname.in:22:2: ERROR: escaped character not allowed in a name: first\e
-mandoc: escname.in:32:19: ERROR: escaped character not allowed in a name: first\e
-mandoc: escname.in:33:2: ERROR: skipping unknown macro: .first
-mandoc: escname.in:35:2: ERROR: skipping unknown macro: .first\\second
-mandoc: escname.in:38:5: ERROR: skipping excess arguments: .de ... excess arguments
-mandoc: escname.in:41:1: ERROR: escaped character not allowed in a name: witharg\(
-mandoc: escname.in:43:1: ERROR: escaped character not allowed in a name: de\e
-mandoc: escname.in:43:2: WARNING: skipping empty request: de
+mandoc: escname.in:32:10: WARNING: undefined escape, printing literally: \G
+mandoc: escname.in:51:7: WARNING: undefined escape, printing literally: \G
+mandoc: escname.in:55:19: ERROR: escaped character not allowed in a name: first\e
+mandoc: escname.in:56:2: ERROR: skipping unknown macro: .first
+mandoc: escname.in:58:2: ERROR: skipping unknown macro: .first\second
+mandoc: escname.in:61:5: ERROR: skipping excess arguments: .de ... excess arguments
+mandoc: escname.in:64:1: ERROR: escaped character not allowed in a name: witharg\(en
+mandoc: escname.in:66:1: ERROR: escaped character not allowed in a name: de\e
+mandoc: escname.in:66:2: WARNING: skipping empty request: de
diff --git a/regress/roff/ds/Makefile b/regress/roff/ds/Makefile
index 773105e8..68a8b3bf 100644
--- a/regress/roff/ds/Makefile
+++ b/regress/roff/ds/Makefile
@@ -1,4 +1,9 @@
-# $OpenBSD: Makefile,v 1.6 2019/02/06 20:54:28 schwarze Exp $
+# $OpenBSD: Makefile,v 1.7 2022/06/03 11:50:25 schwarze Exp $
+#
+# This directory is intended for tests of string *definitions*,
+# in particular testing the behaviour of the .ds and .as macros.
+# Tests of string *expansion* are better placed in the roff/string
+# directory.
REGRESS_TARGETS = append escname nested quoting tab
diff --git a/regress/roff/nr/escname.in b/regress/roff/nr/escname.in
index f81627e1..d4625552 100644
--- a/regress/roff/nr/escname.in
+++ b/regress/roff/nr/escname.in
@@ -1,5 +1,5 @@
-.\" $OpenBSD: escname.in,v 1.3 2017/07/04 14:53:27 schwarze Exp $
-.TH NR-ESCNAME 1 "June 29, 2014"
+.\" $OpenBSD: escname.in,v 1.4 2022/06/03 11:50:25 schwarze Exp $
+.TH NR-ESCNAME 1 "June 3, 2022"
.SH NAME
nr-escname \- escape sequences in register names
.SH DESCRIPTION
@@ -7,7 +7,9 @@ nr-escname \- escape sequences in register names
.nr second 2
.nr first\\second 3
.nr first\esecond 4
-\n[first] \n[second] \n[first\\second]
+.nr first\.second 5
+.nr first\Gsecond 6
+\n[first] \n[second] \n[first\\second] \n[first.second] \n[firstGsecond]
.PP
.rr first\esecond
\n[first] \n[second] \n[first\\second]
diff --git a/regress/roff/nr/escname.out_ascii b/regress/roff/nr/escname.out_ascii
index ca2d50f5..d0301af9 100644
--- a/regress/roff/nr/escname.out_ascii
+++ b/regress/roff/nr/escname.out_ascii
@@ -4,7 +4,7 @@ NNAAMMEE
nr-escname - escape sequences in register names
DDEESSCCRRIIPPTTIIOONN
- 1 2 3
+ 1 2 3 5 6
0 2 3
@@ -12,4 +12,4 @@ DDEESSCCRRIIPPTTIIOONN
incomplete:
-OpenBSD June 29, 2014 NR-ESCNAME(1)
+OpenBSD June 3, 2022 NR-ESCNAME(1)
diff --git a/regress/roff/nr/escname.out_lint b/regress/roff/nr/escname.out_lint
index a2dabebe..edec17fa 100644
--- a/regress/roff/nr/escname.out_lint
+++ b/regress/roff/nr/escname.out_lint
@@ -1,4 +1,5 @@
mandoc: escname.in:9:5: ERROR: escaped character not allowed in a name: first\e
-mandoc: escname.in:12:5: ERROR: escaped character not allowed in a name: first\e
-mandoc: escname.in:18:13: WARNING: invalid escape sequence: \n[second
-mandoc: escname.in:18:12: STYLE: whitespace at end of input line
+mandoc: escname.in:11:10: WARNING: undefined escape, printing literally: \G
+mandoc: escname.in:14:5: ERROR: escaped character not allowed in a name: first\e
+mandoc: escname.in:20:13: WARNING: invalid escape sequence: \n[second
+mandoc: escname.in:20:12: STYLE: whitespace at end of input line
diff --git a/regress/roff/string/Makefile b/regress/roff/string/Makefile
index b8885c65..2fa10557 100644
--- a/regress/roff/string/Makefile
+++ b/regress/roff/string/Makefile
@@ -1,4 +1,9 @@
-# $OpenBSD: Makefile,v 1.6 2014/07/06 19:08:57 schwarze Exp $
+# $OpenBSD: Makefile,v 1.10 2022/06/03 11:50:25 schwarze Exp $
+#
+# This directory is intended for tests of string *expansion*,
+# in particular testing the behaviour of the \* escape sequence.
+# Tests of string *definitions* are better placed in the roff/ds
+# directory.
REGRESS_TARGETS = dotT escape infinite name std undef zerolength
LINT_TARGETS = name std undef
diff --git a/regress/roff/string/name.in b/regress/roff/string/name.in
index 8e872529..3f412534 100644
--- a/regress/roff/string/name.in
+++ b/regress/roff/string/name.in
@@ -1,4 +1,4 @@
-.\" $OpenBSD: name.in,v 1.4 2017/07/04 14:53:27 schwarze Exp $
+.\" $OpenBSD: name.in,v 1.5 2022/06/03 11:50:25 schwarze Exp $
.Dd $Mdocdate$
.Dt STRING-NAME 1
.Os
@@ -10,7 +10,9 @@
.ds "quot" value of "quot"
.ds bs\e value of bs\ee
.ds bs\\e value of bs\e\ee
+.ds dot. value of dot.
.ds bl\ e value of bl\e e
+.ds inval\\G value of inval\eG
norm: \*[norm]
.br
norm without closing brace: \*[norm
@@ -26,6 +28,10 @@ bs\e\ee: \*[bs\\e]
bse: \*[bse]
.br
bs: \*[bs]
+.br
+dot.: \*[dot.]
+.br
+dot\e.: \*[dot\.]
.\".br
.\"bl\e e: \*[bl\ e]
.br
@@ -34,3 +40,7 @@ bl e: \*[bl e]
ble: \*[ble]
.br
bl: \*[bl]
+.br
+inval\e\eG: \*[inval\\G]
+.br
+inval\eG: \*[inval\G]
diff --git a/regress/roff/string/name.out_ascii b/regress/roff/string/name.out_ascii
index 325e28aa..38258a72 100644
--- a/regress/roff/string/name.out_ascii
+++ b/regress/roff/string/name.out_ascii
@@ -11,8 +11,12 @@ DDEESSCCRRIIPPTTIIOONN
bs\\e: value of bs\\e
bse:
bs:
+ dot.: value of dot.
+ dot\.: value of dot.
bl e:
ble:
bl:
+ inval\\G: value of inval\G
+ inval\G: value of inval\G
-OpenBSD July 4, 2017 OpenBSD
+OpenBSD June 3, 2022 OpenBSD
diff --git a/regress/roff/string/name.out_lint b/regress/roff/string/name.out_lint
index 5a6340a0..13283f5d 100644
--- a/regress/roff/string/name.out_lint
+++ b/regress/roff/string/name.out_lint
@@ -1,16 +1,17 @@
mandoc: name.in:11:5: ERROR: escaped character not allowed in a name: bs\e
-mandoc: name.in:13:5: ERROR: escaped character not allowed in a name: bl\
-mandoc: name.in:16:29: WARNING: invalid escape sequence: \*[norm
-mandoc: name.in:16:28: STYLE: whitespace at end of input line
-mandoc: name.in:18:7: WARNING: undefined string, using "": quot
-mandoc: name.in:18:6: STYLE: whitespace at end of input line
-mandoc: name.in:26:6: WARNING: undefined string, using "": bse
-mandoc: name.in:26:5: STYLE: whitespace at end of input line
-mandoc: name.in:28:5: WARNING: undefined string, using "": bs
-mandoc: name.in:28:4: STYLE: whitespace at end of input line
-mandoc: name.in:32:7: WARNING: undefined string, using "": bl e
-mandoc: name.in:32:6: STYLE: whitespace at end of input line
-mandoc: name.in:34:6: WARNING: undefined string, using "": ble
-mandoc: name.in:34:5: STYLE: whitespace at end of input line
-mandoc: name.in:36:5: WARNING: undefined string, using "": bl
-mandoc: name.in:36:4: STYLE: whitespace at end of input line
+mandoc: name.in:14:5: ERROR: escaped character not allowed in a name: bl\
+mandoc: name.in:18:29: WARNING: invalid escape sequence: \*[norm
+mandoc: name.in:18:28: STYLE: whitespace at end of input line
+mandoc: name.in:20:7: WARNING: undefined string, using "": quot
+mandoc: name.in:20:6: STYLE: whitespace at end of input line
+mandoc: name.in:28:6: WARNING: undefined string, using "": bse
+mandoc: name.in:28:5: STYLE: whitespace at end of input line
+mandoc: name.in:30:5: WARNING: undefined string, using "": bs
+mandoc: name.in:30:4: STYLE: whitespace at end of input line
+mandoc: name.in:38:7: WARNING: undefined string, using "": bl e
+mandoc: name.in:38:6: STYLE: whitespace at end of input line
+mandoc: name.in:40:6: WARNING: undefined string, using "": ble
+mandoc: name.in:40:5: STYLE: whitespace at end of input line
+mandoc: name.in:42:5: WARNING: undefined string, using "": bl
+mandoc: name.in:42:4: STYLE: whitespace at end of input line
+mandoc: name.in:46:19: WARNING: undefined escape, printing literally: \G
diff --git a/roff.c b/roff.c
index dbe47b43..785097b6 100644
--- a/roff.c
+++ b/roff.c
@@ -1375,6 +1375,7 @@ roff_expand(struct roff *r, struct buf *buf, int ln, int pos, char ec)
int iarg; /* index beginning the argument */
int iendarg; /* index right after the argument */
int iend; /* index right after the sequence */
+ int isrc, idst; /* to reduce \\ and \. in names */
int deftype; /* type of definition to paste */
int argi; /* macro argument index */
int quote_args; /* true for \\$@, false for \\$* */
@@ -1428,6 +1429,21 @@ roff_expand(struct roff *r, struct buf *buf, int ln, int pos, char ec)
continue;
}
+ /* Reduce \\ and \. in names. */
+
+ if (buf->buf[inam] == '*' || buf->buf[inam] == 'n') {
+ isrc = idst = iarg;
+ while (isrc < iendarg) {
+ if (isrc + 1 < iendarg &&
+ buf->buf[isrc] == '\\' &&
+ (buf->buf[isrc + 1] == '\\' ||
+ buf->buf[isrc + 1] == '.'))
+ isrc++;
+ buf->buf[idst++] = buf->buf[isrc++];
+ }
+ iendarg -= isrc - idst;
+ }
+
/* Handle expansion. */
res = NULL;
@@ -4002,7 +4018,7 @@ static size_t
roff_getname(struct roff *r, char **cpp, int ln, int pos)
{
char *name, *cp;
- size_t namesz;
+ int namesz, inam, iend;
name = *cpp;
if (*name == '\0')
@@ -4010,24 +4026,46 @@ roff_getname(struct roff *r, char **cpp, int ln, int pos)
/* Advance cp to the byte after the end of the name. */
- for (cp = name; 1; cp++) {
- namesz = cp - name;
+ cp = name;
+ namesz = 0;
+ for (;;) {
if (*cp == '\0')
break;
if (*cp == ' ' || *cp == '\t') {
cp++;
break;
}
- if (*cp != '\\')
+ if (*cp != '\\') {
+ if (name + namesz < cp) {
+ name[namesz] = *cp;
+ *cp = ' ';
+ }
+ namesz++;
+ cp++;
continue;
+ }
if (cp[1] == '{' || cp[1] == '}')
break;
- if (*++cp == '\\')
- continue;
- mandoc_msg(MANDOCERR_NAMESC, ln, pos,
- "%.*s", (int)(cp - name + 1), name);
- mandoc_escape((const char **)&cp, NULL, NULL);
- break;
+ if (roff_escape(cp, 0, 0, NULL, &inam,
+ NULL, NULL, &iend) != ESCAPE_UNDEF) {
+ mandoc_msg(MANDOCERR_NAMESC, ln, pos,
+ "%.*s%.*s", namesz, name, iend, cp);
+ cp += iend;
+ break;
+ }
+
+ /*
+ * In an identifier, \\, \., \G and so on
+ * are reduced to \, ., G and so on,
+ * vaguely similar to copy mode.
+ */
+
+ name[namesz++] = cp[inam];
+ while (iend--) {
+ if (cp >= name + namesz)
+ *cp = ' ';
+ cp++;
+ }
}
/* Read past spaces. */