%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%
  {\ifx\@@svgebied\empty
     \readsysfile{#1}{\showmessage\m!systems2{#1}}\donothing
   \else
     \def\doloadsystemfile##1%
       {\readsetfile{##1}{#1}{\showmessage\m!systems2{#1}}\donothing}%
     \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
   \loadallsystemfiles\f!sysfilename
 }%\loadallsystemfiles\f!modfilename}

%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\e!deelomgeving}\relax}
     {\grabuntil{\e!stop\e!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}}

\expanded
  {\long\noexpand\def\csname\e!start\e!instellingen\endcsname##1 ##2\csname\e!stop\e!instellingen\endcsname%
     {\noexpand\long\noexpand\setvalue{\??su##1}{##2}}}

\long\def\startsetups#1 #2\stopsetups% for international purposes
  {\long\setvalue{\??su#1}{#2}}

\def\setups
  {\dosingleargument\dosetups}

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

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

\def\doifsetupselse#1%
  {\doifdefinedelse{\??su#1}}

% 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
