groff-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Groff-commit] groff ./ChangeLog src/roff/troff/node.cpp src/r...


From: Werner LEMBERG
Subject: [Groff-commit] groff ./ChangeLog src/roff/troff/node.cpp src/r...
Date: Tue, 12 Oct 2004 02:07:51 -0400

CVSROOT:        /cvsroot/groff
Module name:    groff
Branch:         
Changes by:     Werner LEMBERG <address@hidden> 04/10/12 05:44:51

Modified files:
        .              : ChangeLog 
        src/roff/troff : node.cpp node.h 

Log message:
        * src/roff/troff/node.cpp: New extern `debug_state'.
        Include `stringclass.h' and `mtsm.h'.
        Implement new classes and class members from `node.h'.
        (real_output_file): Make `fp' public.
        (troff_output_file): New variables `cur_div_level' and `tag_list'.
        Update constructors.
        (troff_output_file::really_print_line): Check whether we should push
        the current troff state and use the state at the start of the
        invocation of this diversion.
        (troff_output_file::add_to_tag_list): New member function.
        (node::add_char): Handle `glyph_comp_np'.
        
        * src/roff/troff/node.h: Include `mtsm.h'.
        (node): New variables `state', `push_state', `div_nest_level',
        `is_special'.  Update constructors, all descendants.
        Pass additional argument to `add_char' member function.
        New virtual member functions `is_tag', `debug_node',
        `debug_node_list'.  Update all descendants.
        (tag_node): New class for handling tags.
        (output_file): Add variable `state'.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/groff/groff/ChangeLog.diff?tr1=1.748&tr2=1.749&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/groff/groff/src/roff/troff/node.cpp.diff?tr1=1.12&tr2=1.13&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/groff/groff/src/roff/troff/node.h.diff?tr1=1.27&tr2=1.28&r1=text&r2=text

Patches:
Index: groff/ChangeLog
diff -u groff/ChangeLog:1.748 groff/ChangeLog:1.749
--- groff/ChangeLog:1.748       Sun Oct 10 19:57:22 2004
+++ groff/ChangeLog     Tue Oct 12 05:44:51 2004
@@ -1,3 +1,26 @@
+2004-10-10  Gaius Mulley  <address@hidden>
+
+       * src/roff/troff/node.cpp: New extern `debug_state'.
+       Include `stringclass.h' and `mtsm.h'.
+       Implement new classes and class members from `node.h'.
+       (real_output_file): Make `fp' public.
+       (troff_output_file): New variables `cur_div_level' and `tag_list'.
+       Update constructors.
+       (troff_output_file::really_print_line): Check whether we should push
+       the current troff state and use the state at the start of the
+       invocation of this diversion.
+       (troff_output_file::add_to_tag_list): New member function.
+       (node::add_char): Handle `glyph_comp_np'.
+
+       * src/roff/troff/node.h: Include `mtsm.h'.
+       (node): New variables `state', `push_state', `div_nest_level',
+       `is_special'.  Update constructors, all descendants.
+       Pass additional argument to `add_char' member function.
+       New virtual member functions `is_tag', `debug_node',
+       `debug_node_list'.  Update all descendants.
+       (tag_node): New class for handling tags.
+       (output_file): Add variable `state'.
+
 2004-10-09  Gaius Mulley  <address@hidden>
 
        * src/roff/troff/mtsm.cpp, src/roff/troff/mtsm.h: New files,
@@ -93,9 +116,6 @@
        (tag, taga): New functions.
        (init_input_requests): Add `tag' and `taga' requests.
 
