gbranden pushed a commit to branch master in repository groff. commit f017b8e4b2b2b709ec45cb8edb1660ba0c89371e Author: G. Branden Robinson <g.branden.robin...@gmail.com> AuthorDate: Sun Mar 2 09:56:17 2025 -0600
Revert "[troff]: Improve `node` types' const-correctness." This inadvertently broke the fix for Savannah #66815--in record time! The problem is that I marked as `const` some objects that had `FILE *` member variables, and writing to the output stream does, in fact, mutate its state. (Recall our friend the stream pointer, exposed via fseek(3) and ftell(3).) This reverts commit d667af72e162c3ef269f7da269ab75f186ad9e4c. --- ChangeLog | 33 ------------------------------ src/roff/troff/node.cpp | 54 ++++++++++++++++++++++++------------------------- src/roff/troff/node.h | 12 +++++------ 3 files changed, 32 insertions(+), 67 deletions(-) diff --git a/ChangeLog b/ChangeLog index 27f311eb6..fb28ff0fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -40,39 +40,6 @@ defined in "Makefile.am" to locate `pdfmom` executable; as with `GROFFBIN`, that's what it's there for. -2025-02-26 G. Branden Robinson <g.branden.robin...@gmail.com> - - * src/roff/troff/node.{h,cpp}: Improve `const`-correctness of - `ascii_output_file` class and related helper functions. - - * src/roff/troff/node.h (struct node, class space_node) - (class hmotion_node, class space_char_hmotion_node) - (class zero_width_node, class left_italic_corrected_node): Mark - `ascii_print()` member functions' `ascii_output_file` pointer - argument as `const`. - - * src/roff/troff/node.cpp (class ascii_output_file): Declare - `outc()` and `outs()` member functions as `const` (for our - C-only readers, this means they don't mutate the object upon - which they're called). - (ascii_output_file::outc, ascii_output_file::outs): Mark them - as `const` in corresponding definitions. - (class glyph_node, class ligature_node, class kern_pair_node) - (class dbreak_node, class glyph_node, class ligature_node) - (class italic_corrected_node, class break_char_node) - (class composite_node): Mark `ascii_print()` member functions' - `ascii_output_file` pointer argument as `const`. - (italic_corrected_node::ascii_print) - (break_char_node::ascii_print, dbreak_node::ascii_print) - (kern_pair_node::ascii_print, node::ascii_print) - (space_node::ascii_print, hmotion_node::ascii_print) - (space_char_hmotion_node::ascii_print) - (zero_width_node::ascii_print, composite_node::ascii_print) - (left_italic_corrected_node::ascii_print): Mark them as `const` - in corresponding definitions. - (ascii_print_node_list, ascii_print_reverse_node_list): Mark - `ascii_output_file` pointer argument as `const`. - 2025-02-26 G. Branden Robinson <g.branden.robin...@gmail.com> * src/roff/troff/node.cpp: Fix code style nit. diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp index 58e9148a8..4ba404a39 100644 --- a/src/roff/troff/node.cpp +++ b/src/roff/troff/node.cpp @@ -765,17 +765,17 @@ public: void really_transparent_char(unsigned char); void really_print_line(hunits x, vunits y, node *n, vunits, vunits, hunits width); void really_begin_page(int pageno, vunits page_length); - void outc(unsigned char c) const; - void outs(const char *s) const; + void outc(unsigned char c); + void outs(const char *s); }; -void ascii_output_file::outc(unsigned char c) const +void ascii_output_file::outc(unsigned char c) { if (fp != 0 /* nullptr */) fputc(c, fp); } -void ascii_output_file::outs(const char *s) const +void ascii_output_file::outs(const char *s) { if (fp != 0 /* nullptr */) { fputc('<', fp); @@ -1925,7 +1925,7 @@ public: void zero_width_tprint(troff_output_file *); hyphen_list *get_hyphen_list(hyphen_list *, int *); node *add_self(node *, hyphen_list **); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); int character_type(); bool is_same_as(node *); @@ -1953,7 +1953,7 @@ public: node *copy(); node *add_self(node *, hyphen_list **); hyphen_list *get_hyphen_list(hyphen_list *, int *); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); bool is_same_as(node *); const char *type(); @@ -1981,7 +1981,7 @@ public: void tprint(troff_output_file *); hyphenation_type get_hyphenation_type(); int ends_sentence(); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); bool is_same_as(node *); const char *type(); @@ -2012,7 +2012,7 @@ public: int ends_sentence(); void split(int, node **, node **); hyphenation_type get_hyphenation_type(); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); bool is_same_as(node *); const char *type(); @@ -2201,7 +2201,7 @@ hyphenation_type glyph_node::get_hyphenation_type() return HYPHEN_MIDDLE; } -void glyph_node::ascii_print(const ascii_output_file *ascii) +void glyph_node::ascii_print(ascii_output_file *ascii) { unsigned char c = ci->get_ascii_code(); if (c != '\0') @@ -2265,7 +2265,7 @@ node *ligature_node::copy() #endif } -void ligature_node::ascii_print(const ascii_output_file *ascii) +void ligature_node::ascii_print(ascii_output_file *ascii) { n1->ascii_print(ascii); n2->ascii_print(ascii); @@ -2670,7 +2670,7 @@ public: node * = 0 /* nullptr */); ~italic_corrected_node(); node *copy(); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); hunits width(); node *last_char_node(); @@ -2748,7 +2748,7 @@ hunits italic_corrected_node::subscript_correction() return n->subscript_correction() - x; } -void italic_corrected_node::ascii_print(const ascii_output_file *out) +void italic_corrected_node::ascii_print(ascii_output_file *out) { n->ascii_print(out); } @@ -2824,7 +2824,7 @@ public: hyphen_list *get_hyphen_list(hyphen_list *, int *); void tprint(troff_output_file *); void zero_width_tprint(troff_output_file *); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); hyphenation_type get_hyphenation_type(); int overlaps_vertically(); @@ -2947,7 +2947,7 @@ hyphenation_type break_char_node::get_hyphenation_type() return HYPHEN_MIDDLE; } -void break_char_node::ascii_print(const ascii_output_file *ascii) +void break_char_node::ascii_print(ascii_output_file *ascii) { ch->ascii_print(ascii); } @@ -3531,8 +3531,7 @@ void vline_node::vertical_extent(vunits *min, vunits *max) /* ascii_print methods */ -static void ascii_print_node_list(const ascii_output_file *ascii, - node *n) +static void ascii_print_node_list(ascii_output_file *ascii, node *n) { node *nn = n; while(nn != 0 /* nullptr */) { @@ -3541,8 +3540,7 @@ static void ascii_print_node_list(const ascii_output_file *ascii, } } -static void ascii_print_reverse_node_list( - const ascii_output_file *ascii, node *n) +static void ascii_print_reverse_node_list(ascii_output_file *ascii, node *n) { if (0 /* nullptr */ == n) return; @@ -3550,40 +3548,40 @@ static void ascii_print_reverse_node_list( n->ascii_print(ascii); } -void dbreak_node::ascii_print(const ascii_output_file *ascii) +void dbreak_node::ascii_print(ascii_output_file *ascii) { ascii_print_reverse_node_list(ascii, none); } -void kern_pair_node::ascii_print(const ascii_output_file *ascii) +void kern_pair_node::ascii_print(ascii_output_file *ascii) { n1->ascii_print(ascii); n2->ascii_print(ascii); } -void node::ascii_print(const ascii_output_file *) +void node::ascii_print(ascii_output_file *) { } -void space_node::ascii_print(const ascii_output_file *ascii) +void space_node::ascii_print(ascii_output_file *ascii) { if (!n.is_zero()) ascii->outc(' '); } -void hmotion_node::ascii_print(const ascii_output_file *ascii) +void hmotion_node::ascii_print(ascii_output_file *ascii) { // this is pretty arbitrary if (n >= points_to_units(2)) ascii->outc(' '); } -void space_char_hmotion_node::ascii_print(const ascii_output_file *ascii) +void space_char_hmotion_node::ascii_print(ascii_output_file *ascii) { ascii->outc(' '); } -void zero_width_node::ascii_print(const ascii_output_file *out) const +void zero_width_node::ascii_print(ascii_output_file *out) { ascii_print_node_list(out, n); } @@ -4332,7 +4330,7 @@ public: units size(); void tprint(troff_output_file *); hyphenation_type get_hyphenation_type(); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); hyphen_list *get_hyphen_list(hyphen_list *, int *); node *add_self(node *, hyphen_list **); @@ -4413,7 +4411,7 @@ void composite_node::asciify(macro *m) m->append(this); } -void composite_node::ascii_print(const ascii_output_file *ascii) +void composite_node::ascii_print(ascii_output_file *ascii) { unsigned char c = ci->get_ascii_code(); if (c != 0) @@ -5617,7 +5615,7 @@ bool left_italic_corrected_node::is_same_as(node *nd) && same_node(n, ((left_italic_corrected_node *)nd)->n)); } -void left_italic_corrected_node::ascii_print(const ascii_output_file *out) +void left_italic_corrected_node::ascii_print(ascii_output_file *out) { if (n) n->ascii_print(out); diff --git a/src/roff/troff/node.h b/src/roff/troff/node.h index 3bf034876..fe96fa1c6 100644 --- a/src/roff/troff/node.h +++ b/src/roff/troff/node.h @@ -85,7 +85,7 @@ struct node { virtual node *add_discretionary_hyphen(); virtual node *add_self(node *, hyphen_list **); virtual hyphen_list *get_hyphen_list(hyphen_list *, int *); - virtual void ascii_print(const ascii_output_file *); + virtual void ascii_print(ascii_output_file *); virtual void asciify(macro *); virtual int discardable(); virtual void spread_space(int *, hunits *); @@ -201,7 +201,7 @@ public: bool /* is_inner */ = false); int nbreaks(); void split(int, node **, node **); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); bool is_same_as(node *); void asciify(macro *); const char *type(); @@ -350,7 +350,7 @@ public: void asciify(macro *); void tprint(troff_output_file *); hunits width(); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); bool is_same_as(node *); const char *type(); bool causes_tprint(); @@ -367,7 +367,7 @@ public: space_char_hmotion_node(hunits, color *, statem *, int, node * /* nxt */ = 0 /* nullptr */); node *copy(); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); void tprint(troff_output_file *); bool is_same_as(node *); @@ -461,7 +461,7 @@ public: ~zero_width_node(); node *copy(); void tprint(troff_output_file *); - void ascii_print(const ascii_output_file *) const; + void ascii_print(ascii_output_file *); bool is_same_as(node *); const char *type(); bool causes_tprint(); @@ -480,7 +480,7 @@ public: node * /* xx */ = 0 /* nullptr */); ~left_italic_corrected_node(); void tprint(troff_output_file *); - void ascii_print(const ascii_output_file *); + void ascii_print(ascii_output_file *); void asciify(macro *); node *copy(); bool is_same_as(node *); _______________________________________________ groff-commit mailing list groff-commit@gnu.org https://lists.gnu.org/mailman/listinfo/groff-commit