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

Reply via email to