gbranden pushed a commit to branch master
in repository groff.

commit ab19255d1d0f8151ba590ccf5121e816fae457a3
Author: G. Branden Robinson <g.branden.robin...@gmail.com>
AuthorDate: Sun Mar 2 11:41:58 2025 -0600

    [troff]: Implement recursive node dumping (1/9).
    
    * src/roff/troff/node.h (struct node): Undeclare `dump_node_list()`
      virtual function.
    
    * src/roff/troff/node.cpp (node::dump_node_list): Rename this...
      (dump_node_list): ...to this.  Instead of being a member function, it
      is now an ordinary function taking a pointer-to-node as argument.
      This is a temporary measure to keep node list dumping working.  Stop
      throwing assertion if the given node pointer is null.  Instead, we
      simply write an empty list (`[ ]`).
    
    * src/roff/troff/env.h (class environment): Rename member function
      `dump_node_list()` to `dump_pending_nodes()`.
    
    * src/roff/troff/env.cpp (environment::dump_node_list): Rename this...
      (environment::dump_pending_nodes): ...to this.
    
      (environment:add_char) [0]: Update call sites.
    
      (environment::dump_node_list): Rename this...
      (environment::dump_pending_nodes): ...to this.  Stop refusing to
      dump a null pointer.  Update call site as above.
    
    This change reveals formerly hidden nodes.
    
    Changes `pline` request output as follows.
    
     [{"type": "line_start_node", "diversion level": 0, "is_special_node": 
false},
     {"type": "zero_width_node", "diversion level": 0, "is_special_node": 
false},
     {"type": "glyph_node", "character": "d", "diversion level": 0, 
"is_special_node": false},
     {"type": "glyph_node", "character": "e", "diversion level": 0, 
"is_special_node": false},
    -{"type": "glyph_node", "character": "f", "diversion level": 0, 
"is_special_node": false}]
    +{"type": "glyph_node", "character": "f", "diversion level": 0, 
"is_special_node": false},
    +{"type": "word_space_node", "diversion level": 0, "is_special_node": 
false}]
     [{"type": "line_start_node", "diversion level": 0, "is_special_node": 
false},
     {"type": "hline_node", "diversion level": 0, "is_special_node": false},
     {"type": "zero_width_node", "diversion level": 0, "is_special_node": 
false},
     {"type": "glyph_node", "character": "d", "diversion level": 0, 
"is_special_node": false, "state": "<state>"},
     {"type": "glyph_node", "character": "e", "diversion level": 0, 
"is_special_node": false, "state": "<state>"},
    -{"type": "glyph_node", "character": "f", "diversion level": 0, 
"is_special_node": false, "state": "<state>"}]
    +{"type": "glyph_node", "character": "f", "diversion level": 0, 
"is_special_node": false, "state": "<state>"},
    +{"type": "word_space_node", "diversion level": 0, "is_special_node": 
false}]
    +[ ]
     [{"type": "line_start_node", "diversion level": 0, "is_special_node": 
false},
---
 ChangeLog               | 21 +++++++++++++++++++++
 src/roff/troff/env.cpp  | 15 ++++++++-------
 src/roff/troff/env.h    |  2 +-
 src/roff/troff/node.cpp | 10 +++++-----
 src/roff/troff/node.h   |  1 -
 5 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 74066b114..e726a2ef9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2025-03-02  G. Branden Robinson <g.branden.robin...@gmail.com>
+
+       * src/roff/troff/node.h (struct node): Undeclare
+       `dump_node_list()` virtual function.
+       * src/roff/troff/node.cpp (node::dump_node_list): Rename this...
+       (dump_node_list): ...to this.  Instead of being a member
+       function, it is now an ordinary function taking a
+       pointer-to-node as argument.  This is a temporary measure to
+       keep node list dumping working.  Stop throwing assertion if the
+       given node pointer is null.  Instead, we simply write an empty
+       list (`[ ]`).
+       * src/roff/troff/env.h (class environment): Rename member
+       function `dump_node_list()` to `dump_pending_nodes()`.
+       * src/roff/troff/env.cpp (environment::dump_node_list): Rename
+       this...
+       (environment::dump_pending_nodes): ...to this.
+       (environment:add_char) [0]: Update call sites.
+       (environment::dump_node_list): Rename this...
+       (environment::dump_pending_nodes): ...to this.  Stop refusing to
+       dump a null pointer.  Update call site as above.
+
 2025-03-02  G. Branden Robinson <g.branden.robin...@gmail.com>
 
        [troff]: Revise `pline` output style.  Use more JSON/YAML-ish
diff --git a/src/roff/troff/env.cpp b/src/roff/troff/env.cpp
index 4abb05f56..4349bba66 100644
--- a/src/roff/troff/env.cpp
+++ b/src/roff/troff/env.cpp
@@ -351,7 +351,7 @@ void environment::add_char(charinfo *ci)
       start_line();
 #if 0
     fprintf(stderr, "current line is\n");
-    line->dump_node_list();
+    dump_node_list(line);
 #endif
     if (ci != hyphen_indicator_char)
       line = line->add_char(ci, this, &width_total, &space_total, &gc_np);
@@ -360,7 +360,7 @@ void environment::add_char(charinfo *ci)
   }
 #if 0
   fprintf(stderr, "now after we have added character the line is\n");
