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

%\protected is needed for the \edef\TheIdent from \ident
\protected\def\N@dollar#1{\ifincsname\dollarchar#1\else{\DoDollar#1}\fi}
\def\F@dollar#1{{\DoDollar#1}} %Default definition of \DoDollar in Tcode.tex

%%%%%%%%%%*******  Setting up the character used as dollar  *******%%%%%%%%%%

\newcount\c@dollar

\def\MakeDollarOther{\catcode\c@dollar\cat@xii}
\def\MakeDollarActive{\catcode\c@dollar\active}
\def\MakeDollarLetter{\catcode\c@dollar\cat@xi}
%\ifdefined\letcharcode %Because of a Luatex bug, 0 cannot be the number after \letcharcode
%  \def\MakeDefineDollar{\catcode\c@dollar=\active \letcharcode\c@dollar\N@dollar}
%  \def\MakeDefineFDollar{\catcode\c@dollar=\active \letcharcode\c@dollar\F@dollar}%Fast dollar. Avoids certain check
%\fi
  
\def\SetUpDollar{
  \exP\let\exP\DollarChar\dollarchar %\let\DollarChar=$, for example
  \exP\let\activedollar\relax %So that it is not further expanded in the \edef's below
  \edef\DefineDollar{\let\activedollar\noexpand\N@dollar}
  \ifnum\c@dollar=0
    \let\MakeDefineDollar\relax \let\MakeDefineFDollar\relax
  \else
    \edef\MakeDefineDollar{\catcode\c@dollar=\active \let\activedollar\noexpand\N@dollar}
    \edef\MakeDefineFDollar{\catcode\c@dollar=\active \let\activedollar\noexpand\F@dollar}%Fast dollar. Avoids certain check
  \fi
  \ifdefined\toksapp
    \edef\addActiveChar{\toksapp\WordToPrint{\activedollar}}
  \else
    \edef\addActiveChar{\WordToPrint\noexpand\exP{\noexpand\the\WordToPrint\activedollar}}
  \fi
  \edef\InitActiveChar{\noexpand\WordToPrint{\activedollar}}
}

\iffalse
   %The avobe definitions translate to (using $ for example)
   \let\DollarChar=$ %with catcode 12
   \def\DefineDollar{\let$=\N@dollar}
   \def\MakeDefineDollar{\catcode`$=\active \let$=\N@dollar}
   \def\MakeDefineFDollar{\catcode`$=\active \let$=\F@dollar}
   \def\addActiveChar{\WordToPrint\exP{\the\WordToPrint$}} %Or {\toksapp\WordToPrint{$}}
   \def\InitActiveChar{\WordToPrint{$}}
\fi

\def\Makedollarchar#1{\c@dollar=`#1 \count255=\catcode\c@dollar \exP\Make@d@char\string#1} %two-step definition because of #, duplicated by \scantokens
\def\Make@d@char#1{\catcode\c@dollar=\active \scantokens{\def\activedollar{#1}} \def\dollarchar{#1} \SetUpDollar \catcode\c@dollar\count255 }

\def\TcodeMarkerSet#1{
\ifx\DefineDollar\relax
  \message{Tcode: marker \string#1 requested for Tcode but this package was loaded in no-dollar (no-marker) mode. Request ignored}
\else
  \Makedollarchar#1
\fi
}

\catcode 0=12
%This makes <null> the dollar char, that will certainly not appear in the code snippets.
%For a thourough removal of the dollar char in the macros, input Tcode_removedollar.tex
\def\TcodeMarkerNone{
\ifx\DefineDollar\relax\else \Makedollarchar^^00\fi
}
\catcode 0=9 %

%It would be very common for users to write \TcodeMarkerSet{} to remove the dollar. So instead of saying
%that it is an error, we handle it. This is the "final" user macro
\def\TcodeMarker#1{
\def\temp{#1}
\ifx\temp\empty\TcodeMarkerNone
\else\TcodeMarkerSet#1\fi
}
