gbranden pushed a commit to branch master
in repository groff.
commit 1c4d4a722cd43ea175629185d1fd37738f467342
Author: G. Branden Robinson <[email protected]>
AuthorDate: Wed Nov 19 15:15:22 2025 -0600
[troff]: Fix Savannah #67718 (char class overpop).
* src/roff/troff/input.cpp (define_class_request): Stop adding the
second end point of a character code range (to a character class)
duplicatively as a singleton, preventing redundant population of the
range.
Fixes <https://savannah.gnu.org/bugs/?67718>.
$ sed -n '44,+1p' tmac/ja.tmac
.class [CJKnormal] \
\[u3041]-\[u3096] \[u30A0]-\[u30FF] \[u4E00]-\[u9FFF]
Before:
$ printf '.pchar \\C"[CJKnormal]"\n' | ./build/test-groff -m ja -T utf8
character class '[CJKnormal]'
defined at: file name:
"/home/branden/src/GIT/groff/build/../tmac/ja.tmac", line number: 44
contains ranges: U+3041-U+3096 U+3096 U+30A0-U+30FF U+30FF U+4E00-U+9FFF
U+9FFF
contains nested classes: (none)
After:
$ printf '.pchar \\C"[CJKnormal]"\n' | ./build/test-groff -m ja -T utf8
character class '[CJKnormal]'
defined at: file name:
"/home/branden/src/GIT/groff/build/../tmac/ja.tmac", line number: 44
contains ranges: U+3041-U+3096 U+30A0-U+30FF U+4E00-U+9FFF
contains nested classes: (none)
---
ChangeLog | 9 +++++++++
src/roff/troff/input.cpp | 11 +++++++++++
2 files changed, 20 insertions(+)
diff --git a/ChangeLog b/ChangeLog
index a4b2d84ca..4f69f5d35 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2025-11-19 G. Branden Robinson <[email protected]>
+
+ * src/roff/troff/input.cpp (define_class_request): Stop adding
+ the second end point of a character code range (to a character
+ class) duplicatively as a singleton, preventing redundant
+ population of the range.
+
+ Fixes <https://savannah.gnu.org/bugs/?67718>.
+
2025-11-18 G. Branden Robinson <[email protected]>
* src/roff/troff/input.cpp (define_class_request): Eliminate
diff --git a/src/roff/troff/input.cpp b/src/roff/troff/input.cpp
index a616dbe38..4680c5fcd 100644
--- a/src/roff/troff/input.cpp
+++ b/src/roff/troff/input.cpp
@@ -8538,8 +8538,12 @@ static void define_class_request()
macro *m = new macro;
(void) ci->set_macro(m);
charinfo *child1 = 0 /* nullptr */, *child2 = 0 /* nullptr */;
+ bool just_chained_a_range_expression = false;
while (!tok.is_newline() && !tok.is_eof()) {
tok.skip();
+ // Chained range expressions like
+ // \[u3041]-\[u3096]-\[u30FF]
+ // are not valid.
if ((child1 != 0 /* nullptr */) && (tok.ch() == '-')) {
tok.next();
child2 = tok.get_char();
@@ -8573,6 +8577,7 @@ static void define_class_request()
}
ci->add_to_class(u1, u2);
child1 = child2 = 0 /* nullptr */;
+ just_chained_a_range_expression = true;
}
else if (child1 != 0 /* nullptr */) {
if (child1->is_class()) {
@@ -8603,6 +8608,12 @@ static void define_class_request()
skip_line();
break;
}
+ if (just_chained_a_range_expression) {
+ // Throw away `child1` so we don't duplicatively add the second
+ // end point of a range as a singleton. See Savannah #67718.
+ child1 = 0 /* nullptr */;
+ just_chained_a_range_expression = false;
+ }
}
if (child1 != 0 /* nullptr */) {
if (child1->is_class()) {
_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit