diff --context=2 --recursive web2c-5.851d/Makefile.in web2c-5.851d-tgd/Makefile.in
*** web2c-5.851d/Makefile.in	Tue Feb 23 00:34:25 1993
--- web2c-5.851d-tgd/Makefile.in	Sat Nov 27 01:54:30 1993
***************
*** 10,14 ****
  # match the system directories in the paths.
  # 
! prefix = /usr/local
  exec_prefix = $(prefix)
  bindir = $(exec_prefix)/bin
--- 10,14 ----
  # match the system directories in the paths.
  # 
! prefix = /usr/TeX
  exec_prefix = $(prefix)
  bindir = $(exec_prefix)/bin
***************
*** 17,21 ****
  texdatadir = $(datadir)/tex
  texpooldir = $(texdatadir)
! texinputdir = $(texdatadir)/macros
  texfontdir = $(texdatadir)/fonts
  formatdir = $(texdatadir)/formats
--- 17,21 ----
  texdatadir = $(datadir)/tex
  texpooldir = $(texdatadir)
! texinputdir = $(texdatadir)/inputs
  texfontdir = $(texdatadir)/fonts
  formatdir = $(texdatadir)/formats
***************
*** 27,36 ****
  
  typesources = $(prefix)/src/TeX+MF/typefaces
! cmsources = $(typesources)/cm
  
  # Search paths.
  # 
! # The default is to search subdirectories of /usr/local/lib/tex/fonts
! # for fonts, and of /usr/local/lib/tex/macros for TeX source files.
  # (The trailing // means to search the given directory and all
  # subdirectories, recursively.)
--- 27,36 ----
  
  typesources = $(prefix)/src/TeX+MF/typefaces
! cmsources = $(mfinputdir)
  
  # Search paths.
  # 
! # The default is to search subdirectories of /usr/TeX/lib/tex/fonts
! # for fonts, and of /usr/TeX/lib/tex/inputs for TeX source files.
  # (The trailing // means to search the given directory and all
  # subdirectories, recursively.)
***************
*** 54,62 ****
  default_bstinputs = .:$(texinputdir)/bib
  default_mfbases = $(basedir)
! default_mfinputs = .:$(mfinputdir):$(typesources)//
  default_mfpool = $(mfpooldir)
  default_texfonts = .:$(texfontdir)//
  default_texformats = $(formatdir)
! default_texinputs = .:$(texinputdir)//
  default_texpool = $(texpooldir)
  default_vffonts = $(default_texfonts)
--- 54,62 ----
  default_bstinputs = .:$(texinputdir)/bib
  default_mfbases = $(basedir)
! default_mfinputs = .:$(mfinputdir)//:$(typesources)//
  default_mfpool = $(mfpooldir)
  default_texfonts = .:$(texfontdir)//
  default_texformats = $(formatdir)
! default_texinputs = .:$(texinputdir)//:$(texdatadir)/macros//
  default_texpool = $(texpooldir)
  default_vffonts = $(default_texfonts)
***************
*** 93,101 ****
  # Compiling.
  CC = @CC@
! CFLAGS = -g
  
  # Command to link an executable.
  CCLD = $(CC)
! LDFLAGS = $(XLDFLAGS)
  LIBS = @LIBS@ $(extralibs)
  
--- 93,101 ----
  # Compiling.
  CC = @CC@
! CFLAGS = -O2 -ffast-math 
  
  # Command to link an executable.
  CCLD = $(CC)
! LDFLAGS = -s $(XLDFLAGS)
  LIBS = @LIBS@ $(extralibs)
  
diff --context=2 --recursive web2c-5.851d/lib/c-auto.h.in web2c-5.851d-tgd/lib/c-auto.h.in
*** web2c-5.851d/lib/c-auto.h.in	Sun Feb 21 15:12:11 1993
--- web2c-5.851d-tgd/lib/c-auto.h.in	Sat Nov 27 01:54:30 1993
***************
*** 72,76 ****
     file.  The environment variables TEXEDIT and MFEDIT override this.  */
  #ifndef EDITOR
! #define EDITOR "vi +%d %s"
  #endif
  
--- 72,76 ----
     file.  The environment variables TEXEDIT and MFEDIT override this.  */
  #ifndef EDITOR
! #define EDITOR "TeXeditor +%d %s"
  #endif
  
