% This is part of the Tcode kernel. Only intended to by input by it.

%%%%%%%%%%*******  Language selection  *******%%%%%%%%%%

 %These ones must be defined the same as the default. They are not language dependent
\def\LanguageIndependentDefinitions#1{
  \exP\let\csname NcodeNoLetter#1@\charCii\exP\endcsname \csname NcodeNoLetter@\charCii\endcsname
  \exP\let\csname NcodeNoLetter#1@\charEii\exP\endcsname \csname NcodeNoLetter@\charEii\endcsname
  \exP\let\csname NcodeNoLetter#1@\string\end\exP\endcsname \csname NcodeNoLetter@\string\end\endcsname
  \exP\let\csname NcodeNoLetter#1@\string^^M\exP\endcsname \csname NcodeNoLetter@\string^^M\endcsname
  \exP\let\csname NcodeNoLetter#1@\string\^^M\exP\endcsname \csname NcodeNoLetter@\string\^^M\endcsname
}

%Do not delete the "Reset" from tihs name. There is a macro called \KernelFormatDefaults in Tkernel-categ-words.tex
\def\ResetKernelFormatsDefaults{
  \let\FormatOtherWords\relax
  \let\FormatNumber\relax
  \let\FormatSpliceChar\relax
  \let\FormatAtEsc\FormatAtEsc@@Default
}

%If the user is making use of this \FormatAtEsc and has no color, (s)he must define \def\color#1{}
\def\FormatAtEsc@@Default{\color{black}\FormatOtherWords}
\def\UpdateKernelFormats{
  \ifcsname Format\TcodeLang OtherWords\endcsname \letcs\FormatOtherWords{Format\TcodeLang OtherWords} \else \let\FormatOtherWords\relax \fi
  \ifcsname Format\TcodeLang Number\endcsname	  \letcs\FormatNumber{Format\TcodeLang Number}		   \else \let\FormatNumber\relax \fi
  \ifcsname Format\TcodeLang SpliceChar\endcsname	  \letcs\FormatSpliceChar{Format\TcodeLang SpliceChar}	   \else \let\FormatSpliceChar\relax \fi
  \ifcsname Format\TcodeLang AtEsc\endcsname		  \letcs\FormatAtEsc{Format\TcodeLang AtEsc}			   \else \let\FormatAtEsc\FormatAtEsc@@Default \fi
}

%#1 may be empty
\def\SetupLangFirstTime#1{\edef\temp{#1}\exP\SL@FirstTime\exP{\temp}}
\def\SL@FirstTime#1{
  \exP\let\csname KnownLanguage@#1\endcsname\empty
  \LanguageIndependentDefinitions{#1}
  \ifx*#1*\else
     \exP\def\csname #1Code\endcsname{\begingroup\TcodeSelectLanguage{#1}\Code}
     \exP\def\csname end#1Code\endcsname{\endCode\endgroup}
  \fi
}

%This should never be needed on first input of a language file unless somebody writes Format definitions by hand.
\def\UpdateTcodeLang{
  \UpdateKernelFormats
  \unless\ifcsname KnownLanguage@\TcodeLang\endcsname \SetupLangFirstTime\TcodeLang \fi
}

%Write \def\ThisIsLanguage#1{} before including this file so that everything omits the \TcodeLang infix (e.g., C, py, html)
\unless\ifdefined\ThisIsLanguage \def\ThisIsLanguage#1{
  \edef\temp{#1}\unless\ifx\TcodeLang\temp \edef\TcodeLang{#1}\UpdateTcodeLang\fi
}
\fi
%Not very useful, since people usually modify \ThisIsLanguage before including this file
\def\TcodeNoLanguages{\let\ThisIsLanguage\@gobble}

%\ResetTcode sets \TcodeLang to empty
\ifdefined\begincsname
  \def\TcodeForceLanguage#1{\ResetTcode\edef\TcodeLang{#1}\begincsname ReloadLang@#1\endcsname \UpdateTcodeLang}
\else
  \def\TcodeForceLanguage#1{
    \ResetTcode\edef\TcodeLang{#1}
    \ifcsname ReloadLang@#1\endcsname \csname ReloadLang@#1\endcsname \fi
    \UpdateTcodeLang
  }
\fi

\def\TcodeSelectLanguage#1{
  \edef\temp{#1}\ifx\TcodeLang\temp\else
    \ifcsname UnloadLang@\TcodeLang\endcsname \csname UnloadLang@\TcodeLang\endcsname \fi
    \TcodeForceLanguage{#1}
  \fi
}