texlive[71417] Build/source/texk/web2c: correct chapter/section/line

commits+karl at tug.org commits+karl at tug.org
Tue Jun 4 00:32:13 CEST 2024


Revision: 71417
          https://tug.org/svn/texlive?view=revision&revision=71417
Author:   karl
Date:     2024-06-04 00:32:13 +0200 (Tue, 04 Jun 2024)
Log Message:
-----------
correct chapter/section/line numbers with script from Tyge

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/ChangeLog
    trunk/Build/source/texk/web2c/mf.ch
    trunk/Build/source/texk/web2c/tex.ch
    trunk/Build/source/texk/web2c/unbalanced-braces.ch

Added Paths:
-----------
    trunk/Build/source/texk/web2c/tests/fix-changefile-lines.py

Modified: trunk/Build/source/texk/web2c/ChangeLog
===================================================================
--- trunk/Build/source/texk/web2c/ChangeLog	2024-06-03 20:04:07 UTC (rev 71416)
+++ trunk/Build/source/texk/web2c/ChangeLog	2024-06-03 22:32:13 UTC (rev 71417)
@@ -1,3 +1,14 @@
+2024-06-03  Karl Berry  <karl at freefriends.org>
+
+	* tests/fix-changefile-lines.py: new script from Tyge Thiessen
+	to update the chapter/section/line numbers in a .ch file,
+	following my request:
+	https://tug.org/pipermail/tex-k/2024-June/004064.html
+	* tex.ch,
+	* mf.ch: update with the script.
+	
+	* unbalanced-braces.ch: tweak text.
+
 2024-04-28  Luigi Scarso  <luigi.scarso at gmail.com>
 
 	* configure.ac (LUA53_DEFINES, LUA52_DEFINES, LUAJIT_DEFINES): 

Modified: trunk/Build/source/texk/web2c/mf.ch
===================================================================
--- trunk/Build/source/texk/web2c/mf.ch	2024-06-03 20:04:07 UTC (rev 71416)
+++ trunk/Build/source/texk/web2c/mf.ch	2024-06-03 22:32:13 UTC (rev 71417)
@@ -21,7 +21,7 @@
 % 	Incorporates: New binary I/O library, separate optimized
 % 	arithmetic for takefraction/makefraction, new graphics interface.
 
- at x [0] WEAVE: print changes only.
+ at x [0.0] l.75 - WEAVE: print changes only.
 \def\botofcontents{\vskip 0pt plus 1fil minus 1.5in}
 @y
 \def\botofcontents{\vskip 0pt plus 1fil minus 1.5in}
@@ -30,17 +30,17 @@
 \def\glob{13}\def\gglob{20, 25} % these are defined in module 1
 @z
 
- at x [1.6] Purge non-local 'goto' label.
+ at x [1.6] l.246 - Purge non-local 'goto' label.
 @d end_of_MF=9998 {go here to close files and terminate gracefully}
 @y
 @z
- at x
+ at x [1.6] l.250
 start_of_MF at t\hskip-2pt@>, end_of_MF at t\hskip-2pt@>,@,final_end;
 @y
 start_of_MF at t\hskip-2pt@>,@,final_end;
 @z
 
- at x [1.7] Convert `debug..gubed' and `stat..tats' into #ifdefs.
+ at x [1.7] l.267 - Convert `debug..gubed' and `stat..tats' into #ifdefs.
 @d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
 @d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
 @y
@@ -48,7 +48,7 @@
 @d gubed==endif('TEXMF_DEBUG')
 @z
 
- at x [1.7]
+ at x [1.7] l.272
 @d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
   usage statistics}
 @d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
@@ -58,7 +58,7 @@
 @d tats==endif('STAT')
 @z
 
- at x [1.8] Same, for `init..tini'.
+ at x [1.8] l.287 - Same, for `init..tini'.
 @d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
 @d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
 @y
@@ -69,7 +69,7 @@
 % [1.11] Compile-time constants.  Although we only change a few of
 % these, listing them all makes the patch file for a big Metafont simpler.
 % 16K for BSD I/O; file_name_size is set from the system constant.
