gbranden pushed a commit to branch master
in repository groff.

commit ea1e00de47b376560267b9e1390ee2613fdedccf
Author: G. Branden Robinson <[email protected]>
AuthorDate: Wed Dec 4 04:31:34 2024 -0600

    [troff]: Fix Savannah #66526 (`|` handling).
    
    * src/roff/troff/input.cpp (is_conditional_expression_true): Stop
      treating `|` as a delimiter, but instead as beginning a numeric
      expression, _only_ as the predicate of a control structure request.
      Improves compatibility with AT&T troff, including DWB 3.3 and Heirloom
      Doctools.  Problem appears to date back to groff 1.02.
    
      GNU troff has long thrown diagnostics in this context, of increasing
      detail in recent years.  For example:
    
      troff:mm/0.MT:271: warning: missing closing delimiter in output
        comparison operator; expected character '|', got a newline
    
      However, this was easily overlooked in our automated tests because it
      didn't break formatting, except on Solaris 10 (or if you ran the
      post-1.23.0 test "contrib/mm/tests/memoranda-format-correctly.sh"
      with an older groff release).
    
    Fixes <https://savannah.gnu.org/bugs/?66526>.
---
 ChangeLog                | 22 ++++++++++++++++++++++
 src/roff/troff/input.cpp |  4 +++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 7e8c31203..573f25c8f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2024-12-04  G. Branden Robinson <[email protected]>
+
+       * src/roff/troff/input.cpp (is_conditional_expression_true):
+       Stop treating `|` as a delimiter, but instead as beginning a
+       numeric expression, _only_ as the predicate of a control
+       structure request.  Improves compatibility with AT&T troff,
+       including DWB 3.3 and Heirloom Doctools.  Problem appears to
+       date back to groff 1.02.
+
+       GNU troff has long thrown diagnostics in this context, of
+       increasing detail in recent years.  For example:
+
+       troff:mm/0.MT:271: warning: missing closing delimiter in output
+         comparison operator; expected character '|', got a newline
+
+       However, this was easily overlooked in our automated tests
+       because it didn't break formatting, except on Solaris 10 (or if
+       you ran the post-1.23.0 test "contrib/mm/tests/
+       memoranda-format-correctly.sh" with an older groff release).
+
+       Fixes <https://savannah.gnu.org/bugs/?66526>.
+
 2024-12-04  G. Branden Robinson <[email protected]>
 
        * src/roff/troff/input.cpp: Trivially refactor.
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index 2be0b1e0a..09d4dd6a7 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -6415,7 +6415,9 @@ static bool is_conditional_expression_true()
   }
   else if (tok.is_space())
     result = false;
-  else if (tok.is_usable_as_delimiter()) {
+  // Treat `|` specially for AT&T troff compatibility, where it _isn't_
+  // a delimiter in this context; see Savannah #66526.
+  else if (tok.is_usable_as_delimiter() && (tok.ch() != '|')) {
     // Perform (formatted) output comparison.
     token delim = tok;
     int delim_level = input_stack::get_level();

_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit

Reply via email to