-  line->dump_node_list();
+  dump_node_list(line);
 #endif
   if ((!suppress_push) && gc_np) {
     if (gc_np && (gc_np->state == 0 /* nullptr */)) {
@@ -374,7 +374,7 @@ void environment::add_char(charinfo *ci)
   }
 #if 0
   fprintf(stderr, "now we have possibly added the state the line is\n");
-  line->dump_node_list();
+  dump_node_list(line);
 #endif
 }
 
@@ -2418,10 +2418,11 @@ void environment::dump_troff_state()
 #undef SPACES
 }
 
-void environment::dump_node_list()
+extern void dump_node_list(node *);
+
+void environment::dump_pending_nodes()
 {
-  if (line != 0 /* nullptr */)
-    line->dump_node_list();
+  dump_node_list(line);
 }
 
 statem *environment::construct_state(bool has_only_eol)
@@ -3599,7 +3600,7 @@ void print_env()
 
 static void print_nodes_from_input_line()
 {
-  curenv->dump_node_list();
+  curenv->dump_pending_nodes();
   skip_line();
 }
 
diff --git a/src/roff/troff/env.h b/src/roff/troff/env.h
index 6b4ec03f9..09823b628 100644
--- a/src/roff/troff/env.h
+++ b/src/roff/troff/env.h
@@ -371,7 +371,7 @@ public:
                              int /* fill */);
   void construct_new_line_state(node *n);
   void dump_troff_state();
-  void dump_node_list();
+  void dump_pending_nodes();
 
   friend void title_length();
   friend void space_size();
diff --git a/src/roff/troff/node.cpp b/src/roff/troff/node.cpp
index 0bd007e7b..e0ee14569 100644
--- a/src/roff/troff/node.cpp
+++ b/src/roff/troff/node.cpp
@@ -2627,17 +2627,17 @@ void node::dump_node()
   fflush(stderr);
 }
 
-void node::dump_node_list()
+// TODO: Turn this into container_node::dump().
+void dump_node_list(node *nlist)
 {
   // It's stored in reverse order already; this puts it forward again.
   std::stack<node *> reversed_node_list;
-  node *n = next;
+  node *n = nlist;
 
-  assert(next != 0 /* nullptr */);
-  do {
+  while (n != 0 /* nullptr */) {
     reversed_node_list.push(n);
     n = n->next;
-  } while (n != 0 /* nullptr */);
+  }
   fputc('[', stderr);
   bool need_comma = false;
   while (!reversed_node_list.empty()) {
diff --git a/src/roff/troff/node.h b/src/roff/troff/node.h
index d503c2e0e..efdcd6294 100644
--- a/src/roff/troff/node.h
+++ b/src/roff/troff/node.h
@@ -117,7 +117,6 @@ struct node {
   virtual bool is_same_as(node *) = 0;
   virtual const char *type() = 0;
   virtual void dump_node();
-  virtual void dump_node_list();
 };
 
 inline node::node()

_______________________________________________
groff-commit mailing list
groff-commit@gnu.org
https://lists.gnu.org/mailman/listinfo/groff-commit

Reply via email to