diff --context=2 --recursive web2c-5.851d/lib/openinout.c web2c-5.851d-tgd/lib/openinout.c
*** web2c-5.851d/lib/openinout.c	Sun Feb 21 15:48:14 1993
--- web2c-5.851d-tgd/lib/openinout.c	Sat Nov 27 01:54:30 1993
***************
*** 134,138 ****
       We don't use fork/exec ourselves, since we'd have to call sh anyway
       to interpret the script.  */
!   strcpy (cmd, "sh -c ");
    
    strcat (cmd, program);
--- 134,138 ----
       We don't use fork/exec ourselves, since we'd have to call sh anyway
       to interpret the script.  */
!   strcpy (cmd, "sh -c \"");
    
    strcat (cmd, program);
***************
*** 147,151 ****
  
    /* Don't show any output.  */
!   strcat (cmd, ">/dev/null 2>&1");
  
    /* Run the command, and return whether or not it succeeded.  */
--- 147,151 ----
  
    /* Don't show any output.  */
!   strcat (cmd, "\">/dev/null 2>&1");
  
    /* Run the command, and return whether or not it succeeded.  */
diff --context=2 --recursive web2c-5.851d/mf/mf.ch web2c-5.851d-tgd/mf/mf.ch
*** web2c-5.851d/mf/mf.ch	Sun Feb 21 12:47:36 1993
--- web2c-5.851d-tgd/mf/mf.ch	Sat Nov 27 01:54:31 1993
***************
*** 920,923 ****
--- 920,934 ----
  @z
  
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % [\approx 679] my preferred prompt - tgd
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x
+     print_ln; first:=start;
+     prompt_input("*"); {input on-line into |buffer|}
+ @y
+     first:=start; {changed for interactive convenience}
+     prompt_input(" "); {input on-line into |buffer|}
+ @z
+ 
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % [38.765] Area and extension rules.
diff --context=2 --recursive web2c-5.851d/mf/mf.web web2c-5.851d-tgd/mf/mf.web
*** web2c-5.851d/mf/mf.web	Sun Mar 29 23:06:18 1992
--- web2c-5.851d-tgd/mf/mf.web	Sat Nov 27 02:30:53 1993
***************
*** 21,25 ****
  % Version 2.0 fixed bug in addto; released with TeX version 3.0 (March 1990).
  % Version 2.7 made consistent with TeX version 3.1 (September 1990).
! % Version 2.71 fixed bug in draw, allowed unprintable filenames (not yet released).
  % A few "harmless" optimizations have been made without changing versions.
  
--- 21,25 ----
  % Version 2.0 fixed bug in addto; released with TeX version 3.0 (March 1990).
  % Version 2.7 made consistent with TeX version 3.1 (September 1990).
! % Version 2.71 fixed bug in draw, allowed unprintable filenames (March 1992).
  % A few "harmless" optimizations have been made without changing versions.
  
***************
*** 10007,10011 ****
  $w_2=(6,1)$, and $w_3=(1,2)$. A curve that travels in the first octant
  will be offset by $w_1$ or $w_2$, unless its slope drops to zero
! enroute to the eighth octant; in the latter case we should switch to $w_0$ as
  we cross the octant boundary. Our list for the first octant will
  contain the three offsets $w_0$, $w_1$,~$w_2$. By convention we will
--- 10007,10011 ----
  $w_2=(6,1)$, and $w_3=(1,2)$. A curve that travels in the first octant
  will be offset by $w_1$ or $w_2$, unless its slope drops to zero
! en route to the eighth octant; in the latter case we should switch to $w_0$ as
  we cross the octant boundary. Our list for the first octant will
  contain the three offsets $w_0$, $w_1$,~$w_2$. By convention we will
diff --context=2 --recursive web2c-5.851d/tex/tex.ch web2c-5.851d-tgd/tex/tex.ch
*** web2c-5.851d/tex/tex.ch	Sun Feb 21 12:47:36 1993
--- web2c-5.851d-tgd/tex/tex.ch	Sat Nov 27 02:07:50 1993
***************
*** 43,49 ****
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  @x
! @d banner=='This is TeX, Version 3.141' {printed when \TeX\ starts}
  @y
! @d banner=='This is TeX, Version 3.141' {more is printed later}
  @z
  
--- 43,49 ----
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  @x
! @d banner=='This is TeX, Version 3.1415' {printed when \TeX\ starts}
  @y
