diff options
Diffstat (limited to 'Build/source/texk/web2c/omegadir-1.15/om16bit.ch')
-rw-r--r-- | Build/source/texk/web2c/omegadir-1.15/om16bit.ch | 2635 |
1 files changed, 0 insertions, 2635 deletions
diff --git a/Build/source/texk/web2c/omegadir-1.15/om16bit.ch b/Build/source/texk/web2c/omegadir-1.15/om16bit.ch deleted file mode 100644 index 12d8b49d023..00000000000 --- a/Build/source/texk/web2c/omegadir-1.15/om16bit.ch +++ /dev/null @@ -1,2635 +0,0 @@ -% om16bit.ch: Basic changes to TeX data structures allowing all -% 8-bit entities to become 32-bit entities, in particular -% characters and glyphs. -% -% This file is part of Omega, -% which is based on the web2c distribution of TeX, -% -% Copyright (c) 1994--2000 John Plaice and Yannis Haralambous -% -% This library is free software; you can redistribute it and/or -% modify it under the terms of the GNU Library General Public -% License as published by the Free Software Foundation; either -% version 2 of the License, or (at your option) any later version. -% -% This library 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 -% Library General Public License for more details. -% -% You should have received a copy of the GNU Library General Public -% License along with this library; if not, write to the Free Software -% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -% -@x limbo l.1 - Omega -% This program is copyright (C) 1982 by D. E. Knuth; all rights are reserved. -@y -% This program is copyright -% (C) 1994--2000 by John Plaice and Yannis Haralambous. -% It is designed to be a change file for D. E. Knuth's TeX version 3.141592. -% -% This program is copyright (C) 1982 by D. E. Knuth; all rights are reserved. -@z -%--------------------------------------- -@x limbo l.80 -\def\title{\TeX82} -@y -\def\title{$\Omega$ (OMEGA)} -@z -%--------------------------------------- -@x [1] m.1 l.90 - Omega -This is \TeX, a document compiler intended to produce typesetting of high -quality. -The \PASCAL\ program that follows is the definition of \TeX82, a standard -@:PASCAL}{\PASCAL@> -@!@:TeX82}{\TeX82@> -@y -This is $\Omega$, a document compiler intended to simplify high-quality -typesetting for many of the world's languages. It is an extension -of D. E. Knuth's \TeX, which was designed essentially for the -typesetting of languages using the Latin alphabet. - -The $\Omega$ system loosens many of the restrictions imposed by~\TeX: -register numbers are no longer limited to 8~bits; fonts may have more -than 256~characters; more than 256~fonts may be used; etc. In addition, -$\Omega$ allows much more complex ligature mechanisms between characters, -thereby simplifying the typesetting of alphabets that have preserved -their calligraphic traditions. - -The \PASCAL\ program that follows is a modification of the definition of \TeX82, -a standard @:PASCAL}{\PASCAL@> @!@:TeX82}{\TeX82@> -@z -%--------------------------------------- -@x [1] m.1 l.97 - Omega -will be obtainable on a great variety of computers. - -@y -will be obtainable on a great variety of computers. - -As little as possible is changed in this document. This means that -unless the contrary is explicitly stated, references to \TeX\ in the -documentation are equally applicable to~$\Omega$. References to `the -author' in the documentation are to D. E. Knuth. - -@z -%--------------------------------------- -@x [1] m.2 l.187 - Omega -@d banner=='This is TeX, Version 3.141592' {printed when \TeX\ starts} -@y -@d banner=='This is Omega, Version 3.141592--1.15' {printed when \TeX\ starts} -@z -%--------------------------------------- -@x [1] m.4 l.243 -program TEX; {all file names are defined dynamically} -@y -program OMEGA; {all file names are defined dynamically} -@z -%--------------------------------------- -@x [1] m.11 l.392 - Omega -@!font_max=75; {maximum internal font number; must not exceed |max_quarterword| - and must be at most |font_base+256|} -@!font_mem_size=20000; {number of words of |font_info| for all fonts} -@y -@!font_max=65535; {maximum internal font number; must be at most |font_biggest|} -@z -%--------------------------------------- -@x [1] m.11 l.412 - Omega -@!pool_name='TeXformats:TEX.POOL '; -@y -@!pool_name='TeXformats:OMEGA.POOL '; -@z -%--------------------------------------- -@x [1] m.12 l.437 - Omega -@d hash_size=2100 {maximum number of control sequences; it should be at most - about |(mem_max-mem_min)/10|} -@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|} -@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions} -@y -@d hash_size=65536 {maximum number of control sequences; it should be at most - about |(mem_max-mem_min)/10|} -@d hash_prime=55711 {a prime number equal to about 85\pct! of |hash_size|} -@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions} -@d biggest_char=65535 {the largest allowed character number; - must be |<=max_quarterword|} -@d too_big_char=65536 {|biggest_char+1|} -@d special_char=65537 {|biggest_char+2|} -@d number_chars=65536 {|biggest_char+1|} -@d biggest_reg=65535 {the largest allowed register number; - must be |<=max_quarterword|} -@d number_regs=65536 {|biggest_reg+1|} -@d font_biggest=65535 {the real biggest font} -@d number_fonts=font_biggest-font_base+2 -@d number_math_fonts=768 -@d math_font_biggest=767 -@d text_size=0 {size code for the largest size in a family} -@d script_size=256 {size code for the medium size in a family} -@d script_script_size=512 {size code for the smallest size in a family} -@d biggest_lang=255 -@d too_big_lang=256 -@z -%--------------------------------------- -@x [8] m.110 l.2355 - Omega -In order to make efficient use of storage space, \TeX\ bases its major data -structures on a |memory_word|, which contains either a (signed) integer, -possibly scaled, or a (signed) |glue_ratio|, or a small number of -fields that are one half or one quarter of the size used for storing -integers. - -@y -In order to make efficient use of storage space, \TeX\ bases its major data -structures on a |memory_word|, which contains either a (signed) integer, -possibly scaled, or a (signed) |glue_ratio|, or a small number of -fields that are one half or one quarter of the size used for storing -integers. - -That is the description for \TeX. For $\Omega$, we are going to keep -the same terminology, except that |quarterword| is going to refer to -16~bits, and |halfword| is going to refer to 32~bits. So, in fact, -a |memory_word| will take 64 bits, and, on a 64-bit machine, will run -smaller than \TeX\ will! - -@z -%--------------------------------------- -@x [8] m.110 l.2378 - Omega -Since we are assuming 32-bit integers, a halfword must contain at least -16 bits, and a quarterword must contain at least 8 bits. -@^system dependencies@> -But it doesn't hurt to have more bits; for example, with enough 36-bit -words you might be able to have |mem_max| as large as 262142, which is -eight times as much memory as anybody had during the first four years of -\TeX's existence. - -N.B.: Valuable memory space will be dreadfully wasted unless \TeX\ is compiled -by a \PASCAL\ that packs all of the |memory_word| variants into -the space of a single integer. This means, for example, that |glue_ratio| -words should be |short_real| instead of |real| on some computers. Some -\PASCAL\ compilers will pack an integer whose subrange is `|0..255|' into -an eight-bit field, but others insist on allocating space for an additional -sign bit; on such systems you can get 256 values into a quarterword only -if the subrange is `|-128..127|'. - -@y -@z -%--------------------------------------- -@x [8] m.110 l.2406 - Omega -@d max_quarterword=255 {largest allowable value in a |quarterword|} -@d min_halfword==0 {smallest allowable value in a |halfword|} -@d max_halfword==65535 {largest allowable value in a |halfword|} -@y -@d max_quarterword=@"FFFF {largest allowable value in a |quarterword|} -@d min_halfword=0 {smallest allowable value in a |halfword|} -@d max_halfword=@"3FFFFFFF {largest allowable value in a |halfword|} -@z -%--------------------------------------- -@x [8] m.111 l.2416 - Omega -if (min_quarterword>0)or(max_quarterword<127) then bad:=11; -if (min_halfword>0)or(max_halfword<32767) then bad:=12; -@y -if (min_quarterword>0)or(max_quarterword<@"7FFF) then bad:=11; -if (min_halfword>0)or(max_halfword<@"3FFFFFFF) then bad:=12; -@z -%--------------------------------------- -@x [8] m.111 l.2423 - Omega -if font_max>font_base+256 then bad:=16; -@y -if font_max>font_base+@"10000 then bad:=16; -@z -%--------------------------------------- -@x [8] m.111 l.2426 - Omega -if max_quarterword-min_quarterword<255 then bad:=19; -@y -if max_quarterword-min_quarterword<@"FFFF then bad:=19; -@z -%--------------------------------------- -@x [10] m.134 l.2832 - Omega -Note that the format of a |char_node| allows for up to 256 different -fonts and up to 256 characters per font; but most implementations will -probably limit the total number of fonts to fewer than 75 per job, -and most fonts will stick to characters whose codes are -less than 128 (since higher codes -are more difficult to access on most keyboards). - -Extensions of \TeX\ intended for oriental languages will need even more -than $256\times256$ possible characters, when we consider different sizes -@^oriental characters@>@^Chinese characters@>@^Japanese characters@> -and styles of type. It is suggested that Chinese and Japanese fonts be -handled by representing such characters in two consecutive |char_node| -entries: The first of these has |font=font_base|, and its |link| points -to the second; -the second identifies the font and the character dimensions. -The saving feature about oriental characters is that most of them have -the same box dimensions. The |character| field of the first |char_node| -is a ``\\{charext}'' that distinguishes between graphic symbols whose -dimensions are identical for typesetting purposes. (See the \MF\ manual.) -Such an extension of \TeX\ would not be difficult; further details are -left to the reader. -@y -Note that the format of a |char_node| allows for up to 65536 different -fonts and up to 65536 characters per font. -@z -%--------------------------------------- -@x [15] m.208 l.4127 - Omega -@d min_internal=68 {the smallest code that can follow \.{\\the}} -@d char_given=68 {character code defined by \.{\\chardef}} -@d math_given=69 {math code defined by \.{\\mathchardef}} -@d last_item=70 {most recent item ( \.{\\lastpenalty}, - \.{\\lastkern}, \.{\\lastskip} )} -@d max_non_prefixed_command=70 {largest command code that can't be \.{\\global}} -@y -@d min_internal=end_cs_name+1 {the smallest code that can follow \.{\\the}} -@d char_given=min_internal {character code defined by \.{\\chardef}} -@d math_given=char_given+1 {math code defined by \.{\\mathchardef}} -@d omath_given=math_given+1 {math code defined by \.{\\omathchardef}} -@d last_item=omath_given+1 {most recent item ( \.{\\lastpenalty}, - \.{\\lastkern}, \.{\\lastskip} )} -@d max_non_prefixed_command=last_item - {largest command code that can't be \.{\\global}} -@z -%--------------------------------------- -@x [15] m.209 l.4138 - Omega -@d toks_register=71 {token list register ( \.{\\toks} )} -@d assign_toks=72 {special token list ( \.{\\output}, \.{\\everypar}, etc.~)} -@d assign_int=73 {user-defined integer ( \.{\\tolerance}, \.{\\day}, etc.~)} -@d assign_dimen=74 {user-defined length ( \.{\\hsize}, etc.~)} -@d assign_glue=75 {user-defined glue ( \.{\\baselineskip}, etc.~)} -@d assign_mu_glue=76 {user-defined muglue ( \.{\\thinmuskip}, etc.~)} -@d assign_font_dimen=77 {user-defined font dimension ( \.{\\fontdimen} )} -@d assign_font_int=78 {user-defined font integer ( \.{\\hyphenchar}, - \.{\\skewchar} )} -@d set_aux=79 {specify state info ( \.{\\spacefactor}, \.{\\prevdepth} )} -@d set_prev_graf=80 {specify state info ( \.{\\prevgraf} )} -@d set_page_dimen=81 {specify state info ( \.{\\pagegoal}, etc.~)} -@d set_page_int=82 {specify state info ( \.{\\deadcycles}, - \.{\\insertpenalties} )} -@d set_box_dimen=83 {change dimension of box ( \.{\\wd}, \.{\\ht}, \.{\\dp} )} -@d set_shape=84 {specify fancy paragraph shape ( \.{\\parshape} )} -@d def_code=85 {define a character code ( \.{\\catcode}, etc.~)} -@d def_family=86 {declare math fonts ( \.{\\textfont}, etc.~)} -@d set_font=87 {set current font ( font identifiers )} -@d def_font=88 {define a font file ( \.{\\font} )} -@d register=89 {internal register ( \.{\\count}, \.{\\dimen}, etc.~)} -@d max_internal=89 {the largest code that can follow \.{\\the}} -@d advance=90 {advance a register or parameter ( \.{\\advance} )} -@d multiply=91 {multiply a register or parameter ( \.{\\multiply} )} -@d divide=92 {divide a register or parameter ( \.{\\divide} )} -@d prefix=93 {qualify a definition ( \.{\\global}, \.{\\long}, \.{\\outer} )} -@d let=94 {assign a command code ( \.{\\let}, \.{\\futurelet} )} -@d shorthand_def=95 {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)} -@d read_to_cs=96 {read into a control sequence ( \.{\\read} )} -@d def=97 {macro definition ( \.{\\def}, \.{\\gdef}, \.{\\xdef}, \.{\\edef} )} -@d set_box=98 {set a box ( \.{\\setbox} )} -@d hyph_data=99 {hyphenation data ( \.{\\hyphenation}, \.{\\patterns} )} -@d set_interaction=100 {define level of interaction ( \.{\\batchmode}, etc.~)} -@d max_command=100 {the largest command code seen at |big_switch|} -@y -@d toks_register=max_non_prefixed_command+1 - {token list register ( \.{\\toks} )} -@d assign_toks=toks_register+1 - {special token list ( \.{\\output}, \.{\\everypar}, etc.~)} -@d assign_int=assign_toks+1 - {user-defined integer ( \.{\\tolerance}, \.{\\day}, etc.~)} -@d assign_dimen=assign_int+1 - {user-defined length ( \.{\\hsize}, etc.~)} -@d assign_glue=assign_dimen+1 - {user-defined glue ( \.{\\baselineskip}, etc.~)} -@d assign_mu_glue=assign_glue+1 - {user-defined muglue ( \.{\\thinmuskip}, etc.~)} -@d assign_font_dimen=assign_mu_glue+1 - {user-defined font dimension ( \.{\\fontdimen} )} -@d assign_font_int=assign_font_dimen+1 - {user-defined font integer ( \.{\\hyphenchar}, \.{\\skewchar} )} -@d set_aux=assign_font_int+1 - {specify state info ( \.{\\spacefactor}, \.{\\prevdepth} )} -@d set_prev_graf=set_aux+1 - {specify state info ( \.{\\prevgraf} )} -@d set_page_dimen=set_prev_graf+1 - {specify state info ( \.{\\pagegoal}, etc.~)} -@d set_page_int=set_page_dimen+1 - {specify state info ( \.{\\deadcycles}, - \.{\\insertpenalties} )} -@d set_box_dimen=set_page_int+1 - {change dimension of box ( \.{\\wd}, \.{\\ht}, \.{\\dp} )} -@d set_shape=set_box_dimen+1 - {specify fancy paragraph shape ( \.{\\parshape} )} -@d def_code=set_shape+1 - {define a character code ( \.{\\catcode}, etc.~)} -@d def_family=def_code+1 - {declare math fonts ( \.{\\textfont}, etc.~)} -@d set_font=def_family+1 - {set current font ( font identifiers )} -@d def_font=set_font+1 - {define a font file ( \.{\\font} )} -@d register=def_font+1 - {internal register ( \.{\\count}, \.{\\dimen}, etc.~)} -@d max_internal=register - {the largest code that can follow \.{\\the}} -@d advance=max_internal+1 - {advance a register or parameter ( \.{\\advance} )} -@d multiply=advance+1 - {multiply a register or parameter ( \.{\\multiply} )} -@d divide=multiply+1 - {divide a register or parameter ( \.{\\divide} )} -@d prefix=divide+1 - {qualify a definition ( \.{\\global}, \.{\\long}, \.{\\outer} )} -@d let=prefix+1 - {assign a command code ( \.{\\let}, \.{\\futurelet} )} -@d shorthand_def=let+1 - {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)} -@d read_to_cs=shorthand_def+1 - {read into a control sequence ( \.{\\read} )} -@d def=read_to_cs+1 - {macro definition ( \.{\\def}, \.{\\gdef}, \.{\\xdef}, \.{\\edef} )} -@d set_box=def+1 - {set a box ( \.{\\setbox} )} -@d hyph_data=set_box+1 - {hyphenation data ( \.{\\hyphenation}, \.{\\patterns} )} -@d set_interaction=hyph_data+1 - {define level of interaction ( \.{\\batchmode}, etc.~)} -@d max_command=set_interaction - {the largest command code seen at |big_switch|} -@z -%--------------------------------------- -@x [17] m.220 l.4486 - Omega -@d eq_level(#)==eq_level_field(eqtb[#]) {level of definition} -@d eq_type(#)==eq_type_field(eqtb[#]) {command code for equivalent} -@d equiv(#)==equiv_field(eqtb[#]) {equivalent value} -@y -@d eq_level(#)==new_eq_level(#) {level of definition} -@d eq_type(#)==new_eq_type(#) {command code for equivalent} -@d equiv(#)==new_equiv(#) {equivalent value} -@d equiv1(#)==new_equiv1(#) {equivalent value} -@z -%--------------------------------------- -@x [17] m.222 l.4496 - Omega -In the first region we have 256 equivalents for ``active characters'' that -act as control sequences, followed by 256 equivalents for single-character -control sequences. -@y -In the first region we have |number_chars| equivalents for ``active characters'' -that act as control sequences, followed by |number_chars| equivalents for -single-character control sequences. -@z -%--------------------------------------- -@x [17] m.222 l.4507 - Omega -@d single_base=active_base+256 {equivalents of one-character control sequences} -@d null_cs=single_base+256 {equivalent of \.{\\csname\\endcsname}} -@y -@d single_base=active_base+number_chars - {equivalents of one-character control sequences} -@d null_cs=single_base+number_chars {equivalent of \.{\\csname\\endcsname}} -@z -%--------------------------------------- -@x [17] m.222 l.4530 - Omega -eq_type(undefined_control_sequence):=undefined_cs; -equiv(undefined_control_sequence):=null; -eq_level(undefined_control_sequence):=level_zero; -for k:=active_base to undefined_control_sequence-1 do - eqtb[k]:=eqtb[undefined_control_sequence]; -@y -set_eq_type(undefined_control_sequence,undefined_cs); -set_equiv(undefined_control_sequence,null); -set_eq_level(undefined_control_sequence,level_zero); -@z -%--------------------------------------- -@x [17] m.224 l.4547 - Omega -@ Region 3 of |eqtb| contains the 256 \.{\\skip} registers, as well as the -glue parameters defined here. It is important that the ``muskip'' -parameters have larger numbers than the others. -@y -@ Region 3 of |eqtb| contains the |number_regs| \.{\\skip} registers, -as well as the glue parameters defined here. It is important that the -``muskip'' parameters have larger numbers than the others. -@z -%--------------------------------------- -@x [17] m.224 l.4572 - Omega -@d skip_base=glue_base+glue_pars {table of 256 ``skip'' registers} -@d mu_skip_base=skip_base+256 {table of 256 ``muskip'' registers} -@d local_base=mu_skip_base+256 {beginning of region 4} -@y -@d skip_base=glue_base+glue_pars {table of |number_regs| ``skip'' registers} -@d mu_skip_base=skip_base+number_regs - {table of |number_regs| ``muskip'' registers} -@d local_base=mu_skip_base+number_regs {beginning of region 4} -@z -%--------------------------------------- -@x [17] m.228 l.4685 - Omega -equiv(glue_base):=zero_glue; eq_level(glue_base):=level_one; -eq_type(glue_base):=glue_ref; -for k:=glue_base+1 to local_base-1 do eqtb[k]:=eqtb[glue_base]; -@y -set_equiv(glue_base,zero_glue); set_eq_level(glue_base,level_one); -set_eq_type(glue_base,glue_ref); -@z -%--------------------------------------- -@x [17] m.230 l.4721 - Omega -@d toks_base=local_base+10 {table of 256 token list registers} -@d box_base=toks_base+256 {table of 256 box registers} -@d cur_font_loc=box_base+256 {internal font number outside math mode} -@d math_font_base=cur_font_loc+1 {table of 48 math font numbers} -@d cat_code_base=math_font_base+48 - {table of 256 command codes (the ``catcodes'')} -@d lc_code_base=cat_code_base+256 {table of 256 lowercase mappings} -@d uc_code_base=lc_code_base+256 {table of 256 uppercase mappings} -@d sf_code_base=uc_code_base+256 {table of 256 spacefactor mappings} -@d math_code_base=sf_code_base+256 {table of 256 math mode mappings} -@d int_base=math_code_base+256 {beginning of region 5} -@y -@d toks_base=local_base+10 {table of |number_regs| token list registers} -@d box_base=toks_base+number_regs {table of |number_regs| box registers} -@d cur_font_loc=box_base+number_regs {internal font number outside math mode} -@d math_font_base=cur_font_loc+1 - {table of |number_math_fonts| math font numbers} -@d cat_code_base=math_font_base+number_math_fonts - {table of |number_chars| command codes (the ``catcodes'')} -@d lc_code_base=cat_code_base+number_chars - {table of |number_chars| lowercase mappings} -@d uc_code_base=lc_code_base+number_chars - {table of |number_chars| uppercase mappings} -@d sf_code_base=uc_code_base+number_chars - {table of |number_chars| spacefactor mappings} -@d math_code_base=sf_code_base+number_chars - {table of |number_chars| math mode mappings} -@d int_base=math_code_base+number_chars {beginning of region 5} -@z -%--------------------------------------- -@x [17] m.232 l.4802 - Omega -@d var_code==@'70000 {math code meaning ``use the current family''} - -@<Initialize table entries...@>= -par_shape_ptr:=null; eq_type(par_shape_loc):=shape_ref; -eq_level(par_shape_loc):=level_one;@/ -for k:=output_routine_loc to toks_base+255 do - eqtb[k]:=eqtb[undefined_control_sequence]; -box(0):=null; eq_type(box_base):=box_ref; eq_level(box_base):=level_one; -for k:=box_base+1 to box_base+255 do eqtb[k]:=eqtb[box_base]; -cur_font:=null_font; eq_type(cur_font_loc):=data; -eq_level(cur_font_loc):=level_one;@/ -for k:=math_font_base to math_font_base+47 do eqtb[k]:=eqtb[cur_font_loc]; -equiv(cat_code_base):=0; eq_type(cat_code_base):=data; -eq_level(cat_code_base):=level_one;@/ -for k:=cat_code_base+1 to int_base-1 do eqtb[k]:=eqtb[cat_code_base]; -for k:=0 to 255 do - begin cat_code(k):=other_char; math_code(k):=hi(k); sf_code(k):=1000; - end; -cat_code(carriage_return):=car_ret; cat_code(" "):=spacer; -cat_code("\"):=escape; cat_code("%"):=comment; -cat_code(invalid_code):=invalid_char; cat_code(null_code):=ignore; -for k:="0" to "9" do math_code(k):=hi(k+var_code); -for k:="A" to "Z" do - begin cat_code(k):=letter; cat_code(k+"a"-"A"):=letter;@/ - math_code(k):=hi(k+var_code+@"100); - math_code(k+"a"-"A"):=hi(k+"a"-"A"+var_code+@"100);@/ - lc_code(k):=k+"a"-"A"; lc_code(k+"a"-"A"):=k+"a"-"A";@/ - uc_code(k):=k; uc_code(k+"a"-"A"):=k;@/ - sf_code(k):=999; - end; -@y -@d var_code==@"7000000 {math code meaning ``use the current family''} - -@<Initialize table entries...@>= -set_equiv(par_shape_loc,null); set_eq_type(par_shape_loc,shape_ref); -set_eq_level(par_shape_loc,level_one);@/ -set_equiv(cat_code_base+carriage_return,car_ret); -set_equiv(cat_code_base+" ",spacer); -set_equiv(cat_code_base+"\",escape); -set_equiv(cat_code_base+"%",comment); -set_equiv(cat_code_base+invalid_code,invalid_char); -set_equiv(cat_code_base+null_code,ignore); -for k:="0" to "9" do set_equiv(math_code_base+k,hi(k+var_code)); -for k:="A" to "Z" do - begin set_equiv(cat_code_base+k,letter); - set_equiv(cat_code_base+k+"a"-"A",letter);@/ - set_equiv(math_code_base+k,hi(k+var_code+@"10000)); - set_equiv(math_code_base+k+"a"-"A",hi(k+"a"-"A"+var_code+@"10000));@/ - set_equiv(lc_code_base+k,k+"a"-"A"); - set_equiv(lc_code_base+k+"a"-"A",k+"a"-"A");@/ - set_equiv(uc_code_base+k,k); - set_equiv(uc_code_base+k+"a"-"A",k);@/ - set_equiv(sf_code_base+k,999); - end; -@z -%--------------------------------------- -@x [17] m.234 l.4857 - Omega -@ @<Show the font identifier in |eqtb[n]|@>= -begin if n=cur_font_loc then print("current font") -else if n<math_font_base+16 then - begin print_esc("textfont"); print_int(n-math_font_base); - end -else if n<math_font_base+32 then - begin print_esc("scriptfont"); print_int(n-math_font_base-16); - end -else begin print_esc("scriptscriptfont"); print_int(n-math_font_base-32); - end; -print_char("=");@/ -print_esc(hash[font_id_base+equiv(n)].rh); - {that's |font_id_text(equiv(n))|} -@y -@ @<Show the font identifier in |eqtb[n]|@>= -begin if n=cur_font_loc then print("current font") -else if n<math_font_base+script_size then - begin print_esc("textfont"); print_int(n-math_font_base); - end -else if n<math_font_base+script_script_size then - begin print_esc("scriptfont"); print_int(n-math_font_base-script_size); - end -else begin print_esc("scriptscriptfont"); - print_int(n-math_font_base-script_script_size); - end; -print_char("=");@/ -print_esc(newtext(font_id_base+equiv(n))); - {that's |font_id_text(equiv(n))|} -@z -%--------------------------------------- -@x [17] m.236 l.4955 - Omega -@d count_base=int_base+int_pars {256 user \.{\\count} registers} -@d del_code_base=count_base+256 {256 delimiter code mappings} -@d dimen_base=del_code_base+256 {beginning of region 6} -@# -@d del_code(#)==eqtb[del_code_base+#].int -@d count(#)==eqtb[count_base+#].int -@d int_par(#)==eqtb[int_base+#].int {an integer parameter} -@y -@d count_base=int_base+int_pars {|number_regs| user \.{\\count} registers} -@d del_code_base=count_base+number_regs {|number_chars| delimiter code mappings} -@d dimen_base=del_code_base+number_chars {beginning of region 6} -@# -@d del_code0(#)==new_equiv(del_code_base+#) -@d del_code1(#)==new_equiv1(del_code_base+#) -@d count(#)==new_eqtb_int(count_base+#) -@d int_par(#)==new_eqtb_int(int_base+#) {an integer parameter} -@z -%--------------------------------------- -@x [17] m.240 l.5213 - Omega -for k:=int_base to del_code_base-1 do eqtb[k].int:=0; -mag:=1000; tolerance:=10000; hang_after:=1; max_dead_cycles:=25; -escape_char:="\"; end_line_char:=carriage_return; -for k:=0 to 255 do del_code(k):=-1; -del_code("."):=0; {this null delimiter is used in error recovery} -@y -set_new_eqtb_int(int_base+mag_code,1000); -set_new_eqtb_int(int_base+tolerance_code,10000); -set_new_eqtb_int(int_base+hang_after_code,1); -set_new_eqtb_int(int_base+max_dead_cycles_code,25); -set_new_eqtb_int(int_base+escape_char_code,"\"); -set_new_eqtb_int(int_base+end_line_char_code,carriage_return); -set_equiv(del_code_base+".",0); -set_equiv1(del_code_base+".",0); - {this null delimiter is used in error recovery} - -@ @<Set newline character to -1@>= -set_new_eqtb_int(int_base+new_line_char_code,-1) - -@ @<Set newline character to nl@>= -set_new_eqtb_int(int_base+new_line_char_code,nl) - -@z -%--------------------------------------- -@x [17] m.242 l.5240 - Omega -print_char("="); print_int(eqtb[n].int); -@y -print_char("="); print_int(new_eqtb_int(n)); -@z -%--------------------------------------- -@x [17] m.247 l.5273 - Omega -here, and the 256 \.{\\dimen} registers. -@y -here, and the |number_regs| \.{\\dimen} registers. -@z -%--------------------------------------- -@x [17] m.247 l.5298 - Omega - {table of 256 user-defined \.{\\dimen} registers} -@d eqtb_size=scaled_base+255 {largest subscript of |eqtb|} -@# -@d dimen(#)==eqtb[scaled_base+#].sc -@d dimen_par(#)==eqtb[dimen_base+#].sc {a scaled quantity} -@y - {table of |number_regs| user-defined \.{\\dimen} registers} -@d eqtb_size=scaled_base+biggest_reg {largest subscript of |eqtb|} -@# -@d dimen(#)==new_eqtb_sc(scaled_base+(#)) -@d dimen_par(#)==new_eqtb_sc(dimen_base+(#)) {a scaled quantity} -@z -%--------------------------------------- -@x [17] m.250 l.5405 - Omega -for k:=dimen_base to eqtb_size do eqtb[k].sc:=0; -@y - -@ @p function init_eqtb_entry (p:pointer):memory_word; -var mw:memory_word; -begin - { Regions 1 and 2 } - if (p>=active_base) and - (p<=undefined_control_sequence) then begin - equiv_field(mw):=null; - eq_type_field(mw):=undefined_cs; - eq_level_field(mw):=level_zero; - end - { Region 3 } - else if (p>=glue_base) and - (p<=local_base+1) then begin - equiv_field(mw):=zero_glue; - eq_type_field(mw):=glue_ref; - eq_level_field(mw):=level_one; - end - { Region 4 } - else if (p>=par_shape_loc) and - (p<=toks_base+biggest_reg) then begin - equiv_field(mw):=null; - eq_type_field(mw):=undefined_cs; - eq_level_field(mw):=level_zero; - end - else if (p>=box_base) and - (p<=box_base+biggest_reg) then begin - equiv_field(mw):=null; - eq_type_field(mw):=box_ref; - eq_level_field(mw):=level_one; - end - else if (p>=cur_font_loc) and - (p<=math_font_base+math_font_biggest) then begin - equiv_field(mw):=null_font; - eq_type_field(mw):=data; - eq_level_field(mw):=level_one; - end - else if (p>=cat_code_base) and - (p<=cat_code_base+biggest_char) then begin - equiv_field(mw):=other_char; - eq_type_field(mw):=data; - eq_level_field(mw):=level_one; - end - else if (p>=lc_code_base) and - (p<=uc_code_base+biggest_char) then begin - equiv_field(mw):=0; - eq_type_field(mw):=data; - eq_level_field(mw):=level_one; - end - else if (p>=sf_code_base) and - (p<=sf_code_base+biggest_char) then begin - equiv_field(mw):=1000; - eq_type_field(mw):=data; - eq_level_field(mw):=level_one; - end - else if (p>=math_code_base) and - (p<=math_code_base+biggest_char) then begin - equiv_field(mw):=hi(p-math_code_base); - eq_type_field(mw):=data; - eq_level_field(mw):=level_one; - end - { Region 5 } - else if (p>=int_base) and (p<=del_code_base-1) then begin - setintzero(mw,0); - setintone(mw,0); - end - else if (p>=del_code_base) and (p<=del_code_base+biggest_char) then begin - setintzero(mw,-1); - setintone(mw,-1); - end - { Region 6 } - else if (p>=dimen_base) and (p<=eqtb_size) then begin - setintzero(mw,0); - setintone(mw,0); - end - else begin - equiv_field(mw):=null; - eq_type_field(mw):=undefined_cs; - eq_level_field(mw):=level_zero; - end; - init_eqtb_entry:=mw; -end; - -@z -%--------------------------------------- -@x [17] m.251 l.5411 - Omega -print_char("="); print_scaled(eqtb[n].sc); print("pt"); -@y -print_char("="); print_scaled(new_eqtb_sc(n)); print("pt"); -@z -%--------------------------------------- -@x [17] m.254 l.5435 - Omega -@ The last two regions of |eqtb| have fullword values instead of the -three fields |eq_level|, |eq_type|, and |equiv|. An |eq_type| is unnecessary, -but \TeX\ needs to store the |eq_level| information in another array -called |xeq_level|. - -@<Glob...@>= -@!eqtb:array[active_base..eqtb_size] of memory_word; -@!xeq_level:array[int_base..eqtb_size] of quarterword; -@y -@ The last two regions of |eqtb| have fullword values instead of the -three fields |eq_level|, |eq_type|, and |equiv|. An |eq_type| is unnecessary, -but \TeX\ needs to store the |eq_level| information in another array -called |xeq_level|. - -@d xeq_level(#) == new_xeq_level(eqtb_size+eqtb_size+#) -@d set_xeq_level(#) == set_new_eqtb_int(eqtb_size+eqtb_size+#) -@z -%--------------------------------------- -@x [17] m.255 l.5439 - Omega -for k:=int_base to eqtb_size do xeq_level[k]:=level_one; -@y -@z -%--------------------------------------- -@x [17] m.255 l.5446 - Omega -for q:=active_base to box_base+255 do -@y -for q:=active_base to box_base+biggest_reg do -@z -%--------------------------------------- -@x [18] m.256 l.5477 - Omega -@d next(#) == hash[#].lh {link for coalesced lists} -@d text(#) == hash[#].rh {string number for control sequence name} -@d hash_is_full == (hash_used=hash_base) {test if all positions are occupied} -@d font_id_text(#) == text(font_id_base+#) {a frozen font identifier's name} - -@<Glob...@>= -@!hash: array[hash_base..undefined_control_sequence-1] of two_halves; - {the hash table} -@y -@d hash_is_full == (hash_used=hash_base) {test if all positions are occupied} -@d font_id_text(#) == newtext(font_id_base+#) {a frozen font identifier's name} -@d newtext(#) == new_hash_text(eqtb_size+#) -@d newnext(#) == new_hash_next(eqtb_size+#) -@d settext(#) == set_hash_text(eqtb_size+#) -@d setnext(#) == set_hash_next(eqtb_size+#) - -@<Glob...@>= -@z -%--------------------------------------- -@x [18] m.257 l.5491 - Omega -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 [18] m.258 l.5497 - Omega -hash_used:=frozen_control_sequence; {nothing is used} -cs_count:=0; -eq_type(frozen_dont_expand):=dont_expand; -text(frozen_dont_expand):="notexpanded:"; -@y -hash_used:=frozen_control_sequence; {nothing is used} -cs_count:=0; -set_eq_type(frozen_dont_expand,dont_expand); -settext(frozen_dont_expand,"notexpanded:"); -@z -%--------------------------------------- -@x [18] m.259 l.5514 - Omega -@!k:pointer; {index in |buffer| array} -begin @<Compute the hash code |h|@>; -p:=h+hash_base; {we start searching here; note that |0<=h<hash_prime|} -loop@+begin if text(p)>0 then if length(text(p))=l then - if str_eq_buf(text(p),j) then goto found; - if next(p)=0 then - begin if no_new_control_sequence then - p:=undefined_control_sequence - else @<Insert a new control sequence after |p|, then make - |p| point to it@>; - goto found; - end; - p:=next(p); - end; -found: id_lookup:=p; -@y -@!k:pointer; {index in |buffer| array} -@!newstring:integer; -begin @<Compute the hash code |h|@>; -p:=h+hash_base; {we start searching here; note that |0<=h<hash_prime|} -loop@+begin if newtext(p)>0 then if length(newtext(p))=l then - if str_eq_buf(newtext(p),j) then goto found; - if newnext(p)=0 then - begin if no_new_control_sequence then - p:=undefined_control_sequence - else @<Insert a new control sequence after |p|, then make - |p| point to it@>; - goto found; - end; - p:=newnext(p); - end; -found: id_lookup:=p; -@z -%--------------------------------------- -@x [18] m.260 l.5532 - Omega -begin if text(p)>0 then - begin repeat if hash_is_full then overflow("hash size",hash_size); -@:TeX capacity exceeded hash size}{\quad hash size@> - decr(hash_used); - until text(hash_used)=0; {search for an empty location in |hash|} - next(p):=hash_used; p:=hash_used; - end; -str_room(l); d:=cur_length; -while pool_ptr>str_start[str_ptr] do - begin decr(pool_ptr); str_pool[pool_ptr+l]:=str_pool[pool_ptr]; - end; {move current string up to make room for another} -for k:=j to j+l-1 do append_char(buffer[k]); -text(p):=make_string; pool_ptr:=pool_ptr+d; -@y -begin if newtext(p)>0 then - begin repeat if hash_is_full then overflow("hash size",hash_size); -@:TeX capacity exceeded hash size}{\quad hash size@> - decr(hash_used); - until newtext(hash_used)=0; {search for an empty location in |hash|} - setnext(p,hash_used); p:=hash_used; - end; -str_room(l); d:=cur_length; -while pool_ptr>str_start[str_ptr] do - begin decr(pool_ptr); str_pool[pool_ptr+l]:=str_pool[pool_ptr]; - end; {move current string up to make room for another} -for k:=j to j+l-1 do append_char(buffer[k]); -newstring:=make_string; -settext(p,newstring); pool_ptr:=pool_ptr+d; -@z -%--------------------------------------- -@x [18] m.262 l.5584 - Omega -else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.") -@.NONEXISTENT@> -else begin print_esc(text(p)); -@y -else if (newtext(p)<0)or(newtext(p)>=str_ptr) then print_esc("NONEXISTENT.") -@.NONEXISTENT@> -else begin print_esc(newtext(p)); -@z -%--------------------------------------- -@x [18] m.263 l.5601 - Omega -else print_esc(text(p)); -@y -else print_esc(newtext(p)); -@z -%--------------------------------------- -@x [18] m.264 l.5610 - Omega -@p @!init procedure primitive(@!s:str_number;@!c:quarterword;@!o:halfword); -var k:pool_pointer; {index into |str_pool|} -@!j:small_number; {index into |buffer|} -@!l:small_number; {length of the string} -begin if s<256 then cur_val:=s+single_base -else begin k:=str_start[s]; l:=str_start[s+1]-k; - {we will move |s| into the (empty) |buffer|} - for j:=0 to l-1 do buffer[j]:=so(str_pool[k+j]); - cur_val:=id_lookup(0,l); {|no_new_control_sequence| is |false|} - flush_string; text(cur_val):=s; {we don't want to have the string twice} - end; -eq_level(cur_val):=level_one; eq_type(cur_val):=c; equiv(cur_val):=o; -@y -@p @!init procedure primitive(@!s:str_number;@!c:quarterword;@!o:halfword); -var k:pool_pointer; {index into |str_pool|} -@!j:small_number; {index into |buffer|} -@!l:small_number; {length of the string} -begin if s<=biggest_char then cur_val:=s+single_base -else begin k:=str_start[s]; l:=str_start[s+1]-k; - {we will move |s| into the (empty) |buffer|} - for j:=0 to l-1 do buffer[j]:=so(str_pool[k+j]); - cur_val:=id_lookup(0,l); {|no_new_control_sequence| is |false|} - flush_string; settext(cur_val,s); {we don't want to have the string twice} - end; -set_eq_level(cur_val,level_one); set_eq_type(cur_val,c); -set_equiv(cur_val,o); -@z -%--------------------------------------- -@x [18] m.265 l.5648 - Omega -primitive("delimiter",delim_num,0);@/ -@!@:delimiter_}{\.{\\delimiter} primitive@> -@y -primitive("delimiter",delim_num,0);@/ -@!@:delimiter_}{\.{\\delimiter} primitive@> -primitive("odelimiter",delim_num,1);@/ -@!@:delimiter_}{\.{\\odelimiter} primitive@> -@z -%--------------------------------------- -@x [18] m.265 l.5656 - Omega -text(frozen_end_group):="endgroup"; eqtb[frozen_end_group]:=eqtb[cur_val];@/ -@y -settext(frozen_end_group,"endgroup"); -set_new_eqtb(frozen_end_group,new_eqtb(cur_val));@/ -@z -%--------------------------------------- -@x [18] m.265 l.5673 - Omega -primitive("mathaccent",math_accent,0);@/ -@!@:math_accent_}{\.{\\mathaccent} primitive@> -primitive("mathchar",math_char_num,0);@/ -@!@:math_char_}{\.{\\mathchar} primitive@> -@y -primitive("mathaccent",math_accent,0);@/ -@!@:math_accent_}{\.{\\mathaccent} primitive@> -primitive("mathchar",math_char_num,0);@/ -@!@:math_char_}{\.{\\mathchar} primitive@> -primitive("omathaccent",math_accent,1);@/ -@!@:math_accent_}{\.{\\omathaccent} primitive@> -primitive("omathchar",math_char_num,1);@/ -@!@:math_char_}{\.{\\omathchar} primitive@> -@z -%--------------------------------------- -@x [18] m.265 l.5697 - Omega -primitive("radical",radical,0);@/ -@!@:radical_}{\.{\\radical} primitive@> -@y -primitive("radical",radical,0);@/ -@!@:radical_}{\.{\\radical} primitive@> -primitive("oradical",radical,1);@/ -@!@:radical_}{\.{\\oradical} primitive@> -@z -%--------------------------------------- -@x [18] m.265 l.5701 - Omega -primitive("relax",relax,256); {cf.\ |scan_file_name|} -@!@:relax_}{\.{\\relax} primitive@> -text(frozen_relax):="relax"; eqtb[frozen_relax]:=eqtb[cur_val];@/ -@y -primitive("relax",relax,too_big_char); {cf.\ |scan_file_name|} -@!@:relax_}{\.{\\relax} primitive@> -settext(frozen_relax,"relax"); -set_new_eqtb(frozen_relax,new_eqtb(cur_val));@/ -@z -%--------------------------------------- -@x [19] m.276 l.5951 - Omega -else begin save_stack[save_ptr]:=eqtb[p]; incr(save_ptr); -@y -else begin save_stack[save_ptr]:=new_eqtb(p); incr(save_ptr); -@z -%--------------------------------------- -@x [19] m.277 l.5967 - Omega -begin if eq_level(p)=cur_level then eq_destroy(eqtb[p]) -else if cur_level>level_one then eq_save(p,eq_level(p)); -eq_level(p):=cur_level; eq_type(p):=t; equiv(p):=e; -@y -begin if eq_level(p)=cur_level then eq_destroy(new_eqtb(p)) -else if cur_level>level_one then eq_save(p,eq_level(p)); -set_eq_level(p,cur_level); set_eq_type(p,t); set_equiv(p,e); -@z -%--------------------------------------- -@x [19] m.278 l.5980 - Omega -@p procedure eq_word_define(@!p:pointer;@!w:integer); -begin if xeq_level[p]<>cur_level then - begin eq_save(p,xeq_level[p]); xeq_level[p]:=cur_level; - end; -eqtb[p].int:=w; -end; -@y -@p procedure eq_word_define(@!p:pointer;@!w:integer); -begin if xeq_level(p)<>cur_level then - begin eq_save(p,xeq_level(p)); set_xeq_level(p,cur_level); - end; -set_new_eqtb_int(p,w); -end; - -procedure del_eq_word_define(@!p:pointer;@!w,wone:integer); -begin if xeq_level(p)<>cur_level then - begin eq_save(p,xeq_level(p)); set_xeq_level(p,cur_level); - end; -set_equiv(p,w); set_equiv1(p,wone); -end; - -@z -%--------------------------------------- -@x [19] m.279 l.5990 - Omega -begin eq_destroy(eqtb[p]); -eq_level(p):=level_one; eq_type(p):=t; equiv(p):=e; -end; -@# -procedure geq_word_define(@!p:pointer;@!w:integer); {global |eq_word_define|} -begin eqtb[p].int:=w; xeq_level[p]:=level_one; -end; -@y -begin eq_destroy(new_eqtb(p)); -set_eq_level(p,level_one); set_eq_type(p,t); set_equiv(p,e); -end; -@# -procedure geq_word_define(@!p:pointer;@!w:integer); {global |eq_word_define|} -begin set_new_eqtb_int(p,w); set_xeq_level(p,level_one); -end; - -procedure del_geq_word_define(@!p:pointer;@!w,wone:integer); - {global |del_eq_word_define|} -begin set_equiv(p,w); set_equiv1(p,wone); set_xeq_level(p,level_one); -end; -@z -%--------------------------------------- -@x [19] m.282 l.6036 - Omega - else save_stack[save_ptr]:=eqtb[undefined_control_sequence]; -@y - else save_stack[save_ptr]:=new_eqtb(undefined_control_sequence); -@z -%--------------------------------------- -@x [19] m.283 l.6056 - Omega - else begin eq_destroy(eqtb[p]); {destroy the current value} - eqtb[p]:=save_stack[save_ptr]; {restore the saved value} - @!stat if tracing_restores>0 then restore_trace(p,"restoring");@+tats@;@/ - end -else if xeq_level[p]<>level_one then - begin eqtb[p]:=save_stack[save_ptr]; xeq_level[p]:=l; -@y - else begin eq_destroy(new_eqtb(p)); {destroy the current value} - set_new_eqtb(p,save_stack[save_ptr]); {restore the saved value} - @!stat if tracing_restores>0 then restore_trace(p,"restoring");@+tats@;@/ - end -else if xeq_level(p)<>level_one then - begin set_new_eqtb(p,save_stack[save_ptr]); set_xeq_level(p,l); -@z -%--------------------------------------- -@x [20] m.289 l.6129 - Omega -number $2^8m+c$; the command code is in the range |1<=m<=14|. (2)~A control -sequence whose |eqtb| address is |p| is represented as the number -|cs_token_flag+p|. Here |cs_token_flag=@t$2^{12}-1$@>| is larger than -@y -number $2^16m+c$; the command code is in the range |1<=m<=14|. (2)~A control -sequence whose |eqtb| address is |p| is represented as the number -|cs_token_flag+p|. Here |cs_token_flag=@t$2^{20}-1$@>| is larger than -@z -%--------------------------------------- -@x [20] m.289 l.6142 - Omega -@d cs_token_flag==@'7777 {amount added to the |eqtb| location in a - token that stands for a control sequence; is a multiple of~256, less~1} -@d left_brace_token=@'0400 {$2^8\cdot|left_brace|$} -@d left_brace_limit=@'1000 {$2^8\cdot(|left_brace|+1)$} -@d right_brace_token=@'1000 {$2^8\cdot|right_brace|$} -@d right_brace_limit=@'1400 {$2^8\cdot(|right_brace|+1)$} -@d math_shift_token=@'1400 {$2^8\cdot|math_shift|$} -@d tab_token=@'2000 {$2^8\cdot|tab_mark|$} -@d out_param_token=@'2400 {$2^8\cdot|out_param|$} -@d space_token=@'5040 {$2^8\cdot|spacer|+|" "|$} -@d letter_token=@'5400 {$2^8\cdot|letter|$} -@d other_token=@'6000 {$2^8\cdot|other_char|$} -@d match_token=@'6400 {$2^8\cdot|match|$} -@d end_match_token=@'7000 {$2^8\cdot|end_match|$} -@y -@d cs_token_flag=@"FFFFF {amount added to the |eqtb| location in a - token that stands for a control sequence; is a multiple of~65536, less~1} -@d max_char_val=@"10000 {to separate char and command code} -@d left_brace_token=@"10000 {$2^16\cdot|left_brace|$} -@d left_brace_limit=@"20000 {$2^16\cdot(|left_brace|+1)$} -@d right_brace_token=@"20000 {$2^16\cdot|right_brace|$} -@d right_brace_limit=@"30000 {$2^16\cdot(|right_brace|+1)$} -@d math_shift_token=@"30000 {$2^16\cdot|math_shift|$} -@d tab_token=@"40000 {$2^16\cdot|tab_mark|$} -@d out_param_token=@"50000 {$2^16\cdot|out_param|$} -@d space_token=@"A0020 {$2^16\cdot|spacer|+|" "|$} -@d letter_token=@"B0000 {$2^16\cdot|letter|$} -@d other_token=@"C0000 {$2^16\cdot|other_char|$} -@d match_token=@"D0000 {$2^16\cdot|match|$} -@d end_match_token=@"E0000 {$2^16\cdot|end_match|$} -@z -%--------------------------------------- -@x [20] m.293 l.6256 - Omega -else begin m:=info(p) div @'400; c:=info(p) mod @'400; -@y -else begin m:=info(p) div max_char_val; c:=info(p) mod max_char_val; -@z -%--------------------------------------- -@x [21] m.298 l.6375 - Omega -procedure print_cmd_chr(@!cmd:quarterword;@!chr_code:halfword); -@y -procedure print_cmd_chr(@!cmd:quarterword;@!chr_code:halfword); -@z -%--------------------------------------- -@x [24] m.334 l.7110 - Omega -primitive("par",par_end,256); {cf. |scan_file_name|} -@y -primitive("par",par_end,too_big_char); {cf. |scan_file_name|} -@z -%--------------------------------------- -@x [24] m.357 l.7462 - Omega - else begin cur_cmd:=t div @'400; cur_chr:=t mod @'400; -@y - else begin cur_cmd:=t div max_char_val; cur_chr:=t mod max_char_val; -@z -%--------------------------------------- -@x [24] m.358 l.7479 - Omega -@d no_expand_flag=257 {this characterizes a special variant of |relax|} -@y -@d no_expand_flag=special_char {this characterizes a special variant of |relax|} -@z -%--------------------------------------- -@x [24] m.365 l.7606 - Omega -if cur_cs=0 then cur_tok:=(cur_cmd*@'400)+cur_chr -@y -if cur_cs=0 then cur_tok:=(cur_cmd*max_char_val)+cur_chr -@z -%--------------------------------------- -@x [25] m.374 l.7728 - Omega - begin eq_define(cur_cs,relax,256); {N.B.: The |save_stack| might change} -@y - begin eq_define(cur_cs,relax,too_big_char); - {N.B.: The |save_stack| might change} -@z -%--------------------------------------- -@x [25] m.374 l.7750 - Omega - buffer[j]:=info(p) mod @'400; incr(j); p:=link(p); -@y - buffer[j]:=info(p) mod max_char_val; incr(j); p:=link(p); -@z -%--------------------------------------- -@x [25] m.380 l.7812 - Omega -done: if cur_cs=0 then cur_tok:=(cur_cmd*@'400)+cur_chr -@y -done: if cur_cs=0 then cur_tok:=(cur_cmd*max_char_val)+cur_chr -@z -%--------------------------------------- -@x [25] m.381 l.7824 - Omega -if cur_cs=0 then cur_tok:=(cur_cmd*@'400)+cur_chr -@y -if cur_cs=0 then cur_tok:=(cur_cmd*max_char_val)+cur_chr -@z -%--------------------------------------- -@x [25] m.391 l.7985 - Omega -if (info(r)>match_token+255)or(info(r)<match_token) then s:=null -@y -if (info(r)>=end_match_token)or(info(r)<match_token) then s:=null -@z -%--------------------------------------- -@x [26] m.407 l.8161 - Omega -@ The |scan_left_brace| routine is called when a left brace is supposed to be -the next non-blank token. (The term ``left brace'' means, more precisely, -a character whose catcode is |left_brace|.) \TeX\ allows \.{\\relax} to -appear before the |left_brace|. - -@p procedure scan_left_brace; {reads a mandatory |left_brace|} -begin @<Get the next non-blank non-relax non-call token@>; -if cur_cmd<>left_brace then - begin print_err("Missing { inserted"); -@.Missing \{ inserted@> - help4("A left brace was mandatory here, so I've put one in.")@/ - ("You might want to delete and/or insert some corrections")@/ - ("so that I will find a matching right brace soon.")@/ - ("(If you're confused by all this, try typing `I}' now.)"); - back_error; cur_tok:=left_brace_token+"{"; cur_cmd:=left_brace; - cur_chr:="{"; incr(align_state); - end; -end; -@y -@ The |scan_left_brace| routine is called when a left brace is supposed to be -the next non-blank token. (The term ``left brace'' means, more precisely, -a character whose catcode is |left_brace|.) \TeX\ allows \.{\\relax} to -appear before the |left_brace|. - -@p procedure scan_left_brace; {reads a mandatory |left_brace|} -begin @<Get the next non-blank non-relax non-call token@>; -if cur_cmd<>left_brace then - begin print_err("Missing { inserted"); -@.Missing \{ inserted@> - help4("A left brace was mandatory here, so I've put one in.")@/ - ("You might want to delete and/or insert some corrections")@/ - ("so that I will find a matching right brace soon.")@/ - ("(If you're confused by all this, try typing `I}' now.)"); - back_error; cur_tok:=left_brace_token+"{"; cur_cmd:=left_brace; - cur_chr:="{"; incr(align_state); - end; -end; - -@ The |scan_right_brace| routine is called when a right brace is supposed to be -the next non-blank token. (The term ``right brace'' means, more precisely, -a character whose catcode is |right_brace|.) \TeX\ allows \.{\\relax} to -appear before the |right_brace|. - -@p procedure scan_right_brace; {reads a mandatory |right_brace|} -begin @<Get the next non-blank non-relax non-call token@>; -if cur_cmd<>right_brace then - begin print_err("Missing { inserted"); -@.Missing \{ inserted@> - help4("A right brace was mandatory here, so I've put one in.")@/ - ("You might want to delete and/or insert some corrections")@/ - ("so that I will find a matching right brace soon.")@/ - ("(If you're confused by all this, try typing `I}' now.)"); - back_error; cur_tok:=right_brace_token+"}"; cur_cmd:=right_brace; - cur_chr:="}"; incr(align_state); - end; -end; -@z -%--------------------------------------- -@x [26] m.410 l.8293 - Omega -@!cur_val:integer; {value returned by numeric scanners} -@y -@!cur_val:integer; {value returned by numeric scanners} -@!cur_val1:integer; {delcodes are now 51 digits} -@z -%--------------------------------------- -@x [26] m.413 l.8335 - Omega -assign_int: scanned_result(eqtb[m].int)(int_val); -assign_dimen: scanned_result(eqtb[m].sc)(dimen_val); -@y -assign_int: scanned_result(new_eqtb_int(m))(int_val); -assign_dimen: scanned_result(new_eqtb_sc(m))(dimen_val); -@z -%--------------------------------------- -@x [26] m.413 l.8345 - Omega -char_given,math_given: scanned_result(cur_chr)(int_val); -@y -char_given,math_given,omath_given: scanned_result(cur_chr)(int_val); -@z -%--------------------------------------- -@x [26] m.414 l.8356 - Omega -@ @<Fetch a character code from some table@>= -begin scan_char_num; -if m=math_code_base then scanned_result(ho(math_code(cur_val)))(int_val) -else if m<math_code_base then scanned_result(equiv(m+cur_val))(int_val) -else scanned_result(eqtb[m+cur_val].int)(int_val); -@y -@ @<Fetch a character code from some table@>= -begin scan_char_num; -if m=math_code_base then begin - cur_val1:=ho(math_code(cur_val)); - if ((cur_val1 div @"1000000)>8) or - (((cur_val1 mod @"1000000) div @"10000)>15) or - ((cur_val1 mod @"10000)>255) then - begin print_err("Extended mathchar used as mathchar"); -@.Bad mathchar@> - help2("A mathchar number must be between 0 and ""7FFF.")@/ - ("I changed this one to zero."); int_error(cur_val1); cur_val1:=0; - end; - cur_val1:=((cur_val1 div @"1000000)*@"1000) + - (((cur_val1 mod @"1000000) div @"10000)*@"100) + - (cur_val1 mod @"10000); - scanned_result(cur_val1)(int_val) - end -else if m=(math_code_base+256) then - scanned_result(ho(math_code(cur_val)))(int_val) -else if m<math_code_base then scanned_result(equiv(m+cur_val))(int_val) -else scanned_result(new_eqtb_int(m+cur_val))(int_val); -@z -%--------------------------------------- -@x [26] m.433 l.8593 - Omega -procedure scan_eight_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>255) then - begin print_err("Bad register code"); -@.Bad register code@> - help2("A register number must be between 0 and 255.")@/ -@y -procedure scan_eight_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>biggest_reg) then - begin print_err("Bad register code"); -@.Bad register code@> - help2("A register number must be between 0 and 65535.")@/ -@z -%--------------------------------------- -@x [26] m.434 l.8604 - Omega -procedure scan_char_num; -begin scan_int; -if (cur_val<0)or(cur_val>255) then - begin print_err("Bad character code"); -@.Bad character code@> - help2("A character number must be between 0 and 255.")@/ -@y -procedure scan_char_num; -begin scan_int; -if (cur_val<0)or(cur_val>biggest_char) then - begin print_err("Bad character code"); -@.Bad character code@> - help2("A character number must be between 0 and 65535.")@/ -@z -%--------------------------------------- -@x [26] m.435 l.8618 - Omega -procedure scan_four_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>15) 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; -@y -procedure scan_four_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>15) 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; - -procedure scan_big_four_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>255) then - begin print_err("Bad number"); -@.Bad number@> - help2("Since I expected to read a number between 0 and 255,")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -end; -@z -%--------------------------------------- -@x [26] m.436 l.8629 - Omega -procedure scan_fifteen_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>@'77777) then - begin print_err("Bad mathchar"); -@.Bad mathchar@> - help2("A mathchar number must be between 0 and 32767.")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -end; -@y -procedure scan_real_fifteen_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>@'77777) then - begin print_err("Bad mathchar"); -@.Bad mathchar@> - help2("A mathchar number must be between 0 and 32767.")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -end; - -procedure scan_fifteen_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>@'77777) then - begin print_err("Bad mathchar"); -@.Bad mathchar@> - help2("A mathchar number must be between 0 and 32767.")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -cur_val := ((cur_val div @"1000) * @"1000000) + - (((cur_val mod @"1000) div @"100) * @"10000) + - (cur_val mod @"100); -end; - -procedure scan_big_fifteen_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>@"7FFFFFF) then - begin print_err("Bad extended mathchar"); -@.Bad mathchar@> - help2("An extended mathchar number must be between 0 and ""7FFFFFF.")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -end; -@z -%--------------------------------------- -@x [26] m.437 l.8640 - Omega -procedure scan_twenty_seven_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>@'777777777) then - begin print_err("Bad delimiter code"); -@.Bad delimiter code@> - help2("A numeric delimiter code must be between 0 and 2^{27}-1.")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -end; -@y -procedure scan_twenty_seven_bit_int; -begin scan_int; -if (cur_val<0)or(cur_val>@'777777777) then - begin print_err("Bad delimiter code"); -@.Bad delimiter code@> - help2("A numeric delimiter code must be between 0 and 2^{27}-1.")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -cur_val1 := (((cur_val mod @"1000) div @"100) * @"10000) + - (cur_val mod @"100); -cur_val := cur_val div @"1000; -cur_val := ((cur_val div @"1000) * @"1000000) + - (((cur_val mod @"1000) div @"100) * @"10000) + - (cur_val mod @"100); -end; - -procedure scan_fifty_one_bit_int; -var iiii:integer; -begin scan_int; -if (cur_val<0)or(cur_val>@'777777777) then - begin print_err("Bad delimiter code"); -@.Bad delimiter code@> - help2("A numeric delimiter (first part) must be between 0 and 2^{27}-1.") - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -iiii:=cur_val; -scan_int; -if (cur_val<0)or(cur_val>@"FFFFFF) then - begin print_err("Bad delimiter code"); -@.Bad delimiter code@> -help2("A numeric delimiter (second part) must be between 0 and 2^{24}-1.")@/ - ("I changed this one to zero."); int_error(cur_val); cur_val:=0; - end; -cur_val1:=cur_val; -cur_val:=iiii; -end; - -procedure scan_string_argument; -var s:integer; -begin -scan_left_brace; -get_x_token; -while (cur_cmd<>right_brace) do - begin - if (cur_cmd=letter) or (cur_cmd=other_char) then begin - str_room(1); append_char(cur_chr); - end - else if (cur_cmd=spacer) then begin - str_room(1); append_char(" "); - end - else begin - print("Bad token appearing in string argument"); - end; - get_x_token; - end; -s:=make_string; -if str_eq_str("mi",s) then s:="mi"; -if str_eq_str("mo",s) then s:="mo"; -if str_eq_str("mn",s) then s:="mn"; -cur_val:=s; -end; -@z -%--------------------------------------- -@x [26] m.442 l.8720 - Omega -if cur_val>255 then - begin print_err("Improper alphabetic constant"); -@y -if cur_val>biggest_char then - begin print_err("Improper alphabetic constant"); -@z -%--------------------------------------- -@x [27] m.468 l.9200 - Omega -@d job_name_code=5 {command code for \.{\\jobname}} -@y -@d omega_code=5 {command code for \.{\\OmegaVersion}} -@d job_name_code=6 {command code for \.{\\jobname}} -@z -%--------------------------------------- -@x [27] m.468 l.9200 - Omega -primitive("jobname",convert,job_name_code);@/ -@!@:job_name_}{\.{\\jobname} primitive@> -@y -primitive("OmegaVersion",convert,omega_code);@/ -@!@:omega_version_}{\.{\\OmegaVersion} primitive@> -primitive("jobname",convert,job_name_code);@/ -@!@:job_name_}{\.{\\jobname} primitive@> -@z -%--------------------------------------- -@x [27] m.469 l.9223 - Omega - othercases print_esc("jobname") -@y - omega_code: print_esc("OmegaVersion"); - othercases print_esc("jobname") -@z -%--------------------------------------- -@x [27] m.471 l.9248 - Omega -job_name_code: if job_name=0 then open_log_file; -@y -omega_code:; -job_name_code: if job_name=0 then open_log_file; -@z -%--------------------------------------- -@x [27] m.472 l.9258 - Omega -job_name_code: print(job_name); -@y -omega_code: print("1.15"); -job_name_code: print(job_name); -@z -%--------------------------------------- -@x [28] m.491 l.9610 - Omega -text(frozen_fi):="fi"; eqtb[frozen_fi]:=eqtb[cur_val]; -@y -settext(frozen_fi,"fi"); set_new_eqtb(frozen_fi,new_eqtb(cur_val)); -@z -%--------------------------------------- -@x [28] m.506 l.9802 - Omega -if (cur_cmd>active_char)or(cur_chr>255) then {not a character} - begin m:=relax; n:=256; -@y -if (cur_cmd>active_char)or(cur_chr>biggest_char) then {not a character} - begin m:=relax; n:=too_big_char; -@z -%--------------------------------------- -@x [28] m.506 l.9808 - Omega -if (cur_cmd>active_char)or(cur_chr>255) then - begin cur_cmd:=relax; cur_chr:=256; -@y -if (cur_cmd>active_char)or(cur_chr>biggest_char) then - begin cur_cmd:=relax; cur_chr:=too_big_char; -@z -%--------------------------------------- -@x [29] m.526 l.10178 - Omega -loop@+begin if (cur_cmd>other_char)or(cur_chr>255) then {not a character} -@y -loop@+begin if (cur_cmd>other_char)or(cur_chr>biggest_char) then - {not a character} -@z -%--------------------------------------- -@x [37] m.780 l.15354 - Omega -@d span_code=256 {distinct from any character} -@d cr_code=257 {distinct from |span_code| and from any character} -@y -@d span_code=special_char {distinct from any character} -@d cr_code=span_code+1 {distinct from |span_code| and from any character} -@z -%--------------------------------------- -@x [37] m.780 l.15364 - Omega -text(frozen_cr):="cr"; eqtb[frozen_cr]:=eqtb[cur_val];@/ -primitive("crcr",car_ret,cr_cr_code); -@!@:cr_cr_}{\.{\\crcr} primitive@> -text(frozen_end_template):="endtemplate"; text(frozen_endv):="endtemplate"; -eq_type(frozen_endv):=endv; equiv(frozen_endv):=null_list; -eq_level(frozen_endv):=level_one;@/ -eqtb[frozen_end_template]:=eqtb[frozen_endv]; -eq_type(frozen_end_template):=end_template; -@y -settext(frozen_cr,"cr"); -set_new_eqtb(frozen_cr,new_eqtb(cur_val));@/ -primitive("crcr",car_ret,cr_cr_code); -@!@:cr_cr_}{\.{\\crcr} primitive@> -settext(frozen_end_template,"endtemplate"); settext(frozen_endv,"endtemplate"); -set_eq_type(frozen_endv,endv); set_equiv(frozen_endv,null_list); -set_eq_level(frozen_endv,level_one);@/ -set_new_eqtb(frozen_end_template,new_eqtb(frozen_endv)); -set_eq_type(frozen_end_template,end_template); -@z -%--------------------------------------- -@x [37] m.798 l.15651 - Omega -if n>max_quarterword then confusion("256 spans"); {this can happen, but won't} -@^system dependencies@> -@:this can't happen 256 spans}{\quad 256 spans@> -@y -if n>max_quarterword then confusion("too many spans"); - {this can happen, but won't} -@^system dependencies@> -@:this can't happen too many spans}{\quad too many spans@> -@z -%--------------------------------------- -@x [37] m.804 l.15794 - Omega - overfull_rule:=0; {prevent rule from being packaged} - p:=hpack(preamble,saved(1),saved(0)); overfull_rule:=rule_save; -@y - set_new_eqtb_sc(dimen_base+overfull_rule_code,0); - {prevent rule from being packaged} - p:=hpack(preamble,saved(1),saved(0)); - set_new_eqtb_sc(dimen_base+overfull_rule_code,rule_save); -@z -%--------------------------------------- -@x [37] m.827 l.16255 - Omega -check_shrinkage(left_skip); check_shrinkage(right_skip);@/ -@y -if (shrink_order(left_skip)<>normal)and(shrink(left_skip)<>0) then - begin set_equiv(glue_base+left_skip_code,finite_shrink(left_skip)); - end; -if (shrink_order(right_skip)<>normal)and(shrink(right_skip)<>0) then - begin set_equiv(glue_base+right_skip_code,finite_shrink(right_skip)); - end; -@z -%--------------------------------------- -@x [40] m.891 l.17434 - Omega -$c_1$ will be treated as nonletters. The |hyphen_char| for that font -must be between 0 and 255, otherwise hyphenation will not be attempted. -@y -$c_1$ will be treated as nonletters. The |hyphen_char| for that font must -be between 0 and |biggest_char|, otherwise hyphenation will not be attempted. -@z -%--------------------------------------- -@x [40] m.892 l.17469 - Omega -@!hc:array[0..65] of 0..256; {word to be hyphenated} -@!hn:small_number; {the number of positions occupied in |hc|} -@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} -@!hf:internal_font_number; {font number of the letters in |hc|} -@!hu:array[0..63] of 0..256; {like |hc|, before conversion to lowercase} -@!hyf_char:integer; {hyphen character of the relevant font} -@!cur_lang,@!init_cur_lang:ASCII_code; {current hyphenation table of interest} -@!l_hyf,@!r_hyf,@!init_l_hyf,@!init_r_hyf:integer; {limits on fragment sizes} -@!hyf_bchar:halfword; {boundary character after $c_n$} -@y -@!hc:array[0..65] of 0..too_big_char; {word to be hyphenated} -@!hn:small_number; {the number of positions occupied in |hc|} -@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} -@!hf:internal_font_number; {font number of the letters in |hc|} -@!hu:array[0..63] of 0..too_big_char; - {like |hc|, before conversion to lowercase} -@!hyf_char:integer; {hyphen character of the relevant font} -@!cur_lang,@!init_cur_lang:0..biggest_lang; - {current hyphenation table of interest} -@!l_hyf,@!r_hyf,@!init_l_hyf,@!init_r_hyf:integer; {limits on fragment sizes} -@!hyf_bchar:halfword; {boundary character after $c_n$} -@!max_hyph_char:integer; - -@ @<Set initial values of key variables@>= -max_hyph_char:=too_big_lang; - -@z -%--------------------------------------- -@x [40] m.893 l.17483 - Omega -@!c:0..255; {character being considered for hyphenation} -@y -@!c:ASCII_code; {character being considered for hyphenation} -@z -%--------------------------------------- -@x [40] m.896 l.17534 - Omega -if hyf_char>255 then goto done1; -@y -if hyf_char>biggest_char then goto done1; -@z -%--------------------------------------- -@x [40] m.897 l.17546 - Omega - if lc_code(c)=0 then goto done3; -@y - if lc_code(c)=0 then goto done3; - if lc_code(c)>max_hyph_char then goto done3; -@z -%--------------------------------------- -@x [40] m.898 l.17572 - Omega - if lc_code(c)=0 then goto done3; -@y - if lc_code(c)=0 then goto done3; - if lc_code(c)>max_hyph_char then goto done3; -@z -%--------------------------------------- -@x [41] m.903 l.17648 - Omega - begin hu[0]:=256; init_lig:=false; -@y - begin hu[0]:=max_hyph_char; init_lig:=false; -@z -%--------------------------------------- -@x [41] m.903 l.17660 - Omega -found2: s:=ha; j:=0; hu[0]:=256; init_lig:=false; init_list:=null; -@y -found2: s:=ha; j:=0; hu[0]:=max_hyph_char; init_lig:=false; init_list:=null; -@z -%--------------------------------------- -@x [41] m.905 l.17707 - Omega -getting the input $x_j\ldots x_n$ from the |hu| array. If $x_j=256$, -we consider $x_j$ to be an implicit left boundary character; in this -case |j| must be strictly less than~|n|. There is a -parameter |bchar|, which is either 256 or an implicit right boundary character -@y -getting the input $x_j\ldots x_n$ from the |hu| array. If $x_j=|max_hyph_char|$, -we consider $x_j$ to be an implicit left boundary character; in this -case |j| must be strictly less than~|n|. There is a -parameter |bchar|, which is either |max_hyph_char| -or an implicit right boundary character -@z -%--------------------------------------- -@x [41] m.916 l.17980 - Omega - begin decr(l); c:=hu[l]; c_loc:=l; hu[l]:=256; -@y - begin decr(l); c:=hu[l]; c_loc:=l; hu[l]:=max_hyph_char; -@z -%--------------------------------------- -@x [42] m.921 l.18079 - Omega -@!op_start:array[ASCII_code] of 0..trie_op_size; {offset for current language} -@y -@!op_start:array[0..biggest_lang] of 0..trie_op_size; - {offset for current language} -@z -%--------------------------------------- -@x [42] m.923 l.18086 - Omega -hyphenation algorithm is quite short. In the following code we set |hc[hn+2]| -to the impossible value 256, in order to guarantee that |hc[hn+3]| will -@y -hyphenation algorithm is quite short. In the following code we set |hc[hn+2]| to -the impossible value |max_hyph_char|, in order to guarantee that |hc[hn+3]| will -@z -%--------------------------------------- -@x [42] m.923 l.18095 - Omega -hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters} -@y -hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=max_hyph_char; {insert delimiters} -@z -%--------------------------------------- -@x [42] m.934 l.18206 - Omega -@d set_cur_lang==if language<=0 then cur_lang:=0 - else if language>255 then cur_lang:=0 -@y -@d set_cur_lang==if language<=0 then cur_lang:=0 - else if language>biggest_lang then cur_lang:=0 -@z -%--------------------------------------- -@x [43] m.943 l.18348 - Omega -@!trie_used:array[ASCII_code] of quarterword; - {largest opcode used so far for this language} -@!trie_op_lang:array[1..trie_op_size] of ASCII_code; -@y -@!trie_used:array[0..biggest_lang] of quarterword; - {largest opcode used so far for this language} -@!trie_op_lang:array[1..trie_op_size] of 0..biggest_lang; -@z -%--------------------------------------- -@x [43] m.945 l.18400 - Omega -for j:=1 to 255 do op_start[j]:=op_start[j-1]+qo(trie_used[j-1]); -@y -for j:=1 to biggest_lang do op_start[j]:=op_start[j-1]+qo(trie_used[j-1]); -@z -%--------------------------------------- -@x [43] m.946 l.18416 - Omega -for k:=0 to 255 do trie_used[k]:=min_quarterword; -@y -for k:=0 to biggest_lang do trie_used[k]:=min_quarterword; -@z -%--------------------------------------- -@x [43] m.947 l.18438 - Omega -@!init @!trie_c:packed array[trie_pointer] of packed_ASCII_code; -@y -@!init @!trie_c:packed array[trie_pointer] of ASCII_code; -@z -%--------------------------------------- -@x [43] m.952 l.18551 - Omega -for p:=0 to 255 do trie_min[p]:=p+1; -@y -for p:=0 to biggest_char do trie_min[p]:=p+1; -@z -%--------------------------------------- -@x [43] m.953 l.18569 - Omega -@!ll:1..256; {upper limit of |trie_min| updating} -@y -@!ll:1..too_big_char; {upper limit of |trie_min| updating} -@z -%--------------------------------------- -@x [43] m.953 l.18573 - Omega - @<Ensure that |trie_max>=h+256|@>; -@y - @<Ensure that |trie_max>=h+max_hyph_char|@>; -@z -%--------------------------------------- -@x [43] m.954 l.18582 - Omega -@ By making sure that |trie_max| is at least |h+256|, we can be sure that -|trie_max>z|, since |h=z-c|. It follows that location |trie_max| will -never be occupied in |trie|, and we will have |trie_max>=trie_link(z)|. - -@<Ensure that |trie_max>=h+256|@>= -if trie_max<h+256 then - begin if trie_size<=h+256 then overflow("pattern memory",trie_size); -@y -@ By making sure that |trie_max| is at least |h+max_hyph_char|, -we can be sure that -|trie_max>z|, since |h=z-c|. It follows that location |trie_max| will -never be occupied in |trie|, and we will have |trie_max>=trie_link(z)|. - -@<Ensure that |trie_max>=h+max_hyph_char|@>= -if trie_max<h+max_hyph_char then - begin if trie_size<=h+max_hyph_char then overflow("pattern memory",trie_size); -@z -%--------------------------------------- -@x [43] m.954 l.18592 - Omega - until trie_max=h+256; -@y - until trie_max=h+max_hyph_char; -@z -%--------------------------------------- -@x [43] m.956 l.18607 - Omega -if l<256 then - begin if z<256 then ll:=z @+else ll:=256; -@y -if l<max_hyph_char then - begin if z<max_hyph_char then ll:=z @+else ll:=max_hyph_char; -@z -%--------------------------------------- -@x [43] m.958 l.18637 - Omega -if trie_root=0 then {no patterns were given} - begin for r:=0 to 256 do trie[r]:=h; - trie_max:=256; -@y -if trie_root=0 then {no patterns were given} - begin for r:=0 to max_hyph_char do trie[r]:=h; - trie_max:=max_hyph_char; -@z -%--------------------------------------- -@x [43] m.962 l.18714 - Omega -@ @<Append a new letter or a hyphen level@>= -if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then - begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter} - else begin cur_chr:=lc_code(cur_chr); - if cur_chr=0 then - begin print_err("Nonletter"); -@.Nonletter@> - help1("(See Appendix H.)"); error; - end; - end; -@y -@ @<Append a new letter or a hyphen level@>= -if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then - begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter} - else begin cur_chr:=lc_code(cur_chr); - if cur_chr=0 then - begin print_err("Nonletter"); -@.Nonletter@> - help1("(See Appendix H.)"); error; - end; - end; - if cur_chr>max_hyph_char then max_hyph_char:=cur_chr; -@z -%--------------------------------------- -@x [43] m.966 l. - Omega -procedure init_trie; -var @!p:trie_pointer; {pointer for initialization} -@!j,@!k,@!t:integer; {all-purpose registers for initialization} -@!r,@!s:trie_pointer; {used to clean up the packed |trie|} -@!h:two_halves; {template used to zero out |trie|'s holes} -begin @<Get ready to compress the trie@>; -@y -procedure init_trie; -var @!p:trie_pointer; {pointer for initialization} -@!j,@!k,@!t:integer; {all-purpose registers for initialization} -@!r,@!s:trie_pointer; {used to clean up the packed |trie|} -@!h:two_halves; {template used to zero out |trie|'s holes} -begin -incr(max_hyph_char); -@<Get ready to compress the trie@>; -@z -%--------------------------------------- -@x [44] m.977 l.19008 - Omega -if q=null then box(n):=null {the |eq_level| of the box stays the same} -else box(n):=vpack(q,natural); -@y -if q=null then set_equiv(box_base+n,null) - {the |eq_level| of the box stays the same} -else set_equiv(box_base+n,vpack(q,natural)); -@z -%--------------------------------------- -@x [45] m.992 l.24928 - Omega -flush_node_list(box(n)); box(n):=null; -@y -flush_node_list(box(n)); set_equiv(box_base+n,null); -@z -%--------------------------------------- -@x [45] m.994 l.19364 - Omega -@!n:min_quarterword..255; {insertion box number} -@y -@!n:min_quarterword..biggest_reg; {insertion box number} -@z -%--------------------------------------- -@x [45] m.1012 l.19655 - Omega -@!n:min_quarterword..255; {insertion box number} -@y -@!n:min_quarterword..biggest_reg; {insertion box number} -@z -%--------------------------------------- -@x [45] m.1014 l.19710 - Omega -split_top_skip:=save_split_top_skip; -@y -set_equiv(glue_base+split_top_skip_code,save_split_top_skip); -@z -%--------------------------------------- -@x [45] m.1017 l.19753 - Omega -save_vbadness:=vbadness; vbadness:=inf_bad; -save_vfuzz:=vfuzz; vfuzz:=max_dimen; {inhibit error messages} -box(255):=vpackage(link(page_head),best_size,exactly,page_max_depth); -vbadness:=save_vbadness; vfuzz:=save_vfuzz; -@y -save_vbadness:=vbadness; -set_new_eqtb_int(int_base+vbadness_code,inf_bad); -save_vfuzz:=vfuzz; -set_new_eqtb_sc(dimen_base+vfuzz_code,max_dimen); - {inhibit error messages} -set_equiv(box_base+255, - vpackage(link(page_head),best_size,exactly,page_max_depth)); -set_new_eqtb_int(int_base+vbadness_code,save_vbadness); -set_new_eqtb_sc(dimen_base+vfuzz_code,save_vfuzz); -@z -%--------------------------------------- -@x [45] m.1018 l.19774 - Omega - if box(n)=null then box(n):=new_null_box; -@y - if box(n)=null then set_equiv(box_base+n,new_null_box); -@z -%--------------------------------------- -@x [45] m.1021 l.19817 - Omega - split_top_skip:=split_top_ptr(p); - ins_ptr(p):=prune_page_top(broken_ptr(r)); - if ins_ptr(p)<>null then - begin temp_ptr:=vpack(ins_ptr(p),natural); - height(p):=height(temp_ptr)+depth(temp_ptr); - free_node(temp_ptr,box_node_size); wait:=true; - end; - end; -best_ins_ptr(r):=null; -n:=qo(subtype(r)); -temp_ptr:=list_ptr(box(n)); -free_node(box(n),box_node_size); -box(n):=vpack(temp_ptr,natural); -@y - set_equiv(glue_base+split_top_skip_code,split_top_ptr(p)); - ins_ptr(p):=prune_page_top(broken_ptr(r)); - if ins_ptr(p)<>null then - begin temp_ptr:=vpack(ins_ptr(p),natural); - height(p):=height(temp_ptr)+depth(temp_ptr); - free_node(temp_ptr,box_node_size); wait:=true; - end; - end; -best_ins_ptr(r):=null; -n:=qo(subtype(r)); -temp_ptr:=list_ptr(box(n)); -free_node(box(n),box_node_size); -set_equiv(box_base+n,vpack(temp_ptr,natural)); -@z -%--------------------------------------- -@x [45] m.1023 l.19854 - Omega -ship_out(box(255)); box(255):=null; -@y -ship_out(box(255)); set_equiv(box_base+255,null); -@z -%--------------------------------------- -@x [46] m.1046 l.20339 - Omega -non_math(math_given), non_math(math_comp), non_math(delim_num), -@y -non_math(math_given), non_math(omath_given), -non_math(math_comp), non_math(delim_num), -@z -%--------------------------------------- -@x [47] m.1071 l.20718 - Omega -|box_flag+255| represent `\.{\\setbox0}' through `\.{\\setbox255}'; -codes |box_flag+256| through |box_flag+511| represent `\.{\\global\\setbox0}' -through `\.{\\global\\setbox255}'; -code |box_flag+512| represents `\.{\\shipout}'; and codes |box_flag+513| -through |box_flag+515| represent `\.{\\leaders}', `\.{\\cleaders}', -@y -|box_flag+biggest_reg| represent `\.{\\setbox0}' through -`\.{\\setbox}|biggest_reg|'; codes |box_flag+biggest_reg+1| through -|box_flag+2*biggest_reg| represent `\.{\\global\\setbox0}' -through `\.{\\global\\setbox}|biggest_reg|'; code |box_flag+2*number_regs| -represents `\.{\\shipout}'; and codes |box_flag+2*number_regs+1| -through |box_flag+2*number_regs+3| represent `\.{\\leaders}', `\.{\\cleaders}', -@z -%--------------------------------------- -@x [47] m.1071 l.20732 - Omega -@d ship_out_flag==box_flag+512 {context code for `\.{\\shipout}'} -@d leader_flag==box_flag+513 {context code for `\.{\\leaders}'} -@y -@d ship_out_flag==box_flag+(number_regs+number_regs) - {context code for `\.{\\shipout}'} -@d leader_flag==ship_out_flag+1 {context code for `\.{\\leaders}'} -@z -%--------------------------------------- -@x [47] m.1077 l.20853 - Omega -if box_context<box_flag+256 then - eq_define(box_base-box_flag+box_context,box_ref,cur_box) -else geq_define(box_base-box_flag-256+box_context,box_ref,cur_box) -@y -if box_context<box_flag+number_regs then - eq_define(box_base-box_flag+box_context,box_ref,cur_box) -else geq_define(box_base-box_flag-number_regs+box_context,box_ref,cur_box) -@z -%--------------------------------------- -@x [47] m.1079 l.20888 - Omega - box(cur_val):=null; {the box becomes void, at the same level} -@y - set_equiv(box_base+cur_val,null); - {the box becomes void, at the same level} -@z -%--------------------------------------- -@x [47] m.1100 l.21156 - Omega - if saved(0)<255 then -@y - if saved(0)<>255 then -@z -%--------------------------------------- -@x [47] m.1109 l.21265 - Omega -@ The |un_hbox| and |un_vbox| commands unwrap one of the 256 current boxes. -@y -@ The |un_hbox| and |un_vbox| commands unwrap one of the current boxes. -@z -%--------------------------------------- -@x [47] m.1110 l.21287 - Omega -else begin link(tail):=list_ptr(p); box(cur_val):=null; -@y -else begin link(tail):=list_ptr(p); -set_equiv(box_base+cur_val,null); -@z -%--------------------------------------- -@x [47] m.1117 l.21342 - Omega - if c>=0 then if c<256 then pre_break(tail):=new_character(cur_font,c); -@y - if c>=0 then if c<=biggest_char then - pre_break(tail):=new_character(cur_font,c); -@z -%--------------------------------------- -@x [48] m.1151 l.21810 - Omega -@ Recall that the |nucleus|, |subscr|, and |supscr| fields in a noad are -broken down into subfields called |math_type| and either |info| or -|(fam,character)|. The job of |scan_math| is to figure out what to place -in one of these principal fields; it looks at the subformula that -comes next in the input, and places an encoding of that subformula -into a given word of |mem|. - -@d fam_in_range==((cur_fam>=0)and(cur_fam<16)) - -@<Declare act...@>= -procedure scan_math(@!p:pointer); -label restart,reswitch,exit; -var c:integer; {math character code} -begin restart:@<Get the next non-blank non-relax...@>; -reswitch:case cur_cmd of -letter,other_char,char_given: begin c:=ho(math_code(cur_chr)); - if c=@'100000 then - begin @<Treat |cur_chr| as an active character@>; - goto restart; - end; - end; -char_num: begin scan_char_num; cur_chr:=cur_val; cur_cmd:=char_given; - goto reswitch; - end; -math_char_num: begin scan_fifteen_bit_int; c:=cur_val; - end; -math_given: c:=cur_chr; -delim_num: begin scan_twenty_seven_bit_int; c:=cur_val div @'10000; - end; -othercases @<Scan a subformula enclosed in braces and |return|@> -endcases;@/ -math_type(p):=math_char; character(p):=qi(c mod 256); -if (c>=var_code)and fam_in_range then fam(p):=cur_fam -else fam(p):=(c div 256) mod 16; -exit:end; -@y -@ Recall that the |nucleus|, |subscr|, and |supscr| fields in a noad are -broken down into subfields called |math_type| and either |info| or -|(fam,character)|. The job of |scan_math| is to figure out what to place -in one of these principal fields; it looks at the subformula that -comes next in the input, and places an encoding of that subformula -into a given word of |mem|. - -@d fam_in_range==((cur_fam>=0)and(cur_fam<16)) - -@<Declare act...@>= -@t\4@>@<Declare the function called |fin_mlist|@>@t@>@;@/ - -procedure scan_math(@!p:pointer); -label restart,reswitch,exit; -var c:integer; {math character code} -begin restart:@<Get the next non-blank non-relax...@>; -reswitch: -case cur_cmd of -letter,other_char,char_given: begin - c:=ho(math_code(cur_chr)); - if c=@"8000000 then - begin @<Treat |cur_chr| as an active character@>; - goto restart; - end; - end; -char_num: begin scan_char_num; cur_chr:=cur_val; cur_cmd:=char_given; - goto reswitch; - end; -math_char_num: begin - if cur_chr=0 then scan_fifteen_bit_int - else scan_big_fifteen_bit_int; - c:=cur_val; - end; -math_given: begin - c := ((cur_chr div @"1000) * @"1000000) + - (((cur_chr mod @"1000) div @"100) * @"10000) + - (cur_chr mod @"100); - end; -omath_given: begin c:=cur_chr; - end; -delim_num: begin - if cur_chr=0 then scan_twenty_seven_bit_int - else scan_fifty_one_bit_int; - c:=cur_val; - end; -othercases @<Scan a subformula enclosed in braces and |return|@> -endcases;@/ -math_type(p):=math_char; character(p):=qi(c mod @"10000); -if (c>=var_code)and fam_in_range then fam(p):=cur_fam -else fam(p):=(c div @"10000) mod @"100; -exit:end; -@z -%--------------------------------------- -@x [48] m.1154 l.21860 - Omega -mmode+letter,mmode+other_char,mmode+char_given: - set_math_char(ho(math_code(cur_chr))); -mmode+char_num: begin scan_char_num; cur_chr:=cur_val; - set_math_char(ho(math_code(cur_chr))); - end; -mmode+math_char_num: begin scan_fifteen_bit_int; set_math_char(cur_val); - end; -mmode+math_given: set_math_char(cur_chr); -mmode+delim_num: begin scan_twenty_seven_bit_int; - set_math_char(cur_val div @'10000); -@y -mmode+letter,mmode+other_char,mmode+char_given: - set_math_char(ho(math_code(cur_chr))); -mmode+char_num: begin scan_char_num; cur_chr:=cur_val; - set_math_char(ho(math_code(cur_chr))); - end; -mmode+math_char_num: begin - if cur_chr=0 then scan_fifteen_bit_int - else scan_big_fifteen_bit_int; - set_math_char(cur_val); - end; -mmode+math_given: begin - set_math_char(((cur_chr div @"1000) * @"1000000) + - (((cur_chr mod @"1000) div @"100) * @"10000) + - (cur_chr mod @"100)); - end; -mmode+omath_given: begin - set_math_char(cur_chr); - end; -mmode+delim_num: begin - if cur_chr=0 then scan_twenty_seven_bit_int - else scan_fifty_one_bit_int; - set_math_char(cur_val); -@z -%--------------------------------------- -@x [48] m.1155 l.21878 - Omega -procedure set_math_char(@!c:integer); -var p:pointer; {the new noad} -begin if c>=@'100000 then - @<Treat |cur_chr|...@> -else begin p:=new_noad; math_type(nucleus(p)):=math_char; - character(nucleus(p)):=qi(c mod 256); - fam(nucleus(p)):=(c div 256) mod 16; - if c>=var_code then - begin if fam_in_range then fam(nucleus(p)):=cur_fam; - type(p):=ord_noad; - end - else type(p):=ord_noad+(c div @'10000); - link(tail):=p; tail:=p; - end; -end; -@y -procedure set_math_char(@!c:integer); -var p,q,r:pointer; {the new noad} -begin if c>=@"8000000 then - @<Treat |cur_chr|...@> -else begin p:=new_noad; math_type(nucleus(p)):=math_char; - character(nucleus(p)):=qi(c mod @"10000); - fam(nucleus(p)):=(c div @"10000) mod @"100; - if c>=var_code then - begin if fam_in_range then fam(nucleus(p)):=cur_fam; - type(p):=ord_noad; - end - else type(p):=ord_noad+(c div @"1000000); - link(tail):=p; tail:=p; - end; -end; -@z -%--------------------------------------- -@x [48] m.1160 l.21966 - Omega -procedure scan_delimiter(@!p:pointer;@!r:boolean); -begin if r then scan_twenty_seven_bit_int -else begin @<Get the next non-blank non-relax...@>; - case cur_cmd of - letter,other_char: cur_val:=del_code(cur_chr); - delim_num: scan_twenty_seven_bit_int; - othercases cur_val:=-1 - endcases; - end; -if cur_val<0 then @<Report that an invalid delimiter code is being changed - to null; set~|cur_val:=0|@>; -small_fam(p):=(cur_val div @'4000000) mod 16; -small_char(p):=qi((cur_val div @'10000) mod 256); -large_fam(p):=(cur_val div 256) mod 16; -large_char(p):=qi(cur_val mod 256); -@y -procedure scan_delimiter(@!p:pointer;@!r:integer); -begin if r=1 then scan_twenty_seven_bit_int -else if r=2 then scan_fifty_one_bit_int -else begin @<Get the next non-blank non-relax...@>; - case cur_cmd of - letter,other_char: begin - cur_val:=del_code0(cur_chr); cur_val1:=del_code1(cur_chr); - end; - delim_num: if cur_chr=0 then scan_twenty_seven_bit_int - else scan_fifty_one_bit_int; - othercases begin cur_val:=-1; cur_val1:=-1; end; - endcases; - end; -if cur_val<0 then begin @<Report that an invalid delimiter code is being changed - to null; set~|cur_val:=0|@>; - cur_val1:=0; - end; -small_fam(p):=(cur_val div @"10000) mod @"100; -small_char(p):=qi(cur_val mod @"10000); -large_fam(p):=(cur_val1 div @"10000) mod @"100; -large_char(p):=qi(cur_val1 mod @"10000); -@z -%--------------------------------------- -@x [48] m.1163 l.22005 - Omega -scan_delimiter(left_delimiter(tail),true); scan_math(nucleus(tail)); -@y -scan_delimiter(left_delimiter(tail),cur_chr+1); scan_math(nucleus(tail)); -@z -%--------------------------------------- -@x [48] m.1165 l.22012 - Omega -procedure math_ac; -begin if cur_cmd=accent then - @<Complain that the user should have said \.{\\mathaccent}@>; -tail_append(get_node(accent_noad_size)); -type(tail):=accent_noad; subtype(tail):=normal; -mem[nucleus(tail)].hh:=empty_field; -mem[subscr(tail)].hh:=empty_field; -mem[supscr(tail)].hh:=empty_field; -math_type(accent_chr(tail)):=math_char; -scan_fifteen_bit_int; -character(accent_chr(tail)):=qi(cur_val mod 256); -if (cur_val>=var_code)and fam_in_range then fam(accent_chr(tail)):=cur_fam -else fam(accent_chr(tail)):=(cur_val div 256) mod 16; -scan_math(nucleus(tail)); -end; -@y -procedure math_ac; -begin if cur_cmd=accent then - @<Complain that the user should have said \.{\\mathaccent}@>; -tail_append(get_node(accent_noad_size)); -type(tail):=accent_noad; subtype(tail):=normal; -mem[nucleus(tail)].hh:=empty_field; -mem[subscr(tail)].hh:=empty_field; -mem[supscr(tail)].hh:=empty_field; -math_type(accent_chr(tail)):=math_char; -if cur_chr=0 then scan_fifteen_bit_int -else scan_big_fifteen_bit_int; -character(accent_chr(tail)):=qi(cur_val mod @"10000); -if (cur_val>=var_code)and fam_in_range then fam(accent_chr(tail)):=cur_fam -else fam(accent_chr(tail)):=(cur_val div @"10000) mod @"100; -scan_math(nucleus(tail)); -end; -@z -%--------------------------------------- -@x [48] m.1174 l.22085 - Omega -@t\4@>@<Declare the function called |fin_mlist|@>@t@>@;@/ -@y -@z -%--------------------------------------- -@x [48] m.1188 l.22284 - Omega -text(frozen_right):="right"; eqtb[frozen_right]:=eqtb[cur_val]; -@y -settext(frozen_right,"right"); -set_new_eqtb(frozen_right,new_eqtb(cur_val)); -@z -%--------------------------------------- -@x [49] m.1214 l.22700 - Omega -@d word_define(#)==if global then geq_word_define(#)@+else eq_word_define(#) -@y -@d word_define(#)==if global then geq_word_define(#)@+else eq_word_define(#) -@d del_word_define(#)==if global - then del_geq_word_define(#)@+else del_eq_word_define(#) -@z -%--------------------------------------- -@x [49] m.1216 l.22734 - Omega -text(frozen_protection):="inaccessible"; -@y -settext(frozen_protection,"inaccessible"); -@z -%--------------------------------------- -@x [49] m.1222 l.22789 - Omega -@d char_def_code=0 {|shorthand_def| for \.{\\chardef}} -@d math_char_def_code=1 {|shorthand_def| for \.{\\mathchardef}} -@d count_def_code=2 {|shorthand_def| for \.{\\countdef}} -@d dimen_def_code=3 {|shorthand_def| for \.{\\dimendef}} -@d skip_def_code=4 {|shorthand_def| for \.{\\skipdef}} -@d mu_skip_def_code=5 {|shorthand_def| for \.{\\muskipdef}} -@d toks_def_code=6 {|shorthand_def| for \.{\\toksdef}} - -@<Put each...@>= -primitive("chardef",shorthand_def,char_def_code);@/ -@!@:char_def_}{\.{\\chardef} primitive@> -primitive("mathchardef",shorthand_def,math_char_def_code);@/ -@!@:math_char_def_}{\.{\\mathchardef} primitive@> -@y -@d char_def_code=0 {|shorthand_def| for \.{\\chardef}} -@d math_char_def_code=1 {|shorthand_def| for \.{\\mathchardef}} -@d omath_char_def_code=2 {|shorthand_def| for \.{\\omathchardef}} -@d count_def_code=3 {|shorthand_def| for \.{\\countdef}} -@d dimen_def_code=4 {|shorthand_def| for \.{\\dimendef}} -@d skip_def_code=5 {|shorthand_def| for \.{\\skipdef}} -@d mu_skip_def_code=6 {|shorthand_def| for \.{\\muskipdef}} -@d toks_def_code=7 {|shorthand_def| for \.{\\toksdef}} - -@<Put each...@>= -primitive("chardef",shorthand_def,char_def_code);@/ -@!@:char_def_}{\.{\\chardef} primitive@> -primitive("mathchardef",shorthand_def,math_char_def_code);@/ -@!@:math_char_def_}{\.{\\mathchardef} primitive@> -primitive("omathchardef",shorthand_def,omath_char_def_code);@/ -@!@:math_char_def_}{\.{\\omathchardef} primitive@> -@z -%--------------------------------------- -@x [49] m.1224 l.22833 - Omega -shorthand_def: begin n:=cur_chr; get_r_token; p:=cur_cs; define(p,relax,256); - scan_optional_equals; - case n of - char_def_code: begin scan_char_num; define(p,char_given,cur_val); - end; - math_char_def_code: begin scan_fifteen_bit_int; define(p,math_given,cur_val); - end; -@y -shorthand_def: begin n:=cur_chr; get_r_token; p:=cur_cs; - define(p,relax,too_big_char); scan_optional_equals; - case n of - char_def_code: begin scan_char_num; define(p,char_given,cur_val); - end; - math_char_def_code: begin scan_real_fifteen_bit_int; - define(p,math_given,cur_val); - end; - omath_char_def_code: begin scan_big_fifteen_bit_int; - define(p,omath_given,cur_val); - end; -@z -%--------------------------------------- -@x [49] m.1230 l. - Omega -primitive("mathcode",def_code,math_code_base); -@!@:math_code_}{\.{\\mathcode} primitive@> -primitive("lccode",def_code,lc_code_base); -@!@:lc_code_}{\.{\\lccode} primitive@> -primitive("uccode",def_code,uc_code_base); -@!@:uc_code_}{\.{\\uccode} primitive@> -primitive("sfcode",def_code,sf_code_base); -@!@:sf_code_}{\.{\\sfcode} primitive@> -primitive("delcode",def_code,del_code_base); -@!@:del_code_}{\.{\\delcode} primitive@> -@y -primitive("mathcode",def_code,math_code_base); -@!@:math_code_}{\.{\\mathcode} primitive@> -primitive("omathcode",def_code,math_code_base+256); -@!@:math_code_}{\.{\\omathcode} primitive@> -primitive("lccode",def_code,lc_code_base); -@!@:lc_code_}{\.{\\lccode} primitive@> -primitive("uccode",def_code,uc_code_base); -@!@:uc_code_}{\.{\\uccode} primitive@> -primitive("sfcode",def_code,sf_code_base); -@!@:sf_code_}{\.{\\sfcode} primitive@> -primitive("delcode",def_code,del_code_base); -@!@:del_code_}{\.{\\delcode} primitive@> -primitive("odelcode",def_code,del_code_base+256); -@!@:del_code_}{\.{\\odelcode} primitive@> -@z -%--------------------------------------- -@x [49] m.1232 l.22990 - Omega -def_code: begin @<Let |n| be the largest legal code value, based on |cur_chr|@>; - p:=cur_chr; scan_char_num; p:=p+cur_val; scan_optional_equals; - scan_int; - if ((cur_val<0)and(p<del_code_base))or(cur_val>n) then - begin print_err("Invalid code ("); print_int(cur_val); -@.Invalid code@> - if p<del_code_base then print("), should be in the range 0..") - else print("), should be at most "); - print_int(n); - help1("I'm going to use 0 instead of that illegal code value.");@/ - error; cur_val:=0; - end; - if p<math_code_base then define(p,data,cur_val) - else if p<del_code_base then define(p,data,hi(cur_val)) - else word_define(p,cur_val); -@y -def_code: begin - if cur_chr=(del_code_base+256) then begin - p:=cur_chr-256; scan_char_num; p:=p+cur_val; scan_optional_equals; - scan_int; cur_val1:=cur_val; scan_int; {backwards} - if (cur_val1>@"FFFFFF) or (cur_val>@"FFFFFF) then - begin print_err("Invalid code ("); print_int(cur_val1); print(" "); - print_int(cur_val); - print("), should be at most ""FFFFFF ""FFFFFF"); - help1("I'm going to use 0 instead of that illegal code value.");@/ - error; cur_val1:=0; cur_val:=0; - end; - del_word_define(p,cur_val1,cur_val); - end - else begin - @<Let |n| be the largest legal code value, based on |cur_chr|@>; - p:=cur_chr; scan_char_num; p:=p+cur_val; scan_optional_equals; - scan_int; - if ((cur_val<0)and(p<del_code_base))or(cur_val>n) then - begin print_err("Invalid code ("); print_int(cur_val); -@.Invalid code@> - if p<del_code_base then print("), should be in the range 0..") - else print("), should be at most "); - print_int(n); - help1("I'm going to use 0 instead of that illegal code value.");@/ - error; cur_val:=0; - end; - if p<math_code_base then define(p,data,cur_val) - else if p<(math_code_base+256) then begin - if cur_val=@"8000 then cur_val:=@"8000000 - else cur_val:=((cur_val div @"1000) * @"1000000) + - (((cur_val mod @"1000) div @"100) * @"10000) + - (cur_val mod @"100); - define(p,data,hi(cur_val)); - end - else if p<del_code_base then define(p-256,data,hi(cur_val)) - else begin - cur_val1:=cur_val div @"1000; - cur_val1:=(cur_val1 div @"100)*@"10000 + (cur_val1 mod @"100); - cur_val:=cur_val mod @"1000; - cur_val:=(cur_val div @"100)*@"10000 + (cur_val mod @"100); - del_word_define(p,cur_val1,cur_val); - end; - end; -@z -%--------------------------------------- -@x [49] m.1233 l.22990 - Omega -if cur_chr=cat_code_base then n:=max_char_code -else if cur_chr=math_code_base then n:=@'100000 -else if cur_chr=sf_code_base then n:=@'77777 -else if cur_chr=del_code_base then n:=@'77777777 -else n:=255 -@y -if cur_chr=cat_code_base then n:=max_char_code -else if cur_chr=math_code_base then n:=@'100000 -else if cur_chr=(math_code_base+256) then n:=@"8000000 -else if cur_chr=sf_code_base then n:=@'77777 -else if cur_chr=del_code_base then n:=@'77777777 -else n:=biggest_char -@z -%--------------------------------------- -@x [49] m.1234 l.22990 - Omega -def_family: begin p:=cur_chr; scan_four_bit_int; p:=p+cur_val; -@y -def_family: begin p:=cur_chr; scan_big_four_bit_int; p:=p+cur_val; -@z -%--------------------------------------- -@x [49] m.1238 l.23059 - Omega - if q=advance then cur_val:=cur_val+eqtb[l].int; -@y - if q=advance then cur_val:=cur_val+new_eqtb_int(l); -@z -%--------------------------------------- -@x [49] m.1240 l.23086 - Omega - if p=int_val then cur_val:=mult_integers(eqtb[l].int,cur_val) - else cur_val:=nx_plus_y(eqtb[l].int,cur_val,0) - else cur_val:=x_over_n(eqtb[l].int,cur_val) -@y - if p=int_val then cur_val:=mult_integers(new_eqtb_int(l),cur_val) - else cur_val:=nx_plus_y(new_eqtb_int(l),cur_val,0) - else cur_val:=x_over_n(new_eqtb_int(l),cur_val) -@z -%--------------------------------------- -@x [49] m.1241 l.23109 - Omega - if global then n:=256+cur_val@+else n:=cur_val; -@y - if global then n:=number_regs+cur_val@+else n:=cur_val; -@z -%--------------------------------------- -@x [49] m.1289 l.23546 - Omega -|cs_token_flag+active_base| is a multiple of~256. -@y -|cs_token_flag+active_base| is a multiple of~|max_char_val|. -@z -%--------------------------------------- -@x [49] m.1289 l.23552 - Omega - begin c:=t mod 256; -@y - begin c:=t mod max_char_val; -@z -%--------------------------------------- -@x [50] m.1313 l.23892 - Omega -@<Dump regions 1 to 4 of |eqtb|@>; -@<Dump regions 5 and 6 of |eqtb|@>; -@y -dump_eqtb_table; -@z -%--------------------------------------- -@x [50] m.1314 l.23904 - Omega -@<Undump regions 1 to 6 of |eqtb|@>; -@y -undump_eqtb_table; -@z -%--------------------------------------- -@x [50] m.1315 l.23904 - Omega -@ The table of equivalents usually contains repeated information, so we dump it -in compressed form: The sequence of $n+2$ values $(n,x_1,\ldots,x_n,m)$ in the -format file represents $n+m$ consecutive entries of |eqtb|, with |m| extra -copies of $x_n$, namely $(x_1,\ldots,x_n,x_n,\ldots,x_n)$. - -@<Dump regions 1 to 4 of |eqtb|@>= -k:=active_base; -repeat j:=k; -while j<int_base-1 do - begin if (equiv(j)=equiv(j+1))and(eq_type(j)=eq_type(j+1))and@| - (eq_level(j)=eq_level(j+1)) then goto found1; - incr(j); - end; -l:=int_base; goto done1; {|j=int_base-1|} -found1: incr(j); l:=j; -while j<int_base-1 do - begin if (equiv(j)<>equiv(j+1))or(eq_type(j)<>eq_type(j+1))or@| - (eq_level(j)<>eq_level(j+1)) then goto done1; - incr(j); - end; -done1:dump_int(l-k); -while k<l do - begin dump_wd(eqtb[k]); incr(k); - end; -k:=j+1; dump_int(k-l); -until k=int_base - -@ @<Dump regions 5 and 6 of |eqtb|@>= -repeat j:=k; -while j<eqtb_size do - begin if eqtb[j].int=eqtb[j+1].int then goto found2; - incr(j); - end; -l:=eqtb_size+1; goto done2; {|j=eqtb_size|} -found2: incr(j); l:=j; -while j<eqtb_size do - begin if eqtb[j].int<>eqtb[j+1].int then goto done2; - incr(j); - end; -done2:dump_int(l-k); -while k<l do - begin dump_wd(eqtb[k]); incr(k); - end; -k:=j+1; dump_int(k-l); -until k>eqtb_size - -@ @<Undump regions 1 to 6 of |eqtb|@>= -k:=active_base; -repeat undump_int(x); -if (x<1)or(k+x>eqtb_size+1) then goto bad_fmt; -for j:=k to k+x-1 do undump_wd(eqtb[j]); -k:=k+x; -undump_int(x); -if (x<0)or(k+x>eqtb_size+1) then goto bad_fmt; -for j:=k to k+x-1 do eqtb[j]:=eqtb[k-1]; -k:=k+x; -until k>eqtb_size -@y - -@z -%--------------------------------------- -@x [50] m.1318 l.23967 - Omega -@<Dump the hash table@>= -dump_int(hash_used); cs_count:=frozen_control_sequence-1-hash_used; -for p:=hash_base to hash_used do if text(p)<>0 then - begin dump_int(p); dump_hh(hash[p]); incr(cs_count); - end; -for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]); -dump_int(cs_count);@/ -print_ln; print_int(cs_count); print(" multiletter control sequences") -@y -@<Dump the hash table@>= -dump_int(hash_used); -@z -%--------------------------------------- -@x [50] m.1319 l.23976 - Omega -undump(hash_base)(frozen_control_sequence)(hash_used); p:=hash_base-1; -repeat undump(p+1)(hash_used)(p); undump_hh(hash[p]); -until p=hash_used; -for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]); -undump_int(cs_count) -@y -undump(hash_base)(frozen_control_sequence)(hash_used); -@z -%--------------------------------------- -@x [50] m.1324 l.24066 - Omega -for k:=0 to trie_max do dump_hh(trie[k]); -@y -for k:=0 to trie_max do dump_hh(trie[k]); -dump_int(max_hyph_char); -@z -%--------------------------------------- -@x [50] m.1324 l.24078 - Omega -for k:=255 downto 0 do if trie_used[k]>min_quarterword then -@y -for k:=biggest_lang downto 0 do if trie_used[k]>min_quarterword then -@z -%--------------------------------------- -@x [50] m.1325 l.24094 - Omega -for k:=0 to j do undump_hh(trie[k]); -@y -for k:=0 to j do undump_hh(trie[k]); -undump_int(max_hyph_char); -@z -%--------------------------------------- -@x [50] m.1325 l.24101 - Omega -init for k:=0 to 255 do trie_used[k]:=min_quarterword;@+tini@;@/ -k:=256; -@y -init for k:=0 to biggest_lang do trie_used[k]:=min_quarterword;@+tini@;@/ -k:=biggest_lang+1; -@z -%--------------------------------------- -@x [50] m.1326 l.24100 - Omega -dump_int(interaction); dump_int(format_ident); dump_int(69069); -tracing_stats:=0 -@y -dump_int(interaction); dump_int(format_ident); dump_int(69069); -set_new_eqtb_int(int_base+tracing_stats_code,0) -@z -%--------------------------------------- -@x [53] m.1341 l.24506 - Omega -@d what_lang(#)==link(#+1) {language number, in the range |0..255|} -@y -@d what_lang(#)==link(#+1) {language number, in the range |0..biggest_lang|} -@z -%--------------------------------------- -@x [53] m.1370 -@!write_file:array[0..15] of alpha_file; -@y -@!outside_string_array: array[0..1000] of 0..255; -@!write_file:array[0..15] of alpha_file; -@z -%--------------------------------------- -@x [53] m. l.24761 - Omega -text(end_write):="endwrite"; eq_level(end_write):=level_one; -eq_type(end_write):=outer_call; equiv(end_write):=null; -@y -settext(end_write,"endwrite"); set_eq_level(end_write,level_one); -set_eq_type(end_write,outer_call); set_equiv(end_write,null); -@z -%--------------------------------------- -@x [53] m.1376 l.24878 - Omega -else if language>255 then l:=0 -@y -else if language>biggest_lang then l:=0 -@z -%--------------------------------------- -@x [53] m.1377 l.24893 - Omega - else if cur_val>255 then clang:=0 -@y - else if cur_val>biggest_lang then clang:=0 -@z -%--------------------------------------- -@x [54] -This section should be replaced, if necessary, by any special -modifications of the program -that are necessary to make \TeX\ work at a particular installation. -It is usually best to design your change file so that all changes to -previous sections preserve the section numbering; then everybody's version -will be consistent with the published program. More extensive changes, -which introduce new sections, can be inserted here; then only the index -itself will get a new section number. -@^system dependencies@> - -@y -@* \[54] $\Omega$ changes. - -@z -%--------------------------------------- |