Below are upates to TeX.WEB, MF.WEB, and PLAIN.TeX.
 
Differences between TeX.WEB for 2.92 and for 2.9
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 1-28 (1880)
% Version 2.91 fixes \outer\def\a0{}\a\a bug (April 1988).
% Version 2.92 fixes \patterns, also file names with complex macros (May 1988).
 
% A reward of $81.92 will be paid to the first finder of any remaining bug.
% (This amount will double again in 1989.)
 
% Although considerable effort has been expended to make the TeX program
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 1-29 (1882)
 
% A reward of $40.96 will be paid to the first finder of any remaining bug.
% (This amount will double again in 1988.)
 
% Although considerable effort has been expended to make the TeX program
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 2-93 (9207)
@d banner=='This is TeX, Version 2.92' {printed when \TeX\ starts}
 
@ Different \PASCAL s have slightly different conventions, and the present
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 2-93 (9066)
@d banner=='This is TeX, Version 2.9' {printed when \TeX\ starts}
 
@ Different \PASCAL s have slightly different conventions, and the present
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 19-61 (240552)
@!d:integer; {number of characters already in current string}
@!p:pointer; {index in |hash| array}
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 19-61 (240410)
@!p:pointer; {index in |hash| array}
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 19-88 (241492)
str_room(l); d:=cur_length;
while pool_ptr>str_start[str_ptr] do
  begin decr(pool_ptr); str_pool[pool_ptr+l]:=str_pool[pool_ptr];
  end; {move current string up to make room for another}
for k:=j to j+l-1 do append_char(buffer[k]);
text(p):=make_string; pool_ptr:=pool_ptr+d;
@!stat incr(cs_count);@+tats@;@/
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 19-87 (241287)
str_room(l);
for k:=j to j+l-1 do append_char(buffer[k]);
text(p):=make_string;
@!stat incr(cs_count);@+tats@;@/
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 20-77 (255280)
@!group_code=0..max_group_code; {|save_level| for a level boundary}
 
@ The global variable |cur_group| keeps track of what sort of group we are
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 20-77 (254875)
@!group_code=0..max_group_code; {|save_index| for a level boundary}
 
