%% %% This is file `docstrip.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% docstrip.dtx (with options: `initex,program,stats') %% %% This is a generated file. %% %% Copyright 1993 1994 1995 1996 1997 %% The LaTeX3 Project and any individual authors listed elsewhere %% in this file. %% %% For further copyright information, and conditions for modification %% and distribution, see the file legal.txt, and any other copyright %% notices in this file. %% %% This file is part of the LaTeX2e system. %% ---------------------------------------- %% This system 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. %% %% For error reports concerning UNCHANGED versions of this file no %% more than one year old, see bugs.txt. %% %% Please do not request updates from us directly. Primary %% distribution is through the CTAN archives. %% %% %% IMPORTANT COPYRIGHT NOTICE: %% %% You are NOT ALLOWED to distribute this file alone. %% %% You are allowed to distribute this file under the condition that it %% is distributed together with all the files listed in manifest.txt. %% %% If you receive only some of these files from someone, complain! %% %% %% Permission is granted to copy this file to another file with a %% clearly different name and to customize the declarations in that %% copy to serve the needs of your installation, provided that you %% comply with the conditions in the file legal.txt. %% %% However, NO PERMISSION is granted to generate or to distribute a %% modified version of this file under its original name. %% %% You are NOT ALLOWED to change this file. %% %% %% MODIFICATION ADVICE: %% %% If you want to customize this file, it is best to make a copy of %% the source file(s) from which it was produced. Use a different %% name for your copy(ies) and modify the copy(ies); this will ensure %% that your modifications do not get overwritten when you install a %% new release of the standard system. You should also ensure that %% your modified source file does not generate any modified file with %% the same name as a standard file. %% %% You can then easily distribute your modifications by distributing %% the modified and renamed copy of the source file, taking care to %% observe the conditions in legal.txt; this will ensure that other %% users can safely use your modifications. %% %% You will also need to produce your own, suitably named, .ins file to %% control the generation of files from your source file; this file %% should contain your own preambles for the files it generates, not %% those in the standard .ins files. %% %% The names of the source files used are shown above. %% %% %% \catcode`\{=1 \catcode`\}=2 \def\filename{docstrip.dtx} \def\fileversion{2.4g} \def\filedate{1996/12/13} \def\docdate {1996/12/13} %% \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 \~} %% %% The docstrip program for use with TeX. %% Copyright (C) 1989-1991 Frank Mittelbach %% Copyright (C) 1992-1995 Johannes Braams, Denys Duchier, %% Frank Mittelbach %% Copyright (C) 1995 Marcin Woli\'nski %% Copyright (C) 1996 Mark Wooding, Marcin Woli\'nski %% All rights are reserved. %% \catcode`\Z=\catcode`\% \ifnum13=\catcode`\~{\egroup\else \catcode`\Z=9 Z Z \catcode`\{=1 \catcode`\}=2 Z \catcode`\#=6 \catcode`\^=7 Z \catcode`\@=11 \catcode`\^^L=13 Z \let\bgroup={ \let\egroup=} Z Z \dimendef\z@=10 \z@=0pt \chardef\@ne=1 \countdef\m@ne=22 \m@ne=-1 Z \countdef\count@=255 Z Z \def\wlog{\immediate\write\m@ne} \def\space{ } Z Z \count10=22 % allocates \count registers 23, 24, ... Z \count15=9 % allocates \toks registers 10, 11, ... Z \count16=-1 % allocates input streams 0, 1, ... Z \count17=-1 % allocates output streams 0, 1, ... Z Z \def\alloc@#1#2#3{\advance\count1#1\@ne#2#3\count1#1\relax} Z Z \def\newcount{\alloc@0\countdef} \def\newtoks{\alloc@5\toksdef} Z \def\newread{\alloc@6\chardef} \def\newwrite{\alloc@7\chardef} Z Z \def\newif#1{% Z \count@\escapechar \escapechar\m@ne Z \let#1\iffalse Z \@if#1\iftrue Z \@if#1\iffalse Z \escapechar\count@} Z \def\@if#1#2{% Z \expandafter\def\csname\expandafter\@gobbletwo\string#1% Z \expandafter\@gobbletwo\string#2\endcsname Z {\let#1#2}} Z Z \def\@gobbletwo#1#2{} Z \def\@gobblethree#1#2#3{} Z Z \def\loop#1\repeat{\def\body{#1}\iterate} Z \def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} Z \let\repeat\fi Z Z \def\empty{} Z Z \def\tracingall{\tracingcommands2 \tracingstats2 Z \tracingpages1 \tracingoutput1 \tracinglostchars1 Z \tracingmacros2 \tracingparagraphs1 \tracingrestores1 Z \showboxbreadth 10000 \showboxdepth 10000 \errorstopmode Z \errorcontextlines 10000 \tracingonline1 } Z \bgroup}\fi\catcode`\Z=11 \let\bgroup={ \let\egroup=} \catcode`\@=11 \newlinechar=`\^^J \newif\ifGenerate \newif\ifContinue \newif\ifForlist \newif\ifDefault \newif\ifMoreFiles \MoreFilestrue \newif\ifaskforoverwrite \askforoverwritetrue \newcount\blockLevel \blockLevel\z@ \newcount\emptyLines \emptyLines \z@ \newcount\processedLines \processedLines \z@ \newcount\commentsRemoved \commentsRemoved \z@ \newcount\commentsPassed \commentsPassed \z@ \newcount\codeLinesPassed \codeLinesPassed \z@ \newcount\NumberOfFiles \NumberOfFiles\z@ \newcount\TotalprocessedLines \TotalprocessedLines \z@ \newcount\TotalcommentsRemoved \TotalcommentsRemoved \z@ \newcount\TotalcommentsPassed \TotalcommentsPassed \z@ \newcount\TotalcodeLinesPassed \TotalcodeLinesPassed \z@ \newread\inFile \chardef\ttyin16 \chardef\ttyout16 \newread\inputcheck \newif\iftopbatchfile \topbatchfiletrue \def\ifToplevel{\relax\iftopbatchfile \expandafter\iden \else \expandafter\@gobble\fi} \ifx\undefined\@@input \let\@@input\input\fi \def\batchinput#1{% \begingroup \def\batchfile{#1}% \topbatchfilefalse \Defaultfalse \usepreamble\org@preamble \usepostamble\org@postamble \let\destdir\WriteToDir \processbatchFile \endgroup } \def\skip@input#1 {} \let\input\skip@input \def\guardStack{} \def\blockHead{} \def\yes{yes} \def\y{y} \def\n{n} \def\DefaultbatchFile{docstrip.cmd} {\catcode`\%=12 \gdef\perCent{%} \gdef\DoubleperCent{%%} } \let\MetaPrefix\DoubleperCent \def^^L{ } \def\Name#1#2{\expandafter#1\csname#2\endcsname} \def\@stripstring{\expandafter\@gobble\string} \def\eltStart{} \def\eltEnd{} \def\qStop{\qStop} \def\pop#1#2{% \ifx#1\empty \Msg{Warning: Found end guard without matching begin}% \let#2\empty \else \def\tmp{\expandafter\popX #1\qStop #1#2}% \expandafter\tmp\fi} \def\popX\eltStart #1\eltEnd #2\qStop #3#4{\def#3{#2}\def#4{#1}} \def\push#1#2{\expandafter\pushX #1\qStop #1{\eltStart #2\eltEnd}} \def\pushX #1\qStop #2#3{\def #2{#3#1}} \def\forlist#1:=#2\do#3\od{% \edef\ListCondition{#2}% \Forlisttrue \loop \edef#1{\expandafter\FirstElt\ListCondition,\empty.}% \edef\ListCondition{\expandafter\OtherElts\ListCondition,\empty.}% \ifx#1\empty \Forlistfalse \else#3\fi \ifForlist \repeat} \def\FirstElt#1,#2.{#1} \def\OtherElts#1,#2.{#2} \def\whileswitch#1\fi#2{#1\loop#2#1\repeat\fi} \ifx\@tempcnta\undefined \newcount\@tempcnta \fi \@tempcnta=0 \loop \Name\chardef{s@\number\@tempcnta}=0 \csname newcount\expandafter\endcsname% \csname off@\number\@tempcnta\endcsname \advance\@tempcnta1 \ifnum\@tempcnta<16\repeat \let\s@do\relax \edef\@outputstreams{% \s@do\Name\noexpand{s@0}\s@do\Name\noexpand{s@1}% \s@do\Name\noexpand{s@2}\s@do\Name\noexpand{s@3}% \s@do\Name\noexpand{s@4}\s@do\Name\noexpand{s@5}% \s@do\Name\noexpand{s@6}\s@do\Name\noexpand{s@7}% \s@do\Name\noexpand{s@8}\s@do\Name\noexpand{s@9}% \s@do\Name\noexpand{s@10}\s@do\Name\noexpand{s@11}% \s@do\Name\noexpand{s@12}\s@do\Name\noexpand{s@13}% \s@do\Name\noexpand{s@14}\s@do\Name\noexpand{s@15}% \noexpand\@nostreamerror } \def\@nostreamerror{\errmessage{No more output streams!}} \def\@streamfound#1\@nostreamerror{\fi} \bgroup\edef\x{\egroup \def\noexpand\@stripstr\string\s@{}} \x \chardef\stream@closed=16 \def\StreamOpen#1{% \chardef#1=\stream@closed \def\s@do##1{\ifnum##1=0 \chardef#1=\expandafter\@stripstr\string##1 % \global\chardef##1=1 % \immediate\openout#1=\csname pth@\@stripstring#1\endcsname % \@streamfound \fi} \@outputstreams } \def\StreamClose#1{% \immediate\closeout#1% \def\s@do##1{\ifnum#1=\expandafter\@stripstr\string##1 % \global\chardef##1=0 % \@streamfound \fi} \@outputstreams \chardef#1=\stream@closed } \def\StreamPut{\immediate\write} \def\showprogress{\let\maybeMsg\message} \def\keepsilent{\let\maybeMsg\@gobble} \showprogress \def\Msg{\immediate\write\ttyout} \def\iden#1{#1} \def\strip#1#2 \@gobble{\def #1{#2}} \def\@defpar{\par} \def\Ask#1#2{% \message{#2}\read\ttyin to #1\ifx#1\@defpar\def#1{}\else \iden{\expandafter\strip \expandafter#1#1\@gobble\@gobble} \@gobble\fi} \let\OriginalAsk=\Ask \def\askonceonly{% \def\Ask##1##2{% \OriginalAsk{##1}{##2}% \global\let\Ask\OriginalAsk \Ask\noprompt{% By default you will be asked this question for every file.^^J% If you enter `y' now,^^J% I will asssume `y' for all future questions^^J% without prompting.}% \ifx\y\noprompt\let\noprompt\yes\fi \ifx\yes\noprompt\gdef\Ask####1####2{\def####1{y}}\fi}} \def\@gobble#1{} \edef\Endinput{\expandafter\@gobble\string\\endinput} \def\makeOther#1{\catcode`#1=12\relax} \ifx\undefined\@@end\else\let\end\@@end\fi \ifx\@temptokena\undefined \csname newtoks\endcsname\@temptokena\fi \def\@addto#1#2{% \@temptokena\expandafter{#1}% \edef#1{\the\@temptokena#2}} \def\@ifpresent#1#2#3#4{% \def\tmp##1#1##2\qStop{\ifx!##2!}% \expandafter\tmp#2#1\qStop #4\else #3\fi } \def\tospaces#1{% \ifx#1\secapsot\secapsot\fi\space\tospaces} \def\secapsot\fi\space\tospaces{\fi} \def\@spaces{\space\space\space\space\space} \def\uptospace#1 #2\qStop{#1} \def\afterfi#1#2\fi{\fi#1} \def\@ifnextchar#1#2#3{\bgroup \def\reserved@a{\ifx\reserved@c #1 \aftergroup\@firstoftwo \else \aftergroup\@secondoftwo\fi\egroup {#2}{#3}}% \futurelet\reserved@c\@ifnch } \def\@ifnch{\ifx \reserved@c \@sptoken \expandafter\@xifnch \else \expandafter\reserved@a \fi} \def\@firstoftwo#1#2{#1} \def\@secondoftwo#1#2{#2} \iden{\let\@sptoken= } % \iden{\def\@xifnch} {\futurelet\reserved@c\@ifnch} \def\Terminal#1#2#3{% \expandafter\ifx\csname eT@#3\endcsname\relax \afterfi{\Terminal{#1}{#2#3}}\else \afterfi{\TerminalX{#1}{#2}#3}\fi } \Name\let{eT@>}=1 \Name\let{eT@&}=1 \Name\let{eT@!}=1 \Name\let{eT@|}=1 \Name\let{eT@,}=1 \Name\let{eT@(}=1 \Name\let{eT@)}=1 \def\TerminalX#1#2{% \ifx>#2> \errmessage{Error in expression: empty terminal}\fi \Name\def{t@#2}##1,#2,##2\qStop{\ifx>##2>0\else1\fi}% #1{\Name\noexpand{t@#2},##1,#2,\noexpand\qStop}% } \def\Primary#1#2{% \ifcase \ifx!#20\else\ifx(#21\else2\fi\fi\space \afterfi{\Primary{\NPrimary{#1}}}\or \afterfi{\Expression{\PExpression{#1}}}\or \afterfi{\Terminal{#1}{}#2}\fi } \def\NPrimary#1#2{% #1{\noexpand\if1#20\noexpand\else1\noexpand\fi}% } \def\PExpression#1#2#3{% \ifx)#3\else \errmessage{Error in expression: expected right parenthesis}\fi #1{#2}} \def\Secondary#1{% \Primary{\SecondaryX{#1}}} \bgroup\catcode`\&=12 \gdef\SecondaryX#1#2#3{% \ifx% \afterfi{\Secondary{\SecondaryXX{#1}{#2}}}\else \afterfi{#1{#2}#3}\fi } \egroup \def\SecondaryXX#1#2#3{% #1{\noexpand\if0#20\noexpand\else#3\noexpand\fi}} \def\Expression#1{% \Secondary{\ExpressionX{#1}}} \def\ExpressionX#1#2#3{% \if0\ifx|#31\else\ifx,#31\fi\fi0 \afterfi{#1{#2}#3}\else \afterfi{\Expression{\ExpressionXX{#1}{#2}}}\fi } \def\ExpressionXX#1#2#3{% #1{\noexpand\if1#21\noexpand\else#3\noexpand\fi}} \def\StopParse#1#2{% \ifx>#2 \else\errmessage{Error in expression: spurious #2}\fi \edef\Expr##1{#1}} \def\Evaluate#1{% \Expression\StopParse#1>} \def\normalLine#1\endLine{% \advance\codeLinesPassed\@ne \maybeMsg{.}% \def\inLine{#1}% \let\do\putline@do \activefiles } \def\putline@do#1#2#3{% \StreamPut#1{\inLine}} \def\removeComment#1\endLine{% \advance\commentsRemoved\@ne \maybeMsg{\perCent}} \bgroup\catcode`\%=12 \iden{\egroup \def\putMetaComment%}#1\endLine{% \advance\commentsPassed\@ne \edef\inLine{\MetaPrefix#1}% \let\do\putline@do \activefiles } \begingroup \catcode`\%=12 \catcode`\*=14 \gdef\processLine#1{* \advance\processedLines\@ne \ifx%#1 \expandafter\processLineX \else \expandafter\normalLine \fi #1} \endgroup \begingroup \catcode`\%=12 \catcode`\*=14 \gdef\processLineX%#1{* \ifcase\ifx%#10\else \ifx<#11\else 2\fi\fi\relax \expandafter\putMetaComment\or \expandafter\checkOption\or \expandafter\removeComment\fi #1} \endgroup \def\checkOption<#1{% \ifcase \ifx*#10\else \ifx/#11\else \ifx+#12\else \ifx-#13\else \ifx<#14\else 5\fi\fi\fi\fi\fi\relax \expandafter\starOption\or \expandafter\slashOption\or \expandafter\plusOption\or \expandafter\minusOption\or \expandafter\verbOption\or \expandafter\doOption\fi #1} \def\doOption#1>#2\endLine{% \maybeMsg{<#1 . >}% \Evaluate{#1}% \def\do##1##2##3{% \if1\Expr{##2}\StreamPut##1{#2}\fi }% \activefiles } \def\plusOption+#1>#2\endLine{% \maybeMsg{<+#1 . >}% \Evaluate{#1}% \def\do##1##2##3{% \if1\Expr{##2}\StreamPut##1{#2}\fi }% \activefiles } \def\minusOption-#1>#2\endLine{% \maybeMsg{<-#1 . >}% \Evaluate{#1}% \def\do##1##2##3{% \if1\Expr{##2}\else \StreamPut##1{#2}\fi }% \activefiles } \def\starOption*#1>#2\endLine{% \maybeMsg{<*#1}% \expandafter\push\expandafter\guardStack\expandafter{\blockHead}% \advance\blockLevel\@ne \def\blockHead{#1}% \Evaluate{#1}% \let\do\checkguard@do \outputfiles \let\do\findactive@do \edef\activefiles{\activefiles} } \def\checkguard@do#1#2#3{% \ifnum#3>0 \advance#3\@ne \else \if1\Expr{#2}\else \advance#3\@ne\fi \fi} \def\findactive@do#1#2#3{% \ifnum#3=0 \noexpand\do#1{#2}#3\fi} \def\slashOption/#1>#2\endLine{% \def\tmp{#1}% \ifnum\blockLevel<\@ne \errmessage{Spurious end block ignored}% \else \ifx\tmp\blockHead \pop\guardStack\blockHead \else \errmessage{Found instead of }% \fi \maybeMsg{>}% \advance\blockLevel\m@ne \let\do\closeguard@do \outputfiles \let\do\findactive@do \edef\activefiles{\outputfiles} \fi } \def\closeguard@do#1#2#3{% \ifnum#3>0 \advance#3\m@ne \fi} \def\verbOption<#1\endLine{{% \edef\verbStop{\perCent#1}\maybeMsg{<<<}% \let\do\putline@do \loop \ifeof\inFile\errmessage{Source file ended while in verbatim mode!}\fi \read\inFile to \inLine \if 1\ifx\inLine\verbStop 0\fi 1% if not inLine==verbStop \activefiles \maybeMsg{.}% \repeat \maybeMsg{>}% }} \def\generate#1{\begingroup \let\inputfiles\empty \let\filestogenerate\empty \let\file\@file #1 \ifx\filestogenerate\empty\else \Msg{^^JGenerating file(s) \filestogenerate}\fi \def\inFileName{\csname in@\outFileName\endcsname}% \def\ReferenceLines{\csname ref@\outFileName\endcsname}% \processinputfiles \endgroup} \def\processinputfiles{% \let\newinputfiles\empty \inputfiles \let\inputfiles\newinputfiles \ifx\inputfiles\empty\else \expandafter\processinputfiles \fi } \def\file#1#2{\errmessage{Command `\string\file' only allowed in argument to `\string\generate'}} \def\@file#1{% \Generatetrue \makepathname{#1}% \ifaskforoverwrite \immediate\openin\inFile\@pathname\relax \ifeof\inFile\else \Ask\answer{File \@pathname\space already exists \ifx\empty\destdir somewhere \fi on the system.^^J% Overwrite it% \ifx\empty\destdir\space if necessary\fi ? [y/n]}% \ifx\y \answer \else \ifx\yes\answer \else \Generatefalse\fi\fi\fi \closein\inFile \fi \ifGenerate \Name\let{pth@#1}\@pathname \@addto\filestogenerate{\@pathname\space}% \Name\@fileX{#1\expandafter}% \else \Msg{Not generating file \@pathname^^J}% \expandafter\@gobble \fi } \def\@fileX#1#2{% \chardef#1=\stream@closed \def\curout{#1}% \let\curinfiles\empty \let\curinnames\empty \def\curref{\MetaPrefix ^^J% \MetaPrefix\space The original source files were:^^J% \MetaPrefix ^^J}% \let\from\@from \let\needed\@needed #2% \let\from\err@from \let\needed\err@needed \checkorder \Name\@addto{e@\curin}{\noexpand\closeoutput{#1}}% \Name\let{pre@\@stripstring#1\expandafter}\currentpreamble \Name\let{post@\@stripstring#1\expandafter}\currentpostamble \Name\edef{in@\@stripstring#1}{\expandafter\iden\curinnames} \Name\edef{ref@\@stripstring#1}{\curref} } \def\checkorder{% \expandafter\expandafter\expandafter \checkorderX\expandafter\curinfiles \expandafter\qStop\inputfiles\qStop } \def\checkorderX(#1)#2\qStop#3\qStop{% \def\tmp##1\readsource(#1)##2\qStop{% \ifx!##2! \order@error \else\ifx!#2!\else \checkorderXX##2% \fi\fi}% \def\checkorderXX##1\readsource(#1)\fi\fi{\fi\fi \checkorderX#2\qStop##1\qStop}% \tmp#3\readsource(#1)\qStop } \def\order@error#1\fi\fi{\fi \errmessage{DOCSTRIP error: Incompatible order of input files specified for file `\iden{\expandafter\uptospace\curin} \qStop'.^^J Read DOCSTRIP documentation for explanation.^^J This is a serious problem, I'm exiting}\end } \def\needed#1{\errmessage{\string\needed\space can only be used in argument to \string\file}} \let\err@needed\needed \def\@needed#1{% \edef\reserved@a{#1}% \expandafter\@need@d\expandafter{\reserved@a}} \def\@need@d#1{% \@ifpresent{(#1)}\curinfiles {\@need@d{#1 }}% {\@ifpresent{\readsource(#1)}\inputfiles {}{\@addto\inputfiles{\noexpand\readsource(#1)}% \Name\let{b@#1}\empty \Name\let{o@#1}\empty \Name\let{e@#1}\empty}% \@addto\curinfiles{(#1)}% \def\curin{#1}}% } \def\from#1#2{\errmessage{Command `\string\from' only allowed in argument to `\string\file'}} \let\err@from\from \def\@from#1#2{% \@addto\curref{\MetaPrefix\space #1 \if>#2>\else \space (with options: `#2')\fi^^J}% \needed{#1}% \ifx\curinnames\empty \Name\@addto{b@\curin}{\noexpand\openoutput\curout}% \fi \@addto\curinnames{ #1}% \Name\@addto{o@\curin}{\noexpand\do\curout{#2}}% } \def\readsource(#1){% \immediate\openin\inFile\uptospace#1 \qStop\relax \ifeof\inFile \errmessage{Cannot find file \uptospace#1 \qStop}% \else \processedLines\z@ \commentsRemoved\z@ \commentsPassed\z@ \codeLinesPassed\z@ \let\refusedfiles\empty \csname b@#1\endcsname \Name\let{b@#1}\refusedfiles \Msg{} \def\@msg{Processing file \uptospace#1 \qStop} \def\change@msg{% \edef\@msg{\@spaces\@spaces\@spaces\space \expandafter\tospaces\uptospace#1 \qStop\secapsot} \let\change@msg\relax} \let\do\showfiles@do \let\refusedfiles\empty \csname o@#1\endcsname \ifx\refusedfiles\empty\else \@addto\newinputfiles{\noexpand\readsource(#1)} \fi \let\do\makeoutlist@do \edef\outputfiles{\csname o@#1\endcsname}% \let\activefiles\outputfiles \Name\let{o@#1}\refusedfiles \makeOther\ \makeOther\\\makeOther\$% \makeOther\#\makeOther\^\makeOther\^^K% \makeOther\_\makeOther\^^A\makeOther\%% \makeOther\~\makeOther\{\makeOther\}\makeOther\&% \endlinechar-1\relax \loop \read\inFile to\inLine \ifx\inLine\Endinput \Msg{File #1 ended by \string\endinput.}% \Continuefalse \else \ifeof\inFile \Continuefalse \else \Continuetrue \ifx\inLine\empty \advance\emptyLines\@ne \else \emptyLines\z@ \fi \ifnum \emptyLines<2 \expandafter\processLine\inLine\endLine \else \maybeMsg{/}% \fi \fi \fi \ifContinue \repeat \closein\inFile \csname e@#1\endcsname \Msg{Lines \space processed: \the\processedLines^^J% Comments removed: \the\commentsRemoved^^J% Comments \space passed: \the\commentsPassed^^J% Codelines passed: \the\codeLinesPassed^^J}% \global\advance\TotalprocessedLines by \processedLines \global\advance\TotalcommentsRemoved by \commentsRemoved \global\advance\TotalcommentsPassed by \commentsPassed \global\advance\TotalcodeLinesPassed by \codeLinesPassed \global\advance\NumberOfFiles by \@ne \fi} \def\showfiles@do#1#2{% \ifnum#1=\stream@closed \@addto\refusedfiles{\noexpand\do#1{#2}}% \else \Msg{\@msg \ifx>#2>\else\space(#2)\fi \space -> \@stripstring#1} \change@msg \csname off@\number#1\endcsname=\z@ \fi } \def\makeoutlist@do#1#2{% \ifnum#1=\stream@closed\else \noexpand\do#1{#2}\csname off@\number#1\endcsname \fi} \def\openoutput#1{% \if 1\ifnum\@maxfiles=\z@ 0\fi \ifnum\@maxoutfiles=\z@ 0\fi1% \advance\@maxfiles\m@ne \advance\@maxoutfiles\m@ne \StreamOpen#1% \WritePreamble#1% \else \@addto\refusedfiles{\noexpand\openoutput#1}% \fi } \def\closeoutput#1{% \ifnum#1=\stream@closed\else \WritePostamble#1% \StreamClose#1% \advance\@maxfiles\@ne \advance\@maxoutfiles\@ne \fi} \def\ds@heading{% \MetaPrefix ^^J% \MetaPrefix\space This is file `\outFileName',^^J% \MetaPrefix\space generated with the docstrip utility.^^J% } \def\AddGenerationDate{% \def\ds@heading{% \MetaPrefix ^^J% \MetaPrefix\space This is file `\outFileName', generated % on <\the\year/\the\month/\the\day> ^^J% \MetaPrefix\space with the docstrip utility (\fileversion).^^J% }} \let\inFileName\relax \let\outFileName\relax \let\ReferenceLines\relax \def\declarepreamble{\begingroup \catcode`\^^M=13 \catcode`\ =12 % \declarepreambleX} {\catcode`\^^M=13 % \gdef\declarepreambleX#1#2 \endpreamble{\endgroup% \def^^M{^^J\MetaPrefix\space}% \edef#1{\ds@heading% \ReferenceLines% \MetaPrefix\space\checkeoln#2\empty}}% \gdef\checkeoln#1{\ifx^^M#1\else\expandafter#1\fi}% } \def\declarepostamble{\begingroup \catcode`\ =12 \catcode`\^^M=13 \declarepostambleX} {\catcode`\^^M=13 % \gdef\declarepostambleX#1#2 \endpostamble{\endgroup% \def^^M{^^J\MetaPrefix\space}% \edef#1{\MetaPrefix\space\checkeoln#2\empty^^J% \MetaPrefix ^^J% \MetaPrefix\space End of file `\outFileName'.% }}% } \def\usepreamble#1{\def\currentpreamble{#1}} \def\usepostamble#1{\def\currentpostamble{#1}} \def\preamble{\usepreamble\defaultpreamble \declarepreamble\defaultpreamble} \def\postamble{\usepostamble\defaultpostamble \declarepostamble\defaultpostamble} \declarepreamble\org@preamble IMPORTANT NOTICE: For the copyright see the source file. You are *not* allowed to modify this file. You are *not* allowed to distribute this file. For distribution of the original source see the terms for copying and modification in the file \inFileName. \endpreamble \edef\org@postamble{\string\endinput^^J% \MetaPrefix ^^J% \MetaPrefix\space End of file `\outFileName'.% } \let\defaultpreamble\org@preamble \let\defaultpostamble\org@postamble \usepreamble\defaultpreamble \usepostamble\defaultpostamble \def\WritePreamble#1{% \edef\outFileName{\@stripstring#1}% \StreamPut#1{\csname pre@\@stripstring#1\endcsname}} \def\WritePostamble#1{% \edef\outFileName{\@stripstring#1}% \StreamPut#1{\csname post@\@stripstring#1\endcsname}} \def\usedir#1{\edef\destdir{\WriteToDir}} \def\showdirectory#1{\WriteToDir} \def\BaseDirectory#1{% \@setwritetodir \let\usedir\alt@usedir \let\showdirectory\showalt@directory \edef\basedir{#1\dirsep}} \def\convsep#1/#2\qStop{% #1\ifx\qStop#2\qStop \pesvnoc\fi\convsep\dirsep#2\qStop} \def\pesvnoc#1\qStop{\fi} \def\alt@usedir#1{% \Name\ifx{dir@#1}\relax \undefined@directory{#1}% \else \edef\destdir{\csname dir@#1\endcsname}% \fi} \def\showalt@directory#1{% \Name\ifx{dir@#1}\relax \showundef@directory{#1}% \else\csname dir@#1\endcsname\fi} \def\undefined@directory#1{% \errhelp{docstrip.cfg should specify a target directory for^^J% #1 using \DeclareDir or \UseTDS.}% \errmessage{You haven't defined output directory for `#1'.^^J% Subsequent files will be written to the current directory.}% \let\destdir\WriteToDir } \def\showundef@directory#1{UNDEFINED (label is #1)} \def\undefined@TDSdirectory#1{% \edef\destdir{% \basedir\convsep#1/\qStop }} \def\showundef@TDSdirectory#1{\basedir\convsep#1/\qStop} \def\UseTDS{% \@setwritetodir \let\undefined@directory\undefined@TDSdirectory \let\showundef@directory\showundef@TDSdirectory } \def\DeclareDir{\@ifnextchar*{\DeclareDirX}{\DeclareDirX\basedir*}} \def\DeclareDirX#1*#2#3{% \@setwritetodir \Name\edef{dir@#2}{#1#3}} \def\generateFile#1#2#3{{% \ifx t#2\askforoverwritetrue \else\askforoverwritefalse\fi \generate{\file{#1}{#3}}% }} \def\include#1{\def\Options{#1}} \def\processFile#1#2#3#4{% \generateFile{#1.#3}{#4}{\from{#1.#2}{\Options}}} \def\processfile{\Msg{% ^^Jplease use \string\processFile\space instead of \string\processfile!^^J}% \processFile} \def\generatefile{\Msg{% ^^Jplease use \string\generateFile\space instead of \string\generatefile!^^J}% \generateFile} \newcount\@maxfiles \def\maxfiles#1{% \@maxfiles#1\relax \ifnum\@maxfiles<4 \errhelp{I'm not a magician. I need at least four^^J% streams to be able to work properly, but^^J% you've only let me use \the\@maxfiles.}% \errmessage{\noexpand\maxfiles limit is too strict.}% \@maxfiles4 \fi } \maxfiles{1972} % year of my birth (MW) \newcount\@maxoutfiles \def\maxoutfiles#1{% \@maxoutfiles=#1\relax \ifnum\@maxoutfiles<1 \@maxoutfiles1 \errhelp{I'm not a magician. I need at least one output^^J% stream to be able to do anything useful at all.^^J% Please be reasonable.}% \errmessage{\noexpand\maxoutfiles limit is insane}% \fi } \maxoutfiles{16} \def\checkfilelimit{% \advance\@maxfiles\m@ne \ifnum\@maxfiles<2 % \errhelp{There aren't enough streams left to do any unpacking.^^J% I can't do anything about this, so complain at the^^J% person who made such a complicated installation.}% \errmessage{Too few streams left.}% \end \fi } \def\strip@meaning#1>{} \def\processbatchFile{% \checkfilelimit \let\next\relax \openin\inputcheck \batchfile\relax \ifeof\inputcheck \ifDefault \else \errhelp {A batchfile specified in \batchinput could not be found.}% \errmessage{^^J% **************************************************^^J% * Could not find your \string\batchfile=\batchfile.^^J% **************************************************}% \fi \else \ifDefault \Msg{**************************************************^^J% * Batchfile \DefaultbatchFile\space found Use it? (y/n)?}% \Ask\answer{% **************************************************}% \else \let\answer\y \fi \ifx\answer\y \closein\inputcheck \def\next{\@@input\batchfile\relax}% \fi \fi \next} \def\ReportTotals{% \ifnum\NumberOfFiles>\@ne \Msg{Overall statistics:^^J% Files \space processed: \the\NumberOfFiles^^J% Lines \space processed: \the\TotalprocessedLines^^J% Comments removed: \the\TotalcommentsRemoved^^J% Comments \space passed: \the\TotalcommentsPassed^^J% Codelines passed: \the\TotalcodeLinesPassed}% \fi} \def\SetFileNames{% \edef\sourceFileName{\MainFileName.\infileext}% \edef\destFileName{\MainFileName.\outfileext}} \def\CheckFileNames{% \ifx\sourceFileName\destFileName \Msg{^^J% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% ! It is not possible to read from and write to the same file !^^J% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% \Continuefalse \else \Continuetrue \immediate\openin\inFile \sourceFileName\relax \ifeof\inFile \Msg{^^J% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% ! Your input file `\sourceFileName' was not found !^^J% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% \Continuefalse \else \immediate\closein\inFile \immediate\openin\inFile\destdir \destFileName\relax \ifeof\inFile \Continuetrue \else \Continuefalse \Ask\answer{File \destdir\destFileName\space already exists \ifx\empty\destdir somewhere \fi on the system.^^J% Overwrite it% \ifx\empty\destdir\space if necessary\fi ? [y/n]}% \ifx\y \answer \Continuetrue \else \ifx\yes\answer \Continuetrue \else \fi\fi \fi \fi \fi \closein\inFile} \def\interactive{% \whileswitch\ifMoreFiles\fi% {\begingroup \AskQuestions \forlist\MainFileName:=\filelist \do \SetFileNames \CheckFileNames \ifContinue \generateFile{\destFileName}{f}% {\from{\sourceFileName}{\Options}} \fi% \od \endgroup \Ask\answer{More files to process (y/n)?}% \ifx\y \answer\MoreFilestrue \else \ifx\yes\answer\MoreFilestrue \else \MoreFilesfalse\fi\fi }} \def\AskQuestions{% \Msg{^^J% ****************************************************}% \Ask\infileext{% * First type the extension of your input file(s): \space *}% \Msg{****************************************************^^J^^J% ****************************************************}% \Ask\outfileext{% * Now type the extension of your output file(s) \space: *}% \Msg{****************************************************^^J^^J% ****************************************************}% \Ask\Options{% * Now type the name(s) of option(s) to include \space\space: *}% \Msg{****************************************************^^J^^J% ****************************************************^^J% * Finally give the list of input file(s) without \space\space*}% \Ask\filelist{% * extension seperated by commas if necessary % \space\space\space\space: *}% \Msg{****************************************************^^J}}% \Msg{Utility: `docstrip' \fileversion\space <\filedate>^^J% English documentation \space\space\space <\docdate>}% \Msg{^^J% **********************************************************^^J% * This program converts documented macro-files into fast *^^J% * loadable files by stripping off (nearly) all comments! *^^J% **********************************************************^^J}% \def\@setwritetodir{% \let\setwritetodir\relax \ifx\WriteToDir\@undefined \ifx\@currdir\@undefined \def\WriteToDir{}% \else \let\WriteToDir\@currdir \fi \fi \let\destdir\WriteToDir \def\tmp{[]}% \ifx\tmp\WriteToDir \ifx\dirsep\@undefined \def\dirsep{.}% \fi \ifx\makepathname\@undefined \def\makepathname##1{% \edef\@pathname{\ifx\WriteToDir\destdir \WriteToDir\else[\destdir]\fi##1}}% \fi \fi \ifx\dirsep\@undefined \def\dirsep{/}% \def\tmp{:}% \ifx\tmp\WriteToDir \def\dirsep{:}% \fi \fi \ifx\makepathname\@undefined \def\makepathname##1{% \edef\@pathname{\destdir\ifx\empty\destdir\else \ifx\WriteToDir\destdir\else\dirsep\fi\fi##1}}% \fi} \immediate\openin\inputcheck=docstrip.cfg\relax \ifeof\inputcheck \Msg{% ********************************************************^^J% * No Configuration file found, using default settings. *^^J% ********************************************************^^J}% \else \Msg{% ******************************************^^J% * Using Configuration file docstrip.cfg. *^^J% ******************************************^^J}% \closein\inputcheck \afterfi{\@@input docstrip.cfg\relax} \fi \@setwritetodir \def\process@first@batchfile{% \processbatchFile \ifnum\NumberOfFiles=\z@ \interactive \fi \endbatchfile} \def\endbatchfile{% \iftopbatchfile \ReportTotals \expandafter\end \else \endinput \fi} \edef\@jobname{\lowercase{\def\noexpand\@jobname{\jobname}}}% \@jobname \def\@docstrip{docstrip}% \edef\@docstrip{\expandafter\strip@meaning\meaning\@docstrip} \Defaultfalse \ifx\undefined\batchfile \ifx\@jobname\@docstrip \let\batchfile\DefaultbatchFile \Defaulttrue \else \let\process@first@batchfile\relax \fi \fi \process@first@batchfile \endinput %% %% End of file `docstrip.tex'.