%D \module
%D   [       file=core-fil,
%D        version=1997.11.15,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=File Support,
%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.

\writestatus{loading}{Context Core Macros / File Support}

\unprotect

% NOT YET DOCUMENTED !!
%
% overal \normalinput

\startmessages  dutch  library: files
   title: files
       1: file synoniem -- is al in gebruik voor --
\stopmessages

\startmessages  english  library: files
   title: files
       1: file synonym -- is already used for --
\stopmessages

\startmessages  german  library: files
   title: files
       1: Dateisynonym -- wird bereits fuer -- benutzt
\stopmessages

\startmessages  czech  library: files
   title: soubory
       1: synonymum souboru -- je jiz pouzito pro --
\stopmessages

\startmessages  italian  library: files
   title: file
       1: sinonimo file -- già in uso per --
\stopmessages

\startmessages  norwegian  library: files
   title: filer
       1: filesynonym -- er allerede brukt for --
\stopmessages

\startmessages  romanian  library: files
   title: fisiere
       1: sinonimul fisierelor -- este folosit deja pentru --
\stopmessages

%D \macros
%D   {definefilesynonym}
%D
%D One of the problems with loading files is that their names
%D can depend on the interface language. We therefore need a
%D method to define filesynonyms. The actual synonyms are
%D defined elsewhere, but look like:
%D
%D \starttypen
%D \definefilesynonym [chemic]  [chemie]
%D \definefilesynonym [einheit] [eenheid]
%D \definefilesynonym [unit]    [eenheid]
%D \stoptypen
%D
%D So we can say in english:
%D
%D \starttypen
%D \usemodules[pictex,chemic,unit]
%D \stoptypen
%D
%D and in dutch:
%D
%D \starttypen
%D \usemodules[pictex,chemie,eenheid]
%D \stoptypen

\def\definefilesynonym
  {\dodoubleempty\dodefinefilesynonym}

\def\dodefinefilesynonym[#1][#2]%
  {\doifdefined{\??fs#1}
     {\doifnotvalue{\??fs#1}{#2}
        {\showmessage\m!files1{#1 (#2),\getvalue{\??fs#1}}}}%
   \doifelse{#1}{#2}
     {\letbeundefined{\??fs#1}{#2}}
     {\setevalue{\??fs#1}{#2}}}

%D \macros
%D   {truefilename}
%D
%D At the system level such a filename can be called upon by
%D saying:
%D
%D \starttypen
%D \truefilename{filename/filesynonym}
%D \stoptypen
%D
%D The implementation shows that nesting is supported.

\def\truefilename#1%
  {\ifundefined{\??fs#1}%
     #1%
   \else
     \truefilename{\getvalue{\??fs#1}}%
   \fi}

%D \macros
%D   {makeshortfilename}
%D
%D To prevent cross platform problems with filenames, we
%D lowercase them as well as only use the first 8~characters.

\def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
  {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
   \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}

\def\makeshortfilename[#1]%
  {\edef\fullfilename{#1.........}%
   \expanded{\domakeshortfilename[\fullfilename]}}

%D \macros
%D   {usemodule}
%D
%D Most of \CONTEXT is preloaded in the format file. Some very
%D domain specific typesetting topics are however dealt with in
%D separate modules, e.g. typesetting of chemical structure
%D formulas. These modules are loaded by:
%D
%D \showsetup{\y!usemodule}
%D
%D More information on the specific modules can be found in
%D their dedicated manuals. We use \type {\next} so that we
%D can \type {\end} in modules.

\newconditional\moduleisloaded

\def\dododousemodules#1#2% no \unprotect/\protect when loading,
  {\relax                % since we need to use ? ! unprotected
   \ifconditional\moduleisloaded % sometimes (see xtag-map)
     \let\next\relax % or: \expandafter\gobbleoneargument
   \else
     \makeshortfilename[#1\truefilename{#2}]%
     \doifelseflagged\shortfilename
       {\showmessage\m!systems7{#2}%
        \settrue\moduleisloaded
        \let\next\relax}
       {\doglobal\setflag\shortfilename
        \def\next
          {\startreadingfile
             \readsysfile\shortfilename
               {\showmessage\m!systems5{#2}\settrue\moduleisloaded}
               \donothing
           \stopreadingfile}}%
   \fi
   \next}

\def\dodousemodules#1#2%
  {\setfalse\moduleisloaded
   \doifelsenothing{#1}
     {\dododousemodules\f!moduleprefix {#2}%
      \dododousemodules\f!privateprefix{#2}%
      \dododousemodules\f!styleprefix  {#2}%
      \dododousemodules\f!xstyleprefix {#2}%
      \dododousemodules\f!thirdprefix  {#2}%
      \dododousemodules\empty          {#2}}% new, fall back on raw name
     {\dododousemodules{#1-}{#2}}%
   \ifconditional\moduleisloaded\else
     \showmessage\m!systems6{#2}%
   \fi}

\def\dousemodules[#1][#2]%
  {\ifsecondargument
     \doifelsenothing{#2}
       {\let\next\relax}
       {\def\next{\processcommalist[#2]{\dodousemodules{#1}}}}%
   \else
     \def\next{\usemodules[][#1]}%
   \fi
   \next}

\def\usemodules
  {\dodoubleempty\dousemodules}

\let\usemodule\usemodules

% \usemodule[t][speech]

%D We also support a singular call, which saves us for
%D frustrations when we do a typo.

\let\usemodule=\usemodules

% %D The definition shows that the language specific settings
% %D are activated after loading all the modules specified.

%D \macros
%D   {ifprotectbuffers, bufferprefix,
%D    TEXbufferfile, MPgraphicfile}
%D
%D The next switch enables protection of temporary filenames,
%D which is needed when we process more files on one path at
%D the same time.

\newif\ifprotectbuffers

\def\bufferprefix{\ifprotectbuffers\jobname-\fi}

% The following filenames are defined here:

\def\TEXbufferfile   #1{\bufferprefix#1.\f!temporaryextension}
\def\MPgraphicfile     {\bufferprefix mp\ifMPrun run\else graph\fi}
\def\convertMPcolorfile{\bufferprefix metacmyk.tmp}

%D The next few macros ar eused for some internal (rather
%D old already) extensions.

\def\definieerfilegroep
  {\dodoubleargument\dodefinieerfilegroep}

\def\dodefinieerfilegroep[#1][#2]%
  {\getparameters[\??fp#1][\c!file=#1,\c!voor=,\c!na=,#2]%
   \setvalue{\e!start#1}{\dostartfilegroep[#1]}}

\def\dostartfilegroep%
  {\dodoubleargument\dodostartfilegroep}

\def\dodostartfilegroep[#1][#2]%
  {\getvalue{\??fp#1\c!voor}%
   \setvalue{\e!stop#1}{\dostopfilegroep[#1][#2]}%
   \expanded{\dolaadfilegroep[\getvalue{\??fp#1\c!file}-#2]}%
   \getvalue{\e!start#1#2}}

\def\dolaadfilegroep[#1-#2#3#4#5]%
  {\readsysfile{#1-#2#3#4}\donothing\donothing}

\def\dostopfilegroep[#1][#2]%
  {\getvalue{\e!stop#1#2}%
   \getvalue{\??fp#1\c!na}}

%D To save memory, we implement some seldomly used commands
%D in a lazy way. Nota bene: such runtime definitions are
%D global.
%D
%D \starttypen
%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
%D \stoptypen

\def\fetchruntimecommand#1#2%
  {\def#1{\dofetchruntimecommand#1{#2}}}

\def\dofetchruntimecommand#1#2%
  {\doifnotflagged{#2}
     {\let#1\undefined
      \startreadingfile
      \startnointerference % \bgroup
      \cleanupfeatures % better \setnormalcatcodes / test first
      \readfile{#2}\donothing\donothing
      \stopnointerference  % \egroup
      \stopreadingfile
      \doglobal\setflag{#2}}%
   \ifx#1\undefined
     \writestatus{\m!systems}{command \string#1 not found in file #2}%
     \def#1{{\infofont[unknown command \string#1]}}%
   \fi
   #1}

%D To be documented and probably moved

\def\stelexternebronnenin
  {\dodoubleargument\getparameters[\??er]}

\def\documentresources{\@@erurl}

\stelexternebronnenin[url=]

%D This module will be perfected / changed / weeded.

\protect \endinput