! @d banner=='This is TeX, Version 3.1415' {more is printed later}
  @z
  
diff --context=2 --recursive web2c-5.851d/tex/tex.web web2c-5.851d-tgd/tex/tex.web
*** web2c-5.851d/tex/tex.web	Sun Mar 29 21:45:13 1992
--- web2c-5.851d-tgd/tex/tex.web	Sat Nov 27 01:59:21 1993
***************
*** 41,45 ****
  % Version 3.1 fixed nullfont, disabled \write{\the\prevgraf} (September 1990).
  % Version 3.14 fixed unprintable font names and corrected typos (March 1991).
! % Version 3.141 more of same; reconstituted ligatures better (September 1991).
  
  % A reward of $327.68 will be paid to the first finder of any remaining bug,
--- 41,46 ----
  % Version 3.1 fixed nullfont, disabled \write{\the\prevgraf} (September 1990).
  % Version 3.14 fixed unprintable font names and corrected typos (March 1991).
! % Version 3.141 more of same; reconstituted ligatures better (March 1992).
! % Version 3.1415 preserved nonexplicit kerns, tidied up (February 1993).
  
  % A reward of $327.68 will be paid to the first finder of any remaining bug,
***************
*** 183,187 ****
  November 1984].
  
! @d banner=='This is TeX, Version 3.141' {printed when \TeX\ starts}
  
  @ Different \PASCAL s have slightly different conventions, and the present
--- 184,188 ----
  November 1984].
  
! @d banner=='This is TeX, Version 3.1415' {printed when \TeX\ starts}
  
  @ Different \PASCAL s have slightly different conventions, and the present
***************
*** 4287,4291 ****
  user's output routine.
  
! Seventh and eighth quantities, |lhmin| and |rhmin|, affect hyphenation.
  
  The semantic nest is an array called |nest| that holds the |mode|, |head|,
--- 4288,4292 ----
  user's output routine.
  
! In horizontal mode, the |prev_graf| field is used for initial language data.
  
  The semantic nest is an array called |nest| that holds the |mode|, |head|,
***************
*** 4302,4307 ****
    @!head_field,@!tail_field: pointer;
    @!pg_field,@!ml_field: integer;@+
!   @!aux_field: memory_word;@+
!   @!lhm_field,@!rhm_field: quarterword;
    end;
  
--- 4303,4307 ----
    @!head_field,@!tail_field: pointer;
    @!pg_field,@!ml_field: integer;@+
!   @!aux_field: memory_word;
    end;
  
***************
*** 4316,4321 ****
  @d incompleat_noad==aux.int {the name of |aux| in math mode}
  @d mode_line==cur_list.ml_field {source file line number at beginning of list}
- @d lhmin==cur_list.lhm_field {\.{\\lefthyphenmin} at start of paragraph}
- @d rhmin==cur_list.rhm_field {\.{\\righthyphenmin} at start of paragraph}
  
  @<Glob...@>=
--- 4316,4319 ----
***************
*** 4343,4347 ****
  mode:=vmode; head:=contrib_head; tail:=contrib_head;
  prev_depth:=ignore_depth; mode_line:=0;
- lhmin:=0; rhmin:=0;
  prev_graf:=0; shown_mode:=0;
  @<Start a new current page@>;
--- 4341,4344 ----
***************
*** 4385,4391 ****
    print_nl("### "); print_mode(m);
    print(" entered at line "); print_int(abs(nest[p].ml_field));
!   if m=hmode then@+if(nest[p].lhm_field<>2)or(nest[p].rhm_field<>3)then
!     begin print(" (hyphenmin "); print_int(nest[p].lhm_field); print_char(",");
!     print_int(nest[p].rhm_field); print_char(")");
      end;
    if nest[p].ml_field<0 then print(" (\output routine)");
--- 4382,4390 ----
    print_nl("### "); print_mode(m);
    print(" entered at line "); print_int(abs(nest[p].ml_field));
