% \iffalse meta-comment
%
% Written in 2011 by Manuel Pégourié-Gonnard <mpg@elzevir.fr>
%
% This work is under the CC0 license.
%
% This work consists of the main source file luatex.dtx
% and the derived files
%    luatex.sty
%
% Unpacking:
%    tex luatex.dtx
% Documentation:
%    pdflatex luatex.dtx
%
%<*ignore>
\begingroup
  \def\x{LaTeX2e}%
\expandafter\endgroup
\ifcase 0\ifx\install y1\fi\expandafter
         \ifx\csname processbatchFile\endcsname\relax\else1\fi
         \ifx\fmtname\x\else 1\fi\relax
\else\csname fi\endcsname
%</ignore>
%<*install>
\input docstrip.tex

\keepsilent
\askforoverwritefalse

\preamble

See source file '\inFileName' for licence and contact information.

\endpreamble

\generate{%
  \usedir{tex/luatex/luatexbase}%
  \file{luatex.sty}{\from{luatex.dtx}{texpackage}}%
}

\generate{%
  \usedir{doc/luatex/luatexbase}%
  \file{test-luatex1.tex}{\from{luatex.dtx}{test1}}%
  \file{test-luatex2.tex}{\from{luatex.dtx}{test1,test2}}%
  \file{test-luatex3.tex}{\from{luatex.dtx}{test1,test3}}%
  \file{test-luatex4.tex}{\from{luatex.dtx}{test4}}%
  \file{test-luatex5.tex}{\from{luatex.dtx}{test5}}%
}

\obeyspaces
\Msg{************************************************************************}
\Msg{*}
\Msg{* To finish the installation you have to move the following}
\Msg{* files into a directory searched by TeX:}
\Msg{*}
\Msg{*     luatex.sty}
\Msg{*}
\Msg{* Happy TeXing!}
\Msg{*}
\Msg{************************************************************************}