- at x
+ at x [1.11] l.348
 @<Constants...@>=
 @!mem_max=30000; {greatest index in \MF's internal |mem| array;
   must be strictly less than |max_halfword|;
@@ -145,7 +145,7 @@
 @!sup_buf_size = 30000000;
 @z
 
- at x [1.12] Constants defined as WEB macros.
+ at x [1.12] l.397 - Constants defined as WEB macros.
 @d mem_min=0 {smallest index in the |mem| array, must not be less
   than |min_halfword|}
 @d mem_top==30000 {largest index in the |mem| array dumped by \.{INIMF};
@@ -168,7 +168,7 @@
 @d param_size=150 {maximum number of simultaneous macro parameters}
 @z
 
- at x [1.13] Global parameters that can be changed in texmf.cnf.
+ at x [1.13] l.416 - Global parameters that can be changed in texmf.cnf.
 @<Glob...@>=
 @!bad:integer; {is some ``constant'' wrong?}
 @y
@@ -211,7 +211,7 @@
 @!quoted_filename:boolean; {current filename is quoted}
 @z
 
- at x [1.16] Use C macros for `incr' and `decr'.
+ at x [1.16] l.468 - Use C macros for `incr' and `decr'.
 @d incr(#) == #:=#+1 {increase a variable by unity}
 @d decr(#) == #:=#-1 {decrease a variable by unity}
 @y
@@ -220,13 +220,13 @@
 % [2.19] The text_char type is used as an array index into xord.  The
 % default type `char' produces signed integers, which are bad array
 % indices in C.
- at x
+ at x [2.19] l.524
 @d text_char == char {the data type of characters in text files}
 @y
 @d text_char == ASCII_code {the data type of characters in text files}
 @z
 
- at x [2.22] Allow any character as input.
+ at x [2.22] l.665 - Allow any character as input.
 @^character set dependencies@>
 @^system dependencies@>
 
@@ -246,7 +246,7 @@
 for i:=@'177 to @'377 do xchr[i]:=i;
 @z
 
- at x [2.23]
+ at x [2.23] l.681
 for i:=0 to @'176 do xord[xchr[i]]:=i;
 @y
 for i:=0 to @'176 do xord[xchr[i]]:=i;
@@ -266,7 +266,7 @@
 
 % [3.25] Declare name_of_file as a C string.  See comments in tex.ch for
 % why we change the element type to text_char.
- at x
+ at x [3.25] l.737
 @!name_of_file:packed array[1..file_name_size] of char;@;@/
   {on some systems this may be a \&{record} variable}
 @y
@@ -273,7 +273,7 @@
 @!name_of_file:^text_char;
 @z
 
- at x [3.26] Do file opening in C.
+ at x [3.26] l.742 - Do file opening in C.
 @ The \ph\ compiler with which the present version of \MF\ was prepared has
 extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
 we can write
@@ -328,7 +328,7 @@
 @ All of the file opening functions are defined in C.
 @z
 
- at x [3.27] Do file closing in C.
+ at x [3.27] l.793 - Do file closing in C.
 @ Files can be closed with the \ph\ routine `|close(f)|', which
 @:PASCAL H}{\ph@>
 @^system dependencies@>
@@ -352,13 +352,13 @@
 @ And all the file closing routines as well.
 @z
 
- at x [3.29] Array size of input buffer is determined at runtime.
+ at x [3.29] l.829 - Array size of input buffer is determined at runtime.
 @!buffer:array[0..buf_size] of ASCII_code; {lines of characters being read}
 @y
 @!buffer:^ASCII_code; {lines of characters being read}
 @z
 
- at x [3.30] Do `input_ln' in C.
+ at x [3.30] l.862 - Do `input_ln' in C.
 Standard \PASCAL\ says that a file should have |eoln| immediately
 before |eof|, but \MF\ needs only a weaker restriction: If |eof|
 occurs in the middle of a line, the system function |eoln| should return
@@ -392,7 +392,7 @@
 @p @{ @<Report overflow of the input buffer, and abort@> @}
 @z
 
- at x [3.31] `term_in' and `term_out' are standard input and output.
+ at x [3.31] l.894 - `term_in' and `term_out' are standard input and output.
 @<Glob...@>=
 @!term_in:alpha_file; {the terminal as an input file}
 @!term_out:alpha_file; {the terminal as an output file}
@@ -401,7 +401,7 @@
 @d term_out==stdout {the terminal as an output file}
 @z
 
- at x [3.32] We don't need to open the terminal files.
+ at x [3.32] l.898 - We don't need to open the terminal files.
 @ Here is how to open the terminal files
 in \ph. The `\.{/I}' switch suppresses the first |get|.
 @:PASCAL H}{\ph@>
@@ -418,7 +418,7 @@
 @d t_open_out == {output already open for text output}
 @z
 
- at x [3.33] Flushing output.
+ at x [3.33] l.918 - Flushing output.
 these operations can be specified in \ph:
 @:PASCAL H}{\ph@>
 @^system dependencies@>
@@ -435,7 +435,7 @@
 @d clear_terminal == do_nothing
 @z
 
- at x [3.36] Reading the command line.
+ at x [3.36] l.991 - Reading the command line.
 @ The following program does the required initialization
 without retrieving a possible command line.
 It should be clear how to modify this routine to deal with command lines,
@@ -507,7 +507,7 @@
 end;
 @z
 
- at x [4.49] l.1239 -- change documentation (probably needed in more places)
+ at x [4.49] l.1253 - change documentation (probably needed in more places)
 would like string @'32 to be the single character @'32 instead of the
 @y
 would like string @'32 to be printed as the single character @'32 instead
@@ -518,7 +518,7 @@
 % assignments directly.  (`strcpy' and `strlen' work here because
 % `pool_name' is a constant string, and thus ends in a null and doesn't
 % start with a space.)
- at x
+ at x [4.51] l.1292
 name_of_file:=pool_name; {we needn't set |name_length|}
 if a_open_in(pool_file) then
 @y
@@ -528,12 +528,12 @@
 if a_open_in (pool_file, kpse_mfpool_format) then
 @z
 
- at x [4.51,52,53] Make `MF.POOL' lowercase, and change how it's read.
+ at x [4.51] l.1300 - Make `MF.POOL' lowercase, and change how it's read.
 else  bad_pool('! I can''t read MF.POOL.')
 @y
 else  bad_pool('! I can''t read ', pool_name, '; bad path?')
 @z
- at x
+ at x [4.52] l.1304
 begin if eof(pool_file) then bad_pool('! MF.POOL has no check sum.');
 @.MF.POOL has no check sum@>
 read(pool_file,m,n); {read two digits of string length}
@@ -542,17 +542,17 @@
 @.MF.POOL has no check sum@>
 read(pool_file,m); read(pool_file,n); {read two digits of string length}
 @z
- at x
+ at x [4.52] l.1310
     bad_pool('! MF.POOL line doesn''t begin with two digits.');
 @y
     bad_pool('! ', pool_name, ' line doesn''t begin with two digits.');
 @z
- at x
+ at x [4.53] l.1332
   bad_pool('! MF.POOL check sum doesn''t have nine digits.');
 @y
   bad_pool('! ', pool_name, ' check sum doesn''t have nine digits.');
 @z
- at x
+ at x [4.53] l.1338
 done: if a<>@$ then bad_pool('! MF.POOL doesn''t match; TANGLE me again.');
 @y
 done: if a<>@$ then
@@ -559,25 +559,25 @@
   bad_pool('! ', pool_name, ' doesn''t match; tangle me again (or fix the path).');
 @z
 
- at x [5.54] error_line is a variable, so can't be a subrange array bound
+ at x [5.54] l.1398 - error_line is a variable, so can't be a subrange array bound
 @!trick_buf:array[0..error_line] of ASCII_code; {circular buffer for
 @y
 @!trick_buf:array[0..ssup_error_line] of ASCII_code; {circular buffer for
 @z
 
- at x [5.58] Do not expand printable characters.
+ at x [5.59] l.1478 - Do not expand printable characters.
 if (s<256)and(selector>pseudo) then print_char(s)
 @y
 if (s<256)and((selector>pseudo)or xprn[s]) then print_char(s)
 @z
 
- at x [5.59] Do not expand printable characters.
+ at x [5.60] l.1494 - Do not expand printable characters.
 if (s<256)and(selector>pseudo) then print_char(s)
 @y
 if (s<256)and((selector>pseudo) or xprn[s])then print_char(s)
 @z
 
- at x [5.61] Print rest of banner.
+ at x [5.61] l.1509 - Print rest of banner.
 wterm(banner);
 if base_ident=0 then wterm_ln(' (no base preloaded)')
 else  begin slow_print(base_ident); print_ln;
@@ -595,7 +595,7 @@
 end;
 @z
 
- at x [6.68] l.1603 - Add unspecified_mode.
+ at x [6.68] l.1618 - Add unspecified_mode.
 @d error_stop_mode=3 {stops at every opportunity to interact}
 @y
 @d error_stop_mode=3 {stops at every opportunity to interact}
@@ -602,7 +602,7 @@
 @d unspecified_mode=4 {extra value for command-line switch}
 @z
 
- at x [6.68] l.1605 - file:line:error style messages.
+ at x [6.68] l.1620 - file:line:error style messages.
   print_nl("! "); print(#);
 @y
   if (file_line_error_style_p and not terminal_input) then
@@ -615,7 +615,7 @@
   else begin print_nl("! "); print(#) end;
 @z
 
- at x [6.68] l.1610 - Add interaction_option.
+ at x [6.68] l.1625 - Add interaction_option.
 @!interaction:batch_mode..error_stop_mode; {current level of interaction}
 @y
 @!interaction:batch_mode..error_stop_mode; {current level of interaction}
@@ -622,7 +622,7 @@
 @!interaction_option:batch_mode..unspecified_mode; {set from command line}
 @z
 
- at x [6.69] l.1612 - Allow override by command line switch.
+ at x [6.69] l.1627 - Allow override by command line switch.
 @ @<Set init...@>=interaction:=error_stop_mode;
 @y
 @ @<Set init...@>=if interaction_option=unspecified_mode then
@@ -631,7 +631,7 @@
   interaction:=interaction_option;
 @z
 
- at x [6.76] Eliminate non-local goto.
+ at x [6.76] l.1727 - Eliminate non-local goto.
 @ The |jump_out| procedure just cuts across all active procedure levels and
 goes to |end_of_MF|. This is the only nontrivial |@!goto| statement in the
 whole program. It is used when there is no recovery from a particular error.
@@ -671,7 +671,7 @@
 end;
 @z
 
- at x [6.77] l.1736 -- halt on error?
+ at x [6.77] l.1751 - halt on error?
 print_char("."); show_context;
 @y
 print_char("."); show_context;
@@ -685,7 +685,7 @@
 end;
 @z
 
- at x [6.79] Handle the switch-to-editor option.
+ at x [6.79] l.1774 - Handle the switch-to-editor option.
 line ready to be edited. But such an extension requires some system
 wizardry, so the present implementation simply types out the name of the
 file that should be
@@ -709,7 +709,7 @@
 @^debugging@>
 @d edit_file==input_stack[file_ptr]
 @z
- at x
+ at x [6.79] l.1789
 "E": if file_ptr>0 then if input_stack[file_ptr].name_field>=256 then
   begin print_nl("You want to edit file ");
 @.You want to edit file x@>
@@ -726,36 +726,36 @@
     jump_out;
 @z
 
- at x [6.88] Declare fatal_error as noreturn.
+ at x [6.88] l.1931 - Declare fatal_error as noreturn.
 procedure fatal_error(@!s:str_number); {prints |s|, and that's it}
 @y
 noreturn procedure fatal_error(@!s:str_number); {prints |s|, and that's it}
 @z
 
- at x [6.89] Declare overflow as noreturn.
+ at x [6.89] l.1940 - Declare overflow as noreturn.
 procedure overflow(@!s:str_number;@!n:integer); {stop due to finiteness}
 @y
 noreturn procedure overflow(@!s:str_number;@!n:integer); {stop due to finiteness}
 @z
 
- at x [6.90] Declare confusion as noreturn.
+ at x [6.90] l.1959 - Declare confusion as noreturn.
 procedure confusion(@!s:str_number);
 @y
 noreturn procedure confusion(@!s:str_number);
 @z
 
- at x [7.96] Do half in cpascal.h. And add halfp as in MetaPost for speed.
+ at x [7.96] l.2054 - Do half in cpascal.h. And add halfp as in MetaPost for speed.
 @d half(#)==(#) div 2
 @y
 @z
 
- at x [7.102] Use halfp.
+ at x [7.102] l.2123 - Use halfp.
 round_decimals:=half(a+1);
 @y
 round_decimals:=halfp(a+1);
 @z
 
- at x [7.107-7.114] Optionally replace make_fraction etc. with external routines
+ at x [7.107] l.2231 - Optionally replace make_fraction etc. with external routines
 @p function make_fraction(@!p,@!q:integer):fraction;
 @y
 In the C version, there are external routines that use double precision
@@ -770,7 +770,7 @@
 @p ifdef('FIXPT')@/
 function make_fraction(@!p,@!q:integer):fraction;
 @z
- at x [7.107]
+ at x [7.107] l.2251
   if negative then make_fraction:=-(f+n)@+else make_fraction:=f+n;
   end;
 end;
@@ -780,13 +780,13 @@
 end;@/
 endif('FIXPT')
 @z
- at x [7.109]
+ at x [7.109] l.2289
 @p function take_fraction(@!q:integer;@!f:fraction):integer;
 @y
 @p ifdef('FIXPT')@/
 function take_fraction(@!q:integer;@!f:fraction):integer;
 @z
- at x [7.109]
+ at x [7.109] l.2308
 else take_fraction:=n+p;
 end;
 @y
@@ -795,7 +795,7 @@
 endif('FIXPT')
 @z
 
- at x [7.111] Use halfp.
+ at x [7.111] l.2327 - Use halfp.
   repeat if odd(f) then p:=half(p+q)@+else p:=half(p);
   f:=half(f);
   until f=1
@@ -809,13 +809,13 @@
   f:=halfp(f);
 @z
 
- at x [7.112]
+ at x [7.112] l.2345
 @p function take_scaled(@!q:integer;@!f:scaled):integer;
 @y
 @p ifdef('FIXPT')@/
 function take_scaled(@!q:integer;@!f:scaled):integer;
 @z
- at x [7.112]
+ at x [7.112] l.2364
 else take_scaled:=n+p;
 end;
 @y
@@ -824,7 +824,7 @@
 endif('FIXPT')
 @z
 
- at x [7.113] Use halfp.
+ at x [7.113] l.2371 - Use halfp.
   repeat if odd(f) then p:=half(p+q)@+else p:=half(p);
   f:=half(f);
   until f=1
@@ -838,7 +838,7 @@
   f:=halfp(f);
 @z
 
- at x [7.114]
+ at x [7.114] l.2381
 operands are positive. \ (This procedure is not used especially often,
 so it is not part of \MF's inner loop.)
 
@@ -851,7 +851,7 @@
 @p ifdef('FIXPT')@/
 function make_scaled(@!p,@!q:integer):scaled;
 @z
- at x [7.114]
+ at x [7.114] l.2404
   if negative then make_scaled:=-(f+n)@+else make_scaled:=f+n;
   end;
 end;
@@ -862,7 +862,7 @@
 endif('FIXPT')
 @z
 
- at x [7.119] Do floor_scaled, floor_unscaled, round_unscaled, round_fraction in C.
+ at x [7.119] l.2504 - Do floor_scaled, floor_unscaled, round_unscaled, round_fraction in C.
 @p function floor_scaled(@!x:scaled):scaled;
   {$2^{16}\lfloor x/2^{16}\rfloor$}
 var @!be_careful:integer; {temporary register}
@@ -902,37 +902,37 @@
 @y
 @z
 
- at x [8.121] Use halfp.
+ at x [8.121] l.2567 - Use halfp.
   square_rt:=half(q);
 @y
   square_rt:=halfp(q);
 @z
 
- at x [8.126] Use halfp.
+ at x [8.126] l.2651 - Use halfp.
   else  begin a:=half(a); b:=half(b); big:=true;
 @y
   else  begin a:=halfp(a); b:=halfp(b); big:=true;
 @z
 
- at x [8.133] Use halfp.
+ at x [8.133] l.2748 - Use halfp.
   begin z:=half(z+1); k:=k+1;
 @y
   begin z:=halfp(z+1); k:=k+1;
 @z
 
- at x [8.142] Use halfp.
+ at x [8.142] l.2910 - Use halfp.
   begin x:=half(x); y:=half(y);
 @y
   begin x:=halfp(x); y:=halfp(y);
 @z
 
- at x [8.150] Use halfp.
+ at x [8.150] l.3059 - Use halfp.
 while j>=fraction_one do j:=half(j);
 @y
 while j>=fraction_one do j:=halfp(j);
 @z
 
- at x [9.153] Increase memory size.
+ at x [9.153] l.3148 - Increase memory size.
 @d min_quarterword=0 {smallest allowable value in a |quarterword|}
 @d max_quarterword=255 {largest allowable value in a |quarterword|}
 @d min_halfword==0 {smallest allowable value in a |halfword|}
@@ -944,7 +944,7 @@
 @d max_halfword==@"FFFFFFF {largest allowable value in a |halfword|}
 @z
 
- at x [9.155] Don't bother to subtract zero.
+ at x [9.155] l.3177 - Don't bother to subtract zero.
 @d ho(#)==#-min_halfword
   {to take a sixteen-bit item from a halfword}
 @d qo(#)==#-min_quarterword {to read eight bits from a quarterword}
@@ -955,7 +955,7 @@
 @d qi(#)==#
 @z
 
- at x [9.156] memory_word is defined externally.
+ at x [9.156] l.3192 - memory_word is defined externally.
 @!two_halves = packed record@;@/
   @!rh:halfword;
   case two_choices of
@@ -978,7 +978,7 @@
 @=#include "texmfmem.h";@>
 @z
 
- at x [10.159] mem is dynamically allocated.
+ at x [10.159] l.3267 - mem is dynamically allocated.
 @!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
 @y
 @!mem : ^memory_word; {the big dynamic storage area}
@@ -987,7 +987,7 @@
 % [11.178] Change the word `free' so that it doesn't conflict with the
 % standard C library routine of the same name. Also change arrays that
 % use mem_max, since that's a variable now, effectively disabling the feature.
- at x
+ at x [11.178] l.3582
 are debugging.)
 
 @<Glob...@>=
@@ -1002,7 +1002,7 @@
 @t\hskip1em@>@!was_free: packed array [0..1] of boolean; {this loses too}
 @z
 
- at x [11.182] Eliminate unsigned comparisons to zero.
+ at x [11.182] l.3638 - Eliminate unsigned comparisons to zero.
 repeat if (p>=lo_mem_max)or(p<mem_min) then clobbered:=true
   else if (rlink(p)>=lo_mem_max)or(rlink(p)<mem_min) then clobbered:=true
 @y
@@ -1010,7 +1010,7 @@
   else if (rlink(p)>=lo_mem_max) then clobbered:=true
 @z
 
- at x [12.194] Do `fix_date_and_time' in C.
+ at x [12.194] l.4268 - Do `fix_date_and_time' in C.
 @ The following procedure, which is called just before \MF\ initializes its
 input and output, establishes the initial values of the date and time.
 @^system dependencies@>
@@ -1040,7 +1040,7 @@
 begin date_and_time(sys_time,sys_day,sys_month,sys_year);
 @z
 
- at x [12.198] Change class to c_class to avoid C++ keyword.
+ at x [12.198] l.4347 - Change class to c_class to avoid C++ keyword.
 @d max_class=20 {the largest class number}
 @y
 @d max_class=20 {the largest class number}
@@ -1047,7 +1047,7 @@
 @d class==c_class
 @z
 
- at x [12.199] Allow tab and form feed as input.
+ at x [12.199] l.4395 - Allow tab and form feed as input.
 for k:=127 to 255 do char_class[k]:=invalid_class;
 @y
 for k:=127 to 255 do char_class[k]:=invalid_class;
@@ -1055,7 +1055,7 @@
 char_class[form_feed]:=space_class;
 @z
 
- at x [15.232] Use halfp.
+ at x [15.232] l.5187 - Use halfp.
 name_type(q+s):=half(s)+x_part_sector; link(q+s):=null;
 @y
 name_type(q+s):=halfp(s)+x_part_sector; link(q+s):=null;
@@ -1064,7 +1064,7 @@
  [20.329] |valid_range| uses |abs|, which we have defined as a C
 % macro.  Some C preprocessors cannot expand the giant argument here.
 % So we add a temporary.
- at x
+ at x [20.329] l.7270
 @p procedure edge_prep(@!ml,@!mr,@!nl,@!nr:integer);
 var @!delta:halfword; {amount of change}
 @y
@@ -1072,7 +1072,7 @@
 var @!delta:halfword; {amount of change}
 temp:integer;
 @z
- at x
+ at x [20.329] l.7277
 if not valid_range(m_min(cur_edges)+m_offset(cur_edges)-zero_field) or@|
  not valid_range(m_max(cur_edges)+m_offset(cur_edges)-zero_field) then
 @y
@@ -1082,7 +1082,7 @@
 then
 @z
 
- at x [21.442] Use halfp.
+ at x [21.442] l.9489 - Use halfp.
 if odd(right_type(q)) then a:=good_val(b,pen_edge+half(cur_gran))
 else a:=good_val(b-1,pen_edge+half(cur_gran));
 @y
@@ -1090,7 +1090,7 @@
 else a:=good_val(b-1,pen_edge+halfp(cur_gran));
 @z
 
- at x [24.509] i18n fix
+ at x [24.510] l.10808 - i18n fix
 print(" ("); print_int(info(h)); print(" offset");
 if info(h)<>1 then print_char("s");
 @y
@@ -1102,7 +1102,7 @@
 % [25.530] |make_fraction| and |take_fraction| arguments are too long for
 % some preprocessors, when they were defined as macros, just as in the
 % previous change.
- at x
+ at x [25.534] l.11334
   alpha:=take_fraction(take_fraction(major_axis,
       make_fraction(gamma,beta)),n_cos)@|
     -take_fraction(take_fraction(minor_axis,
@@ -1119,19 +1119,19 @@
   gamma := pyth_add (take_fraction (major_axis, n_cos), gamma);
 @z
 
- at x [26.556] Use halfp.
+ at x [26.560] l.11902 - Use halfp.
         begin cur_t:=half(cur_t+1); cur_tt:=half(cur_tt+1); return;
 @y
         begin cur_t:=halfp(cur_t+1); cur_tt:=halfp(cur_tt+1); return;
 @z
 
- at x [26.561] Use halfp.
+ at x [26.565] l.11999 - Use halfp.
 begin cur_t:=half(cur_t); cur_tt:=half(cur_tt);
 @y
 begin cur_t:=halfp(cur_t); cur_tt:=halfp(cur_tt);
 @z
 
- at x [27.564] The window functions are defined externally, in C.
+ at x [27.568] l.12089 - The window functions are defined externally, in C.
 @p function init_screen:boolean;
 begin init_screen:=false;
 end;
@@ -1143,7 +1143,7 @@
 {These functions/procedures are defined externally in C.}
 @z
 
- at x [27.565] screen_row, screen_col are variables, so can't be subrange array bounds.
+ at x [27.569] l.12114 - screen_row, screen_col are variables, so can't be subrange array bounds.
 @!screen_row=0..screen_depth; {a row number on the screen}
 @!screen_col=0..screen_width; {a column number on the screen}
 @!trans_spec=array[screen_col] of screen_col; {a transition spec, see below}
@@ -1153,7 +1153,7 @@
 @!trans_spec=^screen_col; {a transition spec, see below}
 @z
 
- at x [27.567]
+ at x [27.571] l.12138
 @p procedure blank_rectangle(@!left_col,@!right_col:screen_col;
   @!top_row,@!bot_row:screen_row);
 var @!r:screen_row;
@@ -1169,7 +1169,7 @@
 {Same thing.}
 @z
 
- at x [27.568]
+ at x [27.572] l.12165
 @p procedure paint_row(@!r:screen_row;@!b:pixel_color;var @!a:trans_spec;
   @!n:screen_col);
 var @!k:screen_col; {an index into |a|}
@@ -1191,13 +1191,13 @@
 {Same thing}
 @z
 
- at x [28.596] Use halfp.
+ at x [28.600] l.12687 - Use halfp.
 if abs(v)>half(threshold) then
 @y
 if abs(v)>halfp(threshold) then
 @z
 
- at x [31.631] l.13346 - Add datastructures for file:line:error.
+ at x [31.635] l.13377 - Add datastructures for file:line:error.
 @!line_stack : array[1..max_in_open] of integer;
 @y
 @!line_stack : array[1..max_in_open] of integer;
@@ -1205,7 +1205,7 @@
 @!full_source_filename_stack : ^str_number;
 @z
 
- at x [38.768] Area and extension rules.
+ at x [38.772] l.15564 - Area and extension rules.
 @ The file names we shall deal with for illustrative purposes have the
 following structure:  If the name contains `\.>' or `\.:', the file area
 consists of all characters up to and including the final such character;
@@ -1237,7 +1237,7 @@
 @!ext_delimiter:pool_pointer; {the most recent `\..', if any}
 @z
 
- at x [38.769] MF area directories.
+ at x [38.773] l.15584 - MF area directories.
 @d MF_area=="MFinputs:"
 @.MFinputs@>
 @y
@@ -1244,13 +1244,13 @@
 In C, the default paths are specified separately.
 @z
 
- at x [38.770] filenames: quoted
+ at x [38.774] l.15591 - filenames: quoted
 begin area_delimiter:=0; ext_delimiter:=0;
 @y
 begin area_delimiter:=0; ext_delimiter:=0; quoted_filename:=false;
 @z
 
- at x [38.771] more_name
+ at x [38.775] l.15598 - more_name
 begin if c=" " then more_name:=false
 else  begin if (c=">")or(c=":") then
 @y
@@ -1265,13 +1265,13 @@
   if IS_DIR_SEP (c) then
 @z
 
- at x [38.771] more_name
+ at x [38.775] l.15602 - more_name
   else if (c=".")and(ext_delimiter=0) then ext_delimiter:=pool_ptr;
 @y
   else if c="." then ext_delimiter:=pool_ptr;
 @z
 
- at x [38.772] end_name: quote if spaces in names.
+ at x [38.776] l.15611 - end_name: quote if spaces in names.
 @p procedure end_name;
 @y
 @d pool_seq_check(#) == {set |s:=str_start[str_ptr]| and |t:=#|,
@@ -1298,7 +1298,7 @@
 @!j,@!s,@!t: pool_pointer; {running indices}
 @z
 
- at x [38.772] end_name: quote if spaces in names.
+ at x [38.776] l.15618 - end_name: quote if spaces in names.
 if area_delimiter=0 then cur_area:=""
 else  begin cur_area:=str_ptr; incr(str_ptr);
   str_start[str_ptr]:=area_delimiter+1;
@@ -1341,7 +1341,7 @@
 else cur_ext:=make_string;
 @z
 
- at x [38.773] print_file_name: quote if spaces in names.
+ at x [38.777] l.15635 - print_file_name: quote if spaces in names.
 @<Basic printing...@>=
 procedure print_file_name(@!n,@!a,@!e:integer);
 begin slow_print(a); slow_print(n); slow_print(e);
@@ -1371,7 +1371,7 @@
 if must_quote then slow_print("""");
 @z
 
- at x [38.774] have append_to_name skip quotes.
+ at x [38.778] l.15646 - have append_to_name skip quotes.
 @d append_to_name(#)==begin c:=#; incr(k);
   if k<=file_name_size then name_of_file[k]:=xchr[c];
   end
@@ -1381,7 +1381,7 @@
   end end
 @z
 
- at x [38.774] (pack_file_name) malloc and null terminate name_of_file.
+ at x [38.778] l.15655 - (pack_file_name) malloc and null terminate name_of_file.
 for j:=str_start[a] to str_start[a+1]-1 do append_to_name(so(str_pool[j]));
 @y
 if name_of_file then libc_free (name_of_file);
@@ -1388,13 +1388,13 @@
 name_of_file := xmalloc_array (ASCII_code, length(a)+length(n)+length(e)+1);
 for j:=str_start[a] to str_start[a+1]-1 do append_to_name(so(str_pool[j]));
 @z
- at x
+ at x [38.778] l.15659
 for k:=name_length+1 to file_name_size do name_of_file[k]:=' ';
 @y
 name_of_file[name_length + 1] := 0;
 @z
 
- at x [38.775] The default base.
+ at x [38.779] l.15668 - The default base.
 @d base_default_length=18 {length of the |MF_base_default| string}
 @d base_area_length=8 {length of its area part}
 @y
@@ -1401,7 +1401,7 @@
 @d base_area_length=0 {no fixed area in C}
 @z
 
- at x [38.776] Where `plain.base' is.
+ at x [38.779] l.15674 - Where `plain.base' is.
 @!MF_base_default:packed array[1..base_default_length] of char;
 
 @ @<Set init...@>=
@@ -1415,7 +1415,7 @@
 program.
 @z
 
- at x [38.778] Change to pack_buffered_name as with pack_file_name.
+ at x [38.782] l.15703 - Change to pack_buffered_name as with pack_file_name.
 for j:=1 to n do append_to_name(xord[MF_base_default[j]]);
 for j:=a to b do append_to_name(buffer[j]);
 for j:=base_default_length-base_ext_length+1 to base_default_length do
@@ -1433,7 +1433,7 @@
 name_of_file[name_length + 1] := 0;
 @z
 
- at x [38.779] Base file opening: do path searching for the default, not plain.
+ at x [38.783] l.15726 - Base file opening: do path searching for the default, not plain.
   pack_buffered_name(0,loc,j-1); {try first without the system file area}
   if w_open_in(base_file) then goto found;
   pack_buffered_name(base_area_length,loc,j-1);
@@ -1443,7 +1443,7 @@
   pack_buffered_name(0,loc,j-1);
   if w_open_in(base_file) then goto found;
 @z
- at x
+ at x [38.783] l.15732
   wterm_ln('Sorry, I can''t find that base;',' will try PLAIN.');
 @y
   wterm ('Sorry, I can''t find the base `');
@@ -1452,7 +1452,7 @@
   fputs (MF_base_default + 1, stdout);
   wterm_ln ('''.');
 @z
- at x
+ at x [38.783] l.15740
   wterm_ln('I can''t find the PLAIN base file!');
 @.I can't find PLAIN...@>
 @y
@@ -1462,7 +1462,7 @@
 @.I can't find the base...@>
 @z
 
- at x [38.780] make_name_string
+ at x [38.784] l.15763 - make_name_string
   make_name_string:=make_string;
   end;
 @y
@@ -1479,13 +1479,13 @@
   end_name;
 @z
 
- at x [38.781] Make scan_file_name ignore leading tabs as well as spaces.
+ at x [38.785] l.15795 - Make scan_file_name ignore leading tabs as well as spaces.
 while buffer[loc]=" " do incr(loc);
 @y
 while (buffer[loc]=" ")or(buffer[loc]=tab) do incr(loc);
 @z
 
- at x [38.782] `logname' is declared in <unistd.h> on some systems.
+ at x [38.786] l.15805 - `logname' is declared in <unistd.h> on some systems.
 `\.{.base}' and `\.{.tfm}' in the names of \MF's output files.
 @y
 `\.{.base}' and `\.{.tfm}' in the names of \MF's output files.
@@ -1492,7 +1492,7 @@
 @d log_name == texmf_log_name
 @z
 
- at x [38.786] prompt_file_name: avoid empty filenames.
+ at x [38.790] l.15847 - prompt_file_name: avoid empty filenames.
 var @!k:0..buf_size; {index into |buffer|}
 @y
 var @!k:0..buf_size; {index into |buffer|}
@@ -1499,7 +1499,7 @@
 @!saved_cur_name:str_number; {to catch empty terminal input}
 @z
 
- at x [38.786] prompt_file_name: avoid empty filenames.
+ at x [38.790] l.15860 - prompt_file_name: avoid empty filenames.
 clear_terminal; prompt_input(": "); @<Scan file name in the buffer@>;
 if cur_ext="" then cur_ext:=e;
 @y
@@ -1509,19 +1509,19 @@
 if length(cur_name)=0 then cur_name:=saved_cur_name;
 @z
 
- at x [38.787] <Scan file name...> needs similar leading tab treatment.
+ at x [38.791] l.15867 - <Scan file name...> needs similar leading tab treatment.
 while (buffer[k]=" ")and(k<last) do incr(k);
 @y
 while ((buffer[k]=" ")or(buffer[k]=tab))and(k<last) do incr(k);
 @z
 
- at x [38.788] Adjust for C string conventions.
+ at x [38.792] l.15883 - Adjust for C string conventions.
 @!months:packed array [1..36] of char; {abbreviations of month names}
 @y
 @!months:const_cstring;
 @z
 
- at x [38.788] Set correct filename for recorder.
+ at x [38.792] l.15885 - Set correct filename for recorder.
 if job_name=0 then job_name:="mfput";
 @.mfput@>
 pack_job_name(".log");
@@ -1533,13 +1533,13 @@
 pack_job_name(".log");
 @z
 
- at x [38.790] leading character for C string
+ at x [38.794] l.15924 - leading character for C string
 months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
 @y
 months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
 @z
 
- at x [38.790] l.15898 - Print TCX name, if given.
+ at x [38.794] l.15928 - Print TCX name, if given.
 end
 @y
 if translate_filename then begin
@@ -1551,7 +1551,7 @@
 end
 @z
 
- at x [38.793] (start_input) a_open_in of input file needs path specifier.
+ at x [38.797] l.15956 - (start_input) a_open_in of input file needs path specifier.
 begin @<Put the desired file name in |(cur_name,cur_ext,cur_area)|@>;
 if cur_ext="" then cur_ext:=".mf";
 pack_cur_name;
@@ -1576,13 +1576,13 @@
     goto done;
 @z
 
- at x [38.793] l.15938 - The job name may have been given on the command line.
+ at x [38.797] l.15970 - The job name may have been given on the command line.
   begin job_name:=cur_name; open_log_file;
 @y
   begin job_name:=get_job_name(cur_name); open_log_file;
 @z
 
- at x [38.793] Can't return name to string pool because of editor option?
+ at x [38.797] l.15976 - Can't return name to string pool because of editor option?
 if name=str_ptr-1 then {conserve string pool space (but see note above)}
   begin flush_string(name); name:=cur_name;
   end;
@@ -1589,7 +1589,7 @@
 @y
 @z
 
- at x [41.866] Use halfp.
+ at x [41.870] l.17320 - Use halfp.
 major_axis:=half(a_minus_b+a_plus_b); minor_axis:=half(abs(a_plus_b-a_minus_b));
 if major_axis=minor_axis then theta:=0 {circle}
 else theta:=half(n_arg(txx-tyy,tyx+txy)+n_arg(txx+tyy,tyx-txy));
@@ -1599,7 +1599,7 @@
 else theta:=half(n_arg(txx-tyy,tyx+txy)+n_arg(txx+tyy,tyx-txy));
 @z
 
- at x [44.1023] if batchmode, MakeTeX... scripts should be silent.
+ at x [44.1027] l.19871 - if batchmode, MakeTeX... scripts should be silent.
 mode_command: begin print_ln; interaction:=cur_mod;
 @y
 mode_command: begin print_ln; interaction:=cur_mod;
@@ -1610,7 +1610,7 @@
 
 % [45.1120] `threshold' is both a function and a variable.  Since the
 % function is used much less often than the variable, we'll change that
- at x
+ at x [45.1124] l.21405
 @p function threshold(@!m:integer):scaled;
 var @!d:scaled; {lower bound on the smallest interval size}
 begin excess:=min_cover(0)-m;
@@ -1630,19 +1630,19 @@
   threshold_fn:=d;
 @z
 
- at x [45.1121] Change the call to the threshold function.
+ at x [45.1125] l.21428 - Change the call to the threshold function.
 begin d:=threshold(m); perturbation:=0;
 @y
 begin d:=threshold_fn(m); perturbation:=0;
 @z
 
- at x [45.1122] Use halfp.
+ at x [45.1126] l.21443 - Use halfp.
 v:=l+half(value(p)-l);
 @y
 v:=l+halfp(value(p)-l);
 @z
 
- at x [45.1133] Use C macros to do the TFM writing, to avoid casting(?) problems.
+ at x [45.1137] l.21592 - Use C macros to do the TFM writing, to avoid casting(?) problems.
 @d tfm_out(#)==write(tfm_file,#) {output one byte to |tfm_file|}
 
 @p procedure tfm_two(@!x:integer); {output two bytes to |tfm_file|}
@@ -1672,19 +1672,19 @@
 @p procedure tfm_qqqq(@!x:four_quarters); {output four quarterwords to |tfm_file|}
 @z
 
- at x [45.1134] print_file_name
+ at x [45.1138] l.21627 - print_file_name
 print_nl("Font metrics written on "); slow_print(metric_file_name);
 @y
 print_nl("Font metrics written on "); print_file_name(0,metric_file_name,0);
 @z
 
- at x [47.1152] declare gf_buf as a pointer, for dynamic allocated
+ at x [47.1156] l.22122 - declare gf_buf as a pointer, for dynamic allocated
 @!gf_buf:array[gf_index] of eight_bits; {buffer for \.{GF} output}
 @y
 @!gf_buf:^eight_bits; {dynamically-allocated buffer for \.{GF} output}
 @z
 
- at x [47.1154] omit write_gf
+ at x [47.1158] l.22143 - omit write_gf
 @<Declare generic font output procedures@>=
 procedure write_gf(@!a,@!b:gf_index);
 var k:gf_index;
@@ -1696,7 +1696,7 @@
 bytes at a time.
 @z
 
- at x [47.1155] check gf file size
+ at x [47.1159] l.22150 - check gf file size
 each time, we use the macro |gf_out|.
 @y
 each time, we use the macro |gf_out|.
@@ -1706,7 +1706,7 @@
 recursion.
 @z
 
- at x [47.1155] gf_swap: check gf file size
+ at x [47.1159] l.22158 - gf_swap: check gf file size
 begin if gf_limit=gf_buf_size then
 @y
 begin if gf_ptr>(@"7FFFFFFF-gf_offset) then
@@ -1717,7 +1717,7 @@
 if gf_limit=gf_buf_size then
 @z
 
- at x [47.1156] empty the last bytes: check gf file size
+ at x [47.1160] l.22171 - empty the last bytes: check gf file size
 if gf_ptr>0 then write_gf(0,gf_ptr-1)
 @y
 if gf_ptr>(@"7FFFFFFF-gf_offset) then
@@ -1728,7 +1728,7 @@
 if gf_ptr>0 then write_gf(0,gf_ptr-1)
 @z
 
- at x [47.1163] C needs k to be 0..256 instead of 0..255.
+ at x [47.1167] l.22263 - C needs k to be 0..256 instead of 0..255.
 procedure init_gf;
 var @!k:eight_bits; {runs through all possible character codes}
 @y
@@ -1736,13 +1736,13 @@
 var @!k:0..256; {runs through all possible character codes}
 @z
 
- at x [47.1182] print_file_name
+ at x [47.1186] l.22501 - print_file_name
 print_nl("Output written on "); slow_print(output_file_name);
 @y
 print_nl("Output written on "); print_file_name(0,output_file_name,0);
 @z
 
- at x [47.1182] i18n fix
+ at x [47.1186] l.22503 - i18n fix
 print(" ("); print_int(total_chars); print(" character");
 if total_chars<>1 then print_char("s");
 @y
@@ -1751,13 +1751,13 @@
 else print(" character");
 @z
 
- at x [48.1185] INI = VIR.
+ at x [48.1189] l.22533 - INI = VIR.
 base_ident:=" (INIMF)";
 @y
 if ini_version then base_ident:=" (INIMF)";
 @z
 
- at x [48.1186] Add base_engine.
+ at x [48.1190] l.22540 - Add base_engine.
 @!w: four_quarters; {four ASCII codes}
 @y
 @!w: four_quarters; {four ASCII codes}
@@ -1764,7 +1764,7 @@
 @!base_engine: ^text_char;
 @z
 
- at x [48.1187] Add base_engine.
+ at x [48.1191] l.22569 - Add base_engine.
 @!w: four_quarters; {four ASCII codes}
 @y
 @!w: four_quarters; {four ASCII codes}
@@ -1774,7 +1774,7 @@
 @!dummy_xprn: ASCII_code;
 @z
 
- at x [48.1188] Reading and writing of `base_file' is done in C.
+ at x [48.1192] l.22585 - Reading and writing of `base_file' is done in C.
 @d dump_wd(#)==begin base_file^:=#; put(base_file);@+end
 @d dump_int(#)==begin base_file^.int:=#; put(base_file);@+end
 @d dump_hh(#)==begin base_file^.hh:=#; put(base_file);@+end
@@ -1782,7 +1782,7 @@
 @y
 @z
 
- at x [48.1189]
+ at x [48.1193] l.22599
 @d undump_wd(#)==begin get(base_file); #:=base_file^;@+end
 @d undump_int(#)==begin get(base_file); #:=base_file^.int;@+end
 @d undump_hh(#)==begin get(base_file); #:=base_file^.hh;@+end
@@ -1790,7 +1790,7 @@
 @y
 @z
 
- at x [48.1190] Dump engine name.
+ at x [48.1194] l.22615 - Dump engine name.
 dump_int(@$);@/
 @y
 dump_int(@"57324D46);  {Web2C \MF's magic constant: "W2MF"}
@@ -1806,7 +1806,7 @@
 @<Dump |xord|, |xchr|, and |xprn|@>;
 @z
 
- at x [48.1191] Avoid Pascal file convention.
+ at x [48.1195] l.22629 - Avoid Pascal file convention.
 x:=base_file^.int;
 if x<>@$ then goto off_base; {check that strings are the same}
 undump_int(x);
@@ -1853,7 +1853,7 @@
 mem:=xmalloc_array (memory_word, mem_max - mem_min + 1);
 @z
 
- at x [48.1195] l.22714 - Check that p did not become corrupt.
+ at x [48.1199] l.22713 - Check that p did not become corrupt.
 p:=q+node_size(q);
 if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto off_base;
 @y
@@ -1869,7 +1869,7 @@
 p:=q+node_size(q);
 @z
 
- at x [48.1199] l.22750 - Allow command line to override dumped value.
+ at x [48.1203] l.22767 - Allow command line to override dumped value.
 undump(batch_mode)(error_stop_mode)(interaction);
 @y
 undump(batch_mode)(error_stop_mode)(interaction);
@@ -1876,13 +1876,13 @@
 if interaction_option<>unspecified_mode then interaction:=interaction_option;
 @z
 
- at x [48.1199] l.22755 - Test for end-of-file already done by undump.
+ at x [48.1203] l.22772 - Test for end-of-file already done by undump.
 undump_int(x);@+if (x<>69069)or eof(base_file) then goto off_base
 @y
 undump_int(x);@+if x<>69069 then goto off_base
 @z
 
- at x [49.1204] Dynamic allocation.
+ at x [49.1208] l.22858 - Dynamic allocation.
 @p begin @!{|start_here|}
 @y
 @d const_chk(#) == begin if # < inf@&# then # := inf@&# else
@@ -1927,7 +1927,7 @@
 @+tini
 @z
 
- at x [49.1204] Only do get_strings_started if ini.
+ at x [49.1208] l.22870 - Only do get_strings_started if ini.
 @!init if not get_strings_started then goto final_end;
 init_tab; {initialize the tables}
 init_prim; {call |primitive| for each primitive}
@@ -1946,7 +1946,7 @@
 tini@/
 @z
 
- at x [49.1204]
+ at x [49.1208] l.22885
 end_of_MF: close_files_and_terminate;
 final_end: ready_already:=0;
 @y
@@ -1956,7 +1956,7 @@
 
 % [49.1205] close_files_and_terminate: Print new line before
 % termination; switch to editor if necessary.
- at x
+ at x [49.1209] l.22917
     slow_print(log_name); print_char(".");
     end;
   end;
@@ -1969,7 +1969,7 @@
     call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
 @z
 
- at x [49.1209] Only do dump if ini.
+ at x [49.1213] l.23018 - Only do dump if ini.
   begin @!init store_base_file; return;@+tini@/
 @y
   begin
@@ -1982,7 +1982,7 @@
 %if (base_ident=0)or(buffer[loc]="&")or dump_line then
 %@z
 
- at x [51.1214] Add editor-switch variable to globals.
+ at x [51.1218] l.23126 - Add editor-switch variable to globals.
 This section should be replaced, if necessary, by any special
 modifications of the program
 that are necessary to make \MF\ work at a particular installation.

Added: trunk/Build/source/texk/web2c/tests/fix-changefile-lines.py
===================================================================
--- trunk/Build/source/texk/web2c/tests/fix-changefile-lines.py	                        (rev 0)
+++ trunk/Build/source/texk/web2c/tests/fix-changefile-lines.py	2024-06-03 22:32:13 UTC (rev 71417)
@@ -0,0 +1,197 @@
+#!/usr/bin/env python3
+# $Id$
+# Applied to tex.ch and mf.ch on 2024-06-03, following the request at:
+# https://tug.org/pipermail/tex-k/2024-June/004064.html
+"""
+Reads a WEB file and a change file and writes a change file to stdout with
+potentially corrected part, section and line numbers.
+Written by Tyge Thiessen, 2024. Public domain.
+"""
+import re
+import sys
+
+USAGE = f"{sys.argv[0]} <web file> <change file>"
+
+
+def main():
+    if len(sys.argv) != 3:
+        print(USAGE)
+        sys.exit(1)
+
+    # Read WEB file
+    try:
+        web_file = open(sys.argv[1], "r")
+    except OSError:
+        eprint(f"Could not open {sys.argv[1]}")
+        print(USAGE)
+        sys.exit(1)
+    with web_file:
+        web_lines = [line.rstrip() for line in web_file]
+        web_reader = WebReader(web_lines)
+
+    # Read change file
+    try:
+        ch_file = open(sys.argv[2], "r")
+    except OSError:
+        eprint(f"Could not open {sys.argv[2]}")
+        print(USAGE)
+        sys.exit(1)
+    with ch_file:
+        ch_lines = [line.rstrip() for line in ch_file]
+
+    ch_reader = ChangeReader(ch_lines)
+    ch_reader.traverse(web_reader)
+    updated_ch_lines = ch_reader.get_lines()
+
+    for line in updated_ch_lines:
+        print(line)
+
+
+class WebReader:
+    """An iterator that produces the lines of a WEB file while keeping track
+    of the current part and section number.
+    """
+
+    def __init__(self, web_lines):
+        self._web_lines = web_lines
+        self._pos = 0
+        self.part_cnt = 0
+        self.section_cnt = 0
+
+    def next_line(self):
+        """Returns the triple of current part, section and line numbers, as
+        well as the next line. Updates part and section numbers.
+        """
+        if self._pos >= len(self._web_lines):
+            return None
+        line = self._web_lines[self._pos]
+        self._pos += 1
+
+        part = self.part_cnt
+        section = self.section_cnt
+        line_number = self._pos
+
+        part_inc = line.count("@*")
+        self.part_cnt += part_inc
+        self.section_cnt += line.count("@ ") + part_inc
+
+        return (part, section, line_number), line
+
+
+class ChangeReader:
+    """Reads the lines of a change file while updating the tags with
+    information from the corresponding WEB file.
+    """
+
+    def __init__(self, ch_lines):
+        self._lines = ch_lines
+        self._pos = 0
+        self._chunk_start = None
+        self._match_lines = None
+
+    def advance_to_next_chunk(self):
+        """Find the next change chunk. Store where it starts and the lines to be matched."""
+        while self._pos < len(self._lines):
+            line = self._lines[self._pos]
+            if line.startswith("@x"):
+                self._chunk_start = self._pos
+                while True:
+                    self._pos += 1
+                    if self._pos >= len(self._lines):
+                        eprint(
+                            f"ERROR: Missing @y for @x on l.{self._chunk_start + 1} in change file"
+                        )
+                        sys.exit(1)
+                    line = self._lines[self._pos]
+                    if line.startswith("@y"):
+                        self._match_lines = self._lines[
+                            self._chunk_start + 1 : self._pos
+                        ]
+                        return True
+            self._pos += 1
+        return False
+
+    def find_match_in_web(self, web_reader):
+        """Find the match for the current change chunk in the WEB file.
+        Returns the part number and section number just before the first match line,
+        as well as the line number of the first match line in the WEB file.
+        """
+        while True:
+            (part, section, line_number), tex_line = web_reader.next_line()
+            if tex_line is None:
+                eprint("ERROR: Could not find match for line:")
+                eprint(f"  {self._match_lines[0]}")
+                sys.exit(1)
+            if tex_line == self._match_lines[0]:
+                for i in range(1, len(self._match_lines)):
+                    _, tex_line = web_reader.next_line()
+                    if tex_line is None or tex_line != self._match_lines[i]:
+                        eprint("ERROR: Could not match all lines following match line:")
+                        eprint(f"  {self._match_lines[0]}")
+                        sys.exit(1)
+
+                return part, section, line_number
+
+    def traverse(self, web_reader):
+        """Go through all individual change chunks while updating their tags."""
+        while self.advance_to_next_chunk():
+            part, section, line_number = self.find_match_in_web(web_reader)
+
+            # Attempt to catch the case where something is inserted just before
+            # the start of a section.
+            match_start = self._match_lines[0].strip()[:2]
+            repl_start = self._lines[self._pos + 1].strip()[:2]
+            if match_start == "@ ":
+                if repl_start in ["@ ", "@*"]:
+                    section += 1
+            elif match_start == "@*":
+                if repl_start == "@*":
+                    part += 1
+                    section += 1
+                elif repl_start == "@ ":
+                    section += 1
+
+            # Remove leading @x.
+            text = self._lines[self._chunk_start][2:].strip()
+
+            # Remove potentially leading [part.section] tag.
+            pattern = "\\[.*\\]"
+            if re.match(pattern, text):
+                text = re.sub(pattern, "", text).strip()
+
+                # Remove potentially line number information.
+                pattern = "l\\.\\d+"
+                if re.match(pattern, text):
+                    text = re.sub(pattern, "", text)
+                    pattern = " -+ "
+                    # Remove potentially text comment separator.
+                    if re.match(pattern, text):
+                        text = re.sub(pattern, "", text).strip()
+
+            # Create line with standard tag.
+            new_line = f"@x [{part}.{section}] l.{line_number}"
+
+            if text:
+                new_line += f" - {text}"
+
+            ch_line = self._lines[self._chunk_start]
+            if new_line[:10] != ch_line[:10]:
+                print("Old:")
+                print(f"  {ch_line}")
+                print("New:")
+                print(f"  {new_line}")
+                print()
+
+            self._lines[self._chunk_start] = new_line
+
+    def get_lines(self):
+        return self._lines
+
+
+def eprint(*args, **kwargs):
+    """Print to stderr."""
+    print(*args, file=sys.stderr, **kwargs)
+
+
+if __name__ == "__main__":
+    main()


Property changes on: trunk/Build/source/texk/web2c/tests/fix-changefile-lines.py
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision
\ No newline at end of property
Modified: trunk/Build/source/texk/web2c/tex.ch
===================================================================
--- trunk/Build/source/texk/web2c/tex.ch	2024-06-03 20:04:07 UTC (rev 71416)
+++ trunk/Build/source/texk/web2c/tex.ch	2024-06-03 22:32:13 UTC (rev 71417)
@@ -51,16 +51,16 @@
 % of March, 1995 (published as Donald E. Knuth, TeX: The Program,
 % Volume B of Computers & Typesetting).
 
- at x [0.0] l.83 - WEAVE: print changes only.
+ at x [0.0] l.88 - WEAVE: print changes only.
   \def\?##1]{\hbox to 1in{\hfil##1.\ }}
   }
- at y 83
+ at y
   \def\?##1]{\hbox{Changes to ##1.\ }}
   }
 \let\maybe=\iffalse
 @z
 
- at x [1.2] l.185 - MLTeX: add comment about banner line change
+ at x [1.2] l.191 - MLTeX: add comment about banner line change
 November 1984].
 @y
 November 1984].
@@ -72,7 +72,7 @@
 
 @z
 
- at x [1.2] l.188
+ at x [1.2] l.193
 @d banner=='This is TeX, Version 3.141592653' {printed when \TeX\ starts}
 @y
 @d TeX_banner_k=='This is TeXk, Version 3.141592653' {printed when \TeX\ starts}
@@ -82,7 +82,7 @@
 @d banner_k==TeX_banner_k
 @z
 
- at x [1.4] l.233 - program header
+ at x [1.4] l.244 - program header
 Actually the heading shown here is not quite normal: The |program| line
 does not mention any |output| file, because \ph\ would ask the \TeX\ user
 to specify a file name if |output| were specified here.
@@ -91,7 +91,7 @@
 @y
 @z
 
- at x [1.4] l.243 - labels in outer block not needed
+ at x [1.4] l.255 - labels in outer block not needed
 program TEX; {all file names are defined dynamically}
 label @<Labels in the outer block@>@/
 @y
@@ -98,7 +98,7 @@
 program TEX; {all file names are defined dynamically}
 @z
 
- at x [1.6] l.267 - labels in outer block not needed
+ at x [1.6] l.279 - labels in outer block not needed
 @ Three labels must be declared in the main program, so we give them
 symbolic names.
 
@@ -119,7 +119,7 @@
 
 % Here we change these WEB symbols, which are used much as #ifdef's
 % are in C, into something which will get translated into actual #ifdef's.
- at x [1.7] l.292 - debug..gubed, stat..tats
+ at x [1.7] l.304 - debug..gubed, stat..tats
 @d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
 @d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
 @y
@@ -126,7 +126,7 @@
 @d debug==ifdef('TEXMF_DEBUG')
 @d gubed==endif('TEXMF_DEBUG')
 @z
- at x [1.7] l.297 - debug..gubed, stat..tats
+ at x [1.7] l.309 - debug..gubed, stat..tats
 @d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
   usage statistics}
 @d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
@@ -136,12 +136,12 @@
 @d tats==endif('STAT')
 @z
 
- at x [1.8] Somewhat different for `init...tini'..  310 m.8
+ at x [1.8] l.322 - Somewhat different for `init...tini'..  310 m.8
 the codewords `$|init|\ldots|tini|$'.
 
 @d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
 @d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
- at y 314
+ at y
 the codewords `$|init|\ldots|tini|$' for declarations and by the codewords
 `$|Init|\ldots|Tini|$' for executable code.  This distinction is helpful for
 implementations where a run-time switch differentiates between the two
@@ -155,13 +155,13 @@
 @f Tini==end
 @z
 
- at x [1.8] l.319 - init...tini is dynamic
+ at x [1.8] l.331 - init...tini is dynamic
 @!init @<Initialize table entries (done by \.{INITEX} only)@>@;@+tini
- at y  318
+ at y
 @!Init @<Initialize table entries (done by \.{INITEX} only)@>@;@+Tini
 @z
 
- at x [1.11] l.375 - Compile-time constants: most removed for dynamic allocation.
+ at x [1.11] l.389 - Compile-time constants: most removed for dynamic allocation.
 @<Constants...@>=
 @!mem_max=30000; {greatest index in \TeX's internal |mem| array;
   must be strictly less than |max_halfword|;
@@ -291,7 +291,7 @@
 @!sup_expand_depth = 10000000;
 @z
 
- at x [1.12] l.427 - Constants that are WEB numeric macros.
+ at x [1.12] l.441 - Constants that are WEB numeric macros.
 @d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
   must not be less than |mem_min|}
 @d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
@@ -311,7 +311,7 @@
                 if you change this, you should also change |iinf_hyphen_size|.}
 @z
 
- at x [1.16] l.498 - Use C macros for `incr' and `decr'.
+ at x [1.16] l.512 - Use C macros for `incr' and `decr'.
 @d incr(#) == #:=#+1 {increase a variable by unity}
 @d decr(#) == #:=#-1 {decrease a variable by unity}
 @y
@@ -320,13 +320,13 @@
 % The text_char type is used as an array index into xord.  The
 % default type `char' produces signed integers, which are bad array
 % indices in C.
- at x [2.19] l.565 - data type text_char is 8-bit ASCII_code
+ at x [2.19] l.579 - data type text_char is 8-bit ASCII_code
 @d text_char == char {the data type of characters in text files}
 @y
 @d text_char == ASCII_code {the data type of characters in text files}
 @z
 
- at x [2.20] l.579 - printable characters
+ at x [2.20] l.593 - printable characters
 @!xchr: array [ASCII_code] of text_char;
   {specifies conversion of output characters}
 @y
@@ -336,7 +336,7 @@
    { non zero iff character is printable }
 @z
 
- at x [2.23] l.723 - Translate characters if desired, otherwise allow them all.
+ at x [2.23] l.737 - Translate characters if desired, otherwise allow them all.
 for i:=0 to @'37 do xchr[i]:=' ';
 for i:=@'177 to @'377 do xchr[i]:=' ';
 @y
@@ -345,7 +345,7 @@
 for i:=@'177 to @'377 do xchr[i]:=i;
 @z
 
- at x [2.24] l.733 - Don't reinitialize xord.
+ at x [2.24] l.749 - Don't reinitialize xord.
 for i:=0 to @'176 do xord[xchr[i]]:=i;
 @y
 for i:=0 to @'176 do xord[xchr[i]]:=i;
@@ -371,7 +371,7 @@
 %       When echoed to the screen and in the log, character codes
 %       above '177 in file names are shown wrongly (typically as ^@).
 %
- at x [3.26] l.789 - name_of_file is no longer an array
+ at x [3.26] l.803 - name_of_file is no longer an array
 @!name_of_file:packed array[1..file_name_size] of char;@;@/
   {on some systems this may be a \&{record} variable}
 @y
@@ -378,7 +378,7 @@
 @!name_of_file:^text_char;
 @z
 
- at x [3.27] l.794 - Do file opening in C.
+ at x [3.27] l.808 - Do file opening in C.
 @ The \ph\ compiler with which the present version of \TeX\ was prepared has
 extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
 we can write
@@ -438,7 +438,7 @@
 @ All of the file opening functions are defined in C.
 @z
 
- at x [3.28] l.850 - Do file closing in C.
+ at x [3.28] l.864 - Do file closing in C.
 @ Files can be closed with the \ph\ routine `|close(f)|', which
 @:PASCAL H}{\ph@>
 @^system dependencies@>
@@ -465,13 +465,13 @@
 @ And all the file closing routines as well.
 @z
 
- at x [3.30] l.888 - Array size of input buffer is determined at runtime.
+ at x [3.30] l.903 - Array size of input buffer is determined at runtime.
 @!buffer:array[0..buf_size] of ASCII_code; {lines of characters being read}
 @y
 @!buffer:^ASCII_code; {lines of characters being read}
 @z
 
- at x [3.31] l.933 - Do `input_ln' in C.
+ at x [3.31] l.948 - Do `input_ln' in C.
 @p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
   {inputs the next line or returns |false|}
 var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
@@ -502,7 +502,7 @@
 
 % [3.32] `term_in' and `term_out' are standard input and output.
 % Declare the variables that used to be constants.
- at x [3.32] l.961 - `term_in' and `term_out' are standard input and output.
+ at x [3.32] l.975 - `term_in' and `term_out' are standard input and output.
 @<Glob...@>=
 @!term_in:alpha_file; {the terminal as an input file}
 @!term_out:alpha_file; {the terminal as an output file}
@@ -589,7 +589,7 @@
 @!insert_src_special_every_display : boolean;
 @z
 
- at x [3.33] l.964 - We don't need to open terminal files.
+ at x [3.33] l.979 - We don't need to open terminal files.
 @ Here is how to open the terminal files
 in \ph. The `\.{/I}' switch suppresses the first |get|.
 @:PASCAL H}{\ph@>
@@ -605,7 +605,7 @@
 @d t_open_out == {output already open for text output}
 @z
 
- at x [3.34] l.982 - Flushing output to terminal files.
+ at x [3.34] l.998 - Flushing output to terminal files.
 these operations can be specified in \ph:
 @:PASCAL H}{\ph@>
 @^system dependencies@>
@@ -622,7 +622,7 @@
 @d clear_terminal == do_nothing
 @z
 
- at x [3.35] l.1017 - needed for e-TeX, but differently
+ at x [3.35] l.1034 - needed for e-TeX, but differently
 @<Report overflow of the input buffer, and abort@>=
 if format_ident=0 then
   begin write_ln(term_out,'Buffer size exceeded!'); goto final_end;
@@ -636,7 +636,7 @@
   begin cur_input.loc_field:=first; cur_input.limit_field:=last-1;
 @z
 
- at x [3.37] l.1055 - |init_terminal|, reading the command line.
+ at x [3.37] l.1072 - |init_terminal|, reading the command line.
 @ The following program does the required initialization
 without retrieving a possible command line.
 It should be clear how to modify this routine to deal with command lines,
@@ -664,13 +664,13 @@
   end;
 @z
 
- at x [3.37] l.1068 - |init_terminal|, output missing newline.
+ at x [3.37] l.1085 - |init_terminal|, output missing newline.
     write(term_out,'! End of file on the terminal... why?');
 @y
     write_ln(term_out,'! End of file on the terminal... why?');
 @z
 
- at x [4.38] l.1126 - Array size for string pool is determined at runtime.
+ at x [4.38] l.1144 - Array size for string pool is determined at runtime.
 @!pool_pointer = 0..pool_size; {for variables that point into |str_pool|}
 @!str_number = 0..max_strings; {for variables that point into |str_start|}
 @y
@@ -678,7 +678,7 @@
 @!str_number = 0..ssup_max_strings; {for variables that point into |str_start|}
 @z
 
- at x [4.39] l.1131 - Dynamically size pool arrays.
+ at x [4.39] l.1149 - Dynamically size pool arrays.
 @!str_pool:packed array[pool_pointer] of packed_ASCII_code; {the characters}
 @!str_start : array[str_number] of pool_pointer; {the starting pointers}
 @y
@@ -686,7 +686,7 @@
 @!str_start : ^pool_pointer; {the starting pointers}
 @z
 
- at x [4.47] l.1237 - string recycling
+ at x [4.47] l.1255 - string recycling
 @p @!init function get_strings_started:boolean; {initializes the string pool,
 @y
 @p @t\4@>@<Declare additional routines for string recycling@>@/
@@ -694,7 +694,7 @@
 @!init function get_strings_started:boolean; {initializes the string pool,
 @z
 
- at x [4.49] l.1272 -- Change documentation (probably needed in more places)
+ at x [4.49] l.1290 - Change documentation (probably needed in more places)
 would like string @'32 to be the single character @'32 instead of the
 @y
 would like string @'32 to be printed as the single character @'32
@@ -705,7 +705,7 @@
 % assignments directly.  (`strcpy' and `strlen' work here because
 % `pool_name' is a constant string, and thus ends in a null and doesn't
 % start with a space.)
- at x [4.51] l.1314 - Open the pool file.
+ at x [4.51] l.1332 - Open the pool file.
 name_of_file:=pool_name; {we needn't set |name_length|}
 if a_open_in(pool_file) then
 @y
@@ -715,12 +715,12 @@
 if a_open_in (pool_file, kpse_texpool_format) then
 @z
 
- at x [4.51] l.1322 - Make `TEX.POOL' lowercase, and change how it's read.
+ at x [4.51] l.1340 - Make `TEX.POOL' lowercase, and change how it's read.
 else  bad_pool('! I can''t read TEX.POOL.')
 @y
 else  bad_pool('! I can''t read ', pool_name, '; bad path?')
 @z
- at x [4.52] l.1326 - Make `TEX.POOL' lowercase, and change how it's read.
+ at x [4.52] l.1344 - Make `TEX.POOL' lowercase, and change how it's read.
 begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
 @.TEX.POOL has no check sum@>
 read(pool_file,m,n); {read two digits of string length}
@@ -729,17 +729,17 @@
 @.TEX.POOL has no check sum@>
 read(pool_file,m); read(pool_file,n); {read two digits of string length}
 @z
- at x [4.52] l.1332 - Make `TEX.POOL' lowercase, and change how it's read.
+ at x [4.52] l.1350 - Make `TEX.POOL' lowercase, and change how it's read.
     bad_pool('! TEX.POOL line doesn''t begin with two digits.');
 @y
     bad_pool('! ', pool_name, ' line doesn''t begin with two digits.');
 @z
- at x [4.53] l.1354 - Make `TEX.POOL' lowercase, and change how it's read.
+ at x [4.53] l.1372 - Make `TEX.POOL' lowercase, and change how it's read.
   bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
 @y
   bad_pool('! ', pool_name, ' check sum doesn''t have nine digits.');
 @z
- at x [4.53] l.1360 - Make `TEX.POOL' lowercase, and change how it's read.
+ at x [4.53] l.1378 - Make `TEX.POOL' lowercase, and change how it's read.
 done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
 @y
 done: if a<>@$ then
@@ -746,13 +746,13 @@
   bad_pool('! ', pool_name, ' doesn''t match; tangle me again (or fix the path).');
 @z
 
- at x [5.54] l.1422 - error_line
+ at x [5.54] l.1440 - error_line
 @!trick_buf:array[0..error_line] of ASCII_code; {circular buffer for
 @y
 @!trick_buf:array[0..ssup_error_line] of ASCII_code; {circular buffer for
 @z
 
- at x l.1536 --  If the ``src-specials'' feature is active, change the banner.
+ at x [5.61] l.1574 - If the ``src-specials'' feature is active, change the banner.
 wterm(banner);
 @y
 if src_specials_p or file_line_error_style_p or parse_first_line_p then
@@ -761,7 +761,7 @@
   wterm(banner);
 @z
 
- at x [5.61] l.1556 - Print rest of banner.
+ at x [5.61] l.1575 - Print rest of banner.
 if format_ident=0 then wterm_ln(' (no format preloaded)')
 else  begin slow_print(format_ident); print_ln;
   end;
@@ -787,7 +787,7 @@
 end;
 @z
 
- at x [5.71] term_input: set limit when fatal_error
+ at x [5.71] l.1713 - term_input: set limit when fatal_error
 if not input_ln(term_in,true) then fatal_error("End of file on the terminal!");
 @y
 if not input_ln(term_in,true) then begin
@@ -794,7 +794,7 @@
   limit:=0; fatal_error("End of file on the terminal!"); end;
 @z
 
- at x [6.73] l.1732 - Add unspecified_mode.
+ at x [6.73] l.1750 - Add unspecified_mode.
 @d error_stop_mode=3 {stops at every opportunity to interact}
 @y
 @d error_stop_mode=3 {stops at every opportunity to interact}
@@ -801,7 +801,7 @@
 @d unspecified_mode=4 {extra value for command-line switch}
 @z
 
- at x [6.73] l.1734 - file:line:error style error messages.
+ at x [6.73] l.1752 - file:line:error style error messages.
   print_nl("! "); print(#);
 @y
   if file_line_error_style_p then print_file_line
@@ -810,7 +810,7 @@
 @z
 
 
- at x [6.73] l.1738 - Add interaction_option.
+ at x [6.73] l.1756 - Add interaction_option.
 @!interaction:batch_mode..error_stop_mode; {current level of interaction}
 @y
 @!interaction:batch_mode..error_stop_mode; {current level of interaction}
@@ -817,7 +817,7 @@
 @!interaction_option:batch_mode..unspecified_mode; {set from command line}
 @z
 
- at x [6.74] l.1740 - Allow override by command line switch.
+ at x [6.74] l.1758 - Allow override by command line switch.
 @ @<Set init...@>=interaction:=error_stop_mode;
 @y
 @ @<Set init...@>=if interaction_option=unspecified_mode then
@@ -830,7 +830,7 @@
 % Plus, it's nicer just to do an exit with the appropriate status code
 % under Unix.  We call it `uexit' because there's a WEB symbol called
 % `exit' already.  We use a C macro to change `uexit' back to `exit'.
- at x [6.81] l.1852 - Eliminate nonlocal goto, since C doesn't have them.
+ at x [6.81] l.1860 - Eliminate nonlocal goto, since C doesn't have them.
 @ The |jump_out| procedure just cuts across all active procedure levels and
 goes to |end_of_TEX|. This is the only nontrivial |@!goto| statement in the
 whole program. It is used when there is no recovery from a particular error.
@@ -871,7 +871,7 @@
 end;
 @z
 
- at x [6.82] l.1866 - halt on error?
+ at x [6.82] l.1884 - halt on error?
 print_char("."); show_context;
 @y
 print_char("."); show_context;
@@ -885,7 +885,7 @@
 end;
 @z
 
- at x [6.84] l.1904 - Implement the switch-to-editor option.
+ at x [6.84] l.1908 - Implement the switch-to-editor option.
 line ready to be edited. But such an extension requires some system
 wizardry, so the present implementation simply types out the name of the
 file that should be
@@ -910,7 +910,7 @@
 @d edit_file==input_stack[base_ptr]
 @z
 
- at x [6.84] l.1903 - Implement the switch-to-editor option.
+ at x [6.84] l.1923 - Implement the switch-to-editor option.
 "E": if base_ptr>0 then if input_stack[base_ptr].name_field>=256 then
   begin print_nl("You want to edit file ");
 @.You want to edit file x@>
@@ -926,19 +926,19 @@
     jump_out;
 @z
 
- at x [6.93] l.2056 - Declare fatal_error as noreturn.
+ at x [6.93] l.2062 - Declare fatal_error as noreturn.
 procedure fatal_error(@!s:str_number); {prints |s|, and that's it}
 @y
 noreturn procedure fatal_error(@!s:str_number); {prints |s|, and that's it}
 @z
 
- at x [6.94] l.2065 - Declare overflow as noreturn.
+ at x [6.94] l.2071 - Declare overflow as noreturn.
 procedure overflow(@!s:str_number;@!n:integer); {stop due to finiteness}
 @y
 noreturn procedure overflow(@!s:str_number;@!n:integer); {stop due to finiteness}
 @z
 
- at x [6.95] l.2084 - Declare confusion as noreturn.
+ at x [6.95] l.2090 - Declare confusion as noreturn.
 procedure confusion(@!s:str_number);
 @y
 noreturn procedure confusion(@!s:str_number);
@@ -946,7 +946,7 @@
 
 % [7.104] `remainder' is a library routine on some systems, so change
 % its name to avoid conflicts.
- at x [7.104] l.2227 - avoid name conflicts with lib routine remainder()
+ at x [7.104] l.2248 - avoid name conflicts with lib routine remainder()
 |remainder|, holds the remainder after a division.
 
 @<Glob...@>=
@@ -958,7 +958,7 @@
 @<Glob...@>=
 @z
 
- at x [7.109] l.2352 - Define glue_ratio in C.
+ at x [7.109] l.2373 - Define glue_ratio in C.
 @!glue_ratio=real; {one-word representation of a glue expansion factor}
 @y
 @z
@@ -965,15 +965,15 @@
 
 % [8.110] Make it easy to change constants.  Do not increase
 % max_quarterword without changing the memoryword structure in `texmfmem.h'.
- at x [8.110] l.2422 - increase |max_halfword|
+ at x [8.110] l.2428 - increase |max_halfword|
 @d min_halfword==0 {smallest allowable value in a |halfword|}
 @d max_halfword==65535 {largest allowable value in a |halfword|}
- at y 2424
+ at y
 @d min_halfword==-@"FFFFFFF {smallest allowable value in a |halfword|}
 @d max_halfword==@"FFFFFFF {largest allowable value in a |halfword|}
 @z
 
- at x [8.111] l.2435 - min_halfword and max_halfword
+ at x [8.111] l.2441 - min_halfword and max_halfword
 if (mem_min<min_halfword)or(mem_max>=max_halfword)or@|
   (mem_bot-mem_min>max_halfword+1) then bad:=14;
 @y
@@ -981,7 +981,7 @@
   (mem_top+sup_main_memory>=max_halfword) then bad:=14;
 @z
 
- at x [8.111] l.2437 - max_font_max
+ at x [8.111] l.2443 - max_font_max
 if (font_base<min_quarterword)or(font_max>max_quarterword) then bad:=15;
 if font_max>font_base+256 then bad:=16;
 @y
@@ -989,7 +989,7 @@
 if font_max>font_base+max_font_max then bad:=16;
 @z
 
- at x [8.112] l.2450 - Efficiency.
+ at x [8.112] l.2456 - Efficiency.
 macros are simplified in the obvious way when |min_quarterword=0|.
 @^inner loop@>@^system dependencies@>
 
@@ -1019,7 +1019,7 @@
 
 % [8.113] We've put the memory structure into the include file
 % `texmf.h', since it's too hard to translate automatically.
- at x [8.113] l.2453 - data structures for main memory
+ at x [8.113] l.2474 - data structures for main memory
 @!quarterword = min_quarterword..max_quarterword; {1/4 of a word}
 @!halfword=min_halfword..max_halfword; {1/2 of a word}
 @!two_choices = 1..2; {used when there are two variants in a record}
@@ -1053,7 +1053,7 @@
 
 % [9.116] Change `mem' to `zmem', so we can define mem to be a register
 % pointer to the memory array for speed.
- at x [9.116] l.2545 - definition of main memory array
+ at x [9.116] l.2566 - definition of main memory array
 @!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
 @y
 @!yzmem : ^memory_word; {the big dynamic storage area}
@@ -1060,7 +1060,7 @@
 @!zmem : ^memory_word; {the big dynamic storage area}
 @z
 
- at x [10.144] l.3006 - font numbers can be >255 now.
+ at x [10.144] l.3027 - font numbers can be >255 now.
 @p function new_ligature(@!f,@!c:quarterword; @!q:pointer):pointer;
 @y
 @p function new_ligature(@!f:internal_font_number; @!c:quarterword;
@@ -1069,7 +1069,7 @@
 
 % [11.165] Fix the word `free' so that it doesn't conflict with the
 % standard C library routine of the same name.
- at x [11.165] l.3364 - avoid conflict with lib function free()
+ at x [11.165] l.3385 - avoid conflict with lib function free()
 are debugging.)
 @y
 are debugging.)
@@ -1077,7 +1077,7 @@
 @d free==free_arr
 @z
 
- at x [11.165] l.3367 - dummy |free| and |was_free| arrays
+ at x [11.165] l.3388 - dummy |free| and |was_free| arrays
 @!debug @!free: packed array [mem_min..mem_max] of boolean; {free cells}
 @t\hskip10pt@>@!was_free: packed array [mem_min..mem_max] of boolean;
 @y
@@ -1086,13 +1086,13 @@
 @t\hskip10pt@>@!was_free: packed array [0..9] of boolean;
 @z
 
- at x [12.174] l.3526 - Eliminate unsigned comparisons to zero.
+ at x [12.174] l.3547 - Eliminate unsigned comparisons to zero.
         begin if (font(p)<font_base)or(font(p)>font_max) then
 @y
         begin if (font(p)>font_max) then
 @z
 
- at x [12.176] l.3563 - Eliminate unsigned comparisons to zero.
+ at x [12.176] l.3584 - Eliminate unsigned comparisons to zero.
 @p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
 begin if p>mem_end then print_esc("CLOBBERED.")
 else  begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
@@ -1102,10 +1102,10 @@
 else  begin if (font(p)>font_max) then print_char("*")
 @z
 
- at x [12.186] l.3747 - Don't worry about strange floating point values.
+ at x [12.186] l.3768 - Don't worry about strange floating point values.
   if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?")
   else if abs(g)>float_constant(20000) then
- at y 3747
+ at y
   { The Unix |pc| folks removed this restriction with a remark that
     invalid bit patterns were vanishingly improbable, so we follow
     their example without really understanding it.
@@ -1115,7 +1115,7 @@
 @z
 
 
- at x [15.209] l.4165 - MLTeX: \charsubdef primitive
+ at x [15.209] l.4186 - MLTeX: \charsubdef primitive
 @d shorthand_def=95 {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)}
 @y
 @d shorthand_def=95 {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)}
@@ -1126,7 +1126,7 @@
 % can not be translated. For example, messages printed by |print_mode|
 % from [16.211] use different word order and [46.1049] use different
 % word order and words are declined.
- at x [16.211] l.4256
+ at x [16.211] l.4259
 begin if m>0 then
   case m div (max_command+1) of
   0:print("vertical");
@@ -1172,13 +1172,13 @@
 end;
 @z
 
- at x [16.213] l.4321 - texarray
+ at x [16.213] l.4342 - texarray
 @!nest:array[0..nest_size] of list_state_record;
 @y
 @!nest:^list_state_record;
 @z
 
- at x [16.215] l.4344 - remove mem[] reference from initialize.
+ at x [16.215] l.4365 - reference from initialize.
 prev_graf:=0; shown_mode:=0;
 @<Start a new current page@>;
 @y
@@ -1189,7 +1189,7 @@
 page_depth:=0; page_max_depth:=0;
 @z
 
- at x [16.219] l.4409 - i18n fix
+ at x [16.219] l.4430 - i18n fix
     print_int(nest[p].pg_field); print(" line");
     if nest[p].pg_field<>1 then print_char("s");
 @y
@@ -1198,7 +1198,7 @@
     else print(" line");
 @z
 
- at x [17.220] l.4448 - MLTeX: char_sub_code_base
+ at x [17.220] l.4469 - MLTeX: char_sub_code_base
 paragraph shape.
 @y
 paragraph shape.
@@ -1206,7 +1206,7 @@
 substitution definitions.
 @z
 
- at x [17.222] l.4523 - frozen_special, for source specials.
+ at x [17.222] l.4543 - frozen_special, for source specials.
 @d frozen_null_font=frozen_control_sequence+10
 @y
 @d frozen_special=frozen_control_sequence+10
@@ -1214,13 +1214,13 @@
 @d frozen_null_font=frozen_control_sequence+11
 @z
 
- at x [17.222] l.4526 - max_font_max
+ at x [17.222] l.4547 - max_font_max
 @d undefined_control_sequence=frozen_null_font+257 {dummy location}
 @y
 @d undefined_control_sequence=frozen_null_font+max_font_max+1 {dummy location}
 @z
 
- at x [17.222] l.4533 - hash_extra
+ at x [17.222] l.4554 - hash_extra
 for k:=active_base to undefined_control_sequence-1 do
   eqtb[k]:=eqtb[undefined_control_sequence];
 @y
@@ -1228,7 +1228,7 @@
   eqtb[k]:=eqtb[undefined_control_sequence];
 @z
 
- at x [17.230] l.4731 - MLTeX: char_sub_code_base
+ at x [17.230] l.4752 - MLTeX: char_sub_code_base
 @d int_base=math_code_base+256 {beginning of region 5}
 @y
 @d char_sub_code_base=math_code_base+256 {table of character substitutions}
@@ -1235,7 +1235,7 @@
 @d int_base=char_sub_code_base+256 {beginning of region 5}
 @z
 
- at x [17.230] l.4752 - MLTeX: char_sub_code_base
+ at x [17.230] l.4773 - MLTeX: char_sub_code_base
   {Note: |math_code(c)| is the true math code plus |min_halfword|}
 @y
   {Note: |math_code(c)| is the true math code plus |min_halfword|}
@@ -1244,7 +1244,7 @@
 @z
 
 % MLTeX: \charsubdefmax and \tracingcharsubdef
- at x [17.236] l.4954
+ at x [17.236] l.4975
 @d int_pars=55 {total number of integer parameters}
 @y
 @d tex_int_pars=55 {total number of \TeX's integer parameters}
@@ -1259,7 +1259,7 @@
 @z
 
 % MLTeX: \charsubdefmax and \tracingcharsubdef
- at x [17.236] l.5016
+ at x [17.236] l.5037
 @d error_context_lines==int_par(error_context_lines_code)
 @y
 @d error_context_lines==int_par(error_context_lines_code)
@@ -1270,7 +1270,7 @@
 @z
 
 % MLTeX: \charsubdefmax and \tracingcharsubdef
- at x [17.237] l.5080
+ at x [17.237] l.5101
 error_context_lines_code:print_esc("errorcontextlines");
 @y
 error_context_lines_code:print_esc("errorcontextlines");
@@ -1280,7 +1280,7 @@
 @z
 
 % MLTeX: \charsubdefmax and \tracingcharsubdef
- at x [17.238] l.5200
+ at x [17.238] l.5221
 @!@:error_context_lines_}{\.{\\errorcontextlines} primitive@>
 @y
 @!@:error_context_lines_}{\.{\\errorcontextlines} primitive@>
@@ -1296,7 +1296,7 @@
   end;
 @z
 
- at x [17.240] l.5213 - MLTeX: \charsubdefmax and \tracingcharsubdef
+ at x [17.240] l.5234 - MLTeX: \charsubdefmax and \tracingcharsubdef
 for k:=int_base to del_code_base-1 do eqtb[k].int:=0;
 @y
 for k:=int_base to del_code_base-1 do eqtb[k].int:=0;
@@ -1305,7 +1305,7 @@
 {|tracing_char_sub_def:=0| is already done}@/
 @z
 
- at x [17.241] l.5219 - Do `fix_date_and_time' in C.
+ at x [17.241] l.5240 - Do `fix_date_and_time' in C.
 @ The following procedure, which is called just before \TeX\ initializes its
 input and output, establishes the initial values of the date and time.
 @^system dependencies@>
@@ -1335,7 +1335,7 @@
 begin date_and_time(sys_time,sys_day,sys_month,sys_year);
 @z
 
- at x [17.252] l.5420 - hash_extra
+ at x [17.252] l.5447 - hash_extra
 else if n<glue_base then @<Show equivalent |n|, in region 1 or 2@>
 @y
 else if (n<glue_base) or ((n>eqtb_size)and(n<=eqtb_top)) then
@@ -1342,13 +1342,13 @@
   @<Show equivalent |n|, in region 1 or 2@>
 @z
 
- at x [17.253] l.5435 - Change eqtb to zeqtb.
+ at x [17.253] l.5462 - Change eqtb to zeqtb.
 @!eqtb:array[active_base..eqtb_size] of memory_word;
 @y
 @!zeqtb:^memory_word;
 @z
 
- at x [18.256] l.5483 - hash_extra
+ at x [18.256] l.5510 - hash_extra
 @!hash: array[hash_base..undefined_control_sequence-1] of two_halves;
   {the hash table}
 @!hash_used:pointer; {allocation pointer for |hash|}
@@ -1362,13 +1362,13 @@
 @!hash_high:pointer; {pointer to next high hash location}
 @z
 
- at x [18.257] l.5491 - hash_extra
+ at x [18.257] l.5518 - hash_extra
 next(hash_base):=0; text(hash_base):=0;
 for k:=hash_base+1 to undefined_control_sequence-1 do hash[k]:=hash[hash_base];
 @y
 @z
 
- at x [18.258] l.5495 - hash_extra
+ at x [18.258] l.5522 - hash_extra
 hash_used:=frozen_control_sequence; {nothing is used}
 @y
 hash_used:=frozen_control_sequence; {nothing is used}
@@ -1375,7 +1375,7 @@
 hash_high:=0;
 @z
 
- at x [18.260] l.5531 - hash_extra
+ at x [18.260] l.5558 - hash_extra
 @ @<Insert a new control...@>=
 begin if text(p)>0 then
   begin repeat if hash_is_full then overflow("hash size",hash_size);
@@ -1401,7 +1401,7 @@
   end;
 @z
 
- at x [18.262] l.5583 - hash_extra
+ at x [18.262] l.5610 - hash_extra
 else if p>=undefined_control_sequence then print_esc("IMPOSSIBLE.")
 @y
 else if ((p>=undefined_control_sequence)and(p<=eqtb_size))or(p>eqtb_top) then
@@ -1408,25 +1408,25 @@
   print_esc("IMPOSSIBLE.")
 @z
 
- at x [18.262] l.5584 - Remove more unsigned comparisons to zero.
+ at x [18.262] l.5611 - Remove more unsigned comparisons to zero.
 else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.")
 @y
 else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.")
 @z
 
- at x [19.271] l.5872 - texarray
+ at x [19.271] l.5899 - texarray
 @!save_stack : array[0..save_size] of memory_word;
 @y
 @!save_stack : ^memory_word;
 @z
 
- at x [19.283] l.6050 - hash_extra
+ at x [19.283] l.6077 - hash_extra
 if p<int_base then
 @y
 if (p<int_base)or(p>eqtb_size) then
 @z
 
- at x [20.290] l.6158 - hash_extra
+ at x [20.290] l.6185 - hash_extra
 if cs_token_flag+undefined_control_sequence>max_halfword then bad:=21;
 @y
 if cs_token_flag+eqtb_size+hash_extra>max_halfword then bad:=21;
@@ -1433,13 +1433,13 @@
 if (hash_offset<0)or(hash_offset>hash_base) then bad:=42;
 @z
 
- at x [22.301] l.6432 - texarray
+ at x [22.301] l.6459 - texarray
 @!input_stack : array[0..stack_size] of in_state_record;
 @y
 @!input_stack : ^in_state_record;
 @z
 
- at x [22.304] l.6536 - texarray; additions for file:line:error style.
+ at x [22.304] l.6563 - texarray; additions for file:line:error style.
 @!input_file : array[1..max_in_open] of alpha_file;
 @!line : integer; {current line number in the current source file}
 @!line_stack : array[1..max_in_open] of integer;
@@ -1451,7 +1451,7 @@
 @!full_source_filename_stack : ^str_number;
 @z
 
- at x [22.306] l.6855 - i18n fix
+ at x [22.306] l.6615 - i18n fix
   begin print_nl("Runaway ");
 @.Runaway...@>
   case scanner_status of
@@ -1479,7 +1479,7 @@
   end; {there are no other cases}
 @z
 
- at x [22.308] l.6701 - texarray
+ at x [22.308] l.6728 - texarray
 @!param_stack:array [0..param_size] of pointer;
   {token list pointers for parameters}
 @y
@@ -1487,7 +1487,7 @@
   {token list pointers for parameters}
 @z
 
- at x [23.328] l.7043 - keep top of source_filename_stack initialized
+ at x [23.328] l.7064 - keep top of source_filename_stack initialized
 incr(in_open); push_input; index:=in_open;
 @y
 incr(in_open); push_input; index:=in_open;
@@ -1494,7 +1494,7 @@
 source_filename_stack[index]:=0;full_source_filename_stack[index]:=0;
 @z
 
- at x [23.331] l.7071 - init source file name stacks
+ at x [23.331] l.7092 - init source file name stacks
 begin input_ptr:=0; max_in_stack:=0;
 @y
 begin input_ptr:=0; max_in_stack:=0;
@@ -1501,12 +1501,12 @@
 source_filename_stack[0]:=0;full_source_filename_stack[0]:=0;
 @z
 
- at x [24.338] l.7164 - i18n fix
+ at x [24.338] l.7191 - i18n fix
 print(" while scanning ");
 @y
 @z
 
- at x [24.339] l.7185 - i18n fix
+ at x [24.339] l.7213 - i18n fix
 defining:begin print("definition"); info(p):=right_brace_token+"}";
   end;
 matching:begin print("use"); info(p):=par_token; long_state:=outer_call;
@@ -1561,7 +1561,7 @@
   end
 @z
 
- at x [28.501] l.9747 - \eof18
+ at x [28.501] l.9765 - \eof18
 if_eof_code: begin scan_four_bit_int; b:=(read_open[cur_val]=closed);
   end;
 @y
@@ -1571,7 +1571,7 @@
   end;
 @z
 
- at x [29.513] l.9951 - Area and extension rules for filenames.
+ at x [29.513] l.9983 - Area and extension rules for filenames.
 @ The file names we shall deal with for illustrative purposes have the
 following structure:  If the name contains `\.>' or `\.:', the file area
 consists of all characters up to and including the final such character;
@@ -1588,7 +1588,7 @@
 `\..' to the end, otherwise the file extension is null.
 @z
 
- at x [29.513] l.9963 - Area and extension rules for filenames.
+ at x [29.513] l.9995 - Area and extension rules for filenames.
 @!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any}
 @!ext_delimiter:pool_pointer; {the relevant `\..', if any}
 @y
@@ -1596,7 +1596,7 @@
 @!ext_delimiter:pool_pointer; {the most recent `\..', if any}
 @z
 
- at x [29.514] l.9973 - TeX area directories.
+ at x [29.514] l.10005 - TeX area directories.
 @d TEX_area=="TeXinputs:"
 @.TeXinputs@>
 @d TEX_font_area=="TeXfonts:"
@@ -1605,13 +1605,13 @@
 In C, the default paths are specified separately.
 @z
 
- at x [29.515] l.9995 - filenames: quoted
+ at x [29.515] l.10014 - filenames: quoted
 begin area_delimiter:=0; ext_delimiter:=0;
 @y
 begin area_delimiter:=0; ext_delimiter:=0; quoted_filename:=false;
 @z
 
- at x [29.516] l.9992 - filenames: more_name
+ at x [29.516] l.10024 - filenames: more_name
 begin if c=" " then more_name:=false
 @y
 begin if (c=" ") and stop_at_space and (not quoted_filename) then
@@ -1622,19 +1622,19 @@
   end
 @z
 
- at x [29.516] l.9994 - filenames: more_name
+ at x [29.516] l.10026 - filenames: more_name
   if (c=">")or(c=":") then
 @y
   if IS_DIR_SEP(c) then
 @z
 
- at x [29.516] l.9997 - filenames: more_name
+ at x [29.516] l.10029 - filenames: more_name
   else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
 @y
   else if c="." then ext_delimiter:=cur_length;
 @z
 
- at x [29.517] l.10002 - end_name: string recycling
+ at x [29.517] l.10034 - end_name: string recycling
 @ The third.
 @^system dependencies@>
 
@@ -1654,7 +1654,7 @@
 @!must_quote:boolean; {whether we need to quote a string}
 @z
 
- at x [29.517] l.10022 - end_name: spaces in filenames
+ at x [29.517] l.10040 - end_name: spaces in filenames
 @:TeX capacity exceeded number of strings}{\quad number of strings@>
 @y
 @:TeX capacity exceeded number of strings}{\quad number of strings@>
@@ -1713,7 +1713,7 @@
   end;
 @z
 
- at x [29.517] l.10011 - end_name: string recycling
+ at x [29.517] l.10044 - end_name: string recycling
   end;
 if ext_delimiter=0 then
   begin cur_ext:=""; cur_name:=make_string;
@@ -1732,7 +1732,7 @@
   begin cur_ext:=""; cur_name:=slow_make_string;
 @z
 
- at x [29.517] l.10016 - end_name: string recycling
+ at x [29.517] l.10050 - end_name: string recycling
   incr(str_ptr); cur_ext:=make_string;
 @y
   incr(str_ptr); cur_ext:=make_string;
@@ -1749,7 +1749,7 @@
   cur_ext:=slow_make_string;  {remake extension string}
 @z
 
- at x [29.518] l.10042 - print_file_name: quote if spaces in names.
+ at x [29.518] l.10056 - print_file_name: quote if spaces in names.
 some operating systems put the file area last instead of first.)
 @^system dependencies@>
 @y
@@ -1771,7 +1771,7 @@
       print(so(str_pool[j]))
 @z
 
- at x [29.518] l.10042 - print_file_name: quote if spaces in names.
+ at x [29.518] l.10061 - print_file_name: quote if spaces in names.
 begin slow_print(a); slow_print(n); slow_print(e);
 @y
 var must_quote: boolean; {whether to quote the filename}
@@ -1790,7 +1790,7 @@
 if must_quote then print_char("""");
 @z
 
- at x [29.519] l.10051 - have append_to_name skip quotes.
+ at x [29.519] l.10070 - have append_to_name skip quotes.
 @d append_to_name(#)==begin c:=#; incr(k);
   if k<=file_name_size then name_of_file[k]:=xchr[c];
   end
@@ -1802,7 +1802,7 @@
 
 % [29.519] In pack_file_name, leave room for the extra null we append at
 % the end of a filename.
- at x [29.519] l.10047 - pack_file_name, leave room for the extra null
+ at x [29.519] l.10078 - pack_file_name, leave room for the extra null
 begin k:=0;
 @y
 begin k:=0;
@@ -1810,13 +1810,13 @@
 name_of_file:= xmalloc_array (ASCII_code, length(a)+length(n)+length(e)+1);
 @z
 
- at x [29.519] l.10051 - pack_file_name, append the extra null
+ at x [29.519] l.10083 - pack_file_name, append the extra null
 for k:=name_length+1 to file_name_size do name_of_file[k]:=' ';
 @y
 name_of_file[name_length+1]:=0;
 @z
 
- at x [29.520] l.10060 - filenames: default format.
+ at x [29.520] l.10092 - filenames: default format.
 @d format_default_length=20 {length of the |TEX_format_default| string}
 @d format_area_length=11 {length of its area part}
 @d format_ext_length=4 {length of its `\.{.fmt}' part}
@@ -1829,7 +1829,7 @@
 @d format_ext_length=4 {length of its `\.{.fmt}' part}
 @z
 
- at x [29.521] l.10066 - filenames: default format, where `plain.fmt' is.
+ at x [29.520] l.10098 - filenames: default format, where `plain.fmt' is.
 @!TEX_format_default:packed array[1..format_default_length] of char;
 
 @ @<Set init...@>=
@@ -1843,7 +1843,7 @@
 program.
 @z
 
- at x [29.523] l.10095 - Change to pack_buffered_name as with pack_file_name.
+ at x [29.523] l.10127 - Change to pack_buffered_name as with pack_file_name.
 for j:=1 to n do append_to_name(xord[TEX_format_default[j]]);
 for j:=a to b do append_to_name(buffer[j]);
 for j:=format_default_length-format_ext_length+1 to format_default_length do
@@ -1861,7 +1861,7 @@
 name_of_file[name_length+1]:=0;
 @z
 
- at x [29.524] l.10118 - Format file opening: only try once, with path searching.
+ at x [29.524] l.10150 - Format file opening: only try once, with path searching.
   pack_buffered_name(0,loc,j-1); {try first without the system file area}
   if w_open_in(fmt_file) then goto found;
   pack_buffered_name(format_area_length,loc,j-1);
@@ -1872,7 +1872,7 @@
   if w_open_in(fmt_file) then goto found;
 @z
 
- at x [29.524] l.10124 - replace `PLAIN' in error messages with `default'.
+ at x [29.524] l.10156 - replace `PLAIN' in error messages with `default'.
   wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
 @y
   wterm ('Sorry, I can''t find the format `');
@@ -1882,7 +1882,7 @@
   wterm_ln ('''.');
 @z
 
- at x [29.524] l.10132 - replace `PLAIN' in error messages with `default'.
+ at x [29.524] l.10164 - replace `PLAIN' in error messages with `default'.
   wterm_ln('I can''t find the PLAIN format file!');
 @.I can't find PLAIN...@>
 @y
@@ -1892,7 +1892,7 @@
 @.I can't find the format...@>
 @z
 
- at x [29.525] l.10170 - make_name_string
+ at x [29.525] l.10184 - make_name_string
 begin if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings)or
 @y
 save_area_delimiter, save_ext_delimiter: pool_pointer;
@@ -1900,7 +1900,7 @@
 begin if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings)or
 @z
 
- at x [29.525] l.10174 - make_name_string
+ at x [29.525] l.10188 - make_name_string
   make_name_string:=make_string;
 @y
   make_name_string:=make_string;
@@ -1920,7 +1920,7 @@
   area_delimiter:=save_area_delimiter; ext_delimiter:=save_ext_delimiter;
 @z
 
- at x [29.526] l.10193 - look for a left_brace when scanning a file name
+ at x [29.526] l.10206 - look for a left_brace when scanning a file name
 @p procedure scan_file_name;
 label done;
 @y
@@ -1941,7 +1941,7 @@
   else
 @z
 
- at x [29.526] l.10194 - stop scanning file name if we're at end-of-line.
+ at x [29.526] l.10213 - stop scanning file name if we're at end-of-line.
   if not more_name(cur_chr) then goto done;
 @y
   {If |cur_chr| is a space and we're not scanning a token list, check
@@ -1951,7 +1951,7 @@
   if not more_name(cur_chr) then goto done;
 @z
 
- at x [29.526] l.10203 - scan a bgroup/egroup-delimited file name
+ at x [29.526] l.10216 - scan a bgroup/egroup-delimited file name
 done: end_name; name_in_progress:=false;
 end;
 @y
@@ -1961,7 +1961,7 @@
 end;
 @z
 
- at x [29.530] l.10245 - prompt_file_name: prevent empty filenames.
+ at x [29.530] l.10264 - prompt_file_name: prevent empty filenames.
 var k:0..buf_size; {index into |buffer|}
 @y
 var k:0..buf_size; {index into |buffer|}
@@ -1970,7 +1970,7 @@
 @!saved_cur_area:str_number; {to catch empty terminal input}
 @z
 
- at x [29.530] l.10252 - prompt_file_name: No default extension is TeX input file.
+ at x [29.530] l.10271 - prompt_file_name: No default extension is TeX input file.
 if e=".tex" then show_context;
 @y
 if (e=".tex") or (e="") then show_context;
@@ -1982,7 +1982,7 @@
 print(")"); print_ln;
 @z
 
- at x [29.530] l.10258 - prompt_file_name: prevent empty filenames.
+ at x [29.530] l.10277 - prompt_file_name: prevent empty filenames.
 clear_terminal; prompt_input(": "); @<Scan file name in the buffer@>;
 if cur_ext="" then cur_ext:=e;
 @y
@@ -2000,7 +2000,7 @@
   if cur_ext="" then cur_ext:=e;
 @z
 
- at x [29.532] l.10263 - avoid conflict, `logname' in <unistd.h> on some systems.
+ at x [29.532] l.10295 - avoid conflict, `logname' in <unistd.h> on some systems.
 @d ensure_dvi_open==if output_file_name=0 then
 @y
 @d log_name == texmf_log_name
@@ -2007,13 +2007,13 @@
 @d ensure_dvi_open==if output_file_name=0 then
 @z
 
- at x [29.534] l.10285 - Adjust for C string conventions.
+ at x [29.534] l.10317 - Adjust for C string conventions.
 @!months:packed array [1..36] of char; {abbreviations of month names}
 @y
 @!months:const_cstring;
 @z
 
- at x [29.534] l.10300 - Filename change for the recorder.
+ at x [29.534] l.10319 - Filename change for the recorder.
 if job_name=0 then job_name:="texput";
 @.texput@>
 @y
@@ -2023,7 +2023,7 @@
 recorder_change_filename(stringcast(name_of_file+1));
 @z
 
- at x [29.534] l.10293 - MLTeX: add MLTeX banner after loading fmt file
+ at x [29.534] l.10325 - MLTeX: add MLTeX banner after loading fmt file
 @<Print the banner line, including the date and time@>;
 @y
 @<Print the banner line, including the date and time@>;
@@ -2032,7 +2032,7 @@
   end;
 @z
 
- at x
+ at x [29.536] l.10356
 begin wlog(banner);
 @y
 begin
@@ -2043,7 +2043,7 @@
   wlog(banner);
 @z
 
- at x [29.536] l.10324 - Print rest of banner.
+ at x [29.536] l.10357 - Print rest of banner.
 slow_print(format_ident); print("  ");
 @y
 wlog(version_string);
@@ -2050,7 +2050,7 @@
 slow_print(format_ident); print("  ");
 @z
 
- at x [29.536] l.10327 - Adjust for C string conventions.
+ at x [29.536] l.10359 - Adjust for C string conventions.
 months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
 @y
 months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
@@ -2058,7 +2058,7 @@
 
 % Print whether we're using src-specials and other such features.
 % Print TCX name if one's given.
- at x [29.536] l.10331
+ at x [29.536] l.10363
 end
 @y
 if shellenabledp then begin
@@ -2094,7 +2094,7 @@
 % to open the file with and without the `.tex' extension, regardless of
 % whether the file already has an extension.  This allows filenames like
 % `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'.
- at x [29.537] l.10338 - start_input
+ at x [29.537] l.10373 - start_input
 begin scan_file_name; {set |cur_name| to desired file name}
 if cur_ext="" then cur_ext:=".tex";
 pack_cur_name;
@@ -2117,13 +2117,13 @@
     goto done;
 @z
 
- at x [29.537] l.10348 - start_input: don't force ".tex" extension.
+ at x [29.537] l.10383 - start_input: don't force ".tex" extension.
   prompt_file_name("input file name",".tex");
 @y
   prompt_file_name("input file name","");
 @z
 
- at x [29.537] l.10350 - start_input: string recycling
+ at x [29.537] l.10385 - start_input: string recycling
 done: name:=a_make_name_string(cur_file);
 @y
 done: name:=a_make_name_string(cur_file);
@@ -2137,13 +2137,13 @@
   end;
 @z
 
- at x [29.537] l.10352 - start_input: was job_name given on the command line?
+ at x [29.537] l.10387 - start_input: was job_name given on the command line?
   begin job_name:=cur_name; open_log_file;
 @y
   begin job_name:=get_job_name(cur_name); open_log_file;
 @z
 
- at x [29.537] l.10356 -
+ at x [29.537] l.10390 -  -
 if term_offset+length(name)>max_print_line-2 then print_ln
 else if (term_offset>0)or(file_offset>0) then print_char(" ");
 print_char("("); incr(open_parens); slow_print(name); update_terminal;
@@ -2155,7 +2155,7 @@
 slow_print(full_source_filename_stack[in_open]); update_terminal;
 @z
 
- at x [29.537] l.10360 - start_input: don't return filename to string pool.
+ at x [29.537] l.10394 - start_input: don't return filename to string pool.
 if name=str_ptr-1 then {conserve string pool space (but see note above)}
   begin flush_string; name:=cur_name;
   end;
@@ -2162,7 +2162,7 @@
 @y
 @z
 
- at x [30.548] l.10673 - texarray
+ at x [30.548] l.10708 - texarray
 @!internal_font_number=font_base..font_max; {|font| in a |char_node|}
 @!font_index=0..font_mem_size; {index into |font_info|}
 @y
@@ -2171,7 +2171,7 @@
 @!nine_bits=min_quarterword..non_char;
 @z
 
- at x [30.549] l.10682 - texarray
+ at x [30.549] l.10717 - texarray
 @!font_info:array[font_index] of memory_word;
   {the big collection of font data}
 @!fmem_ptr:font_index; {first unused word of |font_info|}
@@ -2235,7 +2235,7 @@
   {|font_bchar| if it doesn't exist in the font, otherwise |non_char|}
 @z
 
- at x [30.550] l.10723 - texarray
+ at x [30.550] l.10758 - texarray
 @!char_base:array[internal_font_number] of integer;
   {base addresses for |char_info|}
 @!width_base:array[internal_font_number] of integer;
@@ -2275,12 +2275,12 @@
   {base addresses for font parameters}
 @z
 
- at x [30.551] l.10743 - texarray
+ at x [30.551] l.10778 - texarray
 for k:=font_base to font_max do font_used[k]:=false;
 @y
 @z
 
- at x [30.552] l.10749 - texarray
+ at x [30.552] l.10784 - texarray
 font_ptr:=null_font; fmem_ptr:=7;
 font_name[null_font]:="nullfont"; font_area[null_font]:="";
 hyphen_char[null_font]:="-"; skew_char[null_font]:=-1;
@@ -2298,7 +2298,7 @@
 @y
 @z
 
- at x [30.554] l.10795 - MLTeX: |effective_char| in |char_info|
+ at x [30.554] l.10830 - MLTeX: |effective_char| in |char_info|
 as fast as possible under the circumstances.
 @^inner loop@>
 
@@ -2356,7 +2356,7 @@
 @#
 @z
 
- at x [30] m.560 l.10876 - MLTeX: |effective_char| in |char_info|
+ at x [30.560] l.10911 - MLTeX: |effective_char| in |char_info|
 @p function read_font_info(@!u:pointer;@!nom,@!aire:str_number;
 @y
 @p @t\4@>@<Declare additional functions for ML\TeX@>@/
@@ -2364,7 +2364,7 @@
 function read_font_info(@!u:pointer;@!nom,@!aire:str_number;
 @z
 
- at x [30.560] l.10898 - Check lengths
+ at x [30.560] l.10915 - Check lengths
 @!file_opened:boolean; {was |tfm_file| successfully opened?}
 @y
 @!name_too_long:boolean; {|nom| or |aire| exceeds 255 bytes?}
@@ -2371,7 +2371,7 @@
 @!file_opened:boolean; {was |tfm_file| successfully opened?}
 @z
 
- at x [30.561] l.10939 - Check lengths
+ at x [30.561] l.10956 - Check lengths
 else print(" not loadable: Metric (TFM) file not found");
 @y
 else if name_too_long then print(" not loadable: Metric (TFM) file name too long")
@@ -2378,7 +2378,7 @@
 else print(" not loadable: Metric (TFM) file not found");
 @z
 
- at x [30.563] l.10961 - Check lengths, don't use TEX_font_area.
+ at x [30.563] l.10978 - Check lengths, don't use TEX_font_area.
 if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
 else pack_file_name(nom,aire,".tfm");
 @y
@@ -2393,7 +2393,7 @@
 % tfm file, we read its first byte into `tfm_temp' right away.  TeX
 % looks at `fbyte' before calling `fget', so it ends up seeing every
 % byte.  This is Pascal-like I/O.
- at x [30.564] l.10956 - reading the tfm file, define fget & fbyte
+ at x [30.564] l.10991 - reading the tfm file, define fget & fbyte
 @d fget==get(tfm_file)
 @d fbyte==tfm_file^
 @y
@@ -2401,13 +2401,13 @@
 @d fbyte==tfm_temp
 @z
 
- at x [30.570] l.11064 - MLTeX: fix for bug while loading font
+ at x [30.570] l.11100 - MLTeX: fix for bug while loading font
   begin qw:=char_info(f)(d);
 @y
   begin qw:=orig_char_info(f)(d);
 @z
 
- at x [30.573] l.11116 - MLTeX: fix for bug while loading font
+ at x [30.573] l.11152 - MLTeX: fix for bug while loading font
   qw:=char_info(f)(#); {N.B.: not |qi(#)|}
 @y
   qw:=orig_char_info(f)(#); {N.B.: not |qi(#)|}
@@ -2416,19 +2416,19 @@
 % [30.575] We only want `eof' on the TFM file to be true if we
 % previously had EOF, not if we're at EOF now.  This is like `feof', and
 % unlike our implementation of `eof' elsewhere.
- at x [30.575] l.11180 - Reading the tfm file, replace eof() by feof().
+ at x [30.575] l.11197 - Reading the tfm file, replace eof() by feof().
 if eof(tfm_file) then abort;
 @y
 if feof(tfm_file) then abort;
 @z
 
- at x [30.576] l.11180 - MLTeX: fix for bug while loading font
+ at x [30.576] l.11216 - MLTeX: fix for bug while loading font
   begin qw:=char_info(f)(bchar); {N.B.: not |qi(bchar)|}
 @y
   begin qw:=orig_char_info(f)(bchar); {N.B.: not |qi(bchar)|}
 @z
 
- at x [30.582] l.11276 - MLTeX: call |effective_char| in |new_character|
+ at x [30.582] l.11312 - MLTeX: call |effective_char| in |new_character|
 @p function new_character(@!f:internal_font_number;@!c:eight_bits):pointer;
 label exit;
 var p:pointer; {newly allocated node}
@@ -2448,7 +2448,7 @@
   if char_exists(orig_char_info(f)(ec)) then  {N.B.: not |char_info|}
 @z
 
- at x [32.592] l.11820 - font numbers can be >255 now.
+ at x [32.592] l.11856 - font numbers can be >255 now.
 @!c,@!f:quarterword; {character and font in current |char_node|}
 @y
  {character and font in current |char_node|}
@@ -2456,7 +2456,7 @@
 @!f:internal_font_number;
 @z
 
- at x [32.595] l.11860 - texarray
+ at x [32.595] l.11896 - texarray
 @!dvi_buf:array[dvi_index] of eight_bits; {buffer for \.{DVI} output}
 @!half_buf:dvi_index; {half of |dvi_buf_size|}
 @!dvi_limit:dvi_index; {end of the current half buffer}
@@ -2468,7 +2468,7 @@
 @!dvi_ptr:integer; {the next available buffer address}
 @z
 
- at x [32.597] l.11886 - write_dvi done in C.
+ at x [32.597] l.11922 - write_dvi done in C.
 @p procedure write_dvi(@!a,@!b:dvi_index);
 var k:dvi_index;
 begin for k:=a to b do write(dvi_file,dvi_buf[k]);
@@ -2479,7 +2479,7 @@
 bytes at a time.
 @z
 
- at x [32.601] l.11911 - check dvi file size
+ at x [32.598] l.11928 - check dvi file size
 each time, we use the macro |dvi_out|.
 @y
 each time, we use the macro |dvi_out|.
@@ -2488,7 +2488,7 @@
 to prevent further \.{DVI} output causing infinite recursion.
 @z
 
- at x [32.601] l.11918 - dvi_swap: check dvi file size
+ at x [32.598] l.11935 - dvi_swap: check dvi file size
 begin if dvi_limit=dvi_buf_size then
 @y
 begin if dvi_ptr>(@"7FFFFFFF-dvi_offset) then
@@ -2499,7 +2499,7 @@
 if dvi_limit=dvi_buf_size then
 @z
 
- at x [32.602] l.11932 -  empty the last bytes: check dvi file size
+ at x [32.599] l.11949 - empty the last bytes: check dvi file size
 if dvi_ptr>0 then write_dvi(0,dvi_ptr-1)
 @y
 if dvi_ptr>(@"7FFFFFFF-dvi_offset) then
@@ -2510,7 +2510,7 @@
 if dvi_ptr>0 then write_dvi(0,dvi_ptr-1)
 @z
 
- at x [32.602] l.11944 - Allow for outputting more than 256 fonts.
+ at x [32.602] l.11980 - Allow for outputting more than 256 fonts.
 begin dvi_out(fnt_def1);
 dvi_out(f-font_base-1);@/
 @y
@@ -2524,7 +2524,7 @@
   end;
 @z
 
- at x [32.617] l.12280 - Use output_comment if the user set it. Assume it's short enough.
+ at x [32.617] l.12297 - Use output_comment if the user set it. Assume it's short enough.
   old_setting:=selector; selector:=new_string;
 @y
 if output_comment then
@@ -2535,7 +2535,7 @@
   old_setting:=selector; selector:=new_string;
 @z
 
- at x [32.617] l.12288 - Use output_comment if the user set it.
+ at x [32.617] l.12305 - Use output_comment if the user set it.
   end
 @y
 end;
@@ -2542,7 +2542,7 @@
   end
 @z
 
- at x [32.619] l.12294 - MLTeX: substitute character in |hlist_out|
+ at x [32.619] l.12330 - MLTeX: substitute character in |hlist_out|
 procedure hlist_out; {output an |hlist_node| box}
 label reswitch, move_past, fin_rule, next_p;
 @y
@@ -2550,7 +2550,7 @@
 label reswitch, move_past, fin_rule, next_p, continue, found;
 @z
 
- at x [32.620] l.12326 - MLTeX: replace virtual character in |hlist_out|
+ at x [32.620] l.12365 - MLTeX: replace virtual character in |hlist_out|
 reaching a non-|char_node|. The program uses the fact that |set_char_0=0|.
 @^inner loop@>
 @y
@@ -2573,7 +2573,7 @@
 @^inner loop@>
 @z
 
- at x [32.620] l.12334 - MLTeX: substitute character during |shipout|
+ at x [32.620] l.12373 - MLTeX: substitute character during |shipout|
   if c>=qi(128) then dvi_out(set1);
   dvi_out(qo(c));@/
   cur_h:=cur_h+char_width(f)(char_info(f)(c));
@@ -2590,7 +2590,7 @@
 continue:
 @z
 
- at x [32.622] l.12349 - more >256 font output stuff.
+ at x [32.621] l.12388 - more >256 font output stuff.
 else  begin dvi_out(fnt1); dvi_out(f-font_base-1);
   end;
 @y
@@ -2605,7 +2605,7 @@
 
 % We output each portion of the page as we get to it, if we are using
 % IPC, so that the previewer (TeXView) can display it immediately. [SPM]
- at x [32.640] l.12723 - IPC
+ at x [32.640] l.12740 - IPC
 done:
 @y
 ifdef ('IPC')
@@ -2632,7 +2632,7 @@
 done:
 @z
 
- at x [32.645] l.12766 - check dvi file size
+ at x [32.642] l.12783 - check dvi file size
 else  begin dvi_out(post); {beginning of the postamble}
 @y
 else if cur_s<>-2 then
@@ -2639,7 +2639,7 @@
   begin dvi_out(post); {beginning of the postamble}
 @z
 
- at x [32.645] l.12775 - Use dvi_offset instead of dvi_buf_size with IPC stuff.
+ at x [32.642] l.12792 - Use dvi_offset instead of dvi_buf_size with IPC stuff.
   k:=4+((dvi_buf_size-dvi_ptr) mod 4); {the number of 223's}
 @y
 ifdef ('IPC')
@@ -2650,13 +2650,13 @@
 endifn ('IPC')
 @z
 
- at x [32.645] l.12780 - use print_file_name
+ at x [32.642] l.12797 - use print_file_name
   print_nl("Output written on "); slow_print(output_file_name);
 @y
   print_nl("Output written on "); print_file_name(0, output_file_name, 0);
 @z
 
- at x [32.645] l.12782 - i18n fix
+ at x [32.642] l.12799 - i18n fix
   print(" ("); print_int(total_pages); print(" page");
   if total_pages<>1 then print_char("s");
 @y
@@ -2671,7 +2671,7 @@
 % can be substituted => we have to avoid this in math mode
 % (for compatibility reasons and to avoid other problems).
 %
- at x [35.708] l.13903 - MLTeX: avoid substitution in |var_delimiter|
+ at x [35.708] l.13954 - MLTeX: avoid substitution in |var_delimiter|
 if (qo(y)>=font_bc[g])and(qo(y)<=font_ec[g]) then
   begin continue: q:=char_info(g)(y);
 @y
@@ -2679,19 +2679,19 @@
   begin continue: q:=orig_char_info(g)(y);
 @z
 
- at x [36.722] l.14207 - MLTeX: avoid substitution in |fetch|
+ at x [36.722] l.14224 - MLTeX: avoid substitution in |fetch|
     cur_i:=char_info(cur_f)(cur_c)
 @y
     cur_i:=orig_char_info(cur_f)(cur_c)
 @z
 
- at x [36.740] l.14486 - MLTeX: avoid substitution in |make_math_accent|
+ at x [36.740] l.14537 - MLTeX: avoid substitution in |make_math_accent|
   i:=char_info(f)(y);
 @y
   i:=orig_char_info(f)(y);
 @z
 
- at x [36.749] l.14638 - MLTeX: avoid substitution in |make_op|
+ at x [36.749] l.14689 - MLTeX: avoid substitution in |make_op|
     begin c:=rem_byte(cur_i); i:=char_info(cur_f)(c);
 @y
     begin c:=rem_byte(cur_i); i:=orig_char_info(cur_f)(c);
@@ -2713,7 +2713,7 @@
 if every_cr<>null then begin_token_list(every_cr,every_cr_text);
  @z
 
- at x [42.920] l.18056 - bigtrie: allow larger hyphenation tries.
+ at x [42.920] l.18111 - bigtrie: allow larger hyphenation tries.
 Comparatively few different number sequences $n_0\ldots n_k$ actually occur,
 since most of the |n|'s are generally zero. Therefore the number sequences
 are encoded in such a way that |trie_op|$(z_k)$ is only one byte long.
@@ -2745,7 +2745,7 @@
 and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|.
 @z
 
- at x [42.920] l.18068 - bigtrie: allow larger hyphenation tries.
+ at x [42.920] l.18123 - bigtrie: allow larger hyphenation tries.
 @!trie_pointer=0..trie_size; {an index into |trie|}
 @y
 @!trie_pointer=0..ssup_trie_size; {an index into |trie|}
@@ -2752,7 +2752,7 @@
 @!trie_opcode=0..ssup_trie_opcode;  {a trie opcode}
 @z
 
- at x [42.921] l.18070 - bigtrie: allow larger hyphenation tries.
+ at x [42.921] l.18125 - bigtrie: allow larger hyphenation tries.
 @ @d trie_link(#)==trie[#].rh {``downward'' link in a trie}
 @d trie_char(#)==trie[#].b1 {character matched at this trie location}
 @d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location}
@@ -2768,7 +2768,7 @@
 @d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location}
 @z
 
- at x [42.921] l.18075 - bigtrie: allow larger hyphenation tries.
+ at x [42.921] l.18130 - bigtrie: allow larger hyphenation tries.
 @!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|}
 @y
 {We will dynamically allocate these arrays.}
@@ -2777,19 +2777,19 @@
 @!trie_trc:^quarterword; {|trie_char|}
 @z
 
- at x [42.921] l.18078 - bigtrie: allow larger hyphenation tries.
+ at x [42.921] l.18133 - bigtrie: allow larger hyphenation tries.
 @!hyf_next:array[1..trie_op_size] of quarterword; {continuation code}
 @y
 @!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code}
 @z
 
- at x [42.923] l.18099 - bigtrie: allow larger hyphenation tries.
+ at x [42.923] l.18154 - bigtrie: allow larger hyphenation tries.
     begin if trie_op(z)<>min_quarterword then
 @y
     begin if trie_op(z)<>min_trie_op then
 @z
 
- at x [42.924] l.18112 - bigtrie: allow larger hyphenation tries.
+ at x [42.924] l.18167 - bigtrie: allow larger hyphenation tries.
 until v=min_quarterword;
 @y
 until v=min_trie_op;
@@ -2796,9 +2796,9 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18126 m.925
+ at x [42.925] l.18181
 different from $\alpha$, we can conclude that $\alpha$ is not in the table.
- at y  18126
+ at y
 different from $\alpha$, we can conclude that $\alpha$ is not in the table.
 This is a clever scheme which saves the need for a hash link array.
 However, it is difficult to increase the size of the hyphen exception
@@ -2811,19 +2811,19 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18134 m.925
+ at x [42.925] l.18189
 @!hyph_pointer=0..hyph_size; {an index into the ordered hash table}
- at y  18134
+ at y
 @!hyph_pointer=0..ssup_hyph_size; {index into hyphen exceptions hash table;
                      enlarging this requires changing (un)dump code}
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18137 m.926
+ at x [42.926] l.18192
 @!hyph_word:array[hyph_pointer] of str_number; {exception words}
 @!hyph_list:array[hyph_pointer] of pointer; {lists of hyphen positions}
 @!hyph_count:hyph_pointer; {the number of words in the exception dictionary}
- at y  18139
+ at y
 @!hyph_word: ^str_number; {exception words}
 @!hyph_list: ^pointer; {lists of hyphen positions}
 @!hyph_link: ^hyph_pointer; {link array for hyphen exceptions hash table}
@@ -2832,12 +2832,12 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18145 m.928
+ at x [42.928] l.18200
 for z:=0 to hyph_size do
   begin hyph_word[z]:=0; hyph_list[z]:=null;
   end;
 hyph_count:=0;
- at y  18148
+ at y
 for z:=0 to hyph_size do
   begin hyph_word[z]:=0; hyph_list[z]:=null; hyph_link[z]:=0;
   end;
@@ -2846,7 +2846,7 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18163 m.930
+ at x [42.930] l.18218
 h:=hc[1]; incr(hn); hc[hn]:=cur_lang;
 for j:=2 to hn do h:=(h+h+hc[j]) mod hyph_size;
 loop at +  begin @<If the string |hyph_word[h]| is less than \(hc)|hc[1..hn]|,
@@ -2855,7 +2855,7 @@
   if h>0 then decr(h)@+else h:=hyph_size;
   end;
 not_found: decr(hn)
- at y  18170
+ at y
 h:=hc[1]; incr(hn); hc[hn]:=cur_lang;
 for j:=2 to hn do h:=(h+h+hc[j]) mod hyph_prime;
 loop at +  begin @<If the string |hyph_word[h]| is less than \(hc)|hc[1..hn]|,
@@ -2867,7 +2867,7 @@
 not_found: decr(hn)
 @z
 
- at x [42.931] l.18206 - dynamic hyph_size
+ at x [42.931] l.18227 - dynamic hyph_size
 @ @<If the string |hyph_word[h]| is less than \(hc)...@>=
 k:=hyph_word[h]; if k=0 then goto not_found;
 if length(k)<hn then goto not_found;
@@ -2878,7 +2878,7 @@
 k:=hyph_word[h]; if k=0 then goto not_found;
 @z
 
- at x [42.931] l.18211 - dynamic hyph_size
+ at x [42.931] l.18232 - dynamic hyph_size
   repeat if so(str_pool[u])<hc[j] then goto not_found;
   if so(str_pool[u])>hc[j] then goto done;
 @y
@@ -2887,7 +2887,7 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18245 m.934
+ at x [42.934] l.18273
 @!s,@!t:str_number; {strings being compared or stored}
 @y
 @!s:str_number; {strings being compared or stored}
@@ -2894,14 +2894,14 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18274 m.939
+ at x [42.939] l.18329
   begin h:=(h+h+hc[j]) mod hyph_size;
- at y  18274
+ at y
   begin h:=(h+h+hc[j]) mod hyph_prime;
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 18281 m.940
+ at x [42.940] l.18336
 @ @<Insert the \(p)pair |(s,p)|...@>=
 if hyph_count=hyph_size then overflow("exception dictionary",hyph_size);
 @:TeX capacity exceeded exception dictionary}{\quad exception dictionary@>
@@ -2912,7 +2912,7 @@
   if h>0 then decr(h)@+else h:=hyph_size;
   end;
 hyph_word[h]:=s; hyph_list[h]:=p
- at y  18290
+ at y
 @ @<Insert the \(p)pair |(s,p)|...@>=
   if hyph_next <= hyph_prime then
      while (hyph_next>0) and (hyph_word[hyph_next-1]>0) do decr(hyph_next);
@@ -2935,7 +2935,7 @@
 found: hyph_word[h]:=s; hyph_list[h]:=p
 @z
 
- at x [42.941] l.18326 - dynamic hyph_size
+ at x [42.941] l.18347 - dynamic hyph_size
 @ @<If the string |hyph_word[h]| is less than \(or)...@>=
 k:=hyph_word[h];
 if length(k)<length(s) then goto found;
@@ -2948,7 +2948,7 @@
 if length(k)<>length(s) then goto not_found;
 @z
 
- at x [42.941] l.18331 - dynamic hyph_size
+ at x [42.941] l.18352 - dynamic hyph_size
 repeat if str_pool[u]<str_pool[v] then goto found;
 if str_pool[u]>str_pool[v] then goto not_found;
 @y
@@ -2955,7 +2955,7 @@
 repeat if str_pool[u]<>str_pool[v] then goto not_found;
 @z
 
- at x [42.941] l.18335 - dynamic hyph_size
+ at x [42.941] l.18356 - dynamic hyph_size
 found:q:=hyph_list[h]; hyph_list[h]:=p; p:=q;@/
 t:=hyph_word[h]; hyph_word[h]:=s; s:=t;
 not_found:
@@ -2969,37 +2969,37 @@
 not_found:
 @z
 
- at x [43.943] l.18332 - bigtrie: Larger tries, also in documentation parts.
+ at x [43.943] l.18387 - bigtrie: Larger tries, also in documentation parts.
 |hyf_next[@t$v^\prime$@>]=min_quarterword|.
 @y
 |hyf_next[@t$v^\prime$@>]=min_trie_op|.
 @z
 
- at x [43.943] l.18336 - bigtrie: Larger tries, also in documentation parts.
+ at x [43.943] l.18391 - bigtrie: Larger tries, also in documentation parts.
 $$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad
 @y
 $$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad
 @z
 
- at x [43.943] l.18346 - web2c can't parse negative lower bounds in arrays.  Sorry.
+ at x [43.943] l.18401 - web2c can't parse negative lower bounds in arrays.  Sorry.
 @!init @!trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
 @y
 @!init @!trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
 @z
 
- at x [43.943] l.18348 - bigtrie: Larger hyphenation tries.
+ at x [43.943] l.18403 - bigtrie: Larger hyphenation tries.
 @!trie_used:array[ASCII_code] of quarterword;
 @y
 @!trie_used:array[ASCII_code] of trie_opcode;
 @z
 
- at x [43.943] l.18352 - bigtrie: Larger hyphenation tries.
+ at x [43.943] l.18407 - bigtrie: Larger hyphenation tries.
 @!trie_op_val:array[1..trie_op_size] of quarterword;
 @y
 @!trie_op_val:array[1..trie_op_size] of trie_opcode;
 @z
 
- at x [43.943] l.18355 - Dynamic trie arrays
+ at x [43.943] l.18410 - Dynamic trie arrays
 tini
 @y
 tini@;
@@ -3007,13 +3007,13 @@
 @!small_op:boolean; {flag used while dumping or undumping}
 @z
 
- at x [43.944] l.18358 - bigtrie: Larger tries, also in documentation parts.
+ at x [43.944] l.18413 - bigtrie: Larger tries, also in documentation parts.
 |new_trie_op| could return |min_quarterword| (thereby simply ignoring
 @y
 |new_trie_op| could return |min_trie_op| (thereby simply ignoring
 @z
 
- at x [43.944] l.18365 - bigtrie: Larger hyphenation tries.
+ at x [43.944] l.18420 - bigtrie: Larger hyphenation tries.
 function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword;
 label exit;
 var h:-trie_op_size..trie_op_size; {trial hash location}
@@ -3025,7 +3025,7 @@
 @!u:trie_opcode; {trial op code}
 @z
 
- at x [43.944] l.18370 - Another casting problem, and use |neg_trie_op_size|.
+ at x [43.944] l.18425 - Another casting problem, and use |neg_trie_op_size|.
 begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
   - trie_op_size;
 @y
@@ -3033,7 +3033,7 @@
   + neg_trie_op_size;
 @z
 
- at x [43.944] l.18377 - bigtrie: And larger tries again.
+ at x [43.944] l.18432 - bigtrie: And larger tries again.
     if u=max_quarterword then
       overflow("pattern memory ops per language",
         max_quarterword-min_quarterword);
@@ -3046,19 +3046,19 @@
     if u>max_op_used then max_op_used:=u;
 @z
 
- at x [43.945] l.18399 - bigtrie: And larger tries again.
+ at x [43.945] l.18454 - bigtrie: And larger tries again.
 op_start[0]:=-min_quarterword;
 @y
 op_start[0]:=-min_trie_op;
 @z
 
- at x [43.946] l.18416 - bigtrie: And larger tries again.
+ at x [43.946] l.18471 - bigtrie: And larger tries again.
 for k:=0 to 255 do trie_used[k]:=min_quarterword;
 @y
 for k:=0 to 255 do trie_used[k]:=min_trie_op;
 @z
 
- at x [43.946] l.18417 - Dynamic trie arrays.
+ at x [43.946] l.18472 - Dynamic trie arrays.
 trie_op_ptr:=0;
 @y
 max_op_used:=min_trie_op;
@@ -3065,7 +3065,7 @@
 trie_op_ptr:=0;
 @z
 
- at x [43.947] l.18438 - Dynamically allocate arrays, and a casting problem.
+ at x [43.947] l.18493 - Dynamically allocate arrays, and a casting problem.
 @!init @!trie_c:packed array[trie_pointer] of packed_ASCII_code;
   {characters to match}
 @t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword;
@@ -3093,13 +3093,13 @@
 tini
 @z
 
- at x [43.950] l.18521 - Dynamically allocate & larger tries.
+ at x [43.950] l.18576 - Dynamically allocate & larger tries.
 @d trie_back(#)==trie[#].lh {backward links in |trie| holes}
 @y
 @d trie_back(#)==trie_tro[#] {use the opcode field now for backward links}
 @z
 
- at x [43.590] l.18524 - Dynamically allocate & larger tries.
+ at x [43.950] l.18579 - Dynamically allocate & larger tries.
 @!init @!trie_taken:packed array[1..trie_size] of boolean;
   {does a family start here?}
 @t\hskip10pt@>@!trie_min:array[ASCII_code] of trie_pointer;
@@ -3117,13 +3117,13 @@
 tini
 @z
 
- at x [43.951] l.18539 - Dynamically allocate.
+ at x [43.951] l.18594 - Dynamically allocate.
 trie_not_ready:=true; trie_root:=0; trie_c[0]:=si(0); trie_ptr:=0;
 @y
 trie_not_ready:=true;
 @z
 
- at x [43.958] l.18634 - bigtrie: Larger tries.
+ at x [43.958] l.18689 - bigtrie: Larger tries.
 @<Move the data into |trie|@>=
 h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|,
   |trie_op:=min_quarterword|, |trie_char:=qi(0)|}
@@ -3137,43 +3137,43 @@
 @<Move the data into |trie|@>=
 @z
 
- at x [43.958] l.18638 - bigtrie: Larger tries.
+ at x [43.958] l.18693 - bigtrie: Larger tries.
   begin for r:=0 to 256 do trie[r]:=h;
 @y
   begin for r:=0 to 256 do clear_trie;
 @z
 
- at x [43.958] l.18643 - bigtrie: Larger tries.
+ at x [43.958] l.18698 - bigtrie: Larger tries.
   repeat s:=trie_link(r); trie[r]:=h; r:=s;
 @y
   repeat s:=trie_link(r); clear_trie; r:=s;
 @z
 
- at x [43.960] l.18677 - bigtrie: Larger tries.
+ at x [43.960] l.18732 - bigtrie: Larger tries.
 @!v:quarterword; {trie op code}
 @y
 @!v:trie_opcode; {trie op code}
 @z
 
- at x [43.963] l.18749 - bigtrie: Larger tries.
+ at x [43.963] l.18804 - bigtrie: Larger tries.
 if trie_o[q]<>min_quarterword then
 @y
 if trie_o[q]<>min_trie_op then
 @z
 
- at x [43.964] l.18762 - bigtrie: Larger tries.
+ at x [43.964] l.18817 - bigtrie: Larger tries.
 trie_c[p]:=si(c); trie_o[p]:=min_quarterword;
 @y
 trie_c[p]:=si(c); trie_o[p]:=min_trie_op;
 @z
 
- at x [43.965] l.18768 - bigtrie: Larger tries.
+ at x [43.965] l.18823 - bigtrie: Larger tries.
 l:=k; v:=min_quarterword;
 @y
 l:=k; v:=min_trie_op;
 @z
 
- at x [43.966] l.18786 - bigtrie: Larger tries.
+ at x [43.966] l.18841 - bigtrie: Larger tries.
 @!h:two_halves; {template used to zero out |trie|'s holes}
 @y
 @z
@@ -3207,7 +3207,7 @@
 %  main_loop_move_lig,
 %@z
 
- at x [46.1034] l.20074 - source specials
+ at x [46.1034] l.20132 - source specials
 @<Append character |cur_chr|...@>=
 @y
 @<Append character |cur_chr|...@>=
@@ -3216,7 +3216,7 @@
 end;
 @z
 
- at x [46.1036] l.20138 - MLTeX: substitution in |main_control|
+ at x [46.1036] l.20198 - MLTeX: substitution in |main_control|
 main_loop_move+2:if(cur_chr<font_bc[main_f])or(cur_chr>font_ec[main_f]) then
 @y
 main_loop_move+2:
@@ -3224,13 +3224,13 @@
   (qo(effective_char(false,main_f,qi(cur_chr)))<font_bc[main_f]) then
 @z
 
- at x [46.1036] l.20141 - MLTeX: substitution in |main_control|
+ at x [46.1036] l.20201 - MLTeX: substitution in |main_control|
 main_i:=char_info(main_f)(cur_l);
 @y
 main_i:=effective_char_info(main_f,cur_l);
 @z
 
- at x [46.1049] l.20407 - i18n fix, see change to [16.211]
+ at x [46.1049] l.20440
 print("' in "); print_mode(mode);
 @y
 print_in_mode(mode);
@@ -3252,7 +3252,7 @@
   if every_hbox<>null then begin_token_list(every_hbox,every_hbox_text);
  @z
 
- at x [47.1091] l.21064 - source specials
+ at x [47.1091] l.21124 - source specials
 if indented then
   begin tail:=new_null_box; link(head):=tail; width(tail):=par_indent;@+
   end;
@@ -3273,7 +3273,7 @@
   end;
  @z
 
- at x [48.1142] l.21697 - source specials
+ at x [48.1139] l.21722 - source specials
 if every_math<>null then begin_token_list(every_math,every_math_text);
 @y
 if (insert_src_special_every_math) then insert_src_special;
@@ -3288,7 +3288,7 @@
 if every_display<>null then begin_token_list(every_display,every_display_text);
  @z
 
- at x [48.1167] l.22042 - source specials
+ at x [48.1167] l.22114 - source specials
   if every_vbox<>null then begin_token_list(every_vbox,every_vbox_text);
 @y
   if (insert_src_special_every_vbox) then insert_src_special;
@@ -3295,7 +3295,7 @@
   if every_vbox<>null then begin_token_list(every_vbox,every_vbox_text);
 @z
 
- at x [49.1215] l.22719 - hash_extra
+ at x [49.1215] l.22793 - hash_extra
 if (cur_cs=0)or(cur_cs>frozen_control_sequence) then
 @y
 if (cur_cs=0)or(cur_cs>eqtb_top)or
@@ -3302,7 +3302,7 @@
   ((cur_cs>frozen_control_sequence)and(cur_cs<=eqtb_size)) then
 @z
 
- at x [49.1222] l.22794 - MLTeX: \charsubdef primitive
+ at x [49.1222] l.22869 - MLTeX: \charsubdef primitive
 @d toks_def_code=6 {|shorthand_def| for \.{\\toksdef}}
 @y
 @d toks_def_code=6 {|shorthand_def| for \.{\\toksdef}}
@@ -3309,7 +3309,7 @@
 @d char_sub_def_code=7 {|shorthand_def| for \.{\\charsubdef}}
 @z
 
- at x [49.1222] l.22810 - MLTeX: \charsubdef primitive
+ at x [49.1222] l.22885 - MLTeX: \charsubdef primitive
 @!@:toks_def_}{\.{\\toksdef} primitive@>
 @y
 @!@:toks_def_}{\.{\\toksdef} primitive@>
@@ -3320,7 +3320,7 @@
   end;
 @z
 
- at x [49.1222] l.22820 - MLTeX: \charsubdef primitive
+ at x [49.1223] l.22895 - MLTeX: \charsubdef primitive
   othercases print_esc("toksdef")
 @y
   char_sub_def_code: print_esc("charsubdef");
@@ -3327,7 +3327,7 @@
   othercases print_esc("toksdef")
 @z
 
- at x [49.1222] l.22833 - MLTeX: \charsubdef primitive
+ at x [49.1224] l.22908 - MLTeX: \charsubdef primitive
 shorthand_def: begin n:=cur_chr; get_r_token; p:=cur_cs; define(p,relax,256);
 @y
 shorthand_def: if cur_chr=char_sub_def_code then
@@ -3350,9 +3350,9 @@
 else begin n:=cur_chr; get_r_token; p:=cur_cs; define(p,relax,256);
 @z
 
- at x [49.1252] l.23230 - INI = VIR, so have to do runtime test.
+ at x [49.1252] l.23309 - INI = VIR, so have to do runtime test.
     begin @!init new_patterns; goto done;@;@+tini@/
- at y  23215
+ at y
     begin @!Init new_patterns; goto done;@;@+Tini@/
 @z
 
@@ -3360,11 +3360,11 @@
 %   a) the string is already replaced in |scan_file_name| and therefore
 %   b) the wrong string will get flushed!!!
 %
- at x [49.1257] l.23328 unused variable
+ at x [49.1257] l.23354 -  unused variable
 @!flushable_string:str_number; {string not yet referenced}
 @y
 @z
- at x [49.1260] l.23383 new_font: string recycling -- already done
+ at x [49.1260] l.23409 -  new_font: string recycling -- already done
 flushable_string:=str_ptr-1;
 @y
 @z
@@ -3383,7 +3383,7 @@
 %
 % otherwise the wrong string will get removed by |flush_string|!!
 %
- at x [49.1260] l.23386 new_font: string recycling -- already done
+ at x [49.1260] l.23412 -  new_font: string recycling -- already done
     begin if cur_name=flushable_string then
       begin flush_string; cur_name:=font_name[f];
       end;
@@ -3392,7 +3392,7 @@
     begin if s>0 then
 @z
 
- at x [49.1265] if batchmode, mktex... scripts should be silent.
+ at x [49.1265] l.23454 - if batchmode, mktex... scripts should be silent.
 interaction:=cur_chr;
 @y
 interaction:=cur_chr;
@@ -3401,7 +3401,7 @@
 else kpse_make_tex_discard_errors := 0;
 @z
 
- at x [49.1275] l.23441 - Same stuff as for \input, this time for \openin.
+ at x [49.1275] l.23519 - Same stuff as for \input, this time for \openin.
   if cur_ext="" then cur_ext:=".tex";
   pack_cur_name;
   if a_open_in(read_file[n]) then read_open[n]:=just_open;
@@ -3413,7 +3413,7 @@
     read_open[n]:=just_open;
 @z
 
- at x [50.1301] l.23679 - INI = VIR, so runtime test.
+ at x [50.1301] l.23760 - INI = VIR, so runtime test.
 format_ident:=" (INITEX)";
 @y
 if ini_version then format_ident:=" (INITEX)";
@@ -3421,7 +3421,7 @@
 
 % Eliminate now-unused variable `w' in `store_fmt_file'.
 % Add format_engine.
- at x [50.1302] l.23690 - store_fmt_file
+ at x [50.1302] l.23768 - store_fmt_file
 @!w: four_quarters; {four ASCII codes}
 @y
 @!format_engine: ^text_char;
@@ -3428,7 +3428,7 @@
 @z
 
 % MLTeX: dump |mltex_p| to fmt file
- at x [50.1302] l.23694
+ at x [50.1302] l.23772
 @<Dump constants for consistency check@>;
 @y
 @<Dump constants for consistency check@>;
@@ -3438,7 +3438,7 @@
 % Eliminate now-unused variable `w' in `load_fmt_file'.
 % Add format_engine.
 % Add dummies for undumping |xord|, |xchr|, and |xprn| into the void.
- at x [50.1303] l.23722 - load_fmt_file
+ at x [50.1303] l.23800 - load_fmt_file
 @!w: four_quarters; {four ASCII codes}
 @y
 @!format_engine: ^text_char;
@@ -3448,7 +3448,7 @@
 @z
 
 % MLTeX: undump |mltex_enabled_p| from fmt file
- at x [50.1303] l.23694
+ at x [50.1303] l.23801
 begin @<Undump constants for consistency check@>;
 @y
 begin @<Undump constants for consistency check@>;
@@ -3455,7 +3455,7 @@
 @<Undump ML\TeX-specific data@>;
 @z
 
- at x [50.1305] l.23751 - Do dumping and undumping of fmt files in C.
+ at x [50.1305] l.23829 - Do dumping and undumping of fmt files in C.
 @d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
 @d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
 @d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
@@ -3462,7 +3462,7 @@
 @d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
 @y
 @z
- at x [1306]
+ at x [50.1306] l.23843
 @d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
 @d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
 @d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
@@ -3469,7 +3469,7 @@
 @d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
 @y
 @z
- at x [still 1306] debug format file
+ at x [50.1306] l.23850 - debug format file
 @d undump_size_end_end(#)==too_small(#)@+else undump_end_end
 @y
 @d format_debug_end(#)==
@@ -3483,7 +3483,7 @@
   too_small(#)@+else format_debug (#)(x); undump_end_end
 @z
 
- at x [50,1307] l.23779 - texarray
+ at x [50.1307] l.23859 - texarray
 dump_int(@$);@/
 @y
 dump_int(@"57325458);  {Web2C \TeX's magic constant: "W2TX"}
@@ -3502,13 +3502,13 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 23784 m.1307
+ at x [50.1307] l.23864
 dump_int(hyph_size)
- at y  23784
+ at y
 dump_int(hyph_prime)
 @z
 
- at x [50.1308] l.23793 - texarray
+ at x [50.1308] l.23873 - texarray
 x:=fmt_file^.int;
 if x<>@$ then goto bad_fmt; {check that strings are the same}
 @y
@@ -3563,7 +3563,7 @@
     eqtb[x]:=eqtb[undefined_control_sequence];
 @z
 
- at x [50.1308] l.23795 - texarray
+ at x [50.1308] l.23875 - texarray
 undump_int(x);
 if x<>mem_bot then goto bad_fmt;
 undump_int(x);
@@ -3587,15 +3587,15 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 23804 m.1308
+ at x [50.1308] l.23884
 if x<>hyph_size then goto bad_fmt
- at y  23804
+ at y
 if x<>hyph_prime then goto bad_fmt
 @z
 
 % [1309] Make dumping/undumping more efficient by doing whole arrays at
 % a time, via fread/fwrite in texmfmp.c.
- at x [50.1309] l.23814 - Make dumping/undumping more efficient.
+ at x [50.1309] l.23894 - Make dumping/undumping more efficient.
 for k:=0 to str_ptr do dump_int(str_start[k]);
 k:=0;
 while k+4<pool_ptr do
@@ -3607,7 +3607,7 @@
 dump_things(str_pool[0], pool_ptr);
 @z
 
- at x [50.1310] l.23829 - Make dumping/undumping more efficient.
+ at x [50.1310] l.23909 - Make dumping/undumping more efficient.
 undump_size(0)(pool_size)('string pool size')(pool_ptr);
 undump_size(0)(max_strings)('max strings')(str_ptr);
 for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
@@ -3629,31 +3629,31 @@
 undump_things(str_pool[0], pool_ptr);
 @z
 
- at x [50.1311] l.23850 - Make dumping/undumping more efficient.
+ at x [50.1311] l.23930 - Make dumping/undumping more efficient.
 repeat for k:=p to q+1 do dump_wd(mem[k]);
 @y
 repeat dump_things(mem[p], q+2-p);
 @z
 
- at x [50.1311] l.23855 - Make dumping/undumping more efficient.
+ at x [50.1311] l.23935 - Make dumping/undumping more efficient.
 for k:=p to lo_mem_max do dump_wd(mem[k]);
 @y
 dump_things(mem[p], lo_mem_max+1-p);
 @z
 
- at x [50.1311] l.23858 - Make dumping/undumping more efficient.
+ at x [50.1311] l.23938 - Make dumping/undumping more efficient.
 for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
 @y
 dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
 @z
 
- at x [50.1312] l.23873 - Make dumping/undumping more efficient.
+ at x [50.1312] l.23953 - Make dumping/undumping more efficient.
 repeat for k:=p to q+1 do undump_wd(mem[k]);
 @y
 repeat undump_things(mem[p], q+2-p);
 @z
 
- at x [50.1312] l.23955 - Check that p did not become corrupt.
+ at x [50.1312] l.23954 - Check that p did not become corrupt.
 p:=q+node_size(q);
 if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
 @y
@@ -3669,19 +3669,19 @@
 p:=q+node_size(q);
 @z
 
- at x [50.1312] l.23878 - Make dumping/undumping more efficient.
+ at x [50.1312] l.23958 - Make dumping/undumping more efficient.
 for k:=p to lo_mem_max do undump_wd(mem[k]);
 @y
 undump_things(mem[p], lo_mem_max+1-p);
 @z
 
- at x [50.1312] l.23888 - Make dumping/undumping more efficient.
+ at x [50.1312] l.23968 - Make dumping/undumping more efficient.
 for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
 @y
 undump_things (mem[hi_mem_min], mem_end+1-hi_mem_min);
 @z
 
- at x [50.1314] l.23899 - hash_extra, source specials
+ at x [50.1314] l.23979 - hash_extra, source specials
 undump(hash_base)(frozen_control_sequence)(par_loc);
 par_token:=cs_token_flag+par_loc;@/
 undump(hash_base)(frozen_control_sequence)(write_loc);@/
@@ -3691,7 +3691,7 @@
 undump(hash_base)(hash_top)(write_loc);@/
 @z
 
- at x [50.1315] l.23925 - Make dumping/undumping more efficient - eqtb
+ at x [50.1315] l.24005 - Make dumping/undumping more efficienteqtb
 while k<l do
   begin dump_wd(eqtb[k]); incr(k);
   end;
@@ -3699,7 +3699,7 @@
 dump_things(eqtb[k], l-k);
 @z
 
- at x [50.1316] l.23944 - Make dumping/undumping more efficient - eqtb
+ at x [50.1316] l.24024 - Make dumping/undumping more efficienteqtb
 while k<l do
   begin dump_wd(eqtb[k]); incr(k);
   end;
@@ -3707,7 +3707,7 @@
 dump_things(eqtb[k], l-k);
 @z
 
- at x [50.1316] l.23947 - hash_extra
+ at x [50.1316] l.24027 - hash_extra
 k:=j+1; dump_int(k-l);
 until k>eqtb_size
 @y
@@ -3717,13 +3717,13 @@
   {dump |hash_extra| part}
 @z
 
- at x [50.1317] l.23958 - Make dumping/undumping more efficient - eqtb
+ at x [50.1317] l.24034 - Make dumping/undumping more efficienteqtb
 for j:=k to k+x-1 do undump_wd(eqtb[j]);
 @y
 undump_things(eqtb[k], x);
 @z
 
- at x [50.1317] l.23960 - hash_extra
+ at x [50.1317] l.24040 - hash_extra
 until k>eqtb_size
 @y
 until k>eqtb_size;
@@ -3731,13 +3731,13 @@
   {undump |hash_extra| part}
 @z
 
- at x [50.1318] l.23968 - hash_extra
+ at x [50.1318] l.24048 - hash_extra
 dump_int(hash_used); cs_count:=frozen_control_sequence-1-hash_used;
- at y  23968
+ at y
 dump_int(hash_used); cs_count:=frozen_control_sequence-1-hash_used+hash_high;
 @z
 
- at x [50.1318] l.23972 - Make dumping/undumping more efficient, hash_extra
+ at x [50.1318] l.24052 - Make dumping/undumping more efficient, hash_extra
 for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
 @y
 dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
@@ -3744,7 +3744,7 @@
 if hash_high>0 then dump_things(hash[eqtb_size+1], hash_high);
 @z
 
- at x [50.1319] l.23980 - Make dumping/undumping more efficient, hash_extra
+ at x [50.1319] l.24060 - Make dumping/undumping more efficient, hash_extra
 for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
 @y
 undump_things (hash[hash_used+1], undefined_control_sequence-1-hash_used);
@@ -3759,7 +3759,7 @@
 end;
 @z
 
- at x [50.1320] l.23985 - Make dumping/undumping more efficient - tfm
+ at x [50.1320] l.24065 - Make dumping/undumping more efficienttfm
 for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
 dump_int(font_ptr);
 for k:=null_font to font_ptr do
@@ -3770,7 +3770,7 @@
 @<Dump the array info for internal font number |k|@>;
 @z
 
- at x [50.1320] l.23991 - i18n fix
+ at x [50.1320] l.24070 - i18n fix
 print_int(font_ptr-font_base); print(" preloaded font");
 if font_ptr<>font_base+1 then print_char("s")
 @y
@@ -3779,7 +3779,7 @@
 else print(" preloaded font")
 @z
 
- at x [50.1321] l.23994 - texarray
+ at x [50.1321] l.24074 - texarray
 undump_size(7)(font_mem_size)('font mem size')(fmem_ptr);
 for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
 undump_size(font_base)(font_max)('font max')(font_ptr);
@@ -3800,7 +3800,7 @@
 % in the same section of the fmt file.  But it's a lot faster to
 % write the arrays of information out, one whole array at a time.
 % So that's the way we handle dumping and undumping font info.
- at x [50.1322] l.24000 - Make dumping/undumping more efficient - tfm
+ at x [50.1322] l.24080 - Make dumping/undumping more efficienttfm
 @ @<Dump the array info for internal font number |k|@>=
 begin dump_qqqq(font_check[k]);
 dump_int(font_size[k]);
@@ -3867,7 +3867,7 @@
 end
 @z
 
- at x [50.1322] l.24031 - Make dumping/undumping more efficient - tfm
+ at x [50.1323] l.24111 - Make dumping/undumping more efficienttfm
 @ @<Undump the array info for internal font number |k|@>=
 begin undump_qqqq(font_check[k]);@/
 undump_int(font_size[k]);
@@ -3957,12 +3957,12 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 24058 m.1324
+ at x [50.1324] l.24138
 dump_int(hyph_count);
 for k:=0 to hyph_size do if hyph_word[k]<>0 then
   begin dump_int(k); dump_int(hyph_word[k]); dump_int(hyph_list[k]);
   end;
- at y  24061
+ at y
 dump_int(hyph_count);
 if hyph_next <= hyph_prime then hyph_next:=hyph_size;
 dump_int(hyph_next);{minimum value of |hyphen_size| needed}
@@ -3973,7 +3973,7 @@
   end;
 @z
 
- at x [50.1324] l.24063 - i18n fix
+ at x [50.1324] l.24142 - i18n fix
 print_ln; print_int(hyph_count); print(" hyphenation exception");
 if hyph_count<>1 then print_char("s");
 @y
@@ -3982,7 +3982,7 @@
 else print(" hyphenation exception");
 @z
 
- at x [50.1324] l.24066 - Make dumping/undumping more efficient - trie
+ at x [50.1324] l.24146 - Make dumping/undumping more efficienttrie
 for k:=0 to trie_max do dump_hh(trie[k]);
 @y
 dump_things(trie_trl[0], trie_max+1);
@@ -3990,7 +3990,7 @@
 dump_things(trie_trc[0], trie_max+1);
 @z
 
- at x [50.1324] l.24068 - Make dumping/undumping more efficient - trie
+ at x [50.1324] l.24148 - Make dumping/undumping more efficienttrie
 for k:=1 to trie_op_ptr do
   begin dump_int(hyf_distance[k]);
   dump_int(hyf_num[k]);
@@ -4002,7 +4002,7 @@
 dump_things(hyf_next[1], trie_op_ptr);
 @z
 
- at x [50.1324] l.24076 - i18n fix
+ at x [50.1324] l.24155 - i18n fix
 print(" has "); print_int(trie_op_ptr); print(" op");
 if trie_op_ptr<>1 then print_char("s");
 @y
@@ -4012,7 +4012,7 @@
 @z
 
 %%%%%%%% dynamic hyph_size
- at x 24087 m.1325
+ at x [50.1325] l.24167
 undump(0)(hyph_size)(hyph_count);
 for k:=1 to hyph_count do
   begin undump(0)(hyph_size)(j);
@@ -4019,7 +4019,7 @@
   undump(0)(str_ptr)(hyph_word[j]);
   undump(min_halfword)(max_halfword)(hyph_list[j]);
   end;
- at y  24092
+ at y
 undump_size(0)(hyph_size)('hyph_size')(hyph_count);
 undump_size(hyph_prime)(hyph_size)('hyph_size')(hyph_next);
 j:=0;
@@ -4041,7 +4041,7 @@
   if hyph_next >= hyph_prime then incr(hyph_next);
 @z
 
- at x [50.1325] l.24094 - Make dumping/undumping more efficient - trie
+ at x [50.1325] l.24174 - Make dumping/undumping more efficienttrie
 for k:=0 to j do undump_hh(trie[k]);
 @y
 {These first three haven't been allocated yet unless we're \.{INITEX};
@@ -4054,7 +4054,7 @@
 undump_things(trie_trc[0], j+1);
 @z
 
- at x [50.1325] l.24096 - Make dumping/undumping more efficient - trie
+ at x [50.1325] l.24176 - Make dumping/undumping more efficienttrie
 for k:=1 to j do
   begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
   undump(0)(63)(hyf_num[k]);
@@ -4068,7 +4068,7 @@
 undump_upper_check_things(max_trie_op, hyf_next[1], j);
 @z
 
- at x [50.1327] l.24117 - Allow command line to override dumped value.
+ at x [50.1327] l.24197 - Allow command line to override dumped value.
 undump(batch_mode)(error_stop_mode)(interaction);
 @y
 undump(batch_mode)(error_stop_mode)(interaction);
@@ -4075,13 +4075,13 @@
 if interaction_option<>unspecified_mode then interaction:=interaction_option;
 @z
 
- at x [50.1327] l.24172 - Test for end-of-file already done by undump.
+ at x [50.1327] l.24200 - Test for end-of-file already done by undump.
 if (x<>69069)or eof(fmt_file) then goto bad_fmt
 @y
 if x<>69069 then goto bad_fmt
 @z
 
- at x [51.1332] l.24203 - make the main program a procedure, for eqtb hack.
+ at x [51.1332] l.24283 - make the main program a procedure, for eqtb hack.
 @p begin @!{|start_here|}
 @y
 @d const_chk(#)==begin if # < inf@&# then # := inf@&# else
@@ -4196,7 +4196,7 @@
 @+Tini
 @z
 
- at x [51.1332] l.24215 - INI = VIR, so pool init needs runtime test
+ at x [51.1332] l.24295 - INI = VIR, so pool init needs runtime test
 @!init if not get_strings_started then goto final_end;
 init_prim; {call |primitive| for each primitive}
 init_str_ptr:=str_ptr; init_pool_ptr:=pool_ptr; fix_date_and_time;
@@ -4208,7 +4208,7 @@
 Tini@/
 @z
 
- at x [51.1332] l.24225 - main
+ at x [51.1332] l.24305 - main
 end_of_TEX: close_files_and_terminate;
 final_end: ready_already:=0;
 end.
@@ -4218,7 +4218,7 @@
 end {|main_body|};
 @z
 
- at x [51.1333] l.24254 - Print new line before termination; switch to editor if necessary.
+ at x [51.1333] l.24334 - Print new line before termination; switch to editor if necessary.
     slow_print(log_name); print_char(".");
     end;
   end;
@@ -4231,33 +4231,33 @@
   call_edit(str_pool,edit_name_start,edit_name_length,edit_line);
 @z
 
- at x [51.1334] l.24275 - hash_extra
+ at x [51.1334] l.24355 - hash_extra
   wlog_ln(' ',cs_count:1,' multiletter control sequences out of ',
     hash_size:1);@/
- at y  24276
+ at y
   wlog_ln(' ',cs_count:1,' multiletter control sequences out of ',
     hash_size:1, '+', hash_extra:1);@/
 @z
 
- at x [51.1335] l.24335 - Only do dump if ini.
+ at x [51.1335] l.24415 - Only do dump if ini.
   begin @!init for c:=top_mark_code to split_bot_mark_code do
 @y
   begin @!Init for c:=top_mark_code to split_bot_mark_code do
 @z
 
- at x [51.1335] l.24337 - Only do dump if ini.
+ at x [51.1335] l.24418 - Only do dump if ini.
   store_fmt_file; return;@+tini@/
 @y
   store_fmt_file; return;@+Tini@/
 @z
 
- at x [51.1337] l.24361 - Handle %&format in all cases.
+ at x [51.1337] l.24441 - Handle %&format in all cases.
 if (format_ident=0)or(buffer[loc]="&") then
 @y
 if (format_ident=0)or(buffer[loc]="&")or dump_line then
 @z
 
- at x [51.1337] l.24366 - Dynamic arrays size.
+ at x [51.1337] l.24447 - Dynamic arrays size.
   w_close(fmt_file);
 @y
   w_close(fmt_file);
@@ -4264,9 +4264,9 @@
   eqtb:=zeqtb;
 @z
 
-%% [51] m.1337 l.24371 - MLTeX: add. MLTeX banner after loading fmt file
+%% [51.1337] l.24371 - MLTeX: add. MLTeX banner after loading fmt file
 %%                     (MLTeX change: only "if mltex_enabled_p then ....;")
- at x [51.1337] l.24371 - Allocate hyphenation tries, do char translation, MLTeX
+ at x [51.1337] l.24452 - Allocate hyphenation tries, do char translation, MLTeX
 fix_date_and_time;@/
 @y
 if mltex_enabled_p then
@@ -4339,7 +4339,7 @@
 % not possible to portably switch into the debugger while a program is
 % running.  The best approximation is to do a core dump, then run the
 % debugger on it later.
- at x [52.1338] l.24411 - Core-dump in debugging mode on 0 input.
+ at x [52.1338] l.24493 - Core-dump in debugging mode on 0 input.
     begin goto breakpoint;@/ {go to every declared label at least once}
     breakpoint: m:=0; @{'BREAKPOINT'@}@/
     end
@@ -4347,9 +4347,9 @@
     dump_core {do something to cause a core dump}
 @z
 
- at x [52.1339] l.24429 - debug - print tfm info
+ at x [52.1339] l.24511 - debugprint tfm info
 5: print_word(font_info[n]);
- at y 24397
+ at y
 5: begin print_scaled(font_info[n].sc); print_char(" ");@/
   print_int(font_info[n].qqqq.b0); print_char(":");@/
   print_int(font_info[n].qqqq.b1); print_char(":");@/
@@ -4358,7 +4358,7 @@
   end;
 @z
 
- at x [53.1344] l.24544 - source specials
+ at x [53.1344] l.24624 - source specials
 primitive("special",extension,special_node);@/
 @y
 primitive("special",extension,special_node);@/
@@ -4365,7 +4365,7 @@
 text(frozen_special):="special"; eqtb[frozen_special]:=eqtb[cur_val];@/
 @z
 
- at x [53.1348] (do_extension) Remove unused variables
+ at x [53.1348] l.24657 - (do_extension) Remove unused variables
 var i,@!j,@!k:integer; {all-purpose integers}
 @!p,@!q,@!r:pointer; {all-purpose pointers}
 @y
@@ -4377,13 +4377,13 @@
 % refer to an actual file, though, so we don't need to change the
 % write_file or write_open arrays. We provide for disabling this at
 % runtime, for paranoids.
- at x [53.1350] l.24609 - system: Allow 18 as a \write stream.
+ at x [53.1350] l.24691 - system: Allow 18 as a \write stream.
   else if cur_val>15 then cur_val:=16;
 @y
   else if (cur_val>15) and (cur_val <> 18) then cur_val:=16;
 @z
 
- at x [53.1370] l.24770 - \write18{foo}
+ at x [53.1370] l.24852 - \write18{foo}
 begin @<Expand macros in the token list
 @y
 @!d:integer; {number of characters in incomplete current string}
@@ -4392,7 +4392,7 @@
 begin @<Expand macros in the token list
 @z
 
- at x [53.1370] l.24773 - system: (write_out) \write18{foo} => system(foo).
+ at x [53.1370] l.24855 - system: (write_out) \write18{foo} => system(foo).
 if write_open[j] then selector:=j
 @y
 if j=18 then selector := new_string
@@ -4400,7 +4400,7 @@
 @z
 
 % Then call system(3) on that string.
- at x [53.1370] l.24779 - system: (write_out) \write18{foo} => system(foo).
+ at x [53.1370] l.24861 - system: (write_out) \write18{foo} => system(foo).
 flush_list(def_ref); selector:=old_setting;
 @y
 flush_list(def_ref);
@@ -4447,7 +4447,7 @@
 selector:=old_setting;
 @z
 
- at x [53.1373] Need new local.
+ at x [53.1373] l.24902 - Need new local.
 procedure out_what(@!p:pointer);
 var j:small_number; {write stream number}
 @y
@@ -4456,7 +4456,7 @@
     @!old_setting:0..max_selector;
 @z
 
- at x [53.1374]
+ at x [53.1374] l.24923
   else  begin if write_open[j] then a_close(write_file[j]);
     if subtype(p)=close_node then write_open[j]:=false
 @y
@@ -4465,7 +4465,7 @@
     if subtype(p)=close_node then do_nothing {already closed}
 @z
 
- at x [still 53.1374] Disallow certain \openout filenames, and log results.
+ at x [53.1374] l.24930 - Disallow certain \openout filenames, and log results.
       while not a_open_out(write_file[j]) do
         prompt_file_name("output file name",".tex");
       write_open[j]:=true;
@@ -4489,7 +4489,7 @@
       end;
 @z
 
- at x [54.1376] l.24903 - Add editor-switch variables to globals.
+ at x [54.1379] l.24985 - Add editor-switch variables to globals.
 @* \[54] System-dependent changes.
 This section should be replaced, if necessary, by any special
 modifications of the program
@@ -5021,7 +5021,7 @@
 else if x<>0 then goto bad_fmt;
 @z
 
- at x [54.1379] l.24916 - extra routines
+ at x [54.1379] l.24996 - extra routines
 @* \[55] Index.
 @y
 

Modified: trunk/Build/source/texk/web2c/unbalanced-braces.ch
===================================================================
--- trunk/Build/source/texk/web2c/unbalanced-braces.ch	2024-06-03 20:04:07 UTC (rev 71416)
+++ trunk/Build/source/texk/web2c/unbalanced-braces.ch	2024-06-03 22:32:13 UTC (rev 71417)
@@ -6,8 +6,8 @@
 % an \output or \write and ending up in all sorts of ill-defined
 % trouble.  (Including the case of \output=\toks with no braces.)
 % 
-% For some problematic input files, see tests/unbalanced-braces.test
-% (not a runnable test).
+% For some problematic input texts, see tests/unbalanced-braces.test
+% (not a runnable test). References to bug reports are also there.
 %
 % The idea is that when it's time to run/evaluate each \output or \write,
 % they have to come to an end exactly as expected: at the right brace that



More information about the tex-live-commits mailing list.