!   if m=hmode then if nest[p].pg_field <> @'40600000 then
!     begin print(" (language"); print_int(nest[p].pg_field mod @'200000);
!     print(":hyphenmin"); print_int(nest[p].pg_field div @'20000000);
!     print_char(","); print_int((nest[p].pg_field div @'200000) mod @'100);
!     print_char(")");
      end;
    if nest[p].ml_field<0 then print(" (\output routine)");
***************
*** 12456,12461 ****
    end
  
! @ The `\\{synch}' operations here are intended to decrease the number
! of bytes needed to specify horizontal and vertical motion in the \.{DVI} output.
  
  @<Output a leader box at |cur_h|, ...@>=
--- 12455,12460 ----
    end
  
! @ The `\\{synch}' operations here are intended to decrease the number of
! bytes needed to specify horizontal and vertical motion in the \.{DVI} output.
  
  @<Output a leader box at |cur_h|, ...@>=
***************
*** 12465,12469 ****
  if type(leader_box)=vlist_node then vlist_out@+else hlist_out;
  doing_leaders:=outer_doing_leaders;
! dvi_v:=save_v; dvi_h:=save_h; cur_v:=save_v;
  cur_h:=save_h+leader_wd+lx;
  end
--- 12464,12468 ----
  if type(leader_box)=vlist_node then vlist_out@+else hlist_out;
  doing_leaders:=outer_doing_leaders;
! dvi_v:=save_v; dvi_h:=save_h; cur_v:=base_line;
  cur_h:=save_h+leader_wd+lx;
  end
***************
*** 12609,12613 ****
  if type(leader_box)=vlist_node then vlist_out@+else hlist_out;
  doing_leaders:=outer_doing_leaders;
! dvi_v:=save_v; dvi_h:=save_h; cur_h:=save_h;
  cur_v:=save_v-height(leader_box)+leader_ht+lx;
  end
--- 12608,12612 ----
  if type(leader_box)=vlist_node then vlist_out@+else hlist_out;
  doing_leaders:=outer_doing_leaders;
! dvi_v:=save_v; dvi_h:=save_h; cur_h:=left_edge;
  cur_v:=save_v-height(leader_box)+leader_ht+lx;
  end
***************
*** 16006,16010 ****
  
  This code assumes that a |glue_node| and a |penalty_node| occupy the
! same number of words in |mem|.
  @^data structure assumptions@>
  
--- 16005,16009 ----
  
  This code assumes that a |glue_node| and a |penalty_node| occupy the
! same number of |mem|~words.
  @^data structure assumptions@>
  
***************
*** 16017,16020 ****
--- 16016,16022 ----
    end;
  link(tail):=new_param_glue(par_fill_skip_code);
+ init_cur_lang:=prev_graf mod @'200000;
+ init_l_hyf:=prev_graf div @'20000000;
+ init_r_hyf:=(prev_graf div @'200000) mod @'100;
  pop_nest;
  
***************
*** 16440,16445 ****
  nodes, subtracting their widths as well.
  
! Kern nodes for accents are treated specially: They do not
! disappear at a line break.
  
  @d set_break_width_to_background(#)==break_width[#]:=background[#]
--- 16442,16446 ----
  nodes, subtracting their widths as well.
  
! Kern nodes do not disappear at a line break unless they are |explicit|.
  
  @d set_break_width_to_background(#)==break_width[#]:=background[#]
***************
*** 16455,16459 ****
    glue_node:@<Subtract glue from |break_width|@>;
    penalty_node: do_nothing;
!   math_node,kern_node: if subtype(s)=acc_kern then goto done
      else break_width[1]:=break_width[1]-width(s);
    othercases goto done
--- 16456,16461 ----
    glue_node:@<Subtract glue from |break_width|@>;
    penalty_node: do_nothing;
!   math_node: break_width[1]:=break_width[1]-width(s);
!   kern_node: if subtype(s)<>explicit then goto done
      else break_width[1]:=break_width[1]-width(s);
    othercases goto done
***************
*** 16476,16481 ****
  line from |cur_p| to |q| will be computed as $\gamma+\beta(q)-\alpha(|cur_p|)$,
  where $\beta(q)=\beta(|cur_p|)-l_0+l$. The actual length will be the background
! plus $l_1$, so the length from |cur_p| to |cur_p| should be $\gamma+l_0+l_1-l$,
! minus the length of nodes that will be discarded after the discretionary break.
  
  The value of $l_0$ need not be computed, since |line_break| will put
--- 16478,16485 ----
  line from |cur_p| to |q| will be computed as $\gamma+\beta(q)-\alpha(|cur_p|)$,
  where $\beta(q)=\beta(|cur_p|)-l_0+l$. The actual length will be the background
! plus $l_1$, so the length from |cur_p| to |cur_p| should be $\gamma+l_0+l_1-l$.
! If the post-break text of the discretionary is empty, a break may also
! discard~|q|; in that unusual case we subtract the length of~|q| and any
! other nodes that will be discarded after the discretionary break.
  
  The value of $l_0$ need not be computed, since |line_break| will put
***************
*** 16492,16501 ****
    end;
  while s<>null do
!   begin @<Add the width of node |s| to |break_width| and increase |t|,
!     unless it's discardable@>;
    s:=link(s);
    end;
  break_width[1]:=break_width[1]+disc_width;
! if t=0 then s:=link(v); {more nodes may also be discardable after the break}
  end
  
--- 16496,16505 ----
    end;
  while s<>null do
!   begin @<Add the width of node |s| to |break_width|@>;
    s:=link(s);
    end;
  break_width[1]:=break_width[1]+disc_width;
! if post_break(cur_p)=null then s:=link(v);
!           {nodes may be discardable after the break}
  end
  
***************
*** 16529,16539 ****
        char_width(f)(char_info(f)(character(lig_char(s))));
      end;
!   hlist_node,vlist_node,rule_node:break_width[1]:=break_width[1]+width(s);
!   kern_node: if (t=0)and(subtype(s)<>acc_kern) then t:=-1 {discardable}
!     else break_width[1]:=break_width[1]+width(s);
    othercases confusion("disc2")
  @:this can't happen disc2}{\quad disc2@>
!   endcases;
! incr(t)
  
  @ We use the fact that |type(active)<>delta_node|.
--- 16533,16541 ----
        char_width(f)(char_info(f)(character(lig_char(s))));
      end;
!   hlist_node,vlist_node,rule_node,kern_node:
!     break_width[1]:=break_width[1]+width(s);
    othercases confusion("disc2")
  @:this can't happen disc2}{\quad disc2@>
!   endcases
  
  @ We use the fact that |type(active)<>delta_node|.
***************
*** 16898,16902 ****
  meaning of |prev_p| is this: If |type(cur_p)=glue_node| then |cur_p| is a legal
  breakpoint if and only if |auto_breaking| is true and |prev_p| does not
! point to a glue node, penalty node, kern node, or math node.
  
  The following declarations provide for a few other local variables that are
--- 16900,16904 ----
  meaning of |prev_p| is this: If |type(cur_p)=glue_node| then |cur_p| is a legal
  breakpoint if and only if |auto_breaking| is true and |prev_p| does not
! point to a glue node, penalty node, explicit kern node, or math node.
  
  The following declarations provide for a few other local variables that are
***************
*** 16988,16993 ****
  
  @d act_width==active_width[1] {length from first active node to current node}
! @d kern_break==begin@t@>@;@/
!   if not is_char_node(link(cur_p)) and auto_breaking then
      if type(link(cur_p))=glue_node then try_break(0,unhyphenated);
    act_width:=act_width+width(cur_p);
--- 16990,16994 ----
  
  @d act_width==active_width[1] {length from first active node to current node}
! @d kern_break==begin if not is_char_node(link(cur_p)) and auto_breaking then
      if type(link(cur_p))=glue_node then try_break(0,unhyphenated);
    act_width:=act_width+width(cur_p);
***************
*** 17006,17010 ****
      @<Try to hyphenate the following word@>;
    end;
! kern_node: kern_break;
  ligature_node: begin f:=font(lig_char(cur_p));
    act_width:=act_width+char_width(f)(char_info(f)(character(lig_char(cur_p))));
--- 17007,17012 ----
      @<Try to hyphenate the following word@>;
    end;
! kern_node: if subtype(cur_p)=explicit then kern_break
!   else act_width:=act_width+width(cur_p);
  ligature_node: begin f:=font(lig_char(cur_p));
    act_width:=act_width+char_width(f)(char_info(f)(character(lig_char(cur_p))));
***************
*** 17042,17046 ****
  if auto_breaking then
    begin if is_char_node(prev_p) then try_break(0,unhyphenated)
!   else if precedes_break(prev_p) then try_break(0,unhyphenated);
    end;
  check_shrinkage(glue_ptr(cur_p)); q:=glue_ptr(cur_p);
--- 17044,17050 ----
  if auto_breaking then
    begin if is_char_node(prev_p) then try_break(0,unhyphenated)
!   else if precedes_break(prev_p) then try_break(0,unhyphenated)
!   else if (type(prev_p)=kern_node)and(subtype(prev_p)<>explicit) then
!     try_break(0,unhyphenated);
    end;
  check_shrinkage(glue_ptr(cur_p)); q:=glue_ptr(cur_p);
***************
*** 17237,17241 ****
    if is_char_node(q) then goto done1;
    if non_discardable(q) then goto done1;
!   if subtype(q)=acc_kern then if type(q)=kern_node then goto done1;
    r:=q; {now |type(q)=glue_node|, |kern_node|, |math_node| or |penalty_node|}
    end;
--- 17241,17245 ----
    if is_char_node(q) then goto done1;
    if non_discardable(q) then goto done1;
!   if type(q)=kern_node then if subtype(q)<>explicit then goto done1;
    r:=q; {now |type(q)=glue_node|, |kern_node|, |math_node| or |penalty_node|}
    end;
***************
*** 17439,17443 ****
  @<Initialize for hyphenating...@>=
  begin @!init if trie_not_ready then init_trie;@+tini@;@/
! l_hyf:=lhmin; r_hyf:=rhmin; cur_lang:=0;
  end
  
--- 17443,17447 ----
  @<Initialize for hyphenating...@>=
  begin @!init if trie_not_ready then init_trie;@+tini@;@/
! cur_lang:=init_cur_lang; l_hyf:=init_l_hyf; r_hyf:=init_r_hyf;
  end
  
***************
*** 17454,17459 ****
  @!hu:array[0..63] of 0..256; {like |hc|, before conversion to lowercase}
  @!hyf_char:integer; {hyphen character of the relevant font}
! @!cur_lang:ASCII_code; {current hyphenation table of interest}
! @!l_hyf,@!r_hyf:integer; {limits on fragment sizes}
  @!hyf_bchar:halfword; {boundary character after $c_n$}
  
--- 17458,17463 ----
  @!hu:array[0..63] of 0..256; {like |hc|, before conversion to lowercase}
  @!hyf_char:integer; {hyphen character of the relevant font}
! @!cur_lang,@!init_cur_lang:ASCII_code; {current hyphenation table of interest}
! @!l_hyf,@!r_hyf,@!init_l_hyf,@!init_r_hyf:integer; {limits on fragment sizes}
  @!hyf_bchar:halfword; {boundary character after $c_n$}
  
***************
*** 17532,17536 ****
      @<Move the characters of a ligature node to |hu| and |hc|;
        but |goto done3| if they are not all letters@>
!   else if (type(s)=kern_node)and(subtype(s)=normal) then hb:=s
    else goto done3;
    s:=link(s);
--- 17536,17543 ----
      @<Move the characters of a ligature node to |hu| and |hc|;
        but |goto done3| if they are not all letters@>
!   else if (type(s)=kern_node)and(subtype(s)=normal) then
!     begin hb:=s;
!     hyf_bchar:=font_bchar[hf];
!     end
    else goto done3;
    s:=link(s);
***************
*** 18188,18193 ****
  @p procedure new_hyph_exceptions; {enters new exceptions}
  label reswitch, exit, found, not_found;
! var n:small_number; {length of current word}
! @!j:small_number; {an index into |hc|}
  @!h:hyph_pointer; {an index into |hyph_word| and |hyph_list|}
  @!k:str_number; {an index into |str_start|}
--- 18195,18200 ----
  @p procedure new_hyph_exceptions; {enters new exceptions}
  label reswitch, exit, found, not_found;
! var n:0..64; {length of current word; not always a |small_number|}
! @!j:0..64; {an index into |hc|}
  @!h:hyph_pointer; {an index into |hyph_word| and |hyph_list|}
  @!k:str_number; {an index into |str_start|}
***************
*** 18650,18654 ****
  procedure new_patterns; {initializes the hyphenation pattern data}
  label done, done1;
! var k,@!l:small_number; {indices into |hc| and |hyf|}
  @!digit_sensed:boolean; {should the next digit be treated as a letter?}
  @!v:quarterword; {trie op code}
--- 18657,18662 ----
  procedure new_patterns; {initializes the hyphenation pattern data}
  label done, done1;
! var k,@!l:0..64; {indices into |hc| and |hyf|;
!                   not always in |small_number| range}
  @!digit_sensed:boolean; {should the next digit be treated as a letter?}
  @!v:quarterword; {trie op code}
***************
*** 21034,21039 ****
  if (mode=vmode)or(head<>tail) then
    tail_append(new_param_glue(par_skip_code));
! lhmin:=norm_min(left_hyphen_min); rhmin:=norm_min(right_hyphen_min);
! push_nest; mode:=hmode; space_factor:=1000; clang:=0;@/
  if indented then
    begin tail:=new_null_box; link(head):=tail; width(tail):=par_indent;@+
--- 21042,21048 ----
  if (mode=vmode)or(head<>tail) then
    tail_append(new_param_glue(par_skip_code));
! push_nest; mode:=hmode; space_factor:=1000; set_cur_lang; clang:=cur_lang;
! prev_graf:=(norm_min(left_hyphen_min)*@'100+norm_min(right_hyphen_min))
!              *@'200000+cur_lang;
  if indented then
    begin tail:=new_null_box; link(head):=tail; width(tail):=par_indent;@+
***************
*** 22431,22435 ****
  @:this can't happen display}{\quad display@>
  unsave; prev_graf:=prev_graf+3;
! push_nest; mode:=hmode; space_factor:=1000; clang:=0;
  @<Scan an optional space@>;
  if nest_ptr=1 then build_page;
--- 22440,22446 ----
  @:this can't happen display}{\quad display@>
  unsave; prev_graf:=prev_graf+3;
! push_nest; mode:=hmode; space_factor:=1000; set_cur_lang; clang:=cur_lang;
! prev_graf:=(norm_min(left_hyphen_min)*@'100+norm_min(right_hyphen_min))
!              *@'200000+cur_lang;
  @<Scan an optional space@>;
  if nest_ptr=1 then build_page;
diff --context=2 --recursive web2c-5.851d/web/tangle.ch web2c-5.851d-tgd/web/tangle.ch
*** web2c-5.851d/web/tangle.ch	Sun Feb 21 12:47:36 1993
--- web2c-5.851d-tgd/web/tangle.ch	Sat Nov 27 02:33:05 1993
***************
*** 59,65 ****
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  @x
! @d banner=='This is TANGLE, Version 4.3'
  @y
! @d banner=='This is TANGLE, Version 4.3' {more is printed later}
  @z
  
--- 59,65 ----
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  @x
! @d banner=='This is TANGLE, Version 4.4'
  @y
! @d banner=='This is TANGLE, Version 4.4' {more is printed later}
  @z
  
diff --context=2 --recursive web2c-5.851d/web/tangle.web web2c-5.851d-tgd/web/tangle.web
*** web2c-5.851d/web/tangle.web	Sun Mar 29 21:24:37 1992
--- web2c-5.851d-tgd/web/tangle.web	Sat Nov 27 02:30:08 1993
***************
*** 3,7 ****
  % Version 1 was released in September, 1982, with version 0 of TeX.
  % Slight changes were made in October, 1982, for version 0.6 of TeX.
! % Version 1.2 added @@= and @@\ and introduced {:nnn} comments (December, 1982).
  % Version 1.4 added "history" (February, 1983).
  % Version 1.5 conformed to TeX version 0.96 and fixed @@\ (March, 1983).
--- 3,7 ----
  % Version 1 was released in September, 1982, with version 0 of TeX.
  % Slight changes were made in October, 1982, for version 0.6 of TeX.
! % Version 1.2 introduced {:nnn} comments, added @@= and @@\ (December, 1982).
  % Version 1.4 added "history" (February, 1983).
  % Version 1.5 conformed to TeX version 0.96 and fixed @@\ (March, 1983).
***************
*** 18,21 ****
--- 18,22 ----
  % Version 4.2 fixes stat report if phase one dies (March, 1991).
  % Version 4.3 fixes @@ bug in verbatim, catches extra } (September, 1991).
+ % Version 4.4 activates debug_help on errors as advertised (February, 1993).
  
  % Here is TeX material that gets inserted after \input webmac
***************
*** 36,40 ****
    \centerline{\titlefont The {\ttitlefont TANGLE} processor}
    \vskip 15pt
!   \centerline{(Version 4.3)}
    \vfill}
  \pageno=\contentspagenumber \advance\pageno by 1
--- 37,41 ----
    \centerline{\titlefont The {\ttitlefont TANGLE} processor}
    \vskip 15pt
!   \centerline{(Version 4.4)}
    \vfill}
  \pageno=\contentspagenumber \advance\pageno by 1
***************
*** 65,69 ****
  is modified.
  
! @d banner=='This is TANGLE, Version 4.3'
  
  @ The program begins with a fairly normal header, made up of pieces that
--- 66,70 ----
  is modified.
  
! @d banner=='This is TANGLE, Version 4.4'
  
  @ The program begins with a fairly normal header, made up of pieces that
***************
*** 641,645 ****
  else @<Print error location based on output buffer@>;
  update_terminal; mark_error;
! @!debug debug_help;@+gubed
  end;
  
--- 642,646 ----
  else @<Print error location based on output buffer@>;
  update_terminal; mark_error;
! @!debug debug_skipped:=debug_cycle; debug_help;@+gubed
  end;
  
diff --context=2 --recursive web2c-5.851d/web/tangleboot.c web2c-5.851d-tgd/web/tangleboot.c
*** web2c-5.851d/web/tangleboot.c	Sun Feb 21 14:33:15 1993
--- web2c-5.851d-tgd/web/tangleboot.c	Sat Nov 27 02:35:03 1993
***************
*** 3074,3078 ****
    buffer [ 0 ] = 32 ; 
    inputhasended = false ; 
!   Fputs( stdout ,  "This is TANGLE, Version 4.3" ) ; 
    fprintf( stdout , "%s\n",  versionstring ) ; 
    phaseone = true ; 
--- 3074,3078 ----
    buffer [ 0 ] = 32 ; 
    inputhasended = false ; 
!   Fputs( stdout ,  "This is TANGLE, Version 4.4" ) ; 
    fprintf( stdout , "%s\n",  versionstring ) ; 
    phaseone = true ; 
diff --context=2 --recursive web2c-5.851d/web/tangleboot.p web2c-5.851d-tgd/web/tangleboot.p
*** web2c-5.851d/web/tangleboot.p	Sun Feb 21 14:33:12 1993
--- web2c-5.851d-tgd/web/tangleboot.p	Sat Nov 27 02:34:59 1993
***************
*** 56,63 ****
  begin writeln(stdout,'. (l.',line:1,')');
  for j:=1 to outptr do write(stdout,xchr[outbuf[j-1]]);
! write(stdout,'... ');end{:33};flush(stdout);history:=2;{debughelp;}end;
! {:31}{190:}procedure scanargs;var dotpos,slashpos,i,a:integer;c:char;
! fname:array[1..PATHMAX]of char;foundweb,foundchange:boolean;
! begin foundweb:=false;foundchange:=false;
  for a:=1 to argc-1 do begin argv(a,fname);
  if fname[1]<>'-'then begin if not foundweb then{191:}begin dotpos:=-1;
--- 56,63 ----
  begin writeln(stdout,'. (l.',line:1,')');
  for j:=1 to outptr do write(stdout,xchr[outbuf[j-1]]);
! write(stdout,'... ');end{:33};flush(stdout);history:=2;
! {debugskipped:=debugcycle;debughelp;}end;{:31}{190:}procedure scanargs;
! var dotpos,slashpos,i,a:integer;c:char;fname:array[1..PATHMAX]of char;
! foundweb,foundchange:boolean;begin foundweb:=false;foundchange:=false;
  for a:=1 to argc-1 do begin argv(a,fname);
  if fname[1]<>'-'then begin if not foundweb then{191:}begin dotpos:=-1;
***************
*** 775,779 ****
  primethechangebuffer;changing:=not changing;templine:=otherline;
  otherline:=line;line:=templine;limit:=0;loc:=1;buffer[0]:=32;
! inputhasended:=false;{:134};write(stdout,'This is TANGLE, Version 4.3');
  writeln(stdout,versionstring);{183:}phaseone:=true;modulecount:=0;
  repeat nextcontrol:=skipahead;until nextcontrol=136;
--- 775,779 ----
  primethechangebuffer;changing:=not changing;templine:=otherline;
  otherline:=line;line:=templine;limit:=0;loc:=1;buffer[0]:=32;
! inputhasended:=false;{:134};write(stdout,'This is TANGLE, Version 4.4');
  writeln(stdout,versionstring);{183:}phaseone:=true;modulecount:=0;
  repeat nextcontrol:=skipahead;until nextcontrol=136;
