gbranden pushed a commit to branch master
in repository groff.
commit 956955c6634b506617818b6a29c892ff18375847
Author: G. Branden Robinson <[email protected]>
AuthorDate: Sat Aug 17 18:24:34 2024 -0500
[troff]: Fix Savannah #63202 (1/3).
[troff]: When throwing a warning diagnostic about a mismatched escape
sequence delimiter, say what what we were expecting and what we got
instead.
* src/roff/troff/input.cpp (read_delimited_number, get_line_arg)
(do_register):
* src/roff/troff/reg.cpp (inline_define_register [0]): Do it.
Fixes <https://savannah.gnu.org/bugs/?63202>.
$ cat ATTIC/mismatched-delimiter-demo.groff
foo\R'a 20g'
foo\L'1ig#
foo\h'5mbar
foo\H'20@
$ ./build/test-groff -ww -z ATTIC/mismatched-delimiter-demo.groff
troff:ATTIC/mismatched-delimiter-demo.groff:1: warning: closing delimiter
does not match; expected character "'", got character 'g'
troff:ATTIC/mismatched-delimiter-demo.groff:2: warning: closing delimiter
does not match; expected character "'", got character '#'
troff:ATTIC/mismatched-delimiter-demo.groff:3: warning: closing delimiter
does not match; expected character "'", got character 'b'
troff:ATTIC/mismatched-delimiter-demo.groff:4: warning: closing delimiter
does not match; expected character "'", got character '@'
---
ChangeLog | 12 ++++++++++++
src/roff/troff/input.cpp | 40 +++++++++++++++++++++++++++++++++-------
src/roff/troff/reg.cpp | 11 +++++++++--
3 files changed, 54 insertions(+), 9 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 8806ebc8d..aa7e29766 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2024-08-17 G. Branden Robinson <[email protected]>
+
+ [troff]: When throwing a warning diagnostic about a mismatched
+ escape sequence delimiter, say what what we were expecting and
+ what we got instead.
+
+ * src/roff/troff/input.cpp (read_delimited_number, get_line_arg)
+ (do_register):
+ * src/roff/troff/reg.cpp (inline_define_register [0]): Do it.
+
+ Fixes <https://savannah.gnu.org/bugs/?63202>.
+
2024-08-17 G. Branden Robinson <[email protected]>
* src/roff/troff/input.cpp (do_name_test): Fix buglet in
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index 84b87a60d..1cb5650c7 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -5182,8 +5182,15 @@ static bool read_delimited_number(units *n,
if (start_token.is_usable_as_delimiter(true /* report error */)) {
tok.next();
if (read_measurement(n, si, prev_value)) {
- if (start_token != tok)
- warning(WARN_DELIM, "closing delimiter does not match");
+ if (start_token != tok) {
+ // token::description() writes to static, class-wide storage, so
+ // we must allocate a copy of it before issuing the next
+ // diagnostic.
+ char *delimdesc = strdup(start_token.description());
+ warning(WARN_DELIM, "closing delimiter does not match;"
+ " expected %1, got %2", delimdesc, tok.description());
+ free(delimdesc);
+ }
return true;
}
}
@@ -5197,8 +5204,15 @@ static bool read_delimited_number(units *n, unsigned
char si)
if (start_token.is_usable_as_delimiter(true /* report error */)) {
tok.next();
if (read_measurement(n, si)) {
- if (start_token != tok)
- warning(WARN_DELIM, "closing delimiter does not match");
+ if (start_token != tok) {
+ // token::description() writes to static, class-wide storage, so
+ // we must allocate a copy of it before issuing the next
+ // diagnostic.
+ char *delimdesc = strdup(start_token.description());
+ warning(WARN_DELIM, "closing delimiter does not match;"
+ " expected %1, got %2", delimdesc, tok.description());
+ free(delimdesc);
+ }
return true;
}
}
@@ -5222,8 +5236,15 @@ static bool get_line_arg(units *n, unsigned char si,
charinfo **cp)
tok.next();
}
if (!(start_token == tok
- && input_stack::get_level() == start_level))
- warning(WARN_DELIM, "closing delimiter does not match");
+ && input_stack::get_level() == start_level)) {
+ // token::description() writes to static, class-wide storage, so
+ // we must allocate a copy of it before issuing the next
+ // diagnostic.
+ char *delimdesc = strdup(start_token.description());
+ warning(WARN_DELIM, "closing delimiter does not match; expected"
+ " %1, got %2", delimdesc, tok.description());
+ free(delimdesc);
+ }
return true;
}
return false;
@@ -5435,8 +5456,13 @@ static void do_register()
int val;
if (!read_measurement(&val, 'u', prev_value))
return;
+ // token::description() writes to static, class-wide storage, so we
+ // must allocate a copy of it before issuing the next diagnostic.
+ char *delimdesc = strdup(start_token.description());
if (start_token != tok)
- warning(WARN_DELIM, "closing delimiter does not match");
+ warning(WARN_DELIM, "closing delimiter does not match; expected %1,"
+ " got %2", delimdesc, tok.description());
+ free(delimdesc);
if (r != 0 /* nullptr */)
r->set_value(val);
else
diff --git a/src/roff/troff/reg.cpp b/src/roff/troff/reg.cpp
index 57f10b5a7..654b2c371 100644
--- a/src/roff/troff/reg.cpp
+++ b/src/roff/troff/reg.cpp
@@ -360,8 +360,15 @@ void inline_define_register()
if (start_token != tok) {
if (read_measurement(&v, 'u')) {
r->set_increment(v);
- if (start_token != tok)
- warning(WARN_DELIM, "closing delimiter does not match");
+ if (start_token != tok) {
+ // token::description() writes to static, class-wide storage,
+ // so we must allocate a copy of it before issuing the next
+ // diagnostic.
+ char *delimdesc = strdup(start_token.description());
+ warning(WARN_DELIM, "closing delimiter does not match;"
+ " expected %1, got %2", delimdesc, tok.description());
+ free(delimdesc);
+ }
}
}
}
_______________________________________________
Groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit