% ======================================================================
% splitindex.tex
% Copyright (c) Markus Kohm, 2002-2009
%
% $Id: splitindex.tex,v 1.3 2009-03-20 14:55:11 mjk Exp $
%
% This file is part of the SplitIndex bundle.
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c of the license.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2005/12/01 or later and of this work.
%
% This work has the LPPL maintenance status "author-maintained".
%
% The Current Maintainer and author of this work is Markus Kohm.
%
% The list of all files belongig to the SplitIndex bundle is given in
% in the file `manifest.txt'. Files generated by means of unpacking the
% distribution (using, for example, the docstrip program) or by means
% of compiling them from a source file, for example, from splitindex.c
% or splitindex.java may be distributed at the distributor's discretion.
% However if they are distributed then a copy of the SplitIndex bundle
% must be distributed together with them.
%
% The list of derived (unpacked or compiled) files belongig to the 
% distribution and covered by LPPL is defined by the unpacking scripts 
% (with extension .ins) and the installation script (with name 
% install.sh) which are part of the distribution.
%
% Two often ignorred clauses from LPPL 1.3c you should not ignore:
% ----------------------------------------------------------------
% 2. You may distribute a complete, unmodified copy of the Work as you
%    received it.  Distribution of only part of the Work is considered
%    modification of the Work, and no right to distribute such a Derived
%    Work may be assumed under the terms of this clause.
% 3. You may distribute a Compiled Work that has been generated from a
%    complete, unmodified copy of the Work as distributed under Clause 2
%    above, as long as that Compiled Work is distributed in such a way that
%    the recipients may install the Compiled Work on their system exactly
%    as it would have been installed if they generated a Compiled Work
%    directly from the Work.
% ======================================================================

% Set newlinechar
\newlinechar`\^^J

% Tell program information
\message{splitindex.tex 0.1^^J%
  Copyright (c) 2002 Markus Kohm <kohm@gmx.de>^^J^^J}

% Change \catcode of At to be a letter
\catcode`\@11\relax

% New end processing command (one of these should do the job)
\def\endprocessing{%
  \csname @@end\endcsname
  \csname end\endcsname
  \csname endinput\endcsname
}

% Check out, if we are using LaTeX or plainTeX:
\let\@earlyend\relax
\def\@tempa{LaTeX2e}
\expandafter\ifx\csname fmtname\endcsname\@tempa
\else
  \def\@tempa{plain}
  \expandafter\ifx\csname fmtname\endcsname\@tempa
    \def\newwrite{\alloc@7\write\chardef\sixt@@n}% not longer \outer
    \chardef\@inputcheck=0\relax
  \else
    \message{Unkown format \csname fmtname\endcsname^^J
      You have to use plainTeX or LaTeX2e to run
      splitindex.tex!^^J}
    \let\@earlyend\endprocessing
  \fi
\fi
\@earlyend

% Is \idx defined to the name of the raw index file?
\expandafter\ifx\csname idx\endcsname\relax
% no it isn't
  \message{Enter the name of the idx file to be processed: }%
  \advance\endlinechar\@M
  \read\m@ne to\idx
  \advance\endlinechar-\@M
\fi

% Sorry to late for log file
\def\setjobname#1.idx#2\\{\def\jobname{#1}}
\expandafter\setjobname\idx.idx\\

\let\@earlyend\relax
\openin\@inputcheck\idx %
\ifeof\@inputcheck
  \ifx\jobname\idx
    \openin\@inputcheck\jobname.idx %
    \ifeof\@inputcheck
      \message{Error: Neither file `\idx' nor file `\jobname.idx' found!^^J}%
      \let\@earlyend\endprocessing
    \else
      \xdef\idx{\jobname.idx}%
    \fi
  \else
    \message{Error: File `\idx' not found!^^J}%
    \let\@earlyend\endprocessing
  \fi
\fi
\@earlyend

\message{Read from file: \idx^^J%
  Write to files: \jobname-*.idx^^J}

% We are ready to do the processing

% First we have to do the tricky splitting of the input line.
% We do not allow lines which don't start with \indexentry.
% We do not support other index file definitions but with an
% optional argument of \indexentry.
% We need some catcode changes to read and split the line. So
% we do this part of the processing at a group.
\newtoks\verbatim@line
\begingroup
\catcode`\^^M\active

\begingroup
\catcode`\|=0
\catcode`\\=12
|gdef|splitidxline\indexentry#1{%
  |if #1[%
    |expandafter|@splitidxline%
  |else%
    |expandafter |@splitidxline |expandafter i|expandafter d%
    |expandafter x|expandafter ]|expandafter#1%
  |fi%
}
|endgroup

\gdef\@splitidxline#1]#2^^M{%
  \idxwrite{#1}{\string\indexentry#2}%
}

\gdef\processidxline{%\message{\the\verbatim@line}%
  \expandafter\splitidxline\verbatim@line^^M
}
\endgroup

% Now, we can do the main job: writing to the index files
\def\idxwrite#1#2{%
  \expandafter\ifx\csname write@#1\endcsname\relax
    % We need a new file
     \message{New index file: \jobname-#1.idx^^J}%
     \expandafter\newwrite\csname write@#1\endcsname
     \immediate\openout\csname write@#1\endcsname \jobname-#1.idx %
    % FixMe: Don't close by end TeX run but use \closeout
  \fi
  \immediate\write\csname write@#1\endcsname{#2}%
}

% Read the file verbatim and process the lines
\newif\ifnoteof
\newtoks\par@tok\par@tok{\par}
\def\@makeother#1{\catcode`#112\relax}
\def\processidxfile{
  \immediate\openin\@inputcheck \idx %
  \noteoftrue
  \loop
    \ifeof\@inputcheck \noteoffalse\fi
  \ifnoteof
    \begingroup
      \let\do\@makeother\dospecials
      \immediate\read\@inputcheck to \verbatim@line
      \if\par@tok\verbatim@line\else
        \processidxline
      \fi
    \endgroup
  \repeat
}

\processidxfile

% Trick to end processing in TeX and LaTeX
\endprocessing
%%% Local Variables: 
%%% mode: tex
%%% TeX-master: t
%%% End: 