\endbatchfile
%</install>
%<*ignore>
\fi
%</ignore>
%<*driver>
\documentclass{ltxdoc}
\input{lltxb-dtxstyle}
\newcommand\subpk[1]{%
  \item[\href{luatexbase-#1.pdf}{luatexbase-#1}\normalfont:]}
\begin{document}
  \DocInput{luatex.dtx}%
\end{document}
%</driver>
% \fi
%
% \CheckSum{0}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \author{%
%   Heiko Oberdiek \& Manuel P\'egouri\'e-Gonnard\\
%   Support: \email{lualatex-dev@tug.org}%
% }
% \hypersetup{%
%   pdfauthor = {Manuel Pegourie-Gonnard and Heiko Oberdiek},
% }
% \pkdate{luatex}{v0.5 2011-05-21}
%
% \maketitle
%
% \begin{abstract}
% This package provides resource management for the LuaTeX macro programmer.
%
% It is now a wrapper around \pk{luatexbase} subpackages, with additinal names
% for some macros in order to ensure compatibility with previous versions of
% this package. You are encouraged to use \pk{luatexbase} directly and switch
% to the new names.
% \end{abstract}
%
% \tableofcontents
%
% \section{Documentation}
%
% The \pk{luatex} package loads the following sub-packages of \pk{luatexbase}:
% \begin{description}
%   \subpk{compat} compatibility helpers for \verb+\directlua+, primitive
%   names and version information from Lua.
%   \subpk{loader} extension of \luatex's Lua module loader (since version
%   0.60.0, this is more of a compatibility layer for older versions than a
%   real extension).
%   \subpk{regs} extented allocation scheme for registers and the like,
%   \emph{\`a la} \pk{etex}.
%   \subpk{cctb} catcode table allocation.
%   \subpk{attr} attribute allocation.
% \end{description}
%
% In addition, it defines the following synonyms:
% \begin{center}
% \begin{tabular}{rl}
% \toprule
% Deprecated name & New name \\
% \midrule
% \cs{newattribute} & \cs{newluatexattribute} \\
% \cs{setattribute} & \cs{setluatexattribute} \\
% \cs{unsetattribute} & \cs{unsetluatexattribute} \\
% \cs{newcatcodetable} & \cs{newluatexcatcodetable} \\
% \bottomrule
% \end{tabular}
% \end{center}
% The deprecated names trigger a warning and will be removed in a future
% version.
%
%
%    \section{Implementation}
%
%    \begin{macrocode}
%<*texpackage>
%    \end{macrocode}
%
%    \subsection{Preliminaries}
%
%    Catcode defenses.
%
%    \begin{macrocode}
\begingroup\catcode61\catcode48\catcode32=10\relax%
  \catcode123 1 % {
  \catcode125 2 % }
  \catcode 35 6 % #
  \toks0\expandafter{\expandafter\endlinechar\the\endlinechar}%
  \edef\x{\endlinechar13}%
  \def\y#1 #2 {%
    \toks0\expandafter{\the\toks0 \catcode#1 \the\catcode#1}%
    \edef\x{\x \catcode#1 #2}}%
  \y  13  5 % endlinechar
  \y  61 12 % =
  \y  32 10 % space
  \y 123  1 % {
  \y 125  2 % }
  \y  35  6 % #
  \y  10 12 % ^^J
  \y  33 12 % !
  \y  34 12 % "
  \y  36  3 % $ $
  \y  39 12 % '
  \y  40 12 % (
  \y  41 12 % )
  \y  42 12 % *
  \y  43 12 % +
  \y  44 12 % ,
  \y  45 12 % -
  \y  46 12 % .
  \y  47 12 % /
  \y  58 12 % :
  \y  60 12 % <
  \y  64 11 % @ (letter)
  \y  62 12 % >
  \y  91 12 % [
  \y  93 12 % ]
  \y  94  7 % ^
  \y  95 12 % _ (other)
  \y  96 12 % `
  \toks0\expandafter{\the\toks0 \relax\noexpand\endinput}%
  \edef\y#1{\endgroup\edef#1{\the\toks0}\x\relax}%
\expandafter\y\csname lltxb@luatex@endinput\endcsname
%    \end{macrocode}
%
%    Reload protection, especially for \plaintex.
%
%    \begin{macrocode}
                \csname lltxb@luatex@loaded\endcsname
\expandafter\let\csname lltxb@luatex@loaded\endcsname\lltxb@luatex@endinput
%    \end{macrocode}
%
%    Package declaration.
%
%    \begin{macrocode}
\begingroup
  \expandafter\ifx\csname ProvidesPackage\endcsname\relax
    \def\x#1[#2]{\immediate\write16{Package: #1 #2}}
  \else
    \let\x\ProvidesPackage
  \fi
\expandafter\endgroup
\x{luatex}[2010/10/06 v0.3 Module utilities for LuaTeX]
%    \end{macrocode}
%
%    Make sure \luatex is used.
%
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname RequirePackage\endcsname\relax
  \input ifluatex.sty
\else
  \RequirePackage{ifluatex}
\fi
\ifluatex\else
  \begingroup
    \expandafter\ifx\csname PackageError\endcsname\relax
      \def\x#1#2#3{\begingroup \newlinechar10
        \errhelp{#3}\errmessage{Package #1 error: #2}\endgroup}
    \else
      \let\x\PackageError
    \fi
  \expandafter\endgroup
  \x{luatex}{LuaTeX is required for this package. Aborting.}{%
    This package can only be used with the LuaTeX engine^^J%
    (command `lualatex' or `luatex').^^J%
    Package loading has been stopped to prevent additional errors.}
  \lltxb@luatex@endinput%
  \expandafter\endinput
\fi
%    \end{macrocode}
%
%    \subsection{Packages loading}
%
%    \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname RequirePackage\endcsname\relax
  \input luatexbase-compat.sty
  \input luatexbase-loader.sty
  \input luatexbase-regs.sty
  \input luatexbase-attr.sty
  \input luatexbase-cctb.sty
\else
  \RequirePackage{luatexbase-compat}
  \RequirePackage{luatexbase-loader}
  \RequirePackage{luatexbase-regs}
  \RequirePackage{luatexbase-attr}
  \RequirePackage{luatexbase-cctb}
\fi
%    \end{macrocode}
%
%    \subsection{Compatibility names}
%
%    Defined a synonym, triggerring a one-time warning.
%
%    \begin{macrocode}
\def\lltxb@synonym#1#2{%
  \def#1{%
    \begingroup
    \ifdefined\PackageWarning
      \let\x\PackageWarning
    \else
      \def\x####1####2{%
        \begingroup \endlinechar10
        \message{Package ####1 warning: ####2}%
        \endgroup}%
    \fi
    \expandafter\endgroup
    \x{luatex}{\string#1 is deprecated^^J%
      and will be removed in the next version of the package.^^J%
      Please use \string#2 instead.}
    \let#1#2%
    #1}}
%    \end{macrocode}
%
%    Now the list of synonyms.
%
%    \begin{macrocode}
\lltxb@synonym \newattribute    \newluatexattribute
\lltxb@synonym \setattribute    \setluatexattribute
\lltxb@synonym \unsetattribute  \unsetluatexattribute
\lltxb@synonym \newcatcodetable \newluatexcatcodetable
%    \end{macrocode}
%
%    This is the end, my friend\dots the end.
%
%    \begin{macrocode}
\lltxb@luatex@endinput%
%</texpackage>
%    \end{macrocode}
%
%    \section{Test}
%
%    MPG: This section shamelessly copied from Heiko's original
%    \file{luatex.dtx}.
%
%    \begin{macrocode}
%<*test2>
\documentclass{article}
\def\LoadCommand{%
  \RequirePackage{luatex}[2010/03/09]%
}
%</test2>
%    \end{macrocode}
%    \begin{macrocode}
%<*test3>
\documentclass{article}
\def\LoadCommand{%
  \RequirePackage{luatex-loader}[2010/03/09]%
}
%</test3>
%    \end{macrocode}
% \subsection{Catcode checks for loading}
%
%    \begin{macrocode}
%<*test1>
%    \end{macrocode}
%    \begin{macrocode}
\catcode`\{=1 %
\catcode`\}=2 %
\catcode`\#=6 %
\catcode`\@=11 %
\expandafter\ifx\csname count@\endcsname\relax
  \countdef\count@=255 %
\fi
\expandafter\ifx\csname @gobble\endcsname\relax
  \long\def\@gobble#1{}%
\fi
\expandafter\ifx\csname @firstofone\endcsname\relax
  \long\def\@firstofone#1{#1}%
\fi
\expandafter\ifx\csname loop\endcsname\relax
  \expandafter\@firstofone
\else
  \expandafter\@gobble
\fi
{%
  \def\loop#1\repeat{%
    \def\body{#1}%
    \iterate
  }%
  \def\iterate{%
    \body
      \let\next\iterate
    \else
      \let\next\relax
    \fi
    \next
  }%
  \let\repeat=\fi
}%
\def\RestoreCatcodes{}
\count@=0 %
\loop
  \edef\RestoreCatcodes{%
    \RestoreCatcodes
    \catcode\the\count@=\the\catcode\count@\relax
  }%
\ifnum\count@<255 %
  \advance\count@ 1 %
\repeat

\def\RangeCatcodeInvalid#1#2{%
  \count@=#1\relax
  \loop
    \catcode\count@=15 %
  \ifnum\count@<#2\relax
    \advance\count@ 1 %
  \repeat
}
\def\RangeCatcodeCheck#1#2#3{%
  \count@=#1\relax
  \loop
    \ifnum#3=\catcode\count@
    \else
      \errmessage{%
        Character \the\count@\space
        with wrong catcode \the\catcode\count@\space
        instead of \number#3%
      }%
    \fi
  \ifnum\count@<#2\relax
    \advance\count@ 1 %
  \repeat
}
\def\space{ }
\expandafter\ifx\csname LoadCommand\endcsname\relax
  \def\LoadCommand{\input luatex.sty\relax}%
\fi
\def\Test{%
  \RangeCatcodeInvalid{0}{47}%
  \RangeCatcodeInvalid{58}{64}%
  \RangeCatcodeInvalid{91}{96}%
  \RangeCatcodeInvalid{123}{255}%
  \catcode`\@=12 %
  \catcode`\\=0 %
  \catcode`\%=14 %
  \LoadCommand
  \RangeCatcodeCheck{0}{36}{15}%
  \RangeCatcodeCheck{37}{37}{14}%
  \RangeCatcodeCheck{38}{47}{15}%
  \RangeCatcodeCheck{48}{57}{12}%
  \RangeCatcodeCheck{58}{63}{15}%
  \RangeCatcodeCheck{64}{64}{12}%
  \RangeCatcodeCheck{65}{90}{11}%
  \RangeCatcodeCheck{91}{91}{15}%
  \RangeCatcodeCheck{92}{92}{0}%
  \RangeCatcodeCheck{93}{96}{15}%
  \RangeCatcodeCheck{97}{122}{11}%
  \RangeCatcodeCheck{123}{255}{15}%
  \RestoreCatcodes
}
\Test
\csname @@end\endcsname
\end
%    \end{macrocode}
%    \begin{macrocode}
%</test1>
%    \end{macrocode}
%
% \subsection{Catcode tables}
%
% \subsubsection{Predefined catcode tables}
%
%    \begin{macrocode}
%<*test4>
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
%    Remember \LaTeX's initial catcodes in count registers
%    starting at \cs{TestLaTeX}.
%    \begin{macrocode}
\count0=0 %
\chardef\TestLaTeX=1000 %
\chardef\TestMax=300 %
\loop
  \count\numexpr\TestLaTeX+\count0\relax=\catcode\count0 %
\ifnum\count0<\TestMax
  \advance\count0 by 1 %
\repeat
\documentclass{minimal}
\usepackage{luatex}[2010/03/09]
\usepackage{qstest}
\IncludeTests{*}
\LogTests{log}{*}{*}
\makeatletter
\def\Check#1{%
  \Expect*{\the\count@=\the\catcode\count@}%
         *{\the\count@=#1}%
}
\newcount\scratch
\def\Test#1#2{%
  \begin{qstest}{CatcodeTable#1}{CatcodeTable#1}%
    \luatexcatcodetable\csname CatcodeTable#1\endcsname
    \count@=\z@
    \loop
      \scratch=#2\relax
      \Expect*{\the\count@=\the\catcode\count@}%
             *{\the\count@=\the\scratch}%
    \ifnum\count@<\TestMax
      \advance\count@\@ne
    \repeat
  \end{qstest}%
}
\begingroup
  % luatex-unicode-letters.tex makes some slots to letters
  \def\TestMax{169}%
  \Test{LaTeX}{\the\count\numexpr\TestLaTeX+\count@}%
\endgroup
\Test{String}{\ifnum\count@=32 10\else 12\fi}
\Test{Other}{12}
\luatexinitcatcodetable99 %
\Test{IniTeX}{%
  0\relax
  \begingroup
    \luatexcatcodetable99 %
    \global\scratch=\the\catcode\count@
  \endgroup
}
%    \end{macrocode}
%
% \subsubsection{Catcode table number stack}
%
%    \begin{macrocode}
\begin{qstest}{CatcodeTableNumStack}{CatcodeTableNumStack}
  \def\TestStack#1{%
    \Expect*{\lltxb@cctb@numstack}{#1}%
  }%
  \TestStack{0}%
  \PushCatcodeTableNumStack
  \TestStack{{0}0}%
  \@firstofone{%
    \begingroup
      \luatexinitcatcodetable12 %
      \luatexcatcodetable12 %
      \PushCatcodeTableNumStack
      \TestStack{{12}{0}0}%
      \PopCatcodeTableNumStack
      \TestStack{{0}0}%
      \PopCatcodeTableNumStack
      \TestStack{0}%
      \def\TestWarning{Missing empty stack warning}%
      \def\PackageWarning#1#2{\def\TestWarning{empty stack}}%
      \PopCatcodeTableNumStack
      \TestStack{0}%
      \Expect*{\TestWarning}{empty stack}%
    \endgroup
  }%
\end{qstest}
%    \end{macrocode}
%
% \subsubsection{Catcode table stack}
%
%    \begin{macrocode}
\begin{qstest}{CatcodeTableStack}{CatcodeTableStack}
  \def\TestStack#1{%
    \Expect*{\the\CatcodeTableStack}{#1}%
  }%
  \TestStack{0}%
  \IncCatcodeTableStack
  \TestStack{2}%
  \IncCatcodeTableStack
  \TestStack{4}%
  \begingroup
    \IncCatcodeTableStack
    \TestStack{6}%
  \endgroup
  \TestStack{6}%
  \begingroup
    \DecCatcodeTableStack
    \TestStack{4}%
  \endgroup
  \TestStack{4}%
  \DecCatcodeTableStack
  \TestStack{2}%
  \DecCatcodeTableStack
  \TestStack{0}%
  \begingroup
    \def\TestError{Missing error}%
    \def\errmessage#1{%
      \def\TestError{Empty stack}%
    }%
    \DecCatcodeTableStack
    \TestStack{0}%
    \Expect*{\TestError}{Empty stack}%
  \endgroup
\end{qstest}
%    \end{macrocode}
%
% \subsubsection{Catcode regime macros}
%
%    \begin{macrocode}
\begin{qstest}{CatcodeRegime}{CatcodeRegime}
  \def\TestStacks#1#2#3{%
    \Expect*{\the\luatexcatcodetable}{#1}%
    \Expect*{\the\CatcodeTableStack}{#2}%
    \Expect*{\lltxb@cctb@numstack}{#3}%
  }%
  \TestStacks{0}{0}{0}%
  \catcode`\|=7 %
  \BeginCatcodeRegime\CatcodeTableLaTeX
    \TestStacks{2}{2}{{0}0}%
    \Expect*{\the\catcode`\|}{12}%
  \EndCatcodeRegime
  \TestStacks{0}{0}{0}%
  \Expect*{\the\catcode`\|}{7}%
\end{qstest}
%    \end{macrocode}
%
% \subsection{Attribute allocation}
%
%    \begin{macrocode}
\begin{qstest}{Attributes}{Attributes}
  \newattribute\TestAttr
  \Expect*{\meaning\TestAttr}%
         *{\string\attribute\number\allocationnumber}%
  \Expect*{\the\allocationnumber}{1}%
  \begingroup
    \newattribute\TestAttr
    \Expect*{\the\allocationnumber}{2}%
  \endgroup
  \Expect*{\the\allocationnumber}{1}%
  \Expect*{\meaning\TestAttr}*{\string\attribute2}%
  \Expect*{\the\TestAttr}*{\number\lltxb@attr@unsetvalue}%
  \def\Test#1{%
    \setattribute\TestAttr{#1}%
    \Expect*{\the\TestAttr}{#1}%
  }%
  \Test{0}%
  \Test{1}%
  \Test{-1}%
  \Test{123}%
  \unsetattribute\TestAttr
  \Expect*{\the\TestAttr}*{\number\lltxb@attr@unsetvalue}%
  \begingroup
    \Expect*{\the\TestAttr}*{\number\lltxb@attr@unsetvalue}%
    \Test{1234}%
  \endgroup
  \Expect*{\the\TestAttr}*{\number\lltxb@attr@unsetvalue}%
\end{qstest}
%    \end{macrocode}
%
%    \begin{macrocode}
\@@end
%</test4>
%    \end{macrocode}
%
% \subsection{Short test for Plain \TeX}
%
%    \begin{macrocode}
%<*test5>
\input luatex.sty\relax
\newattribute\TestAttr
\setattribute\TestAttr{10}
\unsetattribute\TestAttr
\newcatcodetable\TestCTa
\begingroup
  \SetCatcodeRange{`A}{`Z}{12}%
\endgroup
\BeginCatcodeRegime\CatcodeTableLaTeX
\EndCatcodeRegime
\end
%</test5>
%    \end{macrocode}
%
%
% \Finale
\endinput
