%D \module
%D   [       file=xetx-ini,
%D        version=2004.09.11,
%D          title=\CONTEXT\ System Macros,
%D       subtitle=\XETEX\ Initializations,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D We moved some code around and now have reorganized the xetex
%D code in the \type {xetx} module namespace.

\unprotect

%D Some defaults.

\ifdefined\XeTeXuseglyphmetrics
    \XeTeXuseglyphmetrics\plusone
\fi

%D Character classes.

\newcount\nofXTXcharinjections

\def\defineXTXcharinjectionclass[#1]%
  {\global\advance\nofXTXcharinjections\plusone
   \setxvalue{@xtx@cc@#1}{\number\nofXTXcharinjections}}

\setxvalue{@xtx@cc@\s!default}{0}

\def\getXTXcharinjectionclass#1%
  {\csname @xtx@cc@\ifcsname @xtx@cc@#1\endcsname#1\else\s!default\fi\endcsname}

\let\currentXTXcharinjection\s!default

\def\startXTXcharinjecxtions[#1]%
  {\pushmacro\currentXTXcharinjection
   \def\currentXTXcharinjection{#1}}

\def\stopXTXcharinjections
  {\popmacro\currentXTXcharinjection}

\def\defineXTXcharinjection #1 #2 %
  {\doifnumberelse{#1}{\edef\XTXclassone{\number#1}}{\edef\XTXclassone{\getXTXcharinjectionclas{#1}}}%
   \doifnumberelse{#2}{\edef\XTXclasstwo{\number#2}}{\edef\XTXclasstwo{\getXTXcharinjectionclas{#2}}}%
   \expanded{\dodefineXTXcharinjection{\XTXclassone}{\XTXclasstwo}}}

\def\setXTXcharcodes #1 #2 #3 % encoding syntax
  {\catcode#1=11 \lccode #1=#2 \uccode #1=#3 }

\def\dosetXTXcharcodes#1#2#3% compact syntax
  {\catcode#1=11 \lccode #1=#2 \uccode #1=#3 }

\ifdefined\XeTeXinterchartoks

    \long\def\dodefineXTXcharinjection#1#2#3%
      {\XeTeXinterchartoks #1 #2 {\XTXcharinjection{#1}{#2}}%
       \setvalue{@xtx@ch@\currentXTXcharinjection @#1@#2@}{#3}}

    \def\setXTXcharacterclass #1 #2 %
      {\doifnumberelse{#2}
         {\XeTeXcharclass#1=#2\relax}
         {\XeTeXcharclass#1=\getXTXcharinjectionclass{#2}\relax}}

    \def\dosetXTXcharacterclass#1% #2 fast one
      {\XeTeXcharclass#1=\getXTXcharinjectionclass}

\else

    \long\def\dodefineXTXcharinjection#1#2#3%
      {\setvalue{@xtx@ch@\currentXTXcharinjection @#1@#2@}{#3}}

    \def\setXTXcharacterclass #1 #2 %
      {}

\fi

\chardef\XTXcharinjectionsmode=1

\letvalue{@xtx@ch@\s!empty}\empty

\def\XTXcharinjection#1#2%
  {\csname @xtx@ch@%
     \ifcase\XTXcharinjectionsmode
       \s!empty
     \or
       \ifcsname @xtx@ch@\currentXTXcharinjection @#1@#2@\endcsname \currentXTXcharinjection @#1@#2@\fi
     \or
       \ifcsname @xtx@ch@\currentXTXcharinjection @#1@#2@\endcsname \currentXTXcharinjection @#1@#2@\else
       \ifcsname @xtx@ch@\s!default               @#1@#2@\endcsname \s!default               @#1@#2@\else
         \s!empty
       \fi\fi
     \else
       \s!empty
     \fi
   \endcsname}

\def\enableXTXcharinjections[#1]%
  {\def\currentXTXcharinjection{#1}}

\protect \endinput

\starttext

\startXTXcharinjecxtions[default]
    \defineXTXcharinjection 10 40 {[default]}
\stopXTXcharinjections

\startXTXcharinjecxtions[whatever]
    \defineXTXcharinjection 20 40 {[whatever]}
\stopXTXcharinjections

\chardef\XTXcharinjectionsmode=0

\enableXTXcharinjections[default]  A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
\enableXTXcharinjections[whatever] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C

\chardef\XTXcharinjectionsmode=1

\enableXTXcharinjections[default]  A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
\enableXTXcharinjections[whatever] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C

\chardef\XTXcharinjectionsmode=2

\enableXTXcharinjections[default]  A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C
\enableXTXcharinjections[whatever] A\XTXcharinjection{10}{40}B\XTXcharinjection{20}{40}C

\stoptext
