%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% DataBase processing macros, version 0.91, December 2000
% Copyright Victor Eijkhout 2000
% file name: DB_process.tex
%
% Author:
% Victor Eijkhout
% Department of Computer Science
% University of Tennessee, Knoxville TN 37996
%
% victor@eijkhout.net
%
% This program is free software; you can redistribute it and/or
% modify it under the terms of the GNU General Public License
% as published by the Free Software Foundation; either version 2
% of the License, or (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% For a copy of the GNU General Public License, write to the
% Free Software Foundation, Inc.,
% 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA,
% or find it on the net, for instance at
% http://www.gnu.org/copyleft/gpl.html
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Use this file as follows:
%
% \input DB_process
% \def\DBPprintline#1#2#3#4#5#6#7#8#9%
% { < do whatever you want with the argument > }
% \DBPtabfile{ } or \DBPcommafile{ }
%
% The user macro \DBPprintline is applied to the max 9 arguments
% of each database line. You need to define the macro with 9 arguments;
% if the database has less than 9 fields, empty arguments are passed.
%
% The input records are counted, and the counter is available as \DBPno.
% To print this, you have to do \number\DBPno or somesuch.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% revision history:
% 0.9 first release, December 1998
% 0.91 documentation update, use repeat.tex for loop macro,
% copyright notice, better handling of 'fragile' material
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%%
%% prevent multiple loading of this file
%%
\expandafter\ifx\csname DBPfile\endcsname\relax
\message{Loading DataBase Processing macros ... }%
\else
\message{DataBase Processing macros already loaded ... }\endinput \fi
%%
%% Allocations
%%
\newread\DBPfile \newcount\DBPitem \newtoks\DBPtoks
\def\csarg#1#2{\expandafter#1\csname#2\endcsname}
\def\cscsarg#1#2{\csname#1\expandafter\endcsname\csname#2\endcsname}
\cscsarg{newtoks}{DBPtoks1}
\cscsarg{newtoks}{DBPtoks2}
\cscsarg{newtoks}{DBPtoks3}
\cscsarg{newtoks}{DBPtoks4}
\cscsarg{newtoks}{DBPtoks5}
\cscsarg{newtoks}{DBPtoks6}
\cscsarg{newtoks}{DBPtoks7}
\cscsarg{newtoks}{DBPtoks8}
\cscsarg{newtoks}{DBPtoks9}
%%
%% Load auxiliary files: loop macro
%%
\input repeat.tex
%%
%% a default printline macro
%%
\def\DBPprintline#1#2#3#4#5#6#7#8#9{\number\DBPno: #1\par}
%%
%% general parsing macros
%%
\def\DBPparsefile{\def\DBPtestc{\par}%
\repeat \for{DBPno} \do {\read\DBPfile to \DBPinput
\ifx\DBPinput\DBPtestc \expandafter\breakrepeat \fi
\DBPitem=1\relax \DBPtoks=\expandafter{\DBPinput}%
\edef\DBPtemp{\noexpand\DBPparseline\the\DBPtoks
\DBPdelim DBP\DBPdelim}\DBPtemp
}}
\def\DBPline#1#2{%
\def\DBPtesta{#1}\def\DBPtestb{DBP}%
\ifx\DBPtesta\DBPtestb
\edef\DBPtemp{\noexpand\DBPprintline
{\csarg\the{DBPtoks1}}%
{\csarg\the{DBPtoks2}}%
{\csarg\the{DBPtoks3}}%
{\csarg\the{DBPtoks4}}%
{\csarg\the{DBPtoks5}}%
{\csarg\the{DBPtoks6}}%
{\csarg\the{DBPtoks7}}%
{\csarg\the{DBPtoks8}}%
{\csarg\the{DBPtoks9}}%
}\DBPtemp
\csarg\relax{DBPtoks1}{}%
\csarg\relax{DBPtoks2}{}%
\csarg\relax{DBPtoks3}{}%
\csarg\relax{DBPtoks4}{}%
\csarg\relax{DBPtoks5}{}%
\csarg\relax{DBPtoks6}{}%
\csarg\relax{DBPtoks7}{}%
\csarg\relax{DBPtoks8}{}%
\csarg\relax{DBPtoks9}{}%
\else \ifnum\DBPitem<10\relax
\csname DBPtoks\number\DBPitem\endcsname={#1}%
\else \message{DB Processor: can not handle >9 items/line}%
\fi
\advance\DBPitem by 1
\expandafter#2\fi}
%%
%% macros for comma-delimited
%%
\def\DBPcommafile#1{%
\openin\DBPfile=#1\relax
\let\DBPparseline=\DBPcommaline
\def\DBPdelim{,}%
\DBPparsefile}
\def\DBPcommaline#1,{\DBPline{#1}\DBPcommaline}
%%
%% macros for tab-delimited
%%
\begingroup \catcode9=12
\gdef\DBPtabfile#1{%
\openin\DBPfile=#1\relax
\begingroup
\catcode9=12 \let\DBPparseline=\DBPtabline
\def\DBPdelim{^^I}%
\DBPparsefile
\endgroup}
\gdef\DBPtabline#1^^I{\DBPline{#1}\DBPtabline}
\endgroup
\endinput