%D \module
%D   [       file=core-job, % copied from main-001,
%D        version=1997.03.31,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Job Handling,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%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 module is still to be split and documented.

\writestatus{loading}{Context Core Macros / Job Handling}

%S InputFile     \input
%S InputFile     \omgeving    \environment
%S InputFile     \projekt     \project
%S InputFile     \produkt     \product
%S InputFile     \onderdeel   \component
%S
%S CheckStrings  \start  \stop
%S CheckStrings  \begin  \end
%S CheckStrings  \begin  \eind
%S
%S CheckChars    { }
%S CheckChars    [ ]
%S CheckChars    ( )
%S
%S CheckChar     $

% \appendtoks \reportprotectionstate \to \everydump

\unprotect

\let \currentproject     \empty
\let \currentproduct     \empty
\let \currentenvironment \empty
\let \currentcomponent   \empty

\let \loadedfiles        \empty
\let \processedfiles     \empty

\let \geenfilesmeer      \relax

\newcounter\textlevel
\newcounter\fileprocesslevel

\setvalue{\c!file::0}{\jobname}

\def\processedfile % is used in styles, don't change !
  {\getvalue{\c!file::\fileprocesslevel}}

%\def\processfile#1%
%  {\doglobal\increment\fileprocesslevel
%   \setxvalue{\c!file::\fileprocesslevel}{#1}%
%   \@EA\doglobal\@EA\addtocommalist\@EA{#1}\processedfiles
%   \readlocfile{#1}{}{}
%   \doglobal\decrement\fileprocesslevel}

\def\dostarttextfile#1%
  {\doglobal\increment\fileprocesslevel
   \setxvalue{\c!file::\fileprocesslevel}{#1}%
   \@EA\doglobal\@EA\addtocommalist\@EA{#1}\processedfiles}

\def\dostoptextfile
  {\doglobal\decrement\fileprocesslevel}

\def\processlocalfile#1#2%
  {% #1=\readlocfile|\readsetfile{dir} #2=filename
   % #1{#2}\donothing\donothing
   #1{#2}\donothing{\readfile{#2}\donothing\donothing}}

\def\processfile#1%
  {\ifx\allinputpaths\empty
     \def\next{\processlocalfile\readlocfile}%
   \else
     \let\filepath\empty
     \def\docommando##1%
       {\doiffileelse{\pathplusfile{##1}{#1}}
          {\donetrue\def\filepath{##1}}
          {\donefalse}%
        \ifdone\expandafter\quitcommalist\fi}%
     \doifparentfileelse{#1} % new
       {\processcommacommand  [\allinputpaths]\docommando}
       {\processcommacommand[.,\allinputpaths]\docommando}%
     \ifx\filepath\empty
       \def\next{\processlocalfile\readlocfile}% fall back ../../..
     \else
       \def\next{\processlocalfile{\readsetfile\filepath}}% file found
     \fi
   \fi
   \next{#1}}

\let\allinputpaths\empty

\def\usepath[#1]%
  {\def\docommando##1%
     {\doifelse{##1}\v!reset
        {\let\allinputpaths\empty}
        {\addtocommalist{##1}\allinputpaths}}%
   \processcommalist[#1]\docommando}

\def\usesubpath[#1]% new, see webschrift for usage
  {\ifx\allinputpaths\empty
     \edef\allinputpaths{#1}%
   \else
     \def\docommando##1%
       {\def\dodocommando####1{\addtocommalist{##1/####1}\allinputpaths}%
        \processcommalist[#1]\dodocommando}%
     \processcommacommand[\allinputpaths]\docommando
   \fi}

\def\registreerfileinfo[#1#2]#3% geen \showmessage ?
  {\writestatus\m!systems{#1#2 file #3 at line \the\inputlineno}%
   \immediatewriteutility{f #1 {#3}}}

\doifundefined{preloadfonts}    {\let\preloadfonts=\relax}
\doifundefined{preloadspecials} {\let\preloadspecials=\relax}

% \def\loadsystemfiles
%   {\reportprotectionstate
%    \readsysfile\f!newfilename
%      {\showmessage\m!systems2\f!newfilename}\donothing
%    \readsysfile\f!oldfilename
%      {\showmessage\m!systems2\f!oldfilename}\donothing
%    \readsysfile\f!filfilename
%      {\showmessage\m!systems2\f!filfilename}\donothing
%    \readsysfile\f!sysfilename
%      {\showmessage\m!systems2\f!sysfilename}\donothing}
%
% test \@@svgebied

\def\loadallsystemfiles#1#2%
  {\ifx\@@svgebied\empty
     \readsysfile{#1}{\showmessage\m!systems2{#1}}{#2}%
   \else% yet undocumented
     \def\doloadsystemfile##1%
       {\readsetfile{##1}{#1}{\showmessage\m!systems2{#1}}{#2}}%
     \processcommacommand[\@@svgebied]\doloadsystemfile
   \fi}

\def\loadsystemfiles
  {\reportprotectionstate
   \readsysfile\f!newfilename
     {\showmessage\m!systems2\f!newfilename}%
     \donothing
   \readsysfile\f!oldfilename
     {\showmessage\m!systems2\f!oldfilename}%
     \donothing
   \loadallsystemfiles\f!filfilename
     \donothing
   \loadallsystemfiles\f!sysfilename
     {\doglobal\appendtoks
        \loadallsystemfiles\f!errfilename\donothing
      \to\everygoodbye}}

  %\loadallsystemfiles\f!modfilename
  %  \donothing}

%D Loading of \type {cont-usr.tex} (edited by the user)
%D and \type {cont-fmt.tex} (generated by texexec).

\def\loaduserspecifications
  {\readsysfile\f!usrfilename
     {\showmessage\m!systems2\f!usrfilename}\donothing
   \readjobfile\f!fmtfilename
     {\showmessage\m!systems2\f!fmtfilename}\donothing}

%D We don't want multiple jobfiles to interfere.

\bgroup
\catcode`\%=\@@other
\xdef\texcommentsymbol{%}
\egroup

\def\loadoptionfile
  {\readjobfile{\jobname.\f!optionextension}
     {\showmessage\m!systems2{\jobname.\f!optionextension}}%
    %{\showmessage\m!systems2{\jobname.\f!optionextension}}}
     {\writestatus\m!systems {no \jobname.\f!optionextension}}}

% \newevery \everyjob \EveryJob
% \appendtoks ... \to \everyjob

\prependtoks \showcontextbanner   \to \everyjob

\appendtoks \loadsystemfiles      \to \everyjob
\appendtoks \preloadfonts         \to \everyjob
\appendtoks \settopskip           \to \everyjob
\appendtoks \preloadlanguages     \to \everyjob
\appendtoks \preloadspecials      \to \everyjob
\appendtoks \openspecialfile      \to \everyjob
%appendtoks \checkutilityfile     \to \everyjob % obsolete
\appendtoks \openutilities        \to \everyjob
\appendtoks \loadoptionfile       \to \everyjob
%appendtoks \loadtwopassdata      \to \everyjob
\appendtoks \checknotes           \to \everyjob % depends on bodyfont
\appendtoks \initializeMPgraphics \to \everyjob % after loading system files

\appendtoks \pagina[\v!laatste] \pagina           \to \everybye
\appendtoks \ifarrangingpages\poparrangedpages\fi \to \everybye
\appendtoks \registreerfileinfo[end]{\jobname}    \to \everybye

\appendtoks \savenofpages    \to \everybye
\appendtoks \savenofsubpages \to \everybye

\appendtoks \closeutilities    \to \everygoodbye
\appendtoks \stopcopyingblocks \to \everygoodbye
\appendtoks \closespecialfile  \to \everygoodbye

\prependtoks \resetutilities  \to \everystarttext % moved 28-02-2002
\prependtoks \loadtwopassdata \to \everystarttext % moved 28-02-2002
\appendtoks  \checkreferences \to \everystarttext % new   04-12-1999

% Most natural ...
%
% \def\doateverystarttext
%   {\the\everystarttext
%    \global\let\doateverystarttext\relax}
%
% ... most practical, since we can load env's in a
% something.run file (nested \starttext's; see for
% instance x-res-08, where we definitely want to
% open the file!).

\def\doateverystarttext
  {\the\everystarttext
   \global\everystarttext\emptytoks}

\def\starttekst
  {\doateverystarttext
   \ifnum\textlevel=\zerocount
     \registreerfileinfo[begin]{\jobname}%
     \expandafter\startcopyingblocks
   \fi
   \doglobal\increment\textlevel\relax}

\def\stoptekst
  {\doglobal\decrement\textlevel\relax
   \ifnum\textlevel>\zerocount \else
     \the\everystoptext
    %\the\everybye            %
    %\the\everygoodbye        % == \end (new)
    %\expandafter\normalend   %
     \expandafter\end
   \fi}

\let\starttext\starttekst
\let\stoptext \stoptekst

\let\normalend=\end

\def\end
  {\ifnum\textlevel>\zerocount \else
     \the\everybye
     \the\everygoodbye
     \global\everybye    \emptytoks % rather unneeded
     \global\everygoodbye\emptytoks % but for sure
     \expandafter\normalend
   \fi}

\def\doexecutefileonce#1%
  {\beforesplitstring#1\at.\to\currentfile
   \fullexpandtwoargsafter\doifnotinset\currentfile\loadedfiles
     {\fullexpandoneargafter\addtocommalist\currentfile\loadedfiles
      \doexecutefile{#1}}}

\def\doexecutefile#1%
  {\registreerfileinfo[begin]{#1}%
   \dostarttextfile{#1}%
   \processfile{#1}%
   \dostoptextfile
   \registreerfileinfo[end]{#1}}

\def\donotexecutefile#1%
  {}

\def\verwerkfile#1 %
  {\doexecutefile{#1}}

\def\omgeving #1 % at outermost level only
  {\def\startomgeving ##1 {}%
   \let\stopomgeving\relax
   \dostarttextfile{#1}%
   \startreadingfile
   \processfile{#1}% was : \readlocfile{#1}{}{}
   \stopreadingfile
   \dostoptextfile}

\def\onderdeel #1 % at outermost level only
  {\dostarttextfile{#1}%
   \processfile{#1}%
   \dostoptextfile}

\def\environment{\omgeving} % for the moment, no \let !

\newcounter\filelevel

\def\!!donextlevel#1#2#3#4#5#6\\%
  {\beforesplitstring#6\at.\to#1
   \ifcase\filelevel\relax
     \starttekst
     \def\projekt   ##1 {#2{##1}}%
     \def\omgeving  ##1 {#3{##1}}%
     \def\produkt   ##1 {#4{##1}}%
     \def\onderdeel ##1 {#5{##1}}%
   \fi
   \increment\filelevel\relax
   \fullexpandoneargafter\addtocommalist{#1}\loadedfiles}

\def\doprevlevel
  {\ifnum\filelevel=\plusone
     \expandafter\stoptekst
   \else
     \decrement\filelevel\relax
     \expandafter\endinput
   \fi}

\def\startprojekt #1 %
  {\!!donextlevel\currentproject
     \donotexecutefile\doexecutefileonce
     \doexecutefileonce\doexecutefile#1\\}

\def\stopprojekt
  {\doprevlevel}

\def\startprodukt #1 %
  {\doateverystarttext
   \!!donextlevel\currentproduct
     \doexecutefileonce\doexecutefileonce
     \donotexecutefile\doexecutefile#1\\}

\def\stopprodukt
  {\doprevlevel}

\def\startonderdeel #1 %
  {\doateverystarttext
   \!!donextlevel\currentcomponent
     \doexecutefileonce\doexecutefileonce
     \donotexecutefile\doexecutefile#1\\}

\def\stoponderdeel
  {\doprevlevel}

\def\startomgeving #1 %
  {\!!donextlevel\currentenvironment
     \donotexecutefile\doexecutefileonce
     \donotexecutefile\donotexecutefile#1\\}

\def\stopomgeving
  {\doprevlevel}

\def\startdeelomgeving[#1]%
  {\let\loadedlocalenvironments\empty
   \def\docommando##1%
     {\beforesplitstring##1\at.\to\someevironment
      \fullexpandoneargafter\addtocommalist\someevironment\loadedlocalenvironments}%
   \processcommalist[#1]\docommando
   \fullexpandtwoargsafter\doifcommonelse % no longer next needed
       {\currentproject,\currentproduct,%
        \currentcomponent,\currentenvironment}
       {\loadedlocalenvironments}
     {\letvalue{\e!stop\v!deelomgeving}\relax}
     {\grabuntil{\e!stop\v!deelomgeving}\relax}}

\def\startproduct{\startprodukt}
\def\stopproduct {\stopprodukt}
\def\startproject{\startprojekt}
\def\stopproject {\stopprojekt}

\def\project{\projekt}
\def\product{\produkt}

\def\deelomgeving #1 %
  {\doexecutefileonce{#1}}

\def\setups
  {\dosingleargument\dosetups}

\def\dosetups[#1]%
  {\iffirstargument
     \def\next{\dodosetups{#1}}%
   \else
     \let\next\dodosetups
   \fi
   \next}

\def\dodosetups#1%
  {\processcommalist[#1]\dododosetups}

\def\dodososetups#1%
  {\getvalue{\??su#1}}

\def\doifsetupselse#1%
  {\doifdefinedelse{\??su#1}}

\long\@EA\def\csname\e!start\v!instellingen\endcsname#1 %
  {\bgroup
   \catcode`\^^M=\@@ignore
   \xdostartsetups{#1}}

\expanded
  {\long\noexpand\def\noexpand\xdostartsetups##1##2\csname\e!stop\v!instellingen\endcsname
     {\egroup
      \long\noexpand\setvalue{\??su##1}{##2}}}

\def\startsetups % for international purposes
  {\bgroup\doifnextcharelse[\startsetupsA\startsetupsB\stopsetups}

\def\startlocalsetups % for nested purposes
  {\bgroup\doifnextcharelse[\startsetupsA\startsetupsB\stoplocalsetups}

\def\startsetupsA#1[#2]%
  {\catcode`\^^M=\@@ignore
   \dostartsetups#1{#2}}

\def\startsetupsB#1#2 % space delimited
  {\startsetupsA#1[#2]}%

\long\def\dostartsetups#1#2% watch out: not \grabuntil
  {\dograbuntil#1{\egroup\long\setvalue{\??su#2}}}

% Het <pagina>-karakter (FormFeed), wordt omgezet in \par

\catcode`\^^L=\@@endofline

% NOT TOEVOEGEN: \the\everytrace

\neverypar=\emptytoks

\appendtoks \flushnotes                     \to \everypar
\appendtoks \ifinner\else\checksidefloat\fi \to \everypar
\appendtoks \checkindentation               \to \everypar
\appendtoks \showparagraphnumber            \to \everypar
\appendtoks \flushmargincontents            \to \everypar
\appendtoks \flushcommentanchors            \to \everypar
\appendtoks \synchronizenotes               \to \everypar

\appendtoks \flushnotes                     \to \everydisplay
\appendtoks \adjustsidefloatdisplaylines    \to \everydisplay

%D Better here than in supp-mps:

\def\executesystemcommand{\immediate\write18}

% Default-instellingen (verborgen)

\resetutilities

\protect \endinput
