file-ini.mkvi / last modification: 2020-01-30 14:16
%D \module
%D   [       file=file-ini, % was supp-fil,
%D        version=20110701, % 1995.10.10,
%D          title=\CONTEXT\ File Macros,
%D       subtitle=Helpers,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D \TEX\ operates on files, so one wouldn't wonder that there
%D is a separate module for file commands. In \CONTEXT\ files
%D are used for several purposes:
%D \startitemize[packed]
%D \item  general textual input
%D \item  logging status information
%D \item  saving registers, lists and references
%D \item  buffering defered textual input
%D \stopitemize
%D When dealing with files we can load them as a whole, using
%D the \type{\input} primitive or load them on a line||by||line
%D basis, using \type{\read}. Writing is always done line by
%D line, using \type{\write}.

\writestatus{loading}{ConTeXt File Macros / Helpers}



%D \macros
%D   {scratchread, scratchwrite}
%D We define a scratch file for reading. Keep in mind that
%D the number of files is limited to~16, so use this one when
%D possible. We also define a scratch output file.

\ifdefined\scratchread  \else \newread \scratchread  \fi
\ifdefined\scratchwrite \else \newwrite\scratchwrite \fi

%D Seldom needed:

\def\openinputfile  #handle#name{\immediate\openin #handle={#name}\relax}
\def\openoutputfile #handle#name{\immediate\openout#handle={#name}\relax}

\def\closeinputfile #handle{\immediate\closein #handle\relax}

%D \macros
%D   {writeln}
%D This saves a few tokens:


%D \macros
%D   {pushendofline,popendofline}
%D When we are loading files in the middle of the typesetting
%D process, for instance when we load references, we have to be
%D sure that the reading process does not generate so called
%D 'spurious spaces'. This can be prevented by assigning the
%D line ending character the \CATCODE\ comment. This is
%D accomplished by
%D \starttyping
%D \pushendofline
%D ... reading ...
%D \popendofline
%D \stoptyping






%D \macros
%D   {startreadingfile,stopreadingfile}
%D A low level capsule:

\newcount\readingfilelevel       % no longer needed
\newtoks \everystartreadingfile
\newtoks \everystopreadingfile

\unexpanded\def\startreadingfile% beter een every en \setnormalcatcodes
   \pushcatcodetable       % saveguard
   \clf_pushregime}% temporarily this way

  {\popcatcodetable      % saveguard
   \clf_popregime % temporarily this way

%D \macros
%D   {input, normalinput}
%D Sometimes we run into troubles when \type {\input} wants to get
%D expanded, e.g. in a \type {\write} (which happens in the metafun
%D manual when we permit long MP lines). So, instead of fixing that,
%D we go for a redefinition of \type {\input}. Of course it's better
%D to use \type {\readfile} or \type {\processfile}.



%D \macros
%D   {doifelsefile}
%D The next alternative only looks if a file is present. No
%D loading is done. This one obeys the standard \TEX\ lookup.
%D \starttyping
%D \doiffileelse {filename} {found} {not found}
%D \stoptyping

\unexpanded\def\doifelsefile     {\clf_doifelsefileexist}
\unexpanded\def\doifelsepath     {\clf_doifelsepathexist}
\unexpanded\def\doiffile    #name{\clf_doifelsefileexist{#name}\firstofoneargument\gobbleoneargument}
\unexpanded\def\doifnotfile #name{\clf_doifelsefileexist{#name}\gobbleoneargument\firstofoneargument}




%D \macros
%D   {doifparentfileelse}
%D \starttyping
%D \doifparentfileelse{filename}{yes}{no}
%D \stoptyping

\ifx\outputfilename\undefined \def\outputfilename{\jobname} \fi



%D \macros
%D   {splitfilename}
%D \startbuffer
%D \def\showfilesplit
%D   {\bgroup \tttf
%D      \hbox{(full: \splitofffull)}\space
%D      \hbox{(path: \splitoffpath)}\space
%D      \hbox{(base: \splitoffbase)}\space
%D      \hbox{(name: \splitoffname)}\space
%D      \hbox{(type: \splitofftype)}\space
%D    \egroup}
%D \splitfilename{c:/aa/bb/cc/} \showfilesplit \endgraf
%D \splitfilename{c:/aa/bb/cc/}    \showfilesplit \endgraf
%D \splitfilename{c:/aa/bb/cc/dd}       \showfilesplit \endgraf
%D \splitfilename{} \showfilesplit \endgraf
%D \splitfilename{}    \showfilesplit \endgraf
%D \splitfilename{dd}       \showfilesplit \endgraf
%D \stopbuffer
%D \start \typebuffer \getbuffer \stop

\newconstant\kindoffile % 0=normal 1=full path spec (or http) / set at the lua end

\def\splitoffroot{.} \newconstant\splitoffkind



%D \macros
%D   {doonlyonce, doinputonce, doendinputonce}
%D Especially macropackages need only be loaded once.
%D Repetitive loading not only costs time, relocating registers
%D often leads to abortion of the processing because \TEX's
%D capacity is limited. One can prevent multiple execution and
%D loading by using one of both:
%D \starttyping
%D \doonlyonce{actions}
%D \doinputonce{filename}
%D \doendinputonce{filename}
%D \stoptyping
%D This command obeys the standard method for locating files. We could
%D move this function to the \LUA\ end.

\installsystemnamespace {fileonce}





\protect \endinput