@ The global variable |cur_group| keeps track of what sort of group we are
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 25-31 (308968)
@!par_token:halfword; {token representing `\.{\\par}'}
 
@ @<Put each...@>=
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 25-31 (308563)
@!par_token:halfword; {token representing '\.{\\par}'}
 
@ @<Put each...@>=
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 25-372 (322487)
@ The present point in the program is reached only when the |expand|
routine has inserted a special marker into the input. In this special
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 25-372 (322082)
@ The present point in the program is reached only when the |no_expand|
routine has inserted a special marker into the input. In this special
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 26-375 (343630)
repeat link(temp_head):=null;
if (info(r)>match_token+127)or(info(r)<match_token) then s:=null
else  begin match_chr:=info(r)-match_token; s:=link(r); r:=s;
  p:=temp_head; m:=0;
  end;
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 26-375 (343228)
repeat if (info(r)>match_token+127)or(info(r)<match_token) then s:=null
else  begin match_chr:=info(r)-match_token; s:=link(r); r:=s;
  p:=temp_head; link(p):=null; m:=0;
  end;
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 27-675 (378115)
  are |x| sp per unit; |goto attach_sign| if the units are internal@>;
@<Scan an optional space@>;
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 27-675 (377704)
  are |x| units per sp; |goto attach_sign| if the units are internal@>;
@<Scan an optional space@>;
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 28-13 (388583)
@p function str_toks(@!b:pool_pointer):pointer;
  {changes the string |str_pool[b..pool_ptr]| to a token list}
var p:pointer; {tail of the token list}
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 28-13 (388173)
@p function str_toks:pointer; {changes the current string to a token list}
var p:pointer; {tail of the token list}
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 28-20 (388915)
p:=temp_head; link(p):=null; k:=b;
while k<pool_ptr do
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 28-19 (388468)
p:=temp_head; link(p):=null; k:=str_start[str_ptr];
while k<pool_ptr do
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 28-28 (389103)
pool_ptr:=b; str_toks:=p;
end;
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 28-27 (388673)
pool_ptr:=str_start[str_ptr]; str_toks:=p;
end;
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 28-40 (389611)
@!b:pool_pointer; {base of temporary string}
begin get_x_token; scan_something_internal(tok_val,false);
if cur_val_level>=ident_val then @<Copy the token list@>
else begin old_setting:=selector; selector:=new_string; b:=pool_ptr;
  case cur_val_level of
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 28-39 (389198)
begin get_x_token; scan_something_internal(tok_val,false);
if cur_val_level>=ident_val then @<Copy the token list@>
else begin old_setting:=selector; selector:=new_string;
  case cur_val_level of
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 28-53 (390161)
  selector:=old_setting; the_toks:=str_toks(b);
  end;
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 28-51 (389689)
  selector:=old_setting; the_toks:=str_toks;
  end;
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 28-117 (392508)
@!b:pool_pointer; {base of temporary string}
begin c:=cur_chr; @<Scan the argument for command |c|@>;
old_setting:=selector; selector:=new_string; b:=pool_ptr;
@<Print the result of command |c|@>;
selector:=old_setting; link(garbage):=str_toks(b); ins_list(link(temp_head));
end;
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 28-115 (392033)
begin c:=cur_chr; @<Scan the argument for command |c|@>;
old_setting:=selector; selector:=new_string;
@<Print the result of command |c|@>;
selector:=old_setting; link(garbage):=str_toks; ins_list(link(temp_head));
end;
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 30-262 (427879)
begin if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings)or
 (cur_length>0) then
  make_name_string:="?"
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 30-262 (427342)
begin if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings) then
  make_name_string:="?"
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 35-281 (573403)
`\.\_' or `\.\~' or `\./' or `\.\\' if |p| is descended from the |subscr|
or |supscr| or |denominator| or |numerator| fields of noads. For example,
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 35-281 (572846)
`\.[' or `\.(' or `\./' or `\.\\' if |p| is descended from the |subscr|
or |supscr| or |denominator| or |numerator| fields of noads. For example,
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 43-68 (756339)
to the impossible value 128, in order to guarantee that |hc[hn+3]| will
never be fetched.
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 43-68 (755780)
to the impossible value 256, in order to guarantee that |hc[hn+3]| will
never be fetched.
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 43-75 (756649)
hc[0]:=127; hc[hn+1]:=127; hc[hn+2]:=128; {insert delimiters}
for j:=0 to hn-2 do
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 43-75 (756090)
hc[0]:=127; hc[hn+1]:=127; hc[hn+2]:=256; {insert delimiters}
for j:=0 to hn-2 do
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 43-196 (761319)
until coming to a right brace; then |return|@>;
exit:end;
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 43-196 (760760)
until coming to a right brace; then skip an optional space and |return|@>;
exit:end;
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 44-201 (773038)
trie_link(trie_size):=0; trie_back(0):=trie_size; {wrap around}
for p:=1 to 128 do
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 44-201 (772506)
for p:=1 to 128 do
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 44-233 (774482)
begin c:=trie_c[p];
if c<trie_min then trie_min:=c;
if trie_min=0 then z:=trie_link(trie_size)
else z:=trie_link(trie_min-1); {get the first conceivably good hole}
loop@+  begin if z<c then goto not_found;
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 44-232 (773885)
begin c:=trie_c[p]; {we have |c>0|}
if c<trie_min then trie_min:=c;
z:=trie_link(trie_min-1); {get the first conceivably good hole}
loop@+  begin if z<c then goto not_found;
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 44-345 (779179)
  brace@>;
trie_root:=compress_trie(trie_root); {compress the trie}
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 44-343 (778549)
  brace; then skip an optional space@>;
trie_root:=compress_trie(trie_root); {compress the trie}
***************
 
**** FILE TX:<TEX82.NEW>TEX-2-92.WEB.1, 44-443 (782387)
r:=trie_size; {finally, we will zero out the holes}
h.rh:=0; h.b0:=min_quarterword; h.b1:=0; {|trie_link:=0|,
**** FILE TX:<TEX82.NEW>TEX-2-9.WEB.1, 44-441 (781786)
r:=0; {finally, we will zero out the holes}
h.rh:=0; h.b0:=min_quarterword; h.b1:=0; {|trie_link:=0|,
***************
 
 
########################################################################
 
Differences between new and previous Plain.TeX
 
**** FILE PS:<TEX.INPUTS>PLAIN.TEX.2, 6-244 (33253)
\def\arrowvert{\delimiter"33C000 } % arrow without arrowheads
\def\Arrowvert{\delimiter"33D000 } % double arrow without arrowheads
\def\bracevert{\delimiter"33E000 } % the vertical bar that extends braces
**** FILE PS:<TEX.INPUTS>PLAIN.TEX.1, 1-951 (33258)
\def\arrowvert{\delimiter"33C } % arrow without arrowheads
\def\Arrowvert{\delimiter"33D } % double arrow without arrowheads
\def\bracevert{\delimiter"33E } % the vertical bar that extends braces
***************
 
**** FILE PS:<TEX.INPUTS>PLAIN.TEX.2, 8-22 (44482)
\def\fmtname{plain}\def\fmtversion{2.92} % identifies the current format
**** FILE PS:<TEX.INPUTS>PLAIN.TEX.1, 1-1220 (44480)
\def\fmtname{plain}\def\fmtversion{2.3} % identifies the current format
***************
 
########################################################################
 
Differences between MF.WEB for 1.4 and for 1.3
 
**** FILE PS:<1SCRATCH>MF.WEB.1, 1-15 (870)
% Version 1.4 corrected scan_declared_variable timing (May 1988).
% A few "harmless" optimizations have been made since then.
 
% A reward of $20.48 will be paid to the first finder of any remaining bug.
% (This amount will double again in 1989.)
 
% Although considerable effort has been expended to make the METAFONT program
**** FILE PS:<TEX.MF>MF.WEB.1, 1-15 (870)
% A few "harmless" optimizations have been made since then.
 
% A reward of $10.24 will be paid to the first finder of any remaining bug.
% (This amount will double again in 1988.)
 
% Although considerable effort has been expended to make the METAFONT program
***************
 
**** FILE PS:<1SCRATCH>MF.WEB.1, 2-81 (7574)
@d banner=='This is METAFONT, Version 1.4' {printed when \MF\ starts}
 
@ Different \PASCAL s have slightly different conventions, and the present
**** FILE PS:<TEX.MF>MF.WEB.1, 1-146 (7508)
@d banner=='This is METAFONT, Version 1.3' {printed when \MF\ starts}
 
@ Different \PASCAL s have slightly different conventions, and the present
***************
 
**** FILE PS:<1SCRATCH>MF.WEB.1, 43-1162 (768090)
 if txx mod unity=0 then if tyy mod unity=0 then
  @<Scale the edges, shift them, and |return|@>;
**** FILE PS:<TEX.MF>MF.WEB.1, 1-18695 (768065)
 if txy mod unity=0 then if tyy mod unity=0 then
  @<Scale the edges, shift them, and |return|@>;
***************
 
**** FILE PS:<1SCRATCH>MF.WEB.1, 44-399 (798211)
h:=get_avail; info(h):=x; t:=h;@/
**** FILE PS:<TEX.MF>MF.WEB.1, 1-19495 (798187)
if equiv(x)=null then new_root(x);
h:=get_avail; info(h):=x; t:=h;@/
***************
 
**** FILE PS:<1SCRATCH>MF.WEB.1, 44-407 (798526)
done: if eq_type(x)<>tag_token then clear_symbol(x,false);
if equiv(x)=null then new_root(x);
scan_declared_variable:=h;
end;
**** FILE PS:<TEX.MF>MF.WEB.1, 1-19504 (798538)
done:scan_declared_variable:=h;
end;
***************