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

%%%%%%%%%*******  \@parsecode. The kernel's kernel  *******%%%%%%%%%

%When this macro is called, \WordToPrint is empty
\def\@parsecode#1{
  \ifcat\noexpand#1a% If #1 is a letter (incl. 0-9, _)
    \WordOrNumber#1% Changes \parsecode
  \else
    \NcodeNoLetter #1% Sets \parsecode to \@parsecode or to something else
  \fi
  \parsecode
}
\def\WordOrNumber@kernel#1{
  \let\parsecode\NcodeParseWord
  \if#1\DollarChar \WordToPrint\exP{\activedollar}
  \else \WordToPrint{#1}\condCsname @+#1\endcsname %If #1 is a number, \let\parsecode=\NcodeParseNumber
  \fi
}

\def\defMaybeNum#1{\exP\def\csname @+#1\endcsname{\let\parsecode\NcodeParseNumber}}
\defMaybeNum0 \defMaybeNum1 \defMaybeNum2 \defMaybeNum3 \defMaybeNum4
\defMaybeNum5 \defMaybeNum6 \defMaybeNum7 \defMaybeNum8 \defMaybeNum9

%%% Handling of words %%%

\def\TcodeReloadW{
  \let\WordOrNumber\WordOrNumber@kernel
  \let\NcodeParseWord\NcodeParseWord@kernel
  \let\NcodeEndWord\NcodeEndWord@kernel
}

%The dollar has cat 11 when parsing it and we replace it by an active dollar.
%\addActiveChar and \InitActiveChar defined by \SetUpDollar

\ifdefined\toksapp %In luatex

%When this is called from the outside, \WordToPrint already contains the first letter (or a dollar).
\def\NcodeParseWord@kernel#1{
\ifcat\noexpand#1a% If #1 is a letter, _ or 0-9 or dollar, append it to WordToPrint
  \if\DollarChar#1\addActiveChar\else \toksapp\WordToPrint{#1}\fi
  \exP\NcodeParseWord
\else
  \NcodeEndWord #1
\fi
}

\else

\def\NcodeParseWord@kernel#1{
\ifcat\noexpand#1a% If #1 is a letter, _ or 0-9 or dollar, append it to WordToPrint
  \if\DollarChar#1\addActiveChar\else \WordToPrint=\exP{\the\WordToPrint#1}\fi
  \exP\NcodeParseWord
\else
  \NcodeEndWord #1
\fi
}

\fi %luatex

\def\NcodeEndWord@kernel#1{
  \let\parsecode\@parsecode
  \HookAndPrintWord{#1}%May modify \parsecode
  \exP\parsecode\exP #1%First expand \fi, then \parsecode #1
}

\TcodeReloadW

%Print a name
% What is to be printed is the contents of \WordToPrint. (Here this is never empty, but would work.)
% #1 is the next token in the input. It may be needed for \PrePrintLongHook.
\def\HookAndPrintWord#1{
  {\aftergroup\letFormatToApply\exP\aftergroup\csname Format\TcodeLang @\the\WordToPrint\endcsname}
  \PrePrintLongHook#1%Before the next line so that we can disthinguish an unknown word here. May modify \parsecode
  \ifx\FormatToApply\undefined \let\FormatToApply\FormatOtherWords \fi
  \wordbox{\FormatToApply{\the\WordToPrint}}
}

%%% Handling of numbers %%%

\def\TcodeReloadN{
  % The first character was a number. Set catcodes and continue parsing the number
  \def\NcodeParseNumber{\bgroup\NumberCatcodes\Ncode@Number}
  \let\Ncode@Number\Ncode@Number@kernel
  \let\NcodeEndNumber\NcodeEndNumber@kernel
}

\def\Ncode@Number@kernel#1{
\ifcat\noexpand#1a% If #1 is a letter or 0-9
   \WordToPrint\exP{\the\WordToPrint#1}% append it to WordToPrint
   \exP\Ncode@Number
\else
  \NcodeEndNumber #1
\fi
}
\def\NcodeEndNumber@kernel{
  {\FormatNumber{\the\WordToPrint}}\egroup% end of special catcodes for _ and maybe others
  \exP\@parsecode\exP%So that \@parsecode reads the #1 that follows, after executing the \fi.
}

\TcodeReloadN

%%  \NcodeNoLetter %%

\def\NcodeNoLetter#1{
\ifcsname NcodeNoLetter\TcodeLang @\string#1\endcsname%Typically, this is false
  \exP\let\exP\parsecode\csname NcodeNoLetter\TcodeLang @\string#1\endcsname
\else %In \ncode and \Code, skip spaces after a control sequence (even single character ones)
  \let\parsecode\@parsecode
  \MaybeSkipSpacesAfterCS #1
\fi
}
%\dosetupCS has effect in \ncode, that re-tokenizes its input along the way. For \Ncode the tokens are
%frozen once \@parsecode starts parsing, therefore the code in \SkipSpacesAfterCS has no effect. Hence, we avoid it.
\let\MaybeSkipSpacesAfterCS\relax
\def\SkipSpacesAfterCS#1{\ifcat\relax\noexpand#1\dosetupCS\fi #1} %\ncode will use this for \MaybeSkipSpacesAfterCS
\def\dosetupCS{\catcode`\ =10 \let\parsecode\parsecode@restoresp} %Placed all here so that there is just one token, \dosetupCS, above
\def\parsecode@restoresp#1{\catcode`\ =\active \@parsecode#1}