
% This is a stripped-down version of etex.src, meant as companion to 
% minim-plain.tex.
%
% It follows e-TeX V2.1;0-luatex2.
%
% The following has been removed:
%  - Module loading
%  - Version checks
%
% The following has been retained:
%  - Language handling (somewhat simplified)
%  - Tracing and logging extensions
%  - The \eTeX symbol
%  - Register allocation

\catcode `\@=\catcode `\A

% Define the language-handling commands

\def \uselanguage #1%
    {\ifcsname lang@#1\endcsname
        \language=\csname lang@#1\endcsname
        \lefthyphenmin=\csname lhm@#1\endcsname
        \righthyphenmin=\csname rhm@#1\endcsname
          \ifcsname lu@texhyphen@loaded@\the\language\endcsname \else
            \global\expandafter\def\csname
              lu@texhyphen@loaded@\the\language\endcsname{}%
            \directlua{
              if not status.ini_version then
                require("luatex-hyphen")
                luatexhyphen.loadlanguage("\luatexluaescapestring{#1}",
                \the\language)
              end}%
          \fi
        \ifdefined\uselanguage@hook \uselanguage@hook{#1}\fi
     \else
        \begingroup\errorcontextlines=0\relax
        \errhelp {You are trying to use a language which has not previously
                  been defined; remember that any language you want to use
                  will need to have been specified at the time the format
                  was created.%
                 }%
        \errmessage {Language #1 undefined.}\endgroup
     \fi}

\def \addlanguage #1#2#3#4#5{% language patterns exceptions lhm rhm
    \expandafter\newlanguage \csname lang@#1\endcsname
    \expandafter\chardef \csname lhm@#1\endcsname=#4
    \expandafter\chardef \csname rhm@#1\endcsname=#5
    \csname if\directlua{% do we want to skip this language now?
          require("luatex-hyphen")
          if (luatexhyphen.lookupname("\luatexluaescapestring{#1}") == nil)
              or (\number\csname lang@#1\endcsname == 0) then
            tex.sprint("false") % no, load it (execute 'else' part)
          else
            tex.sprint("true") % yes, skip
          end}\endcsname
    \else
        \uselanguage {#1}%
        \input #2
        \if *#3*\else \input #3 \fi
        \edef \fmtversion {\fmtversion/#1}%
    \fi
    \ifdefined\addlanguage@hook \addlanguage@hook{#1}\fi}

% Decrement \count 19, because \newlanguage will increment it again

\advance \count 19 by -1

% We are about to try to process a user/site-specific file "language.def",
% which establishes a Babel-like language selection environment.

\input language.def

% All that was just to set up natural language handling...
% The "real" work of "etex.src", however, is to augment the non-primitives
% of Plain.TeX to incorporate e-TeX specific features, and to add new
% non-primitives to simplify access to new e-TeX specific primitives.

\message {Augmenting the Plain TeX definitions:}
\message {\string \tracingall;}

\def \tracingall
    {\tracingonline=\@ne
     \tracingcommands=\thr@@ % plain.tex has \tw@
     \tracingstats=\tw@
     \tracingpages=\@ne
     \tracingoutput=\@ne
     \tracinglostchars=\tw@ % plain.tex has \@ne
     \tracingmacros=\tw@
     \tracingparagraphs=\@ne
     \tracingrestores=\@ne
     \showboxbreadth=\maxdimen
     \showboxdepth=\maxdimen
     \errorstopmode
     \tracinggroups=\@ne
     \tracingifs=\@ne
     \tracingscantokens=\@ne
     \tracingnesting=\@ne
     \tracingassigns=\tw@
     }

\message {Adding new e-TeX definitions:}

\message {\string \eTeX,}
\def \eTeX {$\varepsilon$-\TeX} %%% the simple version, not suitable for maths;

\message {\string \loggingall,}
\def \loggingall {\tracingall \tracingonline=\z@}

\message {\string \tracingnone,}
\def \tracingnone
    {\tracingassigns=\z@
     \tracingnesting=\z@
     \tracingscantokens=\z@
     \tracingifs=\z@
     \tracinggroups=\z@
     \showboxdepth=\thr@@
     \showboxbreadth=5
     \tracingrestores=\z@
     \tracingparagraphs=\z@
     \tracingmacros=\z@
     \tracinglostchars=\@ne
     \tracingoutput=\z@
     \tracingpages=\z@
     \tracingstats=\z@
     \tracingcommands=\z@
     \tracingonline=\z@
    }

\message {register allocation;}

\newcount \et@xins % our insertion counter (\insc@unt is used differently)

% We have to adjust the Plain TeX register allocation counts for our
% slightly modified book-keeping:

\advance \count 10 by 1 % \count 10=23 % allocates \count registers 23, 24, ...
\advance \count 11 by 1 % \count 11=10 % allocates \dimen registers 10, 11, ...
\advance \count 12 by 1 % \count 12=10 % allocates \skip registers 10, 11, ...
\advance \count 13 by 1 % \count 13=10 % allocates \muskip registers 10, 11, ...
\advance \count 14 by 1 % \count 14=10 % allocates \box registers 10, 11, ...
\advance \count 15 by 1 % \count 15=10 % allocates \toks registers 10, 11, ...
\advance \count 16 by 1 % \count 16=0  % allocates input streams 0, 1, ...
\advance \count 17 by 1 % \count 17=0  % allocates output streams 0, 1, ...
\advance \count 18 by 1 % \count 18=4  % allocates math families 4, 5, ...
\advance \count 19 by 1 % \count 19=0  % allocates \language codes 0, 1, ...

\et@xins=\insc@unt % \et@xins=255 % allocates insertions 254, 253, ...

% We don't change the Plain TeX definitions of \newcount, etc., but the
% \alloc@ macro doing the actual work is redefined.

% When the normal register pool for \count, \dimen, \skip, \muskip,
% \box, or \toks registers is exhausted, we switch to the extended pool.

\def \alloc@ #1#2#3#4#5%
    {\ifnum \count 1#1 < #4% make sure there's still room
     	 \allocationnumber=\count 1#1
	 \global \advance \count 1#1 by \@ne
	 \global #3#5=\allocationnumber
	 \wlog {\string #5=\string #2\the \allocationnumber}%
     \else \ifnum #1 < 6
    		  \begingroup \escapechar=\m@ne
		  \expandafter \alloc@@ \expandafter {\string #2}#5%
	   \else	
	 	  \errmessage {No room for a new #2}%
	   \fi
     \fi
  }

% The \expandafter construction used here allows the generation of
% \newcount and \globcount from #1=count. Moreover (and more important)
% this construction avoids the appearance of \outer macros inside
% macro definitions or conditionals.

\def \alloc@@ #1#2%
    {\endgroup % restore \escapechar
     \message {Normal \csname#1\endcsname register pool exhausted,
						switching to extended pool.}%
     \global \expandafter 
     \let \csname new#1\expandafter \endcsname \csname glob#1\endcsname
     \csname new#1\endcsname#2%
    }

% We do change the Plain TeX definition of \newinsert

\outer \def \newinsert #1%make sure there's still room for ...
      {\ch@ck 0 \et@xins \count % ... a \count, ...
        {\ch@ck 1 \et@xins \dimen % ... \dimen, ...
     	  {\ch@ck 2 \et@xins \skip % ... \skip, ...
       	    {\ch@ck 4 \et@xins \box % ... and \box register
              {\global \advance \et@xins by \m@ne
	       \unless 
               \ifnum \insc@unt < \et@xins 
	      	      \global \insc@unt=\et@xins 
	       \fi
	       \allocationnumber=\et@xins
	       \global \chardef #1=\allocationnumber
	       \wlog {\string #1=\string \insert \the \allocationnumber}%
	      }%
            }%
          }%
        }%
      }

\def \ch@ck #1#2#3#4%
    {\ifnum \count 1#1 < #2#4\else \errmessage {No room for a new #3}\fi}

% And we define \reserveinserts, so that you can say \reserveinserts{17} 
% in order to reserve room for up to 17 additional insertion classes that will
% not be taken away by \newcount, \newdimen, \newskip, or \newbox.

\outer \def \reserveinserts#1%
      {\global \insc@unt=\numexpr \et@xins \ifnum #1 > \z@ -#1\fi \relax}

\message {extended register allocation;}

% Now, we define \globcount, \globbox, etc., so that you can say
% \globcount\foo and \foo will be defined (with \countdef) to be the
% next count register from the vastly larger but somewhat less efficient
% extended register pool. We also define \loccount, etc., but these
% register definitions are local to the current group.

\count 260=277     % globally allocates \count registers 277, 278, ...
\count 261=\@cclvi % globally allocates \dimen registers 256, 257, ...
\count 262=\@cclvi % globally allocates \skip registers 256, 257, ...
\count 263=\@cclvi % globally allocates \muskip registers 256, 257, ...
\count 264=\@cclvi % globally allocates \box registers 256, 257, ...
\count 265=\@cclvi % globally allocates \toks registers 256, 257, ...
\count 266=\@ne    % globally allocates \marks classes 1, 2, ...

\def \et@xmaxregs {32768}

\count 270=\et@xmaxregs % locally allocates \count registers 32767, 32766, ...
\count 271=\et@xmaxregs % ditto for \dimen registers
\count 272=\et@xmaxregs % ditto for \skip registers
\count 273=\et@xmaxregs % ditto for \muskip registers
\count 274=\et@xmaxregs % ditto for \box registers
\count 275=\et@xmaxregs % ditto for \toks registers
\count 276=\et@xmaxregs % ditto for \marks classes

% \count registers 256-259 and 267-269 are not (yet) used

\outer \def \globcount  {\et@xglob 0 \count  \countdef}
       \def \loccount   {\et@xloc  0 \count  \countdef}
\outer \def \globdimen  {\et@xglob 1 \dimen  \dimendef}
       \def \locdimen   {\et@xloc  1 \dimen  \dimendef}
\outer \def \globskip   {\et@xglob 2 \skip   \skipdef}
       \def \locskip    {\et@xloc  2 \skip   \skipdef}
\outer \def \globmuskip {\et@xglob 3 \muskip \muskipdef}
       \def \locmuskip  {\et@xloc  3 \muskip \muskipdef}
\outer \def \globbox    {\et@xglob 4 \box    \mathchardef}
       \def \locbox     {\et@xloc  4 \box    \mathchardef}
\outer \def \globtoks   {\et@xglob 5 \toks   \toksdef}
       \def \loctoks    {\et@xloc  5 \toks   \toksdef}
\outer \def \globmarks  {\et@xglob 6 \marks  \mathchardef}
       \def \locmarks   {\et@xloc  6 \marks  \mathchardef}

\let\newmark=\globmarks %%% 2.0;14
\let\newmarks=\globmarks

\def \et@xglob #1#2#3#4%
    {\et@xchk #1#2% make sure there's still room
    	{\allocationnumber=\count 26#1
	 \global \advance \count 26#1 by \@ne
	 \global #3#4=\allocationnumber
	 \wlog {\string #4=\string #2\the \allocationnumber}%
        }%
 }

\def \et@xloc#1#2#3#4%
    {\et@xchk #1#2% make sure there's still room
        {\advance \count 27#1 by \m@ne
         \allocationnumber=\count 27#1
 	 #3#4=\allocationnumber 
	 \wlog {\string #4=\string #2\the \allocationnumber \space (local)}%
       }%
 }

\def \et@xchk #1#2#3%
    {\ifnum \count 26#1 < \count 27#1 
        #3%
     \else 
	\errmessage {No room for a new #2}%
     \fi
    }

% Next we define \globcountblk, \loccountblk, etc., so that one can
% write \globcountblk\foo{17} and \foo will be defined (with \mathchardef)
% as the first (the zeroth?) of a block of 17 consecutive registers.
% Thus the user is intended to reference elements <\foo+0> to <\foo+n-1>,
% where n is the length of the block allocated.

\outer \def \globcountblk  {\et@xgblk 0 \count}
       \def \loccountblk   {\et@xlblk 0 \count}
\outer \def \globdimenblk  {\et@xgblk 1 \dimen}
       \def \locdimenblk   {\et@xlblk 1 \dimen}
\outer \def \globskipblk   {\et@xgblk 2 \skip}
       \def \locskipblk    {\et@xlblk 2 \skip}
\outer \def \globmuskipblk {\et@xgblk 3 \muskip}
       \def \locmuskipblk  {\et@xlblk 3 \muskip}
\outer \def \globboxblk    {\et@xgblk 4 \box}
       \def \locboxblk     {\et@xlblk 4 \box}
\outer \def \globtoksblk   {\et@xgblk 5 \toks}
       \def \loctoksblk    {\et@xlblk 5 \toks}
\outer \def \globmarksblk  {\et@xgblk 6 \marks}
       \def \locmarksblk   {\et@xlblk 6 \marks}

% And, both to provide a higher-level interface to the block allocation
% scheme, and to demonstrate possible applications of the new \...expr
% primitives, we also define \globcountvector and \loccountvector (etc)
% which allow the user to access elements with embedded arithmetic, as in

% \globcountvector \foo {12}
% \foo {\count 0 + 3} = \foo {\count 1 * 2}

\outer \def \globcountvector  {\et@xgvec 0 \count}
       \def \loccountvector   {\et@xlvec 0 \count}
\outer \def \globdimenvector  {\et@xgvec 1 \dimen}
       \def \locdimenvector   {\et@xlvec 1 \dimen}
\outer \def \globskipvector   {\et@xgvec 2 \skip}
       \def \locskipvector    {\et@xlvec 2 \skip}
\outer \def \globmuskipvector {\et@xgvec 3 \muskip}
       \def \locmuskipvector  {\et@xlvec 3 \muskip}
\outer \def \globboxvector    {\et@xgvec 4 \box}
       \def \locboxvector     {\et@xlvec 4 \box}
\outer \def \globtoksvector   {\et@xgvec 5 \toks}
       \def \loctoksvector    {\et@xlvec 5 \toks}
\outer \def \globmarksvector  {\et@xgvec 6 \marks}
       \def \locmarksvector   {\et@xlvec 6 \marks}

\def \et@xgblk #1#2#3#4%
    {\et@xchkblk #1#2{#4}% make sure there's still room
        {\allocationnumber=\count 26#1
         \global \advance \count 26#1 by #4%
         \global \mathchardef #3=\allocationnumber
         \wlog {\string #3=\string #2blk{\number #4} at \the \allocationnumber}%
      }%
    }

\def \et@xlblk #1#2#3#4%
    {\et@xchkblk #1#2{#4}% make sure there's still room
        {\advance \count 27#1 by -#4%
         \allocationnumber=\count 27#1
         \mathchardef #3=\allocationnumber
         \wlog {\string #3=\string #2blk{\number #4} 
       		at \the \allocationnumber \space (local)%
       	       }%
      }%
    }

\begingroup
\catcode `\# = 12
\gdef \et@xhash {#}
\endgroup

\def \et@xgvec #1#2#3#4%
    {\et@xchkblk #1#2{#4}% make sure there's still room
        {\allocationnumber=\count 26#1
         \global \advance \count 26#1 by #4%
         \ifx    #2\box
                 \def \2{}%
         \else   \ifx #2\marks
                      \def \2{}%
                 \else
                      \def \2{\string #2}%
                 \fi
         \fi
         \xdef #3##1{\2 \noexpand \numexpr \the \allocationnumber+##1\relax}%
         \wlog {\string #3 {\et@xhash 1} =
                  \2 {\the \allocationnumber+\et@xhash 1} (global #2 vector)%
      	     }%
      }%
    }

\def \et@xlvec #1#2#3#4%
    {\et@xchkblk #1#2{#4}% make sure there's still room
        {\advance \count 27#1 by -#4%
 	 \allocationnumber=\count27#1 
	 \mathchardef #3=\allocationnumber
	 \ifx  #2\box
               \def \2{}%
	 \else \ifx #2\marks
               	   \def \2{}%
               \else
               	   \def \2{\string #2}%
               \fi
	 \fi
	 \edef #3##1{\2 \noexpand \numexpr \the \allocationnumber+##1\relax}%
	 \wlog {\string #3 {\et@xhash 1} =
                   \2 {\the \allocationnumber+\et@xhash 1} (local #2 vector)%
               }%
        }%
    }

\def \et@xchkblk #1#2#3#4%
    {\ifnum #3 < \z@
     	   \errmessage {Negative register block size \number #3}%
     \else \ifnum \numexpr \count 26#1+#3 > \count 27#1
     		\errmessage {No room for new #2block of size \number#3}%
     	   \else 
	 	 #4%
     	   \fi 
     \fi
    }

% And finally re-catcode commercial-at

\catcode `\@=12


