%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 \starttyping
%D \definefilesynonym [chemic]  [chemie]
%D \definefilesynonym [einheit] [unit]
%D \definefilesynonym [unit]    [unit]
%D \stoptyping
%D
%D So we can say in english:
%D
%D \starttyping
%D \usemodules[pictex,chemic,unit]
%D \stoptyping
%D
%D and in dutch:
%D
%D \starttyping
%D \usemodules[pictex,chemie,unit]
%D \stoptyping

\def\definefilesynonym
  {\dodoubleempty\dodefinefilesynonym}

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

%D \macros
%D   {definefilefallback}

\def\definefilefallback
  {\dodoubleargument\dodefinefilefallback}

\def\dodefinefilefallback[#1][#2]%
  {\doifnotfile{#1}
     {\def\docommand##1{\doiffile{##1}{\definefilesynonym[#1][##1]\quitcommalist}}%
      \processcommalist[#2]\docommand}}

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

\def\truefilename#1%
  {\ifundefined{\??fs#1}#1\else\truefilename{\csname\??fs#1\endcsname}\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.
%D
%D \starttyping
%D \def\domakeshortfilename[#1#2#3#4#5#6#7#8#9]%
%D   {\lowercase{\edef\shortfilename{#1#2#3#4#5#6#7#8.}}%
%D    \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}
%D
%D \def\makeshortfilename[#1]%
%D   {\edef\fullfilename{#1.........}%
%D    \expanded{\domakeshortfilename[\fullfilename]}}
%D \stoptyping
%D
%D In 2005 there is no need for the 8~character limit any more, so:

\def\makeshortfilename[#1]% no need for further cleanup and shortening
  {\lowercase{\edef\shortfilename{#1.}}%
   \expandafter\beforesplitstring\shortfilename\at.\to\shortfilename}

%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{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 To save memory, we implement some seldomly used commands
%D in a lazy way. Nota bene: such runtime definitions are
%D global.
%D
%D \starttyping
%D \fetchruntimecommand\showaccents{\f!encodingprefix ...}
%D \stoptyping

\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 Experimental:

\let\checkpreprocessor\relax

% \appendtoks\relax{\appendtoks \checkpreprocessor \to \everyjob}\to\everydump
\appendtoks\everyjob\expandafter{\the\everyjob\checkpreprocessor}\to\everydump

%D To be documented and probably moved

\def\documentresources{\@@erurl}

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

\setupexternalresources
  [url=]

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

\protect \endinput
