diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luatex.ch')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/luatex.ch | 2176 |
1 files changed, 0 insertions, 2176 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luatex.ch b/Build/source/texk/web2c/luatexdir/luatex.ch deleted file mode 100644 index 7dd56dcb85f..00000000000 --- a/Build/source/texk/web2c/luatexdir/luatex.ch +++ /dev/null @@ -1,2176 +0,0 @@ -% luatex.ch -% -% Copyright 2006-2008 Taco Hoekwater <taco@luatex.org> -% -% This file is part of LuaTeX. -% -% LuaTeX is free software; you can redistribute it and/or modify it under -% the terms of the GNU General Public License as published by the Free -% Software Foundation; either version 2 of the License, or (at your -% option) any later version. -% -% LuaTeX is distributed in the hope that it will be useful, but WITHOUT -% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -% FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public -% License for more details. -% -% You should have received a copy of the GNU General Public License along -% with LuaTeX; if not, see <http://www.gnu.org/licenses/>. -% -% $Id$ -% -@x - \def\?##1]{\hbox to 1in{\hfil##1.\ }} - } -@y - \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }} - } -\let\maybe=\iftrue -@z - -@x -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. -@:PASCAL H}{\ph@> -@^system dependencies@> -@y -@z - -@x -program TEX; {all file names are defined dynamically} -label @<Labels in the outer block@>@/ -@y -program TEX; {all file names are defined dynamically} -@z - -@x -@ Three labels must be declared in the main program, so we give them -symbolic names. - -@d start_of_TEX=1 {go here when \TeX's variables are initialized} -@d end_of_TEX=9998 {go here to close files and terminate gracefully} -@d final_end=9999 {this label marks the ending of the program} - -@<Labels in the out...@>= -start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end; - {key control points} -@y -@ For Web2c, labels are not declared in the main program, but -we still have to declare the symbolic names. - -@d start_of_TEX=1 {go here when \TeX's variables are initialized} -@d final_end=9999 {this label marks the ending of the program} -@z - -@x -@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging} -@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging} -@y -@d debug== ifdef('TEXMF_DEBUG') -@d gubed== endif('TEXMF_DEBUG') -@z - -@x -@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering - usage statistics} -@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering - usage statistics} -@y -@d stat==ifdef('STAT') -@d tats==endif('STAT') -@z - -@x -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} -@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 -versions of the program. - -@d init==ifdef('INITEX') -@d tini==endif('INITEX') -@d Init==init if ini_version then begin -@d Tini==end;@+tini -@f Init==begin -@f Tini==end -@z - -@x -@!init @<Initialize table entries (done by \.{INITEX} only)@>@;@+tini -@y -@!Init @<Initialize table entries (done by \.{INITEX} only)@>@;@+Tini -@z - -@x -@<Constants...@>= -@!buf_size=500; {maximum number of characters simultaneously present in - current lines of open files and in control sequences between - \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|} -@!error_line=72; {width of context lines on terminal error messages} -@!half_error_line=42; {width of first lines of contexts in terminal - error messages; should be between 30 and |error_line-15|} -@!max_print_line=79; {width of longest text lines output; should be at least 60} -@!stack_size=200; {maximum number of simultaneous input sources} -@!max_in_open=6; {maximum number of input files and error insertions that - can be going on simultaneously} -@!param_size=60; {maximum number of simultaneous macro parameters} -@!nest_size=40; {maximum number of semantic levels simultaneously active} -@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|} -@!string_vacancies=8000; {the minimum number of characters that should be - available for the user's control sequences and font names, - after \TeX's own error messages are stored} -@!pool_size=32000; {maximum number of characters in strings, including all - error messages and help texts, and the names of all fonts and - control sequences; must exceed |string_vacancies| by the total - length of \TeX's own strings, which is currently about 23000} -@!save_size=600; {space for saving values outside of current group; must be - at most |max_halfword|} -@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8} -@!expand_depth=10000; {limits recursive calls of the |expand| procedure} -@!file_name_size=40; {file names shouldn't be longer than this} -@!pool_name='TeXformats:TEX.POOL '; - {string of length |file_name_size|; tells where the string pool appears} -@y -@d file_name_size == max_halfword-1 { has to be big enough to force namelength into integer } -@d ssup_error_line = 255 -@d ssup_max_strings == 262143 -{Larger values than 65536 cause the arrays consume much more memory.} - -@<Constants...@>= -@!hash_offset=0; {smallest index in hash array, i.e., |hash_base| } - {Use |hash_offset=0| for compilers which cannot decrement pointers.} -@!engine_name='luatex'; {the name of this engine} -@# - -@!inf_main_memory = 2000000; -@!sup_main_memory = 32000000; - -@!inf_max_strings = 100000; -@!sup_max_strings = ssup_max_strings; -@!inf_strings_free = 100; -@!sup_strings_free = sup_max_strings; - -@!inf_buf_size = 500; -@!sup_buf_size = 100000000; - -@!inf_nest_size = 40; -@!sup_nest_size = 4000; - -@!inf_max_in_open = 6; -@!sup_max_in_open = 127; - -@!inf_param_size = 60; -@!sup_param_size = 6000; - -@!inf_save_size = 600; -@!sup_save_size = 80000; - -@!inf_stack_size = 200; -@!sup_stack_size = 30000; - -@!inf_dvi_buf_size = 800; -@!sup_dvi_buf_size = 65536; - -@!inf_pool_size = 128000; -@!sup_pool_size = 40000000; -@!inf_pool_free = 1000; -@!sup_pool_free = sup_pool_size; -@!inf_string_vacancies = 8000; -@!sup_string_vacancies = sup_pool_size - 23000; - -@!sup_hash_extra = sup_max_strings; -@!inf_hash_extra = 0; - -@!sup_ocp_list_size = 1000000; -@!inf_ocp_list_size = 1000; -@!sup_ocp_buf_size = 100000000; -@!inf_ocp_buf_size = 1000; -@!sup_ocp_stack_size = 1000000; -@!inf_ocp_stack_size = 1000; - -@!inf_expand_depth = 100; -@!sup_expand_depth = 1000000; -@z - -@x -@d incr(#) == #:=#+1 {increase a variable by unity} -@d decr(#) == #:=#-1 {decrease a variable by unity} -@y -@z - -@x -@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 - -@x -@!nameoffile:packed array[1..file_name_size] of char;@;@/ - {on some systems this may be a \&{record} variable} -@y -@!nameoffile:^packed_ASCII_code; -@z - -@x -@ 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 -$$\vbox{\halign{#\hfil\qquad&#\hfil\cr -|reset(f,@t\\{name}@>,'/O')|&for input;\cr -|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$ -The `\\{name}' parameter, which is of type `{\bf packed array -$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of -the external file that is being opened for input or output. -Blank spaces that might appear in \\{name} are ignored. - -The `\.{/O}' parameter tells the operating system not to issue its own -error messages if something goes wrong. If a file of the specified name -cannot be found, or if such a file cannot be opened for some other reason -(e.g., someone may already be trying to write the same file), we will have -|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows -\TeX\ to undertake appropriate corrective action. -@:PASCAL H}{\ph@> -@^system dependencies@> - -\TeX's file-opening procedures return |false| if no file identified by -|nameoffile| could be opened. - -@d reset_OK(#)==erstat(#)=0 -@d rewrite_OK(#)==erstat(#)=0 - -@p function a_open_in(var f:alpha_file):boolean; - {open a text file for input} -begin reset(f,nameoffile,'/O'); a_open_in:=reset_OK(f); -end; -@# -function a_open_out(var f:alpha_file):boolean; - {open a text file for output} -begin rewrite(f,nameoffile,'/O'); a_open_out:=rewrite_OK(f); -end; -@# -function b_open_in(var f:byte_file):boolean; - {open a binary file for input} -begin reset(f,nameoffile,'/O'); b_open_in:=reset_OK(f); -end; -@# -function b_open_out(var f:byte_file):boolean; - {open a binary file for output} -begin rewrite(f,nameoffile,'/O'); b_open_out:=rewrite_OK(f); -end; -@# -function w_open_in(var f:word_file):boolean; - {open a word file for input} -begin reset(f,nameoffile,'/O'); w_open_in:=reset_OK(f); -end; -@# -function w_open_out(var f:word_file):boolean; - {open a word file for output} -begin rewrite(f,nameoffile,'/O'); w_open_out:=rewrite_OK(f); -end; -@y -@ All of the file opening functions are defined in C. -@z - -@x -@ Files can be closed with the \ph\ routine `|close(f)|', which -@:PASCAL H}{\ph@> -@^system dependencies@> -should be used when all input or output with respect to |f| has been completed. -This makes |f| available to be opened again, if desired; and if |f| was used for -output, the |close| operation makes the corresponding external file appear -on the user's area, ready to be read. - -These procedures should not generate error messages if a file is -being closed before it has been successfully opened. - -@p procedure a_close(var f:alpha_file); {close a text file} -begin close(f); -end; -@# -procedure b_close(var f:byte_file); {close a binary file} -begin close(f); -end; -@# -procedure w_close(var f:word_file); {close a word file} -begin close(f); -end; -@y -@ And all the file closing routines as well. -@z - -@x -@!buffer:array[0..buf_size] of packed_ASCII_code; {lines of characters being read} -@y -@!buffer:^packed_ASCII_code; {lines of characters being read} -@z - -@x -@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} -begin if bypass_eoln then if not eof(f) then get(f); - {input the first character of the line into |f^|} -last:=first; {cf.\ Matthew 19\thinspace:\thinspace30} -if eof(f) then input_ln:=false -else begin last_nonblank:=first; - while not eoln(f) do - begin if last>=max_buf_stack then - begin max_buf_stack:=last+1; - if max_buf_stack=buf_size then - @<Report overflow of the input buffer, and abort@>; - end; - buffer[last]:=f^; get(f); incr(last); - if buffer[last-1]<>" " then last_nonblank:=last; - end; - last:=last_nonblank; input_ln:=true; - end; -end; -@y -We define |input_ln| in C, for efficiency. Nevertheless we quote the module -`Report overflow of the input buffer, and abort' here in order to make -\.{WEAVE} happy, since part of that module is needed by e-TeX. - -@p @{ @<Report overflow of the input buffer, and abort@> @} -@z - -@x -@<Glob...@>= -@!term_in:alpha_file; {the terminal as an input file} -@!term_out:alpha_file; {the terminal as an output file} -@y -@d term_in==stdin {the terminal as an input file} -@d term_out==stdout {the terminal as an output file} - -@<Glob...@>= -@!init -@!ini_version:boolean; {are we \.{INITEX}?} -@!dump_option:boolean; {was the dump name option used?} -@!dump_line:boolean; {was a \.{\%\AM format} line seen?} -tini@/ -@# -@!bound_default:integer; {temporary for setup} -@!bound_name:constcstring; {temporary for setup} -@# -@!error_line:integer; {width of context lines on terminal error messages} -@!half_error_line:integer; {width of first lines of contexts in terminal - error messages; should be between 30 and |error_line-15|} -@!max_print_line:integer; - {width of longest text lines output; should be at least 60} -@!ocp_list_size:integer; -@!ocp_buf_size:integer; -@!ocp_stack_size:integer; -@!max_strings:integer; {maximum number of strings; must not exceed |max_halfword|} -@!strings_free:integer; {strings available after format loaded} -@!string_vacancies:integer; {the minimum number of characters that should be - available for the user's control sequences and font names, - after \TeX's own error messages are stored} -@!pool_size:integer; {maximum number of characters in strings, including all - error messages and help texts, and the names of all fonts and - control sequences; must exceed |string_vacancies| by the total - length of \TeX's own strings, which is currently about 23000} -@!pool_free:integer;{pool space free after format loaded} -@!font_k:integer; {loop variable for initialization} -@!buf_size:integer; {maximum number of characters simultaneously present in - current lines of open files and in control sequences between - \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|} -@!stack_size:integer; {maximum number of simultaneous input sources} -@!max_in_open:integer; {maximum number of input files and error insertions that - can be going on simultaneously} -@!param_size:integer; {maximum number of simultaneous macro parameters} -@!nest_size:integer; {maximum number of semantic levels simultaneously active} -@!save_size:integer; {space for saving values outside of current group; must be - at most |max_halfword|} -@!dvi_buf_size:integer; {size of the output buffer; must be a multiple of 8} -@!expand_depth:integer; {limits recursive calls of the |expand| procedure} -@!parsefirstlinep:cinttype; {parse the first line for options} -@!filelineerrorstylep:cinttype; {format messages as file:line:error} -@!haltonerrorp:cinttype; {stop at first error} -@!quoted_filename:boolean; {current filename is quoted} -@z - -@x -@ Here is how to open the terminal files -in \ph. The `\.{/I}' switch suppresses the first |get|. -@:PASCAL H}{\ph@> -@^system dependencies@> - -@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input} -@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output} -@y -@ Here is how to open the terminal files. |t_open_out| does nothing. -|t_open_in|, on the other hand, does the work of ``rescanning,'' or getting -any command line arguments the user has provided. It's defined in C. - -@d t_open_out == {output already open for text output} -@z - -@x -these operations can be specified in \ph: -@:PASCAL H}{\ph@> -@^system dependencies@> - -@d update_terminal == break(term_out) {empty the terminal output buffer} -@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer} -@y -these operations can be specified with {\mc UNIX}. |update_terminal| -does an |fflush|. |clear_terminal| is redefined -to do nothing, since the user should control the terminal. -@^system dependencies@> - -@d update_terminal == fflush (term_out) -@d clear_terminal == do_nothing -@z - -@x -@<Report overflow of the input buffer, and abort@>= -if format_ident=0 then - begin writeln(term_out,'Buffer size exceeded!'); goto final_end; -@.Buffer size exceeded@> - end -else - check_buffer_overflow(buf_size+10) { need a little bit more} -@y -@<Report overflow of the input buffer, and abort@>= - check_buffer_overflow(buf_size+10) { need a little bit more} -@z - -@x -@ 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, -if the system permits them. -@^system dependencies@> - -@p function init_terminal:boolean; {gets the terminal input started} -label exit; -begin t_open_in; -@y -@ The following program does the required initialization. -Iff anything has been specified on the command line, then |t_open_in| -will return with |last > first|. -@^system dependencies@> - -@p function init_terminal:boolean; {gets the terminal input started} -label exit; -begin t_open_in; -if last > first then - begin loc := first; - while (loc < last) and (buffer[loc]=' ') do incr(loc); - if loc < last then - begin init_terminal := true; goto exit; - end; - end; -@z - -@x - write(term_out,'! End of file on the terminal... why?'); -@y - writeln(term_out,'! End of file on the terminal... why?'); -@z - -@x -@!str_pool:packed array[pool_pointer] of packed_ASCII_code; {the characters} -@!str_start : array[str_number] of pool_pointer; {the starting pointers} -@y -@!str_pool: ^packed_ASCII_code; {the characters} -@!str_start : ^pool_pointer; {the starting pointers} -@z - -@x -@p @!init function get_strings_started:boolean; {initializes the string pool, -@y -@p @t\4@>@<Declare additional routines for string recycling@>@/ - -@!init function get_strings_started:boolean; {initializes the string pool, -@z - -@x -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 of the -@z - -@x -@!trick_buf:array[0..error_line] of packed_ASCII_code; {circular buffer for -@y -@!trick_buf:array[0..ssup_error_line] of packed_ASCII_code; {circular buffer for -@z - -@x -@d error_stop_mode=3 {stops at every opportunity to interact} -@y -@d error_stop_mode=3 {stops at every opportunity to interact} -@d unspecified_mode=4 {extra value for command-line switch} -@z - -@x - print_nl("! "); print(#); -@y - if filelineerrorstylep then print_file_line - else print_nl("! "); - print(#); -@z - -@x -@!interaction:batch_mode..error_stop_mode; {current level of interaction} -@y -@!interaction:batch_mode..error_stop_mode; {current level of interaction} -@!interactionoption:batch_mode..unspecified_mode; {set from command line} -@z - -@x -@ @<Set init...@>=interaction:=error_stop_mode; -@y -@ @<Set init...@>=if interactionoption=unspecified_mode then - interaction:=error_stop_mode -else - interaction:=interactionoption; -@z - -@x -@<Error hand...@>= -procedure jump_out; -begin goto end_of_TEX; -end; -@y -@d do_final_end==begin - update_terminal; - ready_already:=0; - if (history <> spotless) and (history <> warning_issued) then - uexit(1) - else - uexit(0); - end - -@<Error hand...@>= -procedure jump_out; -begin -close_files_and_terminate; -do_final_end; -end; -@z - -@x -show_context; -@y -show_context; -if (haltonerrorp) then begin - history:=fatal_error_stop; jump_out; -end; -@z - -@x -|remainder|, holds the remainder after a division. - -@<Glob...@>= -@y -|remainder|, holds the remainder after a division. - -@d remainder==tex_remainder - -@<Glob...@>= -@z - -@x -@!glue_ratio=real; {one-word representation of a glue expansion factor} -@y -@z - -@x -macros are simplified in the obvious way when |min_quarterword=0|. -@^inner loop@>@^system dependencies@> - -@d qi(#)==#+min_quarterword - {to put an |eight_bits| item into a quarterword} -@d qo(#)==#-min_quarterword - {to take an |eight_bits| item out of a quarterword} -@d hi(#)==#+min_halfword - {to put a sixteen-bit item into a halfword} -@d ho(#)==#-min_halfword - {to take a sixteen-bit item from a halfword} -@y -macros are simplified in the obvious way when |min_quarterword=0|. -So they have been simplified here in the obvious way. -@^inner loop@>@^system dependencies@> - -@d qi(#)==# {to put an |eight_bits| item into a quarterword} -@d qo(#)==# {to take an |eight_bits| item from a quarterword} -@d hi(#)==# {to put a sixteen-bit item into a halfword} -@d ho(#)==# {to take a sixteen-bit item from a halfword} -@z - -@x -@!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} -@!four_choices = 1..4; {used when there are four variants in a record} -@!two_halves = packed record@;@/ - @!rh:halfword; - case two_choices of - 1: (@!lh:halfword); - 2: (@!b0:quarterword; @!b1:quarterword); - end; -@!four_quarters = packed record@;@/ - @!b0:quarterword; - @!b1:quarterword; - @!b2:quarterword; - @!b3:quarterword; - end; -@!memory_word = record@;@/ - case four_choices of - 1: (@!int:integer); - 2: (@!gr:glue_ratio); - 3: (@!hh:two_halves); - 4: (@!qqqq:four_quarters); - end; -@y -@!quarterword = min_quarterword..max_quarterword; -@!halfword = min_halfword..max_halfword; -@!two_choices = 1..2; {used when there are two variants in a record} -@!four_choices = 1..4; {used when there are four variants in a record} -@=#include "texmfmem.h";@> -@z - -@x -begin if m>0 then - case m div (max_command+1) of - 0:print("vertical"); - 1:print("horizontal"); - 2:print("display math"); - end -else if m=0 then print("no") -else case (-m) div (max_command+1) of - 0:print("internal vertical"); - 1:print("restricted horizontal"); - 2:print("math"); - end; -print(" mode"); -end; -@y -begin if m>0 then - case m div (max_command+1) of - 0:print("vertical mode"); - 1:print("horizontal mode"); - 2:print("display math mode"); - end -else if m=0 then print("no mode") -else case (-m) div (max_command+1) of - 0:print("internal vertical mode"); - 1:print("restricted horizontal mode"); - 2:print("math mode"); - end; -end; - -procedure print_in_mode(@!m:integer); {prints the mode represented by |m|} -begin if m>0 then - case m div (max_command+1) of - 0:print("' in vertical mode"); - 1:print("' in horizontal mode"); - 2:print("' in display math mode"); - end -else if m=0 then print("' in no mode") -else case (-m) div (max_command+1) of - 0:print("' in internal vertical mode"); - 1:print("' in restricted horizontal mode"); - 2:print("' in math mode"); - end; -end; -@z - -@x -@!nest:array[0..nest_size] of list_state_record; -@y -@!nest:^list_state_record; -@z - -@x -@<Start a new current page@>; -@y -@/{The following piece of code is a copy of module 991:} -page_contents:=empty; page_tail:=page_head; {|link(page_head):=null;|}@/ -last_glue:=max_halfword; last_penalty:=0; last_kern:=0; -page_depth:=0; page_max_depth:=0; -@z - -@x - print_int(nest[p].pg_field); print(" line"); - if nest[p].pg_field<>1 then print_char("s"); -@y - print_int(nest[p].pg_field); - if nest[p].pg_field<>1 then print(" lines") - else print(" line"); -@z - -@x -for k:=null_cs to undefined_control_sequence-1 do - eqtb[k]:=eqtb[undefined_control_sequence]; -@y -for k:=null_cs to eqtb_top do - eqtb[k]:=eqtb[undefined_control_sequence]; -@z - -@x -@ 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@> -Since standard \PASCAL\ cannot provide such information, something special -is needed. The program here simply specifies July 4, 1776, at noon; but -users probably want a better approximation to the truth. - -@p procedure fix_date_and_time; -begin time:=12*60; {minutes since midnight} -day:=4; {fourth day of the month} -month:=7; {seventh month of the year} -year:=1776; {Anno Domini} -end; -@y -@ The following procedure, which is called just before \TeX\ initializes its -input and output, establishes the initial values of the date and time. -It calls a macro-defined |date_and_time| routine. |date_and_time| -in turn is a C macro, which calls |get_date_and_time|, passing -it the addresses of the day, month, etc., so they can be set by the -routine. |get_date_and_time| also sets up interrupt catching if that -is conditionally compiled in the C code. -@^system dependencies@> - -@d fix_date_and_time==dateandtime(time,day,month,year) -@z - -@x -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 - @<Show equivalent |n|, in region 1 or 2@> -@z - -@x -@!eqtb:array[null_cs..eqtb_size] of memory_word; -@y -@!zeqtb:^memory_word; -@z - -@x -@!hash: array[hash_base..undefined_control_sequence-1] of two_halves; - {the hash table} -@!hash_used:pointer; {allocation pointer for |hash|} -@y -@!hash: ^two_halves; {the hash table} -@!yhash: ^two_halves; {auxiliary pointer for freeing hash} -@!hash_used:pointer; {allocation pointer for |hash|} -@!hash_extra:pointer; {|hash_extra=hash| above |eqtb_size|} -@!hash_top:pointer; {maximum of the hash array} -@!eqtb_top:pointer; {maximum of the |eqtb|} -@!hash_high:pointer; {pointer to next high hash location} -@z - -@x -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 - -@x -hash_used:=frozen_control_sequence; {nothing is used} -@y -hash_used:=frozen_control_sequence; {nothing is used} -hash_high:=0; -@z - -@x -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 - print_esc("IMPOSSIBLE.") -@z - -@x -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 - -@x -@!save_stack : array[0..save_size] of memory_word; -@y -@!save_stack : ^memory_word; -@z - -@x -if p<int_base then -@y -if (p<int_base)or(p>eqtb_size) then -@z - -@x -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; -if (hash_offset<0)or(hash_offset>hash_base) then bad:=42; -@z - -@x -@!input_stack : array[0..stack_size] of in_state_record; -@y -@!input_stack : ^in_state_record; -@z - -@x -@!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; -@y -@!input_file : ^alpha_file; -@!line : integer; {current line number in the current source file} -@!line_stack : ^integer; -@!source_filename_stack : ^str_number; -@!full_source_filename_stack : ^str_number; -@z - -@x - begin print_nl("Runaway "); -@.Runaway...@> - case scanner_status of - defining: begin print("definition"); p:=def_ref; - end; - matching: begin print("argument"); p:=temp_token_head; - end; - aligning: begin print("preamble"); p:=hold_token_head; - end; - absorbing: begin print("text"); p:=def_ref; - end; - end; {there are no other cases} -@y - begin -@.Runaway...@> - case scanner_status of - defining: begin print_nl("Runaway definition"); p:=def_ref; - end; - matching: begin print_nl("Runaway argument"); p:=temp_token_head; - end; - aligning: begin print_nl("Runaway preamble"); p:=hold_token_head; - end; - absorbing: begin print_nl("Runaway text"); p:=def_ref; - end; - end; {there are no other cases} -@z - -@x -@!param_stack:array [0..param_size] of pointer; - {token list pointers for parameters} -@y -@!param_stack: ^pointer; - {token list pointers for parameters} -@z - -@x -incr(in_open); push_input; index:=in_open; -@y -incr(in_open); push_input; index:=in_open; -source_filename_stack[index]:=0;full_source_filename_stack[index]:=0; -@z - -@x -begin input_ptr:=0; max_in_stack:=0; -@y -begin input_ptr:=0; max_in_stack:=0; -source_filename_stack[0]:=0;full_source_filename_stack[0]:=0; -@z - -@x -if_eof_code: begin scan_four_bit_int; b:=(read_open[cur_val]=closed); - end; -@y -if_eof_code: begin scan_four_bit_int_or_18; - if cur_val=18 then b:=not shellenabledp - else b:=(read_open[cur_val]=closed); - end; -@z - -@x -@ 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; -otherwise the file area is null. If the remaining file name contains -`\..', the file extension consists of all such characters from the first -remaining `\..' to the end, otherwise the file extension is null. -@y -@ The file names we shall deal with have the -following structure: If the name contains `\./' or `\.:' -(for Amiga only), the file area -consists of all characters up to and including the final such character; -otherwise the file area is null. If the remaining file name contains -`\..', the file extension consists of all such characters from the last -`\..' to the end, otherwise the file extension is null. -@z - -@x -@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} -@!ext_delimiter:pool_pointer; {the relevant `\..', if any} -@y -@!area_delimiter:pool_pointer; {the most recent `\./', if any} -@!ext_delimiter:pool_pointer; {the most recent `\..', if any} -@z - -@x -@d TEX_area=="TeXinputs:" -@.TeXinputs@> -@d TEX_font_area=="TeXfonts:" -@.TeXfonts@> -@y -In C, the default paths are specified separately. -@z - -@x -@d append_to_name(#)==begin c:=#; incr(k); - if k<=file_name_size then nameoffile[k]:=xchr[c]; - end -@y -@d append_to_name(#)==begin c:=#; if not (c="""") then begin incr(k); - if k<=file_name_size then nameoffile[k]:=xchr[c]; - end end -@z - -@x -for j:=str_start_macro(a) to str_start_macro(a+1)-1 do append_to_name(so(str_pool[j])); -@y -if nameoffile then libcfree (nameoffile); -nameoffile:= xmallocarray (packed_ASCII_code, length(a)+length(n)+length(e)+1); -for j:=str_start_macro(a) to str_start_macro(a+1)-1 do append_to_name(so(str_pool[j])); -@z - -@x -for k:=namelength+1 to file_name_size do nameoffile[k]:=' '; -@y -nameoffile[namelength+1]:=0; -@z - -@x -@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} -@y -Under {\mc UNIX} we don't give the area part, instead depending -on the path searching that will happen during file opening. Also, the -length will be set in the main program. - -@d format_area_length=0 {length of its area part} -@d format_ext_length=4 {length of its `\.{.fmt}' part} -@z - -@x -@!TEX_format_default:packed array[1..format_default_length] of char; - -@ @<Set init...@>= -TEX_format_default:='TeXformats:plain.fmt'; -@y -@!format_default_length: integer; -@!TEX_format_default: ^char; - -@ We set the name of the default format file and the length of that name -in C, instead of Pascal, since we want them to depend on the name of the -program. -@z - -@x -for j:=1 to n do append_to_name(TEX_format_default[j]); -@y -if nameoffile then libcfree (nameoffile); -nameoffile := xmallocarray (packed_ASCII_code, n+(b-a+1)+format_ext_length+1); -for j:=1 to n do append_to_name(TEX_format_default[j]); -@z - -@x -for k:=namelength+1 to file_name_size do nameoffile[k]:=' '; -@y -nameoffile[namelength+1]:=0; -@z - -@x - 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); - {now try the system format file area} - if w_open_in(fmt_file) then goto found; -@y - pack_buffered_name(0,loc,j-1); {Kpathsea does everything} - if w_open_in(fmt_file) then goto found; -@z - -@x - wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.'); -@y - wterm ('Sorry, I can''t find the format `'); - fputs (stringcast(nameoffile + 1), stdout); - wterm ('''; will try `'); - fputs (TEX_format_default + 1, stdout); - wterm_ln ('''.'); -@z - -@x - wterm_ln('I can''t find the PLAIN format file!'); -@.I can't find PLAIN...@> -@y - wterm ('I can''t find the format file `'); - fputs (TEX_format_default + 1, stdout); - wterm_ln ('''!'); -@.I can't find the format...@> -@z - -@x -@d ensure_dvi_open==if output_file_name=0 then -@y -@d log_name == texmf_log_name -@d ensure_dvi_open==if output_file_name=0 then -@z - -@x -@!months:packed array [1..36] of char; {abbreviations of month names} -@y -@!months:constcstring; -@z - -@x -if job_name=0 then job_name:="texput"; -@.texput@> -@y -if job_name=0 then job_name:=getjobname("texput"); -@.texput@> -pack_job_name('.fls'); -recorder_change_filename(stringcast(nameoffile+1)); -@z - -@x -slow_print(format_ident); print(" "); -@y -wlog(versionstring); -slow_print(format_ident); print(" "); -@z - -@x -months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; -@y -months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; -@z - -@x -end -@y -if shellenabledp then begin - wlog_cr; - wlog(' '); - if restrictedshell then begin - wlog('restricted '); - end; - wlog('\write18 enabled.') - end; -if filelineerrorstylep then begin - wlog_cr; - wlog(' file:line:error style messages enabled.') - end; -if parsefirstlinep then begin - wlog_cr; - wlog(' %&-line parsing enabled.'); - end; -end -@z - -@x - prompt_file_name('input file name','.tex'); -@y - prompt_file_name('input file name',''); -@z - -@x -name:=a_make_name_string(cur_file); -@y -name:=a_make_name_string(cur_file); -source_filename_stack[in_open]:=name; -full_source_filename_stack[in_open]:=makefullnamestring; -if name=str_ptr-1 then {we can try to conserve string pool space now} - begin temp_str:=search_string(name); - if temp_str>0 then - begin name:=temp_str; flush_string; - end; - end; -@z - -@x - begin job_name:=cur_name; open_log_file; -@y - begin job_name:=getjobname(cur_name); open_log_file; -@z - -@x -if name=str_ptr-1 then {we can conserve string pool space now} - begin flush_string; name:=cur_name; - end; -@y -@z - -@x -@!ocp_list_info:array[ocp_list_index] of memory_word; - {the big collection of ocp list data} -@!ocp_listmem_ptr:ocp_list_index; {first unused word of |ocp_list_info|} -@!ocp_listmem_run_ptr:ocp_list_index; {temp unused word of |ocp_list_info|} -@!ocp_lstack_info:array[ocp_lstack_index] of memory_word; - {the big collection of ocp lstack data} -@!ocp_lstackmem_ptr:ocp_lstack_index; {first unused word of |ocp_lstack_info|} -@!ocp_lstackmem_run_ptr:ocp_lstack_index; {temp unused word of |ocp_lstack_info|} -@!ocp_list_ptr:internal_ocp_list_number; {largest internal ocp list number in use} -@!ocp_list_list:array[internal_ocp_list_number] of ocp_list_index; -@y -@!ocp_list_info:^memory_word; - {the big collection of ocp list data} -@!ocp_listmem_ptr:ocp_list_index; {first unused word of |ocp_list_info|} -@!ocp_listmem_run_ptr:ocp_list_index; {temp unused word of |ocp_list_info|} -@!ocp_lstack_info:^memory_word; - {the big collection of ocp lstack data} -@!ocp_lstackmem_ptr:ocp_lstack_index; {first unused word of |ocp_lstack_info|} -@!ocp_lstackmem_run_ptr:ocp_lstack_index; {temp unused word of |ocp_lstack_info|} -@!ocp_list_ptr:internal_ocp_list_number; {largest internal ocp list number in use} -@!ocp_list_list:^ocp_list_index; -@z - -@x -@!dvi_buf:array[dvi_index] of real_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} -@!dvi_ptr:dvi_index; {the next available buffer address} -@y -@!dvi_buf:^real_eight_bits; {buffer for \.{DVI} output} -@!half_buf:integer; {half of |dvi_buf_size|} -@!dvi_limit:integer; {end of the current half buffer} -@!dvi_ptr:integer; {the next available buffer address} -@z - -@x -@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]); -end; -@y -In C, we use a macro to call |fwrite| or |write| directly, writing all -the bytes in one shot. Much better even than writing four -bytes at a time. -@z - -@x - old_setting:=selector; selector:=new_string; -@y -if output_comment then - begin l:=strlen(output_comment); dvi_out(l); - for s:=0 to l-1 do dvi_out(output_comment[s]); - end -else begin {the default code is unchanged} - old_setting:=selector; selector:=new_string; -@z - -@x - pool_ptr:=str_start_macro(str_ptr); {flush the current string} -@y - pool_ptr:=str_start_macro(str_ptr); {flush the current string} -end; -@z - -@x -dvi_out(eop); incr(total_pages); cur_s:=-1; -@y -dvi_out(eop); incr(total_pages); cur_s:=-1; -ifdef ('IPC') -if ipcon>0 then - begin if dvi_limit=half_buf then - begin write_dvi(half_buf, dvi_buf_size-1); - flush_dvi; - dvi_gone:=dvi_gone+half_buf; - end; - if dvi_ptr>0 then - begin write_dvi(0, dvi_ptr-1); - flush_dvi; - dvi_offset:=dvi_offset+dvi_ptr; dvi_gone:=dvi_gone+dvi_ptr; - end; - dvi_ptr:=0; dvi_limit:=dvi_buf_size; - ipcpage(dvi_gone); - end; -endif ('IPC'); -@z - -@x - k:=4+((dvi_buf_size-dvi_ptr) mod 4); {the number of 223's} -@y -ifdef ('IPC') - k:=7-((3+dvi_offset+dvi_ptr) mod 4); {the number of 223's} -endif ('IPC') -ifndef ('IPC') - k:=4+((dvi_buf_size-dvi_ptr) mod 4); {the number of 223's} -endifn ('IPC') -@z - -@x - 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 - -@x - print(" ("); print_int(total_pages); print(" page"); - if total_pages<>1 then print_char("s"); -@y - print(" ("); print_int(total_pages); - if total_pages<>1 then print(" pages") - else print(" page"); -@z - -@x -@<Append character |cur_chr|...@>= -continue: adjust_space_factor;@/ -@y -@<Append character |cur_chr|...@>= -continue: adjust_space_factor;@/ -@z - -@x -print("' in "); print_mode(mode); -@y -print_in_mode(mode); -@z - -@x -if indented then begin - p:=new_null_box; box_dir(p):=par_direction; - width(p):=par_indent;@+ - tail_append(p); -@y -if indented then begin - p:=new_null_box; box_dir(p):=par_direction; - width(p):=par_indent;@+ - tail_append(p); -@z - -@x -begin print_err("Extra "); print_esc("endcsname"); -@.Extra \\endcsname@> -help1("I'm ignoring this, since I wasn't doing a \csname."); -@y -begin -if cur_chr = 10 then -begin - print_err("Extra "); print_esc("endmubyte"); -@.Extra \\endmubyte@> - help1("I'm ignoring this, since I wasn't doing a \mubyte."); -end else begin - print_err("Extra "); print_esc("endcsname"); -@.Extra \\endcsname@> - help1("I'm ignoring this, since I wasn't doing a \csname."); -end; -@z - -@x -if (cur_cs=0)or(cur_cs>frozen_control_sequence) then -@y -if (cur_cs=0)or(cur_cs>eqtb_top)or - ((cur_cs>frozen_control_sequence)and(cur_cs<=eqtb_size)) then -@z - -@x -interaction:=cur_chr; -@y -interaction:=cur_chr; -if interaction = batch_mode -then kpsemaketexdiscarderrors := 1 -else kpsemaketexdiscarderrors := 0; -@z - -@x -slow_print(s); update_terminal; -@y -print(s); update_terminal; -@z - -@x -begin print_err(""); slow_print(s); -@y -begin print_err(""); print(s); -@z - -@x -format_ident:=" (INITEX)"; -@y -if ini_version then format_ident:=" (INITEX)"; -@z - -@x -@!w: four_quarters; {four ASCII codes} -@y -@!format_engine: ^packed_ASCII_code; -@z - -@x -@!w: four_quarters; {four ASCII codes} -@y -@!format_engine: ^packed_ASCII_code; -@z - -@x -@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 -@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end -@y -@z - -@x -@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 -@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end -@y -@z - -@x -@d undump_size_end_end(#)==too_small(#)@+else undump_end_end -@y -@d format_debug_end(#)== - writeln (stderr, ' = ', #); - end; -@d format_debug(#)== - if debug_format_file then begin - write (stderr, 'fmtdebug:', #); - format_debug_end -@d undump_size_end_end(#)== - too_small(#)@+else format_debug (#)(x); undump_end_end -@z - -@x -dump_int(@$);@/ -@y -dump_int(@"57325458); {Web2C \TeX's magic constant: "W2TX"} -{Align engine to 4 bytes with one or more trailing NUL} -x:=strlen(engine_name); -format_engine:=xmallocarray(packed_ASCII_code,x+4); -strcpy(stringcast(format_engine), conststringcast(engine_name)); -for k:=x to x+3 do format_engine[k]:=0; -x:=x+4-(x mod 4); -dump_int(x);dump_things(format_engine[0], x); -libcfree(format_engine);@/ -dump_int(@$);@/ -dump_int(max_halfword);@/ -dump_int(hash_high); -@z - -@x -x:=fmt_file^.int; -if x<>@$ then goto bad_fmt; {check that strings are the same} -@y -@+Init -libcfree(str_pool); libcfree(str_start); -libcfree(yhash); libcfree(zeqtb); libcfree(fixmem); libcfree(varmemcast(varmem)); -@+Tini -undump_int(x); -format_debug('format magic number')(x); -if x<>@"57325458 then goto bad_fmt; {not a format file} -undump_int(x); -format_debug('engine name size')(x); -if (x<0) or (x>256) then goto bad_fmt; {corrupted format file} -format_engine:=xmallocarray(packed_ASCII_code, x); -undump_things(format_engine[0], x); -format_engine[x-1]:=0; {force string termination, just in case} -if strcmp(conststringcast(engine_name), stringcast(format_engine)) then - begin wake_up_terminal; - wterm_ln('---! ', stringcast(nameoffile+1), ' was written by ', format_engine); - libcfree(format_engine); - goto bad_fmt; -end; -libcfree(format_engine); -undump_int(x); -format_debug('string pool checksum')(x); -if x<>@$ then begin {check that strings are the same} - wake_up_terminal; - wterm_ln('---! ', stringcast(nameoffile+1), ' was written by an older version'); - goto bad_fmt; -end; -undump_int(x); -if x<>max_halfword then goto bad_fmt; {check |max_halfword|} -undump_int(hash_high); - if (hash_high<0)or(hash_high>sup_hash_extra) then goto bad_fmt; - if hash_extra<hash_high then hash_extra:=hash_high; - eqtb_top:=eqtb_size+hash_extra; - if hash_extra=0 then hash_top:=undefined_control_sequence else - hash_top:=eqtb_top; - yhash:=xmallocarray(two_halves,1+hash_top-hash_offset); - hash:=yhash - hash_offset; - next(hash_base):=0; text(hash_base):=0; - for x:=hash_base+1 to hash_top do hash[x]:=hash[hash_base]; - zeqtb:=xmallocarray (memory_word,eqtb_top+1); - eqtb:=zeqtb; - - eq_type(undefined_control_sequence):=undefined_cs; - equiv(undefined_control_sequence):=null; - eq_level(undefined_control_sequence):=level_zero; - for x:=eqtb_size+1 to eqtb_top do - eqtb[x]:=eqtb[undefined_control_sequence]; -@z - -@x -dump_int(str_ptr); -for k:=string_offset to str_ptr do dump_int(str_start_macro(k)); -k:=0; -while k+4<pool_ptr do - begin dump_four_ASCII; k:=k+4; - end; -k:=pool_ptr-4; dump_four_ASCII; -@y -dump_int((str_ptr-string_offset)); -dump_things(str_start[0], (str_ptr-string_offset)+1); -dump_things(str_pool[0], pool_ptr); -@z - -@x -undump_size(0)(pool_size)('string pool size')(pool_ptr); -undump_size(0)(max_strings)('max strings')(str_ptr); -for k:=string_offset to str_ptr do undump(0)(pool_ptr)(str_start_macro(k)); -k:=0; -while k+4<pool_ptr do - begin undump_four_ASCII; k:=k+4; - end; -k:=pool_ptr-4; undump_four_ASCII; -@y -undump_size(0)(sup_pool_size-pool_free)('string pool size')(pool_ptr); -if pool_size<pool_ptr+pool_free then - pool_size:=pool_ptr+pool_free; -undump_size(0)(sup_max_strings-strings_free)('sup strings')(str_ptr);@/ -if max_strings<str_ptr+strings_free then - max_strings:=str_ptr+strings_free; -str_start:=xmallocarray(pool_pointer, max_strings); -str_ptr:=str_ptr + string_offset; -undump_checked_things(0, pool_ptr, str_start[0], (str_ptr-string_offset)+1);@/ -str_pool:=xmallocarray(packed_ASCII_code, pool_size); -undump_things(str_pool[0], pool_ptr); -@z - -@x -for k:=fix_mem_min to fix_mem_end do dump_wd(mem(k)); -@y -dump_things(mem(fix_mem_min), fix_mem_end-fix_mem_min+1); -@z - -@x -for k:=fix_mem_min to fix_mem_end do undump_wd(mem(k)); -@y -undump_things (mem(fix_mem_min), fix_mem_end-fix_mem_min+1); -@z - -@x -undump(hash_base)(frozen_control_sequence)(par_loc); -par_token:=cs_token_flag+par_loc;@/ -undump(hash_base)(frozen_control_sequence)(write_loc);@/ -@y -undump(hash_base)(hash_top)(par_loc); -par_token:=cs_token_flag+par_loc;@/ -undump(hash_base)(hash_top)(write_loc);@/ -@z - -@x -while k<l do - begin dump_wd(eqtb[k]); incr(k); - end; -@y -dump_things(eqtb[k], l-k); -@z - -@x -while k<l do - begin dump_wd(eqtb[k]); incr(k); - end; -@y -dump_things(eqtb[k], l-k); -@z - -@x -k:=j+1; dump_int(k-l); -until k>eqtb_size -@y -k:=j+1; dump_int(k-l); -until k>eqtb_size; -if hash_high>0 then dump_things(eqtb[eqtb_size+1],hash_high); - {dump |hash_extra| part} -@z - -@x -for j:=k to k+x-1 do undump_wd(eqtb[j]); -@y -undump_things(eqtb[k], x); -@z - -@x -until k>eqtb_size -@y -until k>eqtb_size; -if hash_high>0 then undump_things(eqtb[eqtb_size+1],hash_high); - {undump |hash_extra| part} -@z - -@x -dump_int(hash_used); cs_count:=frozen_control_sequence-1-hash_used; -@y -dump_int(hash_used); cs_count:=frozen_control_sequence-1-hash_used+hash_high; -@z - -@x -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); -if hash_high>0 then dump_things(hash[eqtb_size+1], hash_high); -@z - -@x -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); -if debug_format_file then begin - print_csnames (hash_base, undefined_control_sequence - 1); -end; -if hash_high > 0 then begin - undump_things (hash[eqtb_size+1], hash_high); - if debug_format_file then begin - print_csnames (eqtb_size + 1, hash_high - (eqtb_size + 1)); - end; -end; -@z - -@x -@ @<Undump the array info for internal font number |k|@>= -begin undump_font(k);@/ -end -@y -@ @<Undump the array info for internal font number |k|@>= -begin undump_font(k);@/ -end; -make_pdftex_banner -@z - -@x -for k:=0 to active_max_ptr-1 do dump_wd(active_info[k]); -if active_max_ptr>0 then begin - print_ln; print_int(active_max_ptr); print(" words of active ocps"); - end; - -@ @<Undump the active ocp information@>= -undump_size(0)(active_mem_size)('active start point')(active_min_ptr); -undump_size(0)(active_mem_size)('active mem size')(active_max_ptr); -for k:=0 to active_max_ptr-1 do undump_wd(active_info[k]); -@y -if active_max_ptr>0 then - dump_things(active_info[0], active_max_ptr); -if active_max_ptr>0 then begin - print_ln; print_int(active_max_ptr); print(" words of active ocps"); - end; - -@ @<Undump the active ocp information@>= -undump_size(0)(active_mem_size)('active start point')(active_min_ptr); -undump_size(0)(active_mem_size)('active mem size')(active_max_ptr); -if active_max_ptr>0 then - undump_things(active_info[0], active_max_ptr); -@z - -@x -@ @<Dump the ocp list information@>= -dump_int(ocp_listmem_ptr); -for k:=0 to ocp_listmem_ptr-1 do dump_wd(ocp_list_info[k]); -dump_int(ocp_list_ptr); -for k:=null_ocp_list to ocp_list_ptr do begin - dump_int(ocp_list_list[k]); - if null_ocp_list<>ocp_list_ptr then begin - print_nl("\ocplist"); - print_esc(ocp_list_id_text(k)); - print_char("="); - print_ocp_list(ocp_list_list[k]); - end; - end; -dump_int(ocp_lstackmem_ptr); -for k:=0 to ocp_lstackmem_ptr-1 do dump_wd(ocp_lstack_info[k]) -@y -@ @<Dump the ocp list information@>= -dump_int(ocp_listmem_ptr); -dump_things(ocp_list_info[0], ocp_listmem_ptr); -dump_int(ocp_list_ptr); -dump_things(ocp_list_list[null_ocp_list], ocp_list_ptr+1-null_ocp_list); -for k:=null_ocp_list to ocp_list_ptr do begin - if null_ocp_list<>ocp_list_ptr then begin - print_nl("\ocplist"); - print_esc(ocp_list_id_text(k)); - print_char("="); - print_ocp_list(ocp_list_list[k]); - end; - end; -dump_int(ocp_lstackmem_ptr); -dump_things(ocp_lstack_info[0], ocp_lstackmem_ptr) -@z - -@x -@ @<Undump the ocp list information@>= -undump_size(1)(1000000)('ocp list mem size')(ocp_listmem_ptr); -for k:=0 to ocp_listmem_ptr-1 do undump_wd(ocp_list_info[k]); -undump_size(ocp_list_base)(ocp_list_biggest)('ocp list max')(ocp_list_ptr); -for k:=null_ocp_list to ocp_list_ptr do - undump_int(ocp_list_list[k]); -undump_size(1)(1000000)('ocp lstack mem size')(ocp_lstackmem_ptr); -for k:=0 to ocp_lstackmem_ptr-1 do undump_wd(ocp_lstack_info[k]) -@y -@ @<Undump the ocp list information@>= -undump_size(1)(1000000)('ocp list mem size')(ocp_listmem_ptr); -undump_things(ocp_list_info[0], ocp_listmem_ptr); -undump_size(0)(1000000)('ocp list max')(ocp_list_ptr); -undump_things(ocp_list_list[null_ocp_list], ocp_list_ptr+1-null_ocp_list); -undump_size(0)(1000000)('ocp lstack mem size')(ocp_lstackmem_ptr); -undump_things(ocp_lstack_info[0], ocp_lstackmem_ptr) -@z - -@x -undump(batch_mode)(error_stop_mode)(interaction); -@y -undump(batch_mode)(error_stop_mode)(interaction); -if interactionoption<>unspecified_mode then interaction:=interactionoption; -@z - -@x -if (x<>69069)or eof(fmt_file) then goto bad_fmt -@y -if x<>69069 then goto bad_fmt -@z - -@x -print(" (preloaded format="); print(job_name); print_char(" "); -@y -print(" (format="); print(job_name); print_char(" "); -@z - -@x -@p begin @!{|start_here|} -@y -@d const_chk(#)==begin if # < inf_@&# then # := inf_@&# else - if # > sup_@&# then # := sup_@&# end - -{|setup_bound_var| stuff duplicated in \.{mf.ch}.} -@d setup_bound_var(#)==bound_default:=#; setup_bound_var_end -@d setup_bound_var_end(#)==bound_name:=#; setup_bound_var_end_end -@d setup_bound_var_end_end(#)==if luainit>0 then begin - get_lua_number('texconfig',bound_name,addressof(#)); - if #=0 then #:=bound_default; - end - else - setupboundvariable(addressof(#), bound_name, bound_default); - -@p procedure main_body; -begin @!{|start_here|} - -{Bounds that may be set from the configuration file. We want the user to - be able to specify the names with underscores, but \.{TANGLE} removes - underscores, so we're stuck giving the names twice, once as a string, - once as the identifier. How ugly.} - - setup_bound_var (100000)('pool_size')(pool_size); - setup_bound_var (75000)('string_vacancies')(string_vacancies); - setup_bound_var (5000)('pool_free')(pool_free); {min pool avail after fmt} - setup_bound_var (15000)('max_strings')(max_strings); - setup_bound_var (100)('strings_free')(strings_free); - setup_bound_var (3000)('buf_size')(buf_size); - setup_bound_var (50)('nest_size')(nest_size); - setup_bound_var (15)('max_in_open')(max_in_open); - setup_bound_var (60)('param_size')(param_size); - setup_bound_var (4000)('save_size')(save_size); - setup_bound_var (300)('stack_size')(stack_size); - setup_bound_var (16384)('dvi_buf_size')(dvi_buf_size); - setup_bound_var (79)('error_line')(error_line); - setup_bound_var (50)('half_error_line')(half_error_line); - setup_bound_var (79)('max_print_line')(max_print_line); - setup_bound_var(1000)('ocp_list_size')(ocp_list_size); - setup_bound_var(1000)('ocp_buf_size')(ocp_buf_size); - setup_bound_var(1000)('ocp_stack_size')(ocp_stack_size); - setup_bound_var (0)('hash_extra')(hash_extra); - setup_bound_var (72)('pk_dpi')(pk_dpi); - setup_bound_var (10000)('expand_depth')(expand_depth); - - {Check other constants against their sup and inf.} - const_chk (buf_size); - const_chk (nest_size); - const_chk (max_in_open); - const_chk (param_size); - const_chk (save_size); - const_chk (stack_size); - const_chk (dvi_buf_size); - const_chk (pool_size); - const_chk (string_vacancies); - const_chk (pool_free); - const_chk (max_strings); - const_chk (strings_free); - const_chk (hash_extra); - const_chk (obj_tab_size); - const_chk (pdf_mem_size); - const_chk (dest_names_size); - const_chk (pk_dpi); - if error_line > ssup_error_line then error_line := ssup_error_line; - - {array memory allocation} - buffer:=xmallocarray (packed_ASCII_code, buf_size); - nest:=xmallocarray (list_state_record, nest_size); - save_stack:=xmallocarray (memory_word, save_size); - input_stack:=xmallocarray (in_state_record, stack_size); - input_file:=xmallocarray (alpha_file, max_in_open); - input_file_callback_id:=xmallocarray (integer, max_in_open); - line_stack:=xmallocarray (integer, max_in_open); - eof_seen:=xmallocarray (boolean, max_in_open); - grp_stack:=xmallocarray (save_pointer, max_in_open); - if_stack:=xmallocarray (pointer, max_in_open); - source_filename_stack:=xmallocarray (str_number, max_in_open); - full_source_filename_stack:=xmallocarray (str_number, max_in_open); - param_stack:=xmallocarray (halfword, param_size); - dvi_buf:=xmallocarray (real_eight_bits, dvi_buf_size); - ocp_list_info:=xmallocarray (memory_word, ocp_list_size); - memset(ocp_list_info,0,sizeof(memory_word)* ocp_list_size); - ocp_lstack_info:=xmallocarray (memory_word, ocp_list_size); - memset(ocp_lstack_info,0,sizeof(memory_word)* ocp_list_size); - ocp_list_list:=xmallocarray (ocp_list_index, ocp_list_size); - otp_init_input_buf:=xmallocarray (quarterword, ocp_buf_size); - otp_input_buf:=xmallocarray (quarterword, ocp_buf_size); - otp_output_buf:=xmallocarray (quarterword, ocp_buf_size); - otp_stack_buf:=xmallocarray (quarterword, ocp_stack_size); - otp_calcs:=xmallocarray (halfword, ocp_stack_size); - otp_states:=xmallocarray (halfword, ocp_stack_size); - obj_tab:=xmallocarray (obj_entry, inf_obj_tab_size); {will grow dynamically} - obj_offset(0):=0; - pdf_mem:=xmallocarray (integer, inf_pdf_mem_size); {will grow dynamically} - dest_names:=xmallocarray (dest_name_entry, inf_dest_names_size); {will grow dynamically} - pdf_op_buf:=xmallocarray (real_eight_bits, pdf_op_buf_size); - pdf_os_buf:=xmallocarray (real_eight_bits, inf_pdf_os_buf_size); {will grow dynamically} - pdf_os_objnum:=xmallocarray (integer, pdf_os_max_objs); - pdf_os_objoff:=xmallocarray (integer, pdf_os_max_objs); -@+Init - fixmem:=xmallocarray (smemory_word, fix_mem_init+1); - memset (voidcast(fixmem), 0, (fix_mem_init+1)*sizeof(smemory_word)); - fix_mem_min:=0; - fix_mem_max:=fix_mem_init; - - eqtb_top := eqtb_size+hash_extra; - if hash_extra=0 then hash_top:=undefined_control_sequence else - hash_top:=eqtb_top; - yhash:=xmallocarray (two_halves,1+hash_top-hash_offset); - hash:=yhash - hash_offset; {Some compilers require |hash_offset=0|} - next(hash_base):=0; text(hash_base):=0; - for hash_used:=hash_base+1 to hash_top do hash[hash_used]:=hash[hash_base]; - zeqtb:=xmallocarray (memory_word, eqtb_top); - eqtb:=zeqtb; - - str_start:=xmallocarray (pool_pointer, max_strings); - str_pool:=xmallocarray (packed_ASCII_code, pool_size); -@+Tini -@z - -@x -@!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; -tini@/ -@y -@!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; -Tini@/ -@z - -@x -end_of_TEX: close_files_and_terminate; -final_end: ready_already:=0; -end. -@y -close_files_and_terminate; -final_end: do_final_end; -end {|main_body|}; -@z - -@x - if format_ident=0 then wterm_ln(' (no format preloaded)') - else begin slow_print(format_ident); print_ln; - end; -@y - wterm(versionstring); - if format_ident>0 then slow_print(format_ident); - print_ln; - if shellenabledp then begin - wterm(' '); - if restrictedshell then begin - wterm('restricted '); - end; - wterm_ln('\write18 enabled.'); - end; -@z - -@x -write_svnversion(luatex_svnversion); -@y -wterm(versionstring); -write_svnversion(luatex_svnversion); -@z - -@x - slow_print(log_name); print_char("."); -@y - print_file_name(0, log_name, 0); print_char("."); -@z - -@x - end; -@y - end; -print_ln; -if (edit_name_start<>0) and (interaction>batch_mode) then - calledit(str_pool,edit_name_start,edit_name_length,edit_line); -@z - -@x - wlog_ln(' ',cs_count:1,' multiletter control sequences out of ', - hash_size:1);@/ -@y - wlog_ln(' ',cs_count:1,' multiletter control sequences out of ', - hash_size:1, '+', hash_extra:1);@/ -@z - -@x - begin @!init for i:=0 to biggest_used_mark do begin -@y - begin @!Init for i:=0 to biggest_used_mark do begin -@z - -@x - store_fmt_file; return;@+tini@/ -@y - store_fmt_file; return;@+Tini@/ -@z - -@x -if (format_ident=0)or(buffer[loc]="&") then -@y -if (format_ident=0)or(buffer[loc]="&")or dump_line then -@z - -@x - w_close(fmt_file); -@y - w_close(fmt_file); - eqtb:=zeqtb; -@z - -@x -fix_date_and_time;@/ -@y -fix_date_and_time;@/ -@!init -make_pdftex_banner; -tini@/ -@z - -@x - begin goto breakpoint;@\ {go to every label at least once} - breakpoint: m:=0; @{'BREAKPOINT'@}@\ - end -@y - abort {do something to cause a core dump} -@z - -@x - else if cur_val>15 then cur_val:=16; -@y - else if (cur_val>15) and (cur_val <> 18) then cur_val:=16; -@z - -@x -begin @<Expand macros in the token list -@y -@!d:integer; {number of characters in incomplete current string} -@!clobbered:boolean; {system string is ok?} -@!runsystem_ret:integer; {return value from |runsystem|} -begin @<Expand macros in the token list -@z - -@x -if write_open[j] then selector:=j -@y -if j=18 then selector := new_string -else if write_open[j] then selector:=j -@z - -@x -flush_list(def_ref); selector:=old_setting; -@y -flush_list(def_ref); -if j=18 then - begin if (tracing_online<=0) then - selector:=log_only {Show what we're doing in the log file.} - else selector:=term_and_log; {Show what we're doing.} - {If the log file isn't open yet, we can only send output to the terminal. - Calling |open_log_file| from here seems to result in bad data in the log.} - if not log_opened then selector:=term_only; - print_nl("runsystem("); - for d:=0 to cur_length-1 do - begin {|print| gives up if passed |str_ptr|, so do it by hand.} - print(so(str_pool[str_start_macro(str_ptr)+d])); {N.B.: not |print_char|} - end; - print(")..."); - if shellenabledp then begin - str_room(1); append_char(0); {Append a null byte to the expansion.} - clobbered:=false; - for d:=0 to cur_length-1 do {Convert to external character set.} - begin - str_pool[str_start_macro(str_ptr)+d]:=xchr[str_pool[str_start_macro(str_ptr)+d]]; - if (str_pool[str_start_macro(str_ptr)+d]=null_code) - and (d<cur_length-1) then clobbered:=true; - {minimal checking: NUL not allowed in argument string of |system|()} - end; - if clobbered then print("clobbered") - else begin {We have the command. See if we're allowed to execute it, - and report in the log. We don't check the actual exit status of - the command, or do anything with the output.} - runsystem_ret := runsystem(stringcast(addressof( - str_pool[str_start_macro(str_ptr)]))); - if runsystem_ret = -1 then print("quotation error in system command") - else if runsystem_ret = 0 then print("disabled (restricted)") - else if runsystem_ret = 1 then print("executed") - else if runsystem_ret = 2 then print("executed safely (allowed)") - end; - end else begin - print("disabled"); {|shellenabledp| false} - end; - print_char("."); print_nl(""); print_ln; - pool_ptr:=str_start_macro(str_ptr); {erase the string} -end; -selector:=old_setting; -@z - -@x -@!eof_seen : array[1..max_in_open] of boolean; {has eof been seen?} -@y -@!eof_seen : ^boolean; {has eof been seen?} -@z - -@x -@!grp_stack : array[0..max_in_open] of save_pointer; {initial |cur_boundary|} -@!if_stack : array[0..max_in_open] of pointer; {initial |cond_ptr|} -@y -@!grp_stack : ^save_pointer; {initial |cur_boundary|} -@!if_stack : ^pointer; {initial |cond_ptr|} -@z - -@x -@!otp_init_input_buf:array[0..20000] of quarterword; - -@!otp_input_start:halfword; -@!otp_input_last:halfword; -@!otp_input_end:halfword; -@!otp_input_buf:array[0..20000] of quarterword; - -@!otp_output_end:halfword; -@!otp_output_buf:array[0..20000] of quarterword; - -@!otp_stack_used:halfword; -@!otp_stack_last:halfword; -@!otp_stack_new:halfword; -@!otp_stack_buf:array[0..1000] of quarterword; - -@!otp_pc:halfword; - -@!otp_calc_ptr:halfword; -@!otp_calcs:array[0..1000] of halfword; -@!otp_state_ptr:halfword; -@!otp_states:array[0..1000] of halfword; -@y -@!otp_init_input_buf:^quarterword; - -@!otp_input_start:halfword; -@!otp_input_last:halfword; -@!otp_input_end:halfword; -@!otp_input_buf:^quarterword; - -@!otp_output_end:halfword; -@!otp_output_buf:^quarterword; - -@!otp_stack_used:halfword; -@!otp_stack_last:halfword; -@!otp_stack_new:halfword; -@!otp_stack_buf:^quarterword; - -@!otp_pc:halfword; - -@!otp_calc_ptr:halfword; -@!otp_calcs:^halfword; -@!otp_state_ptr:halfword; -@!otp_states:^halfword; -@z - -@x -@* \[54] System-dependent changes. -@y -@* \[54/web2c] System-dependent changes for Web2c. -Here are extra variables for Web2c. (This numbering of the -system-dependent section allows easy integration of Web2c and e-\TeX, etc.) -@^<system dependencies@> - -@<Glob...@>= -@!edit_name_start: pool_pointer; {where the filename to switch to starts} -@!edit_name_length,@!edit_line: integer; {what line to start editing at} -@!ipcon: cinttype; {level of IPC action, 0 for none [default]} -@!stop_at_space: boolean; {whether |more_name| returns false for space} - -@ The |edit_name_start| will be set to point into |str_pool| somewhere after -its beginning if \TeX\ is supposed to switch to an editor on exit. - -@<Set init...@>= -edit_name_start:=0; -stop_at_space:=true; - -@ These are used when we regenerate the representation of the first 256 -strings. - -@<Global...@> = -@!save_str_ptr: str_number; -@!save_pool_ptr: pool_pointer; -@!shellenabledp: cinttype; -@!restrictedshell: cinttype; -@!output_comment: ^char; -@!k,l: 0..255; {used by `Make the first 256 strings', etc.} - -@ When debugging a macro package, it can be useful to see the exact -control sequence names in the format file. For example, if ten new -csnames appear, it's nice to know what they are, to help pinpoint where -they came from. (This isn't a truly ``basic'' printing procedure, but -that's a convenient module in which to put it.) - -@<Basic printing procedures@> = -procedure print_csnames (hstart:integer; hfinish:integer); -var c,h:integer; -begin - writeln(stderr, 'fmtdebug:csnames from ', hstart, ' to ', hfinish, ':'); - for h := hstart to hfinish do begin - if text(h) > 0 then begin {if have anything at this position} - for c := str_start_macro(text(h)) to str_start_macro(text(h) + 1) - 1 - do begin - putbyte(str_pool[c], stderr); {print the characters} - end; - writeln(stderr, '|'); - end; - end; -end; - -@ Are we printing extra info as we read the format file? - -@<Glob...@> = -@!debug_format_file: boolean; - - -@ A helper for printing file:line:error style messages. Look for a -filename in |full_source_filename_stack|, and if we fail to find -one fall back on the non-file:line:error style. - -@<Basic print...@>= -procedure print_file_line; -var level: 0..max_in_open; -begin - level:=in_open; - while (level>0) and (full_source_filename_stack[level]=0) do - decr(level); - if level=0 then - print_nl("! ") - else begin - print_nl (""); print (full_source_filename_stack[level]); print (":"); - if level=in_open then print_int (line) - else print_int (line_stack[index+1-(in_open-level)]); - print (": "); - end; -end; - -@ To be able to determine whether \.{\\write18} is enabled from within -\TeX\ we also implement \.{\\eof18}. We sort of cheat by having an -additional route |scan_four_bit_int_or_18| which is the same as -|scan_four_bit_int| except it also accepts the value 18. - -@<Declare procedures that scan restricted classes of integers@>= -procedure scan_four_bit_int_or_18; -begin scan_int; -if (cur_val<0)or((cur_val>15)and(cur_val<>18)) then - begin print_err("Bad number"); -@.Bad number@> - help2("Since I expected to read a number between 0 and 15,")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -end; - -@* \[54/web2c-string] The string recycling routines. \TeX{} uses 2 -upto 4 {\it new\/} strings when scanning a filename in an \.{\\input}, -\.{\\openin}, or \.{\\openout} operation. These strings are normally -lost because the reference to them are not saved after finishing the -operation. |search_string| searches through the string pool for the -given string and returns either 0 or the found string number. - -@<Declare additional routines for string recycling@>= -function search_string(@!search:str_number):str_number; -label found; -var result: str_number; -@!s: str_number; {running index} -@!len: integer; {length of searched string} -begin result:=0; len:=length(search); -if len=0 then {trivial case} - begin result:=""; goto found; - end -else begin s:=search-1; {start search with newest string below |s|; |search>1|!} - while s>=string_offset do {first |string_offset| strings depend on implementation!!} - begin if length(s)=len then - if str_eq_str(s,search) then - begin result:=s; goto found; - end; - decr(s); - end; - end; -found:search_string:=result; -end; - -@ The following routine is a variant of |make_string|. It searches -the whole string pool for a string equal to the string currently built -and returns a found string. Otherwise a new string is created and -returned. Be cautious, you can not apply |flush_string| to a replaced -string! - -@<Declare additional routines for string recycling@>= -function slow_make_string : str_number; -label exit; -var s: str_number; {result of |search_string|} -@!t: str_number; {new string} -begin t:=make_string; s:=search_string(t); -if s>0 then - begin flush_string; slow_make_string:=s; return; - end; -slow_make_string:=t; -exit:end; - - -@* \[54] System-dependent changes. -@z - - -@x -@* \[55] Index. -@y - -@ This function used to be in pdftex, but is useful in tex too. - -@p function get_nullstr: str_number; -begin - get_nullstr := ""; -end; - -@* \[55] Index. -@z - |