%D \module
%D   [       file=syst-tex,
%D        version=1999.03.17,  % an oldie: 1995.10.10
%D          title=\CONTEXT\ System Macros,
%D       subtitle=Efficient \PLAIN\ \TEX\ loading,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D This file is used by mptopdf.

%D We've build \CONTEXT\ on top of \PLAIN\ \TEX. Because we
%D want to make the format file as independant as possible of
%D machine dependant font encodings, we have to bypass the
%D loading of fonts.
%D
%D Let's start at the beginning. Because \PLAIN\ is not yet
%D loaded we have to define some \CATCODES\ ourselves.

\catcode`\{=1 % left brace is begin-group character
\catcode`\}=2 % right brace is end-group character
\catcode`\#=6 % hash mark is macro parameter character
\catcode`\^=7 % circumflex is for superscripts

%D To prevent all kind of end||of||file problems, for the
%D moment we simply ignore the Control~Z token.

\catcode`\^^Z=9

%D We are going to report to the user what we are skipping.

\def\skipmessage#1{\immediate\write16{skipping #1 in plain}}

%D We want to be able to use the \type{\newsomething}
%D declarations not only on the \type{\outer} level. This can
%D be done by redefining \type{\outer} so we have to save its
%D original meaning.

\let\normalouter = \outer
\let\outer       = \relax

%D We also want to postpone the loading of hyphenation patters,
%D so we redefine and therefore save \type{\input}.

\let\normalinput = \input
\def\input       #1 {\skipmessage{\string\input}}

%D Finaly are going to we redefine some font specification
%D commands and that's why we save them too. The redefinitions
%D are straightforward because the macros have to do nothing
%D but skipping.

\let\normalskewchar         = \skewchar
\def\skewchar               #1=#2 {\skipmessage{\string\skewchar}}

\let\normaltextfont         = \textfont
\let\normalscriptfont       = \scriptfont
\let\normalscriptscriptfont = \scriptscriptfont

\def\textfont               #1=#2{\skipmessage{\string\textfont}}
\def\scriptfont             #1=#2{\skipmessage{\string\scriptfont}}
\def\scriptscriptfont       #1=#2{\skipmessage{\string\scriptscriptfont}}

%D The redefinition of \type{\font} is a bit more complicated,
%D because in version 3.14159 a scaled specification was
%D introduced.

\let\normalfont = \font

\def\skipscaled scaled #1 {}

\long\def\font#1=#2 #3%
  {\ifx#3s%
     \skipmessage{scaled \string\font}%
     \let\next\skipscaled
   \else
     \skipmessage{\string\font}%
     \let\next\relax
   \fi
   \next#3}

% or:
%
% \long\def\font#1=#2 #3%
%   {\ifx#3s%
%      \skipmessage{scaled \string\font}%
%      \expandafter\skipscaled
%    \else
%      \skipmessage{\string\font}%
%    \fi
%    #3}

%D Relaxing some font switching macros is needed because we
%D don't want any error messages during loading. These
%D unharmfull messages could be ingored.
%D
%D The next substitution is needed for determining
%D \type{\p@renwd} in the macro \type{\bordermatrix}.

\def\tenex#1%
  {\skipmessage{used \string\tenex}\hskip8.75002pt}

%D We need to define \type{\tenrm} for switching to
%D \type{\rm}.

\def\tenrm%
  {\skipmessage{\string\tenrm}}

%D In \CONTEXT\ all \PLAIN\ \TEX\ fonts are available, just
%D like \type{\p@renwd}. We only postpone loading them until
%D they are actually needed.

%D By bypassing fonts, some definitions become less valid so
%D we have to redefine them afterwards.
%D
%D \starttyping
%D \let\normalbordermatrix=\bordermatrix
%D
%D \def\bordermatrix%
%D   {\bgroup
%D    \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}%
%D    \global\p@renwd=\wd0\relax
%D    \egroup
%D    \normalbordermatrix}
%D \stoptyping

%D Now we are ready for loading \PLAIN\ \TEX. Of couse we use
%D \type{\normalinput} and not \type{\input}.

\normalinput plain.tex \let\normalfmtversion\fmtversion

%D We have to take care of unwanted \PDFTEX\
%D initializations. We just want to default to \DVI\ output.

\ifx\pdftexversion\undefined
  \chardef\pdfoutput=0
\else
  \pdfoutput=0
\fi

%D When applicable, we also load the \ETEX\ source and
%D definition files.

\bgroup \obeylines

\ifx\eTeXversion\undefined

  \long\gdef\beginETEX#1\endETEX%
    {}

  \gdef\beginTEX%
    {\bgroup\obeylines\dobeginTEX}

  \gdef\dobeginTEX#1
    {\egroup}

  \global\let\endTEX\relax

\else

  \long\gdef\beginTEX#1\endTEX%
    {}

  \gdef\beginETEX%
    {\bgroup\obeylines\dobeginETEX}

%   \gdef\dobeginETEX#1
%     {\egroup\immediate\write16%
%        {system (E-TEX) : [line \the\inputlineno] \detokenize{#1}}}

  \gdef\dobeginETEX#1
    {\egroup}

  \global\let\endETEX\relax

\fi

\egroup

% \ifx\eTeXversion\undefined
%   \long\def\onlyTEX #1{#1}
%   \long\def\onlyETEX#1{}
% \else
%   \long\def\only TEX#1{}
%   \long\def\onlyETEX#1{#1}
% \fi

%D Well, this redefintion of \type {\input} fails on \ETEX,
%D because of some \type {\cs\fi} constructs. So now we use:

% \beginETEX etex.src etexdefs.lib
%
%   \def\input#1%
%     {\bgroup
%      \skipmessage{\string\input}%
%      \expandafter\ifx\expandafter#1\csname l@ngdefnfile\endcsname
%        \let\input\egroup
%      \else
%        \def\input##1 {\egroup}%
%      \fi
%      \input}
%
%   \normalinput     etex.src \relax
%   \normalinput etexdefs.lib \relax
%
%   \let\fmtversion\normalfmtversion
%
%   \savinghyphcodes=1
%
% \endETEX
%
% \ifx\normalprotected \undefined \let\normalprotected \protected  \fi
% \ifx\normalunexpanded\undefined \let\normalunexpanded\unexpanded \fi
% \ifx\normalexpanded  \undefined \let\normalexpanded  \expanded   \fi

\beginETEX \savinghyphcodes

  \savinghyphcodes=1

\endETEX

%D We restore some redefined primitives to their old meaning.

\let\font             = \normalfont
\let\skewchar         = \normalskewchar
\let\textfont         = \normaltextfont
\let\scriptfont       = \normalscriptfont
\let\scriptscriptfont = \normalscriptscriptfont
\let\input            = \normalinput
\let\outer            = \normalouter

%D We reset some of the used auxiliary macro's to
%D \type{\undefined}. One never knows what testing on them is
%D done elsewhere.

\let\skipmessage            = \undefined
\let\skipscaled             = \undefined
\let\normalfont             = \undefined
\let\normalskewchar         = \undefined
\let\normaltextfont         = \undefined
\let\normalscriptfont       = \undefined
\let\normalscriptscriptfont = \undefined

% \let\normalinput = \undefined
% \let\normalouter = \undefined

%D We want a bit more statistics and some less logging info
%D in the \type{log} file.

\def\wlog#1{}

% \let\normalwlog\wlog
%
% \def\wlog#1{\normalwlog{system (\string\wlog) : #1}}

%D To prevent clashes, we slightly redefine the phantom
%D macros: we let them hide their behaviour by grouping.

\catcode`@=11

%D Somehow this one does not work ok in math mode:

\def\ph@nt%
  {\bgroup
   \ifmmode
     \expandafter\mathpalette\expandafter\mathph@nt
   \else
     \expandafter\makeph@nt
   \fi}

\def\finph@nt%
  {\setbox\tw@\null
   \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
   \ifh@ \wd\tw@\wd\z@ \fi
   \box\tw@
   \egroup}

%D But this one does work.

\def\ph@nt%
  {\ifmmode
     \expandafter\mathpalette\expandafter\mathph@nt
   \else
     \bgroup\expandafter\makeph@nt
   \fi}

\def\finph@nt%
  {\setbox\tw@\null
   \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
   \ifh@ \wd\tw@\wd\z@ \fi
   \box\tw@
   \ifmmode\else\egroup\fi}

\catcode`@=12

%D Just for tracing purposes wet set:

\tracingstats=1

%D To circumvent dependencies, we can postpone certain
%D initializations to dumping time, by appending them to the
%D \type {\everydump} token register.

\newtoks \everydump

\let\normaldump \dump

\def\dump{\the\everydump\normaldump}

\endinput
