Follow-up Comment #23, bug #67571 (group groff): [comment #0 original submission:]
> I get the above results whether I use groff 1.22.4 or 1.23.0. (The other
> historical groff I have at hand, 1.19.2, had not yet implemented the .class
> request.)
I can reproduce it with _groff_ 1.22.3.
The `define_class()` function seems to have come in in December 2010 and
soldified _almost_ instantly. I see only 3 commits implicated, all within a
week.
$ git blame 1.22.3 -- src/roff/troff/input.cpp | sed -n '/void
define_class/,/) }/p'
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7028) void define_class()
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7029) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7030) tok.skip();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7031) symbol nm = get_name(1);
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7032) if (nm.is_null()) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7033) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7034) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7035) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7036) charinfo *ci = get_charinfo(nm);
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7037) charinfo *child1 = 0, *child2 = 0;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7038) while (!tok.newline() && !tok.eof()) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7039) tok.skip();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7040) if (child1 != 0 && tok.ch() == '-') {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7041) tok.next();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7042) child2 = tok.get_char(1);
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7043) if (!child2) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7044) warning(WARN_MISSING,
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7045) "missing end of character range in class `%1'",
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7046) nm.contents());
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7047) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7048) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7049) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7050) if (child1->is_class() || child2->is_class()) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7051) warning(WARN_SYNTAX,
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7052) "nested character class is not allowed in range
definition");
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7053) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7054) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7055) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7056) int u1 = child1->get_unicode_code();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7057) int u2 = child2->get_unicode_code();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7058) if (u1 < 0) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7059) warning(WARN_SYNTAX,
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7060) "invalid start value in character range");
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7061) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7062) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7063) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7064) if (u2 < 0) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7065) warning(WARN_SYNTAX,
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7066) "invalid end value in character range");
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7067) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7068) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7069) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7070) ci->add_to_class(u1, u2);
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7071) child1 = child2 = 0;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7072) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7073) else if (child1 != 0) {
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7074) if (child1->is_class()) {
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7075) if (ci == child1) {
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7076) warning(WARN_SYNTAX, "invalid cyclic class nesting");
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7077) skip_line();
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7078) return;
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7079) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7080) ci->add_to_class(child1);
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7081) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7082) else {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7083) int u1 = child1->get_unicode_code();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7084) if (u1 < 0) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7085) warning(WARN_SYNTAX,
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7086) "invalid character value in class `%1'",
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7087) nm.contents());
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7088) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7089) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7090) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7091) ci->add_to_class(u1);
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7092) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7093) child1 = 0;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7094) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7095) child1 = tok.get_char(1);
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7096) tok.next();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7097) if (!child1) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7098) if (!tok.newline())
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7099) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7100) break;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7101) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7102) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7103) if (child1 != 0) {
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7104) if (child1->is_class()) {
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7105) if (ci == child1) {
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7106) warning(WARN_SYNTAX, "invalid cyclic class nesting");
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7107) skip_line();
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7108) return;
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7109) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7110) ci->add_to_class(child1);
9a08b71d07 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-19 20:47:38 +0000
7111) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7112) else {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7113) int u1 = child1->get_unicode_code();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7114) if (u1 < 0) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7115) warning(WARN_SYNTAX,
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7116) "invalid character value in class `%1'",
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7117) nm.contents());
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7118) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7119) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7120) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7121) ci->add_to_class(u1);
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7122) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7123) child1 = 0;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7124) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7125) if (!ci->is_class()) {
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7126) warning(WARN_SYNTAX,
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7127) "empty class definition for `%1'",
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7128) nm.contents());
a1954c5a05 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 17:36:55 +0000
7129) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7130) return;
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7131) }
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7132) (void)char_class_dictionary.lookup(nm, ci);
a1954c5a05 src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 17:36:55 +0000
7133) skip_line();
1cb8dd7bde src/roff/troff/input.cpp (Werner LEMBERG 2010-12-13 15:30:20 +0000
7134) }
I expect that to resolve our disagreement over character flag and character
class interactions, we're going to both need to look carefully at the
foregoing.
_______________________________________________________
Reply to this item at:
<https://savannah.gnu.org/bugs/?67571>
_______________________________________________
Message sent via Savannah
https://savannah.gnu.org/
signature.asc
Description: PGP signature