-       (node): New virtual member function `is_tag'.  Update all
-       descendants.
-
 2004-10-05  Gaius Mulley  <address@hidden>
 
        * src/include/font.h (font): New member function
Index: groff/src/roff/troff/node.cpp
diff -u groff/src/roff/troff/node.cpp:1.12 groff/src/roff/troff/node.cpp:1.13
--- groff/src/roff/troff/node.cpp:1.12  Wed Jun 30 11:35:29 2004
+++ groff/src/roff/troff/node.cpp       Tue Oct 12 05:44:51 2004
@@ -19,6 +19,8 @@
 with groff; see the file COPYING.  If not, write to the Free Software
 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 
+extern int debug_state;
+
 #include "troff.h"
 
 #ifdef HAVE_UNISTD_H
@@ -37,7 +39,7 @@
 #include "input.h"
 #include "div.h"
 #include "geometry.h"
-#include "stringclass.h"
+#include "mtsm.h"
 
 #include "nonposix.h"
 
@@ -133,7 +135,7 @@
   void flush();
 public:
   special_font_list *sf;
-  font_info(symbol nm, int n, symbol enm, font *f);
+  font_info(symbol, int, symbol, font *);
   int contains(charinfo *);
   void set_bold(hunits);
   void unbold();
@@ -170,7 +172,7 @@
   int height;
   int slant;
 public:
-  tfont_spec(symbol nm, int pos, font *, font_size, int, int);
+  tfont_spec(symbol, int, font *, font_size, int, int);
   tfont_spec(const tfont_spec &spec) { *this = spec; }
   tfont_spec plain();
   int operator==(const tfont_spec &);
@@ -689,9 +691,8 @@
   virtual void really_put_filename(const char *filename);
   virtual void really_on();
   virtual void really_off();
-protected:
-  FILE *fp;
 public:
+  FILE *fp;
   real_output_file();
   ~real_output_file();
   void flush();
@@ -759,6 +760,8 @@
   int tbuf_len;
   int tbuf_kern;
   int begun_page;
+  int cur_div_level;
+  string tag_list;
   void do_motion();
   void put(char c);
   void put(unsigned char c);
@@ -795,6 +798,7 @@
   void fill_color(color *c);
   int get_hpos() { return hpos; }
   int get_vpos() { return vpos; }
+  void add_to_tag_list(string s);
   friend void space_char_hmotion_node::tprint(troff_output_file *);
   friend void unbreakable_space_node::tprint(troff_output_file *);
 };
@@ -872,6 +876,29 @@
 {
   moveto(x, y);
   while (n != 0) {
+    // Check whether we should push the current troff state and use
+    // the state at the start of the invocation of this diversion.
+    if (n->div_nest_level > cur_div_level && n->push_state) {
+      state.push_state(n->push_state);
+      cur_div_level = n->div_nest_level;
+    }
+    // Has the current diversion level decreased?  Then we must pop the
+    // troff state.
+    while (n->div_nest_level < cur_div_level) {
+      state.pop_state();
+      cur_div_level = n->div_nest_level;
+    }
+    // Now check whether the state has changed.
+    if ((is_on() || n->force_tprint())
+       && (state.changed(n->state) || n->is_tag() || n->is_special)) {
+      flush_tbuf();
+      do_motion();
+      force_motion = 1;
+      flush();
+      state.flush(fp, n->state, tag_list);
+      tag_list = string("");
+      flush();
+    }
     n->tprint(this);
     n = n->next;
   }
@@ -1283,6 +1310,16 @@
   put('\n');
 }
 
+void troff_output_file::add_to_tag_list(string s)
+{
+  if (tag_list == string(""))
+    tag_list = s;
+  else {
+    tag_list += string("\n");
+    tag_list += s;
+  }
+}
+
 // determine_line_limits - works out the smallest box which will contain
 //                        the entity, code, built from the point array.
 void troff_output_file::determine_line_limits(char code, hvpair *point,
@@ -1512,7 +1549,8 @@
 
 troff_output_file::troff_output_file()
 : current_slant(0), current_height(0), current_fill_color(0),
-  current_glyph_color(0), nfont_positions(10), tbuf_len(0), begun_page(0)
+  current_glyph_color(0), nfont_positions(10), tbuf_len(0), begun_page(0),
+  cur_div_level(0)
 {
   font_position = new symbol[nfont_positions];
   put("x T ");
@@ -1735,14 +1773,14 @@
 protected:
   charinfo *ci;
 public:
-  charinfo_node(charinfo *, node * = 0);
+  charinfo_node(charinfo *, statem *, int, node * = 0);
   int ends_sentence();
   int overlaps_vertically();
   int overlaps_horizontally();
 };
 
-charinfo_node::charinfo_node(charinfo *c, node *x)
-: node(x), ci(c)
+charinfo_node::charinfo_node(charinfo *c, statem *s, int pop, node *x)
+: node(x, s, pop), ci(c)
 {
 }
 
@@ -1774,12 +1812,14 @@
   color *fcol;         /* this is needed for grotty */
 #ifdef STORE_WIDTH
   hunits wid;
-  glyph_node(charinfo *, tfont *, color *, color *, hunits, node * = 0);
+  glyph_node(charinfo *, tfont *, color *, color *, hunits,
+            statem *, int, node * = 0);
 #endif
 public:
   void *operator new(size_t);
   void operator delete(void *);
-  glyph_node(charinfo *, tfont *, color *, color *, node * = 0);
+  glyph_node(charinfo *, tfont *, color *, color *,
+            statem *, int, node * = 0);
   ~glyph_node() {}
   node *copy();
   node *merge_glyph_node(glyph_node *);
@@ -1806,6 +1846,8 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
+  void debug_node();
 };
 
 glyph_node *glyph_node::free_list = 0;
@@ -1815,13 +1857,13 @@
   node *n2;
 #ifdef STORE_WIDTH
   ligature_node(charinfo *, tfont *, color *, color *, hunits,
-               node *, node *, node * = 0);
+               node *, node *, statem *, int, node * = 0);
 #endif
 public:
   void *operator new(size_t);
   void operator delete(void *);
   ligature_node(charinfo *, tfont *, color *, color *,
-               node *, node *, node * = 0);
+               node *, node *, statem *, int, node * = 0);
   ~ligature_node();
   node *copy();
   node *add_self(node *, hyphen_list **);
@@ -1831,6 +1873,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class kern_pair_node : public node {
@@ -1838,7 +1881,7 @@
   node *n1;
   node *n2;
 public:
-  kern_pair_node(hunits n, node *first, node *second, node *x = 0);
+  kern_pair_node(hunits, node *, node *, statem *, int, node * = 0);
   ~kern_pair_node();
   node *copy();
   node *merge_glyph_node(glyph_node *);
@@ -1857,6 +1900,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   void vertical_extent(vunits *, vunits *);
 };
 
@@ -1865,7 +1909,7 @@
   node *pre;
   node *post;
 public:
-  dbreak_node(node *n, node *p, node *x = 0);
+  dbreak_node(node *, node *, statem *, int, node * = 0);
   ~dbreak_node();
   node *copy();
   node *merge_glyph_node(glyph_node *);
@@ -1886,6 +1930,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 void *glyph_node::operator new(size_t n)
@@ -1922,8 +1967,9 @@
   delete[] (char *)p;
 }
 
-glyph_node::glyph_node(charinfo *c, tfont *t, color *gc, color *fc, node *x)
-: charinfo_node(c, x), tf(t), gcol(gc), fcol(fc)
+glyph_node::glyph_node(charinfo *c, tfont *t, color *gc, color *fc,
+                      statem *s, int pop, node *x)
+: charinfo_node(c, s, pop, x), tf(t), gcol(gc), fcol(fc)
 {
 #ifdef STORE_WIDTH
   wid = tf->get_width(ci);
@@ -1932,8 +1978,9 @@
 
 #ifdef STORE_WIDTH
 glyph_node::glyph_node(charinfo *c, tfont *t,
-                      color *gc, color *fc, hunits w, node *x)
-: charinfo_node(c, x), tf(t), gcol(gc), fcol(fc), wid(w)
+                      color *gc, color *fc, hunits w,
+                      statem *s, int pop, node *x)
+: charinfo_node(c, s, pop, x), tf(t), gcol(gc), fcol(fc), wid(w)
 {
 }
 #endif
@@ -1941,9 +1988,9 @@
 node *glyph_node::copy()
 {
 #ifdef STORE_WIDTH
-  return new glyph_node(ci, tf, gcol, fcol, wid);
+  return new glyph_node(ci, tf, gcol, fcol, wid, state, div_nest_level);
 #else
-  return new glyph_node(ci, tf, gcol, fcol);
+  return new glyph_node(ci, tf, gcol, fcol, state, div_nest_level);
 #endif
 }
 
@@ -2027,13 +2074,15 @@
     if ((lig = tf->get_lig(ci, gn->ci)) != 0) {
       node *next1 = next;
       next = 0;
-      return new ligature_node(lig, tf, gcol, fcol, this, gn, next1);
+      return new ligature_node(lig, tf, gcol, fcol, this, gn, state,
+                              gn->div_nest_level, next1);
     }
     hunits kern;
     if (tf->get_kern(ci, gn->ci, &kern)) {
       node *next1 = next;
       next = 0;
-      return new kern_pair_node(kern, this, gn, next1);
+      return new kern_pair_node(kern, this, gn, state,
+                               gn->div_nest_level, next1);
     }
   }
   return 0;
@@ -2096,16 +2145,35 @@
     ascii->outs(ci->nm.contents());
 }
 
+void glyph_node::debug_node()
+{
+  unsigned char c = ci->get_ascii_code();
+  fprintf(stderr, "{ %s [", type());
+  if (c)
+    fprintf(stderr, "%c", c);
+  else
+    fprintf(stderr, ci->nm.contents());
+  if (push_state)
+    fprintf(stderr, " <push_state>");
+  if (state)
+    state->display_state();
+  fprintf(stderr, " nest level %d", div_nest_level);
+  fprintf(stderr, "]}\n");
+  fflush(stderr);
+}
+
 ligature_node::ligature_node(charinfo *c, tfont *t, color *gc, color *fc,
-                            node *gn1, node *gn2, node *x)
-: glyph_node(c, t, gc, fc, x), n1(gn1), n2(gn2)
+                            node *gn1, node *gn2, statem *s,
+                            int pop, node *x)
+: glyph_node(c, t, gc, fc, s, pop, x), n1(gn1), n2(gn2)
 {
 }
 
 #ifdef STORE_WIDTH
 ligature_node::ligature_node(charinfo *c, tfont *t, color *gc, color *fc,
-                            hunits w, node *gn1, node *gn2, node *x)
-: glyph_node(c, t, gc, fc, w, x), n1(gn1), n2(gn2)
+                            hunits w, node *gn1, node *gn2, statem *s,
+                            int pop, node *x)
+: glyph_node(c, t, gc, fc, w, s, pop, x), n1(gn1), n2(gn2)
 {
 }
 #endif
@@ -2119,9 +2187,11 @@
 node *ligature_node::copy()
 {
 #ifdef STORE_WIDTH
-  return new ligature_node(ci, tf, gcol, fcol, wid, n1->copy(), n2->copy());
+  return new ligature_node(ci, tf, gcol, fcol, wid, n1->copy(), n2->copy(),
+                          state, div_nest_level);
 #else
-  return new ligature_node(ci, tf, gcol, fcol, n1->copy(), n2->copy());
+  return new ligature_node(ci, tf, gcol, fcol, n1->copy(), n2->copy(),
+                          state, div_nest_level);
 #endif
 }
 
@@ -2146,13 +2216,14 @@
   return n;
 }
 
-kern_pair_node::kern_pair_node(hunits n, node *first, node *second, node *x)
-: node(x), amount(n), n1(first), n2(second)
+kern_pair_node::kern_pair_node(hunits n, node *first, node *second,
+                              statem* s, int pop, node *x)
+: node(x, s, pop), amount(n), n1(first), n2(second)
 {
 }
 
-dbreak_node::dbreak_node(node *n, node *p, node *x)
-: node(x), none(n), pre(p), post(0)
+dbreak_node::dbreak_node(node *n, node *p, statem *s, int pop, node *x)
+: node(x, s, pop), none(n), pre(p), post(0)
 {
 }
 
@@ -2228,13 +2299,14 @@
       node *next1 = next;
       next = 0;
       node *n = copy();
-      glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol);
+      glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol,
+                                     state, div_nest_level);
       node *nn = n->merge_glyph_node(gn);
       if (nn == 0) {
        gn->next = n;
        nn = gn;
       }
-      return new dbreak_node(this, nn, next1);
+      return new dbreak_node(this, nn, state, div_nest_level, next1);
     }
   }
   return this;
@@ -2257,7 +2329,8 @@
 
 node *kern_pair_node::copy()
 {
-  return new kern_pair_node(amount, n1->copy(), n2->copy());
+  return new kern_pair_node(amount, n1->copy(), n2->copy(), state,
+                           div_nest_level);
 }
 
 node *copy_node_list(node *n)
@@ -2289,7 +2362,8 @@
 
 node *dbreak_node::copy()
 {
-  dbreak_node *p = new dbreak_node(copy_node_list(none), copy_node_list(pre));
+  dbreak_node *p = new dbreak_node(copy_node_list(none), copy_node_list(pre),
+                                  state, div_nest_level);
   p->post = copy_node_list(post);
   return p;
 }
@@ -2307,11 +2381,12 @@
 
 class hyphen_inhibitor_node : public node {
 public:
-  hyphen_inhibitor_node(node *nd = 0);
+  hyphen_inhibitor_node(node * = 0);
   node *copy();
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   hyphenation_type get_hyphenation_type();
 };
 
@@ -2339,6 +2414,11 @@
   return 0;
 }
 
+int hyphen_inhibitor_node::is_tag()
+{
+  return 0;
+}
+
 hyphenation_type hyphen_inhibitor_node::get_hyphenation_type()
 {
   return HYPHEN_INHIBIT;
@@ -2366,13 +2446,14 @@
     node *next1 = next;
     next = 0;
     node *n = copy();
-    glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol);
+    glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol,
+                                   state, div_nest_level);
     node *n1 = n->merge_glyph_node(gn);
     if (n1 == 0) {
       gn->next = n;
       n1 = gn;
     }
-    return new dbreak_node(this, n1, next1);
+    return new dbreak_node(this, n1, state, div_nest_level, next1);
   }
   return this;
 }
@@ -2412,6 +2493,11 @@
   return 0;
 }
 
+int node::is_tag()
+{
+  return 0;
+}
+
 hunits hmotion_node::width()
 {
   return n;
@@ -2422,6 +2508,29 @@
   return points_to_units(10);
 }
 
+void node::debug_node()
+{
+  fprintf(stderr, "{ %s ", type());
+  if (push_state)
+    fprintf(stderr, " <push_state>");
+  if (state)
+    fprintf(stderr, " <state>");
+  fprintf(stderr, " nest level %d", div_nest_level);
+  fprintf(stderr, " }\n");
+  fflush(stderr);
+}
+
+void node::debug_node_list()
+{
+  node *n = next;
+
+  debug_node();
+  while (n != 0) {
+    n->debug_node();
+    n = n->next;
+  }
+}
+
 hunits kern_pair_node::width()
 {
   return n1->width() + n2->width() + amount;
@@ -2467,7 +2576,7 @@
   node *n;
   hunits x;
 public:
-  italic_corrected_node(node *, hunits, node * = 0);
+  italic_corrected_node(node *, hunits, statem *, int, node * = 0);
   ~italic_corrected_node();
   node *copy();
   void ascii_print(ascii_output_file *);
@@ -2489,6 +2598,7 @@
   node *add_self(node *, hyphen_list **);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 node *node::add_italic_correction(hunits *wd)
@@ -2500,12 +2610,13 @@
     node *next1 = next;
     next = 0;
     *wd += ic;
-    return new italic_corrected_node(this, ic, next1);
+    return new italic_corrected_node(this, ic, state, div_nest_level, next1);
   }
 }
 
-italic_corrected_node::italic_corrected_node(node *nn, hunits xx, node *p)
-: node(p), n(nn), x(xx)
+italic_corrected_node::italic_corrected_node(node *nn, hunits xx, statem *s,
+                                            int pop, node *p)
+: node(p, s, pop), n(nn), x(xx)
 {
   assert(n != 0);
 }
@@ -2517,7 +2628,7 @@
 
 node *italic_corrected_node::copy()
 {
-  return new italic_corrected_node(n->copy(), x);
+  return new italic_corrected_node(n->copy(), x, state, div_nest_level);
 }
 
 hunits italic_corrected_node::width()
@@ -2608,6 +2719,7 @@
   color *col;
 public:
   break_char_node(node *, int, color *, node * = 0);
+  break_char_node(node *, int, color *, statem *, int, node * = 0);
   ~break_char_node();
   node *copy();
   hunits width();
@@ -2629,6 +2741,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 break_char_node::break_char_node(node *n, int bc, color *c, node *x)
@@ -2636,6 +2749,12 @@
 {
 }
 
+break_char_node::break_char_node(node *n, int bc, color *c, statem *s,
+                                int pop, node *x)
+: node(x, s, pop), ch(n), break_code(bc), col(c)
+{
+}
+
 break_char_node::~break_char_node()
 {
   delete ch;
@@ -2643,7 +2762,8 @@
 
 node *break_char_node::copy()
 {
-  return new break_char_node(ch->copy(), break_code, col);
+  return new break_char_node(ch->copy(), break_code, col, state,
+                            div_nest_level);
 }
 
 hunits break_char_node::width()
@@ -2727,27 +2847,57 @@
 
 node *extra_size_node::copy()
 {
-  return new extra_size_node(n);
+  return new extra_size_node(n, state, div_nest_level);
+}
+
+extra_size_node::extra_size_node(vunits i, statem *s, int pop)
+: node(0, s, pop), n(i)
+{
+}
+
+extra_size_node::extra_size_node(vunits i)
+: n(i)
+{
 }
 
 node *vertical_size_node::copy()
 {
-  return new vertical_size_node(n);
+  return new vertical_size_node(n, state, div_nest_level);
+}
+
+vertical_size_node::vertical_size_node(vunits i, statem *s, int pop)
+: node(0, s, pop), n(i)
+{
+}
+
+vertical_size_node::vertical_size_node(vunits i)
+: n(i)
+{
 }
 
 node *hmotion_node::copy()
 {
-  return new hmotion_node(n, was_tab, unformat, col);
+  return new hmotion_node(n, was_tab, unformat, col, state, div_nest_level);
 }
 
 node *space_char_hmotion_node::copy()
 {
-  return new space_char_hmotion_node(n, col);
+  return new space_char_hmotion_node(n, col, state, div_nest_level);
+}
+
+vmotion_node::vmotion_node(vunits i, color *c)
+: n(i), col(c)
+{
+}
+
+vmotion_node::vmotion_node(vunits i, color *c, statem *s, int pop)
+: node(0, s, pop), n(i), col(c)
+{
 }
 
 node *vmotion_node::copy()
 {
-  return new vmotion_node(n, col);
+  return new vmotion_node(n, col, state, div_nest_level);
 }
 
 node *dummy_node::copy()
@@ -2766,9 +2916,19 @@
     delete n;
 }
 
+hline_node::hline_node(hunits i, node *c, node *next)
+: node(next), x(i), n(c)
+{
+}
+
+hline_node::hline_node(hunits i, node *c, statem *s, int pop, node *next)
+: node(next, s, pop), x(i), n(c)
+{
+}
+
 node *hline_node::copy()
 {
-  return new hline_node(x, n ? n->copy() : 0);
+  return new hline_node(x, n ? n->copy() : 0, state, div_nest_level);
 }
 
 hunits hline_node::width()
@@ -2776,6 +2936,16 @@
   return x < H0 ? H0 : x;
 }
 
+vline_node::vline_node(vunits i, node *c, node *next)
+: node(next), x(i), n(c)
+{
+}
+
+vline_node::vline_node(vunits i, node *c, statem *s, int pop, node *next)
+: node(next, s, pop), x(i), n(c)
+{
+}
+
 vline_node::~vline_node()
 {
   if (n)
@@ -2784,7 +2954,7 @@
 
 node *vline_node::copy()
 {
-  return new vline_node(x, n ? n->copy() : 0);
+  return new vline_node(x, n ? n->copy() : 0, state, div_nest_level);
 }
 
 hunits vline_node::width()
@@ -2792,7 +2962,13 @@
   return n == 0 ? H0 : n->width();
 }
 
-zero_width_node::zero_width_node(node *nd) : n(nd)
+zero_width_node::zero_width_node(node *nd, statem *s, int pop)
+: n(nd), node(0, s, pop)
+{
+}
+
+zero_width_node::zero_width_node(node *nd)
+: n(nd)
 {
 }
 
@@ -2803,7 +2979,7 @@
 
 node *zero_width_node::copy()
 {
-  return new zero_width_node(copy_node_list(n));
+  return new zero_width_node(copy_node_list(n), state, div_nest_level);
 }
 
 int node_list_character_type(node *p)
@@ -2842,7 +3018,13 @@
   node_list_vertical_extent(n, min, max);
 }
 
-overstrike_node::overstrike_node() : list(0), max_width(H0)
+overstrike_node::overstrike_node()
+: list(0), max_width(H0)
+{
+}
+
+overstrike_node::overstrike_node(statem *s, int pop)
+: node(0, s, pop), list(0), max_width(H0)
 {
 }
 
@@ -2853,7 +3035,7 @@
 
 node *overstrike_node::copy()
 {
-  overstrike_node *on = new overstrike_node;
+  overstrike_node *on = new overstrike_node(state, div_nest_level);
   for (node *tem = list; tem; tem = tem->next)
     on->overstrike(tem->copy());
   return on;
@@ -2878,7 +3060,13 @@
   return max_width;
 }
 
-bracket_node::bracket_node() : list(0), max_width(H0)
+bracket_node::bracket_node()
+: list(0), max_width(H0)
+{
+}
+
+bracket_node::bracket_node(statem *s, int pop)
+: node(0, s, pop), list(0), max_width(H0)
 {
 }
 
@@ -2889,7 +3077,7 @@
 
 node *bracket_node::copy()
 {
-  bracket_node *on = new bracket_node;
+  bracket_node *on = new bracket_node(state, div_nest_level);
   node *last_node = 0;
   node *tem;
   if (list)
@@ -2958,12 +3146,18 @@
 #endif
 
 space_node::space_node(hunits nn, color *c, node *p)
-: node(p), n(nn), set(0), was_escape_colon(0), col(c)
+: node(p, 0, 0), n(nn), set(0), was_escape_colon(0), col(c)
+{
+}
+
+space_node::space_node(hunits nn, color *c, statem *s, int pop, node *p)
+: node(p, s, pop), n(nn), set(0), was_escape_colon(0), col(c)
 {
 }
 
-space_node::space_node(hunits nn, int s, int flag, color *c, node *p)
-: node(p), n(nn), set(s), was_escape_colon(flag), col(c)
+space_node::space_node(hunits nn, int s, int flag, color *c, statem *st,
+                      int pop, node *p)
+: node(p, st, pop), n(nn), set(s), was_escape_colon(flag), col(c)
 {
 }
 
@@ -2975,7 +3169,7 @@
 
 node *space_node::copy()
 {
-  return new space_node(n, set, was_escape_colon, col);
+  return new space_node(n, set, was_escape_colon, col, state, div_nest_level);
 }
 
 int space_node::force_tprint()
@@ -2983,6 +3177,11 @@
   return 0;
 }
 
+int space_node::is_tag()
+{
+  return 0;
+}
+
 int space_node::nspaces()
 {
   return set ? 0 : 1;
@@ -3039,6 +3238,12 @@
   was_escape_colon = 1;
 }
 
+diverted_space_node::diverted_space_node(vunits d, statem *s, int pop,
+                                        node *p)
+: node(p, s, pop), n(d)
+{
+}
+
 diverted_space_node::diverted_space_node(vunits d, node *p)
 : node(p), n(d)
 {
@@ -3046,7 +3251,13 @@
 
 node *diverted_space_node::copy()
 {
-  return new diverted_space_node(n);
+  return new diverted_space_node(n, state, div_nest_level);
+}
+
+diverted_copy_file_node::diverted_copy_file_node(symbol s, statem *st,
+                                                int pop, node *p)
+: node(p, st, pop), filename(s)
+{
 }
 
 diverted_copy_file_node::diverted_copy_file_node(symbol s, node *p)
@@ -3056,7 +3267,7 @@
 
 node *diverted_copy_file_node::copy()
 {
-  return new diverted_copy_file_node(filename);
+  return new diverted_copy_file_node(filename, state, div_nest_level);
 }
 
 int node::ends_sentence()
@@ -3347,8 +3558,15 @@
 }
 
 space_char_hmotion_node::space_char_hmotion_node(hunits i, color *c,
-                                                node *nxt)
-: hmotion_node(i, c, nxt)
+                                                statem *s, int pop,
+                                                node *next)
+: hmotion_node(i, c, s, pop, next)
+{
+}
+
+space_char_hmotion_node::space_char_hmotion_node(hunits i, color *c,
+                                                node *next)
+: hmotion_node(i, c, 0, 0, next)
 {
 }
 
@@ -3606,12 +3824,16 @@
     tf = tf->get_plain();
   gcol = curenv->get_glyph_color();
   fcol = curenv->get_fill_color();
+  is_special = 1;
 }
 
 special_node::special_node(const macro &m, tfont *t,
-                          color *gc, color *fc, int n)
-: mac(m), tf(t), gcol(gc), fcol(fc), no_init_string(n)
+                          color *gc, color *fc,
+                          statem *s, int pop,
+                          int n)
+: node(0, s, pop), mac(m), tf(t), gcol(gc), fcol(fc), no_init_string(n)
 {
+  is_special = 1;
 }
 
 int special_node::same(node *n)
@@ -3638,9 +3860,15 @@
   return 0;
 }
 
+int special_node::is_tag()
+{
+  return 0;
+}
+
 node *special_node::copy()
 {
-  return new special_node(mac, tf, gcol, fcol, no_init_string);
+  return new special_node(mac, tf, gcol, fcol, state, div_nest_level,
+                         no_init_string);
 }
 
 void special_node::tprint_start(troff_output_file *out)
@@ -3666,8 +3894,8 @@
 /* suppress_node */
 
 suppress_node::suppress_node(int on_or_off, int issue_limits)
-: is_on(on_or_off), emit_limits(issue_limits),
-  filename(0), position(0), image_id(0)
+: is_on(on_or_off), emit_limits(issue_limits), filename(0), position(0),
+  image_id(0)
 {
 }
 
@@ -3677,9 +3905,10 @@
 }
 
 suppress_node::suppress_node(int issue_limits, int on_or_off,
-                            symbol f, char p, int id)
-: is_on(on_or_off), emit_limits(issue_limits),
-  filename(f), position(p), image_id(id)
+                            symbol f, char p, int id,
+                            statem *s, int pop)
+: node(0, s, pop), is_on(on_or_off), emit_limits(issue_limits), filename(f),
+  position(p), image_id(id)
 {
 }
 
@@ -3699,7 +3928,67 @@
 
 node *suppress_node::copy()
 {
-  return new suppress_node(emit_limits, is_on, filename, position, image_id);
+  return new suppress_node(emit_limits, is_on, filename, position, image_id,
+                          state, div_nest_level);
+}
+
+/* tag_node */
+
+tag_node::tag_node()
+: delayed(0)
+{
+  is_special = 1;
+}
+
+tag_node::tag_node(string s, int delay)
+: tag_string(s), delayed(delay)
+{
+  is_special = !delay;
+}
+
+tag_node::tag_node(string s, statem *st, int pop, int delay)
+: node(0, st, pop), tag_string(s), delayed(delay)
+{
+  is_special = !delay;
+}
+
+node *tag_node::copy()
+{
+  return new tag_node(tag_string, state, div_nest_level, delayed);
+}
+
+void tag_node::tprint(troff_output_file *out)
+{
+  if (delayed)
+    out->add_to_tag_list(tag_string);
+  else
+    out->state.add_tag(out->fp, tag_string);
+}
+
+int tag_node::same(node *nd)
+{
+  return tag_string == ((tag_node *)nd)->tag_string
+        && delayed == ((tag_node *)nd)->delayed;
+}
+
+const char *tag_node::type()
+{
+  return "tag_node";
+}
+
+int tag_node::force_tprint()
+{
+  return !delayed;
+}
+
+int tag_node::is_tag()
+{
+  return !delayed;
+}
+
+int tag_node::ends_sentence()
+{
+  return 2;
 }
 
 int get_reg_int(const char *p)
@@ -3852,6 +4141,11 @@
   return is_on;
 }
 
+int suppress_node::is_tag()
+{
+  return is_on;
+}
+
 hunits suppress_node::width()
 {
   return H0;
@@ -3863,7 +4157,7 @@
   node *n;
   tfont *tf;
 public:
-  composite_node(node *, charinfo *, tfont *, node * = 0);
+  composite_node(node *, charinfo *, tfont *, statem *, int, node * = 0);
   ~composite_node();
   node *copy();
   hunits width();
@@ -3879,12 +4173,14 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   void vertical_extent(vunits *, vunits *);
   vunits vertical_width();
 };
 
-composite_node::composite_node(node *p, charinfo *c, tfont *t, node *x)
-: charinfo_node(c, x), n(p), tf(t)
+composite_node::composite_node(node *p, charinfo *c, tfont *t, statem *s,
+                              int pop, node *x)
+: charinfo_node(c, s, pop, x), n(p), tf(t)
 {
 }
 
@@ -3895,7 +4191,7 @@
 
 node *composite_node::copy()
 {
-  return new composite_node(copy_node_list(n), ci, tf);
+  return new composite_node(copy_node_list(n), ci, tf, state, div_nest_level);
 }
 
 hunits composite_node::width()
@@ -4018,8 +4314,8 @@
 }
 
 word_space_node::word_space_node(hunits d, int s, color *c, width_list *w,
-                                int flag, node *x)
-: space_node(d, s, 0, c, x), orig_width(w), unformat(flag)
+                                int flag, statem *st, int pop, node *x)
+: space_node(d, s, 0, c, st, pop, x), orig_width(w), unformat(flag)
 {
 }
 
@@ -4045,7 +4341,8 @@
     w_new_curr = w_new_curr->next;
     w_old_curr = w_old_curr->next;
   }
-  return new word_space_node(n, set, col, w_new, unformat);
+  return new word_space_node(n, set, col, w_new, unformat, state,
+                            div_nest_level);
 }
 
 int word_space_node::set_unformat_flag()
@@ -4078,14 +4375,15 @@
 }
 
 unbreakable_space_node::unbreakable_space_node(hunits d, int s,
-                                              color *c, node *x)
-: word_space_node(d, s, c, 0, 0, x)
+                                              color *c, statem *st, int pop,
+                                              node *x)
+: word_space_node(d, s, c, 0, 0, st, pop, x)
 {
 }
 
 node *unbreakable_space_node::copy()
 {
-  return new unbreakable_space_node(n, set, col);
+  return new unbreakable_space_node(n, set, col, state, div_nest_level);
 }
 
 int unbreakable_space_node::force_tprint()
@@ -4093,6 +4391,11 @@
   return 0;
 }
 
+int unbreakable_space_node::is_tag()
+{
+  return 0;
+}
+
 breakpoint *unbreakable_space_node::get_breakpoints(hunits, int,
                                                    breakpoint *rest, int)
 {
@@ -4127,6 +4430,15 @@
     point[i] = p[i];
 }
 
+draw_node::draw_node(char c, hvpair *p, int np, font_size s,
+                    color *gc, color *fc, statem *st, int pop)
+: node(0, st, pop), npoints(np), sz(s), gcol(gc), fcol(fc), code(c)
+{
+  point = new hvpair[npoints];
+  for (int i = 0; i < npoints; i++)
+    point[i] = p[i];
+}
+
 int draw_node::same(node *n)
 {
   draw_node *nd = (draw_node *)n;
@@ -4149,6 +4461,11 @@
   return 0;
 }
 
+int draw_node::is_tag()
+{
+  return 0;
+}
+
 draw_node::~draw_node()
 {
   if (point)
@@ -4175,7 +4492,8 @@
 
 node *draw_node::copy()
 {
-  return new draw_node(code, point, npoints, sz, gcol, fcol);
+  return new draw_node(code, point, npoints, sz, gcol, fcol, state,
+                      div_nest_level);
 }
 
 void draw_node::tprint(troff_output_file *out)
@@ -4510,7 +4828,7 @@
                                            fontno);
   if (env->is_composite())
     tf = tf->get_plain();
-  return new composite_node(n, s, tf);
+  return new composite_node(n, s, tf, 0, 0, 0);
 }
 
 node *make_glyph_node(charinfo *s, environment *env, int no_error_message = 0)
@@ -4596,7 +4914,7 @@
     tf = tf->get_plain();
   color *gcol = env->get_glyph_color();
   color *fcol = env->get_fill_color();
-  return new glyph_node(s, tf, gcol, fcol);
+  return new glyph_node(s, tf, gcol, fcol, 0, 0);
 }
 
 node *make_node(charinfo *ci, environment *env)
@@ -4642,7 +4960,7 @@
 }
 
 node *node::add_char(charinfo *ci, environment *env,
-                    hunits *widthp, int *spacep)
+                    hunits *widthp, int *spacep, node **glyph_comp_np)
 {
   node *res;
   switch (ci->get_special_translation()) {
@@ -4672,9 +4990,14 @@
     if (res) {
       res->next = this;
       *widthp += res->width();
+      if (glyph_comp_np)
+       *glyph_comp_np = res;
     }
-    else
+    else {
+      if (glyph_comp_np)
+       *glyph_comp_np = res;
       return this;
+    }
   }
   else {
     node *gn = make_glyph_node(ci, env);
@@ -4692,6 +5015,8 @@
        *widthp += p->width() - old_width;
        res = p;
       }
+      if (glyph_comp_np)
+       *glyph_comp_np = res;
     }
   }
   int break_code = 0;
@@ -4748,6 +5073,11 @@
   return 0;
 }
 
+int extra_size_node::is_tag()
+{
+  return 0;
+}
+
 int vertical_size_node::same(node *nd)
 {
   return n == ((vertical_size_node *)nd)->n;
@@ -4768,6 +5098,11 @@
   return 0;
 }
 
+int vertical_size_node::is_tag()
+{
+  return 0;
+}
+
 int hmotion_node::same(node *nd)
 {
   return n == ((hmotion_node *)nd)->n
@@ -4790,6 +5125,11 @@
   return 0;
 }
 
+int hmotion_node::is_tag()
+{
+  return 0;
+}
+
 node *hmotion_node::add_self(node *nd, hyphen_list **p)
 {
   next = nd;
@@ -4820,6 +5160,11 @@
   return 0;
 }
 
+int space_char_hmotion_node::is_tag()
+{
+  return 0;
+}
+
 node *space_char_hmotion_node::add_self(node *nd, hyphen_list **p)
 {
   next = nd;
@@ -4851,6 +5196,11 @@
   return 0;
 }
 
+int vmotion_node::is_tag()
+{
+  return 0;
+}
+
 int hline_node::same(node *nd)
 {
   return x == ((hline_node *)nd)->x && same_node(n, ((hline_node *)nd)->n);
@@ -4866,6 +5216,11 @@
   return 0;
 }
 
+int hline_node::is_tag()
+{
+  return 0;
+}
+
 int vline_node::same(node *nd)
 {
   return x == ((vline_node *)nd)->x && same_node(n, ((vline_node *)nd)->n);
@@ -4881,6 +5236,11 @@
   return 0;
 }
 
+int vline_node::is_tag()
+{
+  return 0;
+}
+
 int dummy_node::same(node * /*nd*/)
 {
   return 1;
@@ -4896,6 +5256,11 @@
   return 0;
 }
 
+int dummy_node::is_tag()
+{
+  return 0;
+}
+
 int transparent_dummy_node::same(node * /*nd*/)
 {
   return 1;
@@ -4911,6 +5276,11 @@
   return 0;
 }
 
+int transparent_dummy_node::is_tag()
+{
+  return 0;
+}
+
 int transparent_dummy_node::ends_sentence()
 {
   return 2;
@@ -4931,6 +5301,11 @@
   return 0;
 }
 
+int zero_width_node::is_tag()
+{
+  return 0;
+}
+
 int italic_corrected_node::same(node *nd)
 {
   return (x == ((italic_corrected_node *)nd)->x
@@ -4947,8 +5322,19 @@
   return 0;
 }
 
-left_italic_corrected_node::left_italic_corrected_node(node *xx)
-: node(xx), n(0)
+int italic_corrected_node::is_tag()
+{
+  return 0;
+}
+
+left_italic_corrected_node::left_italic_corrected_node(node *x)
+: node(x), n(0)
+{
+}
+
+left_italic_corrected_node::left_italic_corrected_node(statem *s, int pop,
+                                                      node *x)
+: node(x, s, pop), n(0)
 {
 }
 
@@ -4980,7 +5366,8 @@
 
 node *left_italic_corrected_node::copy()
 {
-  left_italic_corrected_node *nd = new left_italic_corrected_node;
+  left_italic_corrected_node *nd =
+    new left_italic_corrected_node(state, div_nest_level);
   if (n) {
     nd->n = n->copy();
     nd->x = x;
@@ -5006,6 +5393,11 @@
   return 0;
 }
 
+int left_italic_corrected_node::is_tag()
+{
+  return 0;
+}
+
 int left_italic_corrected_node::same(node *nd)
 {
   return (x == ((left_italic_corrected_node *)nd)->x
@@ -5089,7 +5481,7 @@
 node *left_italic_corrected_node::add_self(node *nd, hyphen_list **p)
 {
   if (n) {
-    nd = new left_italic_corrected_node(nd);
+    nd = new left_italic_corrected_node(state, div_nest_level, nd);
     nd = n->add_self(nd, p);
     n = 0;
     delete this;
@@ -5117,6 +5509,11 @@
   return 0;
 }
 
+int overstrike_node::is_tag()
+{
+  return 0;
+}
+
 node *overstrike_node::add_self(node *n, hyphen_list **p)
 {
   next = n;
@@ -5146,6 +5543,11 @@
   return 0;
 }
 
+int bracket_node::is_tag()
+{
+  return 0;
+}
+
 int composite_node::same(node *nd)
 {
   return ci == ((composite_node *)nd)->ci
@@ -5162,6 +5564,11 @@
   return 0;
 }
 
+int composite_node::is_tag()
+{
+  return 0;
+}
+
 int glyph_node::same(node *nd)
 {
   return ci == ((glyph_node *)nd)->ci
@@ -5180,6 +5587,11 @@
   return 0;
 }
 
+int glyph_node::is_tag()
+{
+  return 0;
+}
+
 int ligature_node::same(node *nd)
 {
   return (same_node(n1, ((ligature_node *)nd)->n1)
@@ -5197,6 +5609,11 @@
   return 0;
 }
 
+int ligature_node::is_tag()
+{
+  return 0;
+}
+
 int kern_pair_node::same(node *nd)
 {
   return (amount == ((kern_pair_node *)nd)->amount
@@ -5214,6 +5631,11 @@
   return 0;
 }
 
+int kern_pair_node::is_tag()
+{
+  return 0;
+}
+
 int dbreak_node::same(node *nd)
 {
   return (same_node_list(none, ((dbreak_node *)nd)->none)
@@ -5231,6 +5653,11 @@
   return 0;
 }
 
+int dbreak_node::is_tag()
+{
+  return 0;
+}
+
 int break_char_node::same(node *nd)
 {
   return break_code == ((break_char_node *)nd)->break_code
@@ -5248,6 +5675,11 @@
   return 0;
 }
 
+int break_char_node::is_tag()
+{
+  return 0;
+}
+
 int line_start_node::same(node * /*nd*/)
 {
   return 1;
@@ -5263,6 +5695,11 @@
   return 0;
 }
 
+int line_start_node::is_tag()
+{
+  return 0;
+}
+
 int space_node::same(node *nd)
 {
   return n == ((space_node *)nd)->n
@@ -5292,6 +5729,11 @@
   return 0;
 }
 
+int word_space_node::is_tag()
+{
+  return 0;
+}
+
 void unbreakable_space_node::tprint(troff_output_file *out)
 {
   out->fill_color(col);
@@ -5347,6 +5789,11 @@
   return 0;
 }
 
+int diverted_space_node::is_tag()
+{
+  return 0;
+}
+
 int diverted_copy_file_node::same(node *nd)
 {
   return filename == ((diverted_copy_file_node *)nd)->filename;
@@ -5362,6 +5809,11 @@
   return 0;
 }
 
+int diverted_copy_file_node::is_tag()
+{
+  return 0;
+}
+
 // Grow the font_table so that its size is > n.
 
 static void grow_font_table(int n)
Index: groff/src/roff/troff/node.h
diff -u groff/src/roff/troff/node.h:1.27 groff/src/roff/troff/node.h:1.28
--- groff/src/roff/troff/node.h:1.27    Wed Jun 30 11:35:29 2004
+++ groff/src/roff/troff/node.h Tue Oct 12 05:44:51 2004
@@ -19,6 +19,8 @@
 with groff; see the file COPYING.  If not, write to the Free Software
 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
 
+#include "mtsm.h"
+
 struct hyphen_list {
   unsigned char hyphen;
   unsigned char breakable;
@@ -50,14 +52,20 @@
 struct node {
   node *next;
   node *last;
+  statem *state;
+  statem *push_state;
+  int div_nest_level;
+  int is_special;
   node();
   node(node *);
-  node *add_char(charinfo *, environment *, hunits *, int *);
+  node(node *, statem *, int);
+  node *add_char(charinfo *, environment *, hunits *, int *, node ** = 0);
 
   virtual ~node();
   virtual node *copy() = 0;
   virtual int set_unformat_flag();
   virtual int force_tprint() = 0;
+  virtual int is_tag() = 0;
   virtual hunits width();
   virtual hunits subscript_correction();
   virtual hunits italic_correction();
@@ -103,16 +111,27 @@
 
   virtual int same(node *) = 0;
   virtual const char *type() = 0;
+  virtual void debug_node();
+  virtual void debug_node_list();
 };
 
 inline node::node()
-: next(0), last(0)
+: next(0), last(0), state(0), push_state(0), div_nest_level(0), is_special(0)
 {
 }
 
 inline node::node(node *n)
-: next(n), last(0)
+: next(n), last(0), state(0), push_state(0), div_nest_level(0), is_special(0)
+{
+}
+
+inline node::node(node *n, statem *s, int divlevel)
+: next(n), last(0), push_state(0), div_nest_level(divlevel), is_special(0)
 {
+  if (s)
+    state = new statem(s);
+  else
+    state = 0;
 }
 
 inline node::~node()
@@ -138,6 +157,7 @@
   node *copy() { return new line_start_node; }
   int same(node *);
   int force_tprint();
+  int is_tag();
   const char *type();
   void asciify(macro *);
 };
@@ -154,8 +174,9 @@
   char set;
   char was_escape_colon;
   color *col;                  /* for grotty */
-  space_node(hunits, int, int, color *, node * = 0);
+  space_node(hunits, int, int, color *, statem *, int, node * = 0);
 public:
+  space_node(hunits, color *, statem *, int, node * = 0);
   space_node(hunits, color *, node * = 0);
 #if 0
   ~space_node();
@@ -178,6 +199,7 @@
   void asciify(macro *);
   const char *type();
   int force_tprint();
+  int is_tag();
   hyphenation_type get_hyphenation_type();
 };
 
@@ -193,7 +215,8 @@
 protected:
   width_list *orig_width;
   unsigned char unformat;
-  word_space_node(hunits, int, color *, width_list *, int, node * = 0);
+  word_space_node(hunits, int, color *, width_list *, int, statem *, int,
+                 node * = 0);
 public:
   word_space_node(hunits, color *, width_list *, node * = 0);
   ~word_space_node();
@@ -206,10 +229,11 @@
   const char *type();
   int merge_space(hunits, hunits, hunits);
   int force_tprint();
+  int is_tag();
 };
 
 class unbreakable_space_node : public word_space_node {
-  unbreakable_space_node(hunits, int, color *, node * = 0);
+  unbreakable_space_node(hunits, int, color *, statem *, int, node * = 0);
 public:
   unbreakable_space_node(hunits, color *, node * = 0);
   node *copy();
@@ -219,6 +243,7 @@
   void asciify(macro *);
   const char *type();
   int force_tprint();
+  int is_tag();
   breakpoint *get_breakpoints(hunits, int, breakpoint * = 0, int = 0);
   int nbreaks();
   void split(int, node **, node **);
@@ -232,11 +257,13 @@
 public:
   vunits n;
   diverted_space_node(vunits, node * = 0);
+  diverted_space_node(vunits, statem *, int, node * = 0);
   node *copy();
   int reread(int *);
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class diverted_copy_file_node : public node {
@@ -244,28 +271,33 @@
 public:
   vunits n;
   diverted_copy_file_node(symbol, node * = 0);
+  diverted_copy_file_node(symbol, statem *, int, node * = 0);
   node *copy();
   int reread(int *);
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class extra_size_node : public node {
   vunits n;
 public:
-  extra_size_node(vunits i) : n(i) {}
+  extra_size_node(vunits);
+  extra_size_node(vunits, statem *, int);
   void set_vertical_size(vertical_size *);
   node *copy();
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class vertical_size_node : public node {
   vunits n;
 public:
-  vertical_size_node(vunits i) : n(i) {}
+  vertical_size_node(vunits, statem *, int);
+  vertical_size_node(vunits);
   void set_vertical_size(vertical_size *);
   void asciify(macro *);
   node *copy();
@@ -273,6 +305,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class hmotion_node : public node {
@@ -284,6 +317,12 @@
 public:
   hmotion_node(hunits i, color *c, node *nxt = 0)
     : node(nxt), n(i), was_tab(0), unformat(0), col(c) {}
+  hmotion_node(hunits i, color *c, statem *s, int divlevel, node *next = 0)
+    : node(next, s, divlevel), n(i), was_tab(0), unformat(0), col(c) {}
+  hmotion_node(hunits i, int flag1, int flag2, color *c, statem *s,
+              int divlevel, node *next = 0)
+    : node(next, s, divlevel), n(i), was_tab(flag1), unformat(flag2),
+      col(c) {}
   hmotion_node(hunits i, int flag1, int flag2, color *c, node *nxt = 0)
     : node(nxt), n(i), was_tab(flag1), unformat(flag2), col(c) {}
   node *copy();
@@ -296,6 +335,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   node *add_self(node *, hyphen_list **);
   hyphen_list *get_hyphen_list(hyphen_list *, int *);
   hyphenation_type get_hyphenation_type();
@@ -304,6 +344,7 @@
 class space_char_hmotion_node : public hmotion_node {
 public:
   space_char_hmotion_node(hunits, color *, node * = 0);
+  space_char_hmotion_node(hunits, color *, statem *, int, node * = 0);
   node *copy();
   void ascii_print(ascii_output_file *);
   void asciify(macro *);
@@ -311,6 +352,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   node *add_self(node *, hyphen_list **);
   hyphen_list *get_hyphen_list(hyphen_list *, int *);
   hyphenation_type get_hyphenation_type();
@@ -320,20 +362,23 @@
   vunits n;
   color *col;                  /* for grotty */
 public:
-  vmotion_node(vunits i, color *c) : n(i), col(c) {}
+  vmotion_node(vunits, color *);
+  vmotion_node(vunits, color *, statem *, int);
   void tprint(troff_output_file *);
   node *copy();
   vunits vertical_width();
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class hline_node : public node {
   hunits x;
   node *n;
 public:
-  hline_node(hunits i, node *c, node *nxt = 0) : node(nxt), x(i), n(c) {}
+  hline_node(hunits, node *, node * = 0);
+  hline_node(hunits, node *, statem *, int, node * = 0);
   ~hline_node();
   node *copy();
   hunits width();
@@ -341,13 +386,15 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class vline_node : public node {
   vunits x;
   node *n;
 public:
-  vline_node(vunits i, node *c, node *nxt = 0) : node(nxt), x(i), n(c) {}
+  vline_node(vunits, node *, node * = 0);
+  vline_node(vunits, node *, statem *, int, node * = 0);
   ~vline_node();
   node *copy();
   void tprint(troff_output_file *);
@@ -357,9 +404,9 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
-
 class dummy_node : public node {
 public:
   dummy_node(node *nd = 0) : node(nd) {}
@@ -367,6 +414,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   hyphenation_type get_hyphenation_type();
 };
 
@@ -377,6 +425,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   int ends_sentence();
   hyphenation_type get_hyphenation_type();
 };
@@ -385,12 +434,14 @@
   node *n;
 public:
   zero_width_node(node *);
+  zero_width_node(node *, statem *, int);
   ~zero_width_node();
   node *copy();
   void tprint(troff_output_file *);
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   void append(node *);
   int character_type();
   void vertical_extent(vunits *, vunits *);
@@ -401,6 +452,7 @@
   hunits x;
 public:
   left_italic_corrected_node(node * = 0);
+  left_italic_corrected_node(statem *, int, node * = 0);
   ~left_italic_corrected_node();
   void tprint(troff_output_file *);
   void ascii_print(ascii_output_file *);
@@ -409,6 +461,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   hunits width();
   node *last_char_node();
   void vertical_extent(vunits *, vunits *);
@@ -431,6 +484,7 @@
   hunits max_width;
 public:
   overstrike_node();
+  overstrike_node(statem *, int);
   ~overstrike_node();
   node *copy();
   void tprint(troff_output_file *);
@@ -439,6 +493,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   node *add_self(node *, hyphen_list **);
   hyphen_list *get_hyphen_list(hyphen_list *, int *);
   hyphenation_type get_hyphenation_type();
@@ -449,6 +504,7 @@
   hunits max_width;
 public:
   bracket_node();
+  bracket_node(statem *, int);
   ~bracket_node();
   node *copy();
   void tprint(troff_output_file *);
@@ -457,6 +513,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class special_node : public node {
@@ -470,12 +527,14 @@
   void tprint_end(troff_output_file *);
 public:
   special_node(const macro &, int = 0);
-  special_node(const macro &, tfont *, color *, color *, int = 0);
+  special_node(const macro &, tfont *, color *, color *, statem *, int,
+              int = 0);
   node *copy();
   void tprint(troff_output_file *);
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
   int ends_sentence();
   tfont *get_tfont();
 };
@@ -489,6 +548,7 @@
 public:
   suppress_node(int, int);
   suppress_node(symbol, char, int);
+  suppress_node(int, int, symbol, char, int, statem *, int);
   suppress_node(int, int, symbol, char, int);
   node *copy();
   void tprint(troff_output_file *);
@@ -496,10 +556,27 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 private:
   void put(troff_output_file *, const char *);
 };
 
+class tag_node : public node {
+public:
+  string tag_string;
+  int delayed;
+  tag_node();
+  tag_node(string, int);
+  tag_node(string, statem *, int, int);
+  node *copy();
+  void tprint(troff_output_file *);
+  int same(node *);
+  const char *type();
+  int force_tprint();
+  int is_tag();
+  int ends_sentence();
+};
+
 struct hvpair {
   hunits h;
   vunits v;
@@ -515,6 +592,7 @@
   hvpair *point;
 public:
   draw_node(char, hvpair *, int, font_size, color *, color *);
+  draw_node(char, hvpair *, int, font_size, color *, color *, statem *, int);
   ~draw_node();
   hunits width();
   vunits vertical_width();
@@ -523,6 +601,7 @@
   int same(node *);
   const char *type();
   int force_tprint();
+  int is_tag();
 };
 
 class charinfo;
@@ -571,6 +650,7 @@
 #ifdef COLUMN
   virtual void vjustify(vunits, symbol);
 #endif /* COLUMN */
+  mtsm state;
 };
 
 #ifndef POPEN_MISSING




reply via email to

[Prev in Thread] Current Thread [Next in Thread]