%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%     CAP  ---  Macros for typesetting programs in C and Pascal     %
%       Micha\l{} Gulczy\'nski, Szczecin, Feb 1997 / Feb 1998       %
%                     mgulcz@we.tuniv.szczecin.pl                   %
%      Some (non-essential) changes to support COLORDVI output      %
%                 Danilo \v Segan, Beograd, Sep 2002                %
%                      mm01142@alas.matf.bg.ac.yu                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  version 1.2d
%    Added DVIPS color support (actually, any output is replaced with
%    a macro call to \Ispis --- search for it to see the changes)
%    Also extended a mechanism for marking "special" symbols, so they
%    would get applicable color in a string, comment, or otherwise
%    NOTE: It should be backwards compatible, so there is no need to
%          change anything else, except of course adding color
%          settings if you wish
%     -- by Danilo {\v S}egan, mm01142@alas.matf.bg.ac.yu
%  version 1.2
%    This file contains common definitions used in the CAP package.
%    It does not contain any useful macros itself.
%

% If you don't have dvips's colordvi.tex, then fetch it from somewhere
% to avoid errors in processing (it inserts specials which will
% probably be ignored by anything other than COLORDVI aware software)
% The alternate solution is to comment out all color definitions
% (\let's) and to define writeout function as \def\Ispis#1{#1}
\input colordvi

% If you don't have color printer, you may choose to remain compatible
% with those that do, and only use analogous dvips's input file
%\input blackdvi

%
%      font and color declarations
%
\font\tenttsl = cmsltt10     % <---  modify these two lines if you don't use
\font\tenttit = cmitt10      % <---  CM fonts
\let\IdentifierFont  = \it
\let\IdentifierColor = \Black
\let\TextFont  = \sl
\let\TextColor = \Black
\let\KeywordFont  = \bf
\let\KeywordColor = \Black
\let\CommentFont  = \tenttit
\let\CommentColor = \Black
\let\DirectiveFont  = \tenttsl
\let\DirectiveColor = \Black
\let\SymbolFont  = \tt
\let\SymbolColor = \Black
\let\SpecialFont  = \tt     % some characters: { } < > _ \ and | are very
\let\SpecialColor = \Black  % special -- they exist only in tt fonts

%
%      how much does a single "space" skip (retained the default 1ex from CAP)
%
\newdimen\SpaceSkip          % Changeable space skip (instead of the old fixed 1ex)
\SpaceSkip=1ex


%\def\GenState#1{%
%\expandafter\expandafter\def\csname @#1State\endcsname{%
%        \def\@Color{\csname#1Color\endcsname}%
%        \def\@@State{#1}%
%        \expandafter\csname #1Font\endcsname}}
\def\GenState#1{%
\expandafter\expandafter\def\csname @#1State\endcsname{%
        \def\@tmpName{#1}%
%	\ifx\@@State\@tmpName\else% if already in this state, skip
        \def\@Color{\csname#1Color\endcsname}%
        \def\@@State{#1}%
        \expandafter\csname #1Font\endcsname%\fi}}
	}}

\GenState{Identifier}
\GenState{Text}
\GenState{Keyword}
\GenState{Comment}
\GenState{Directive}
\GenState{Symbol}
% One \GenState{NAME} replaces the following definition
%    \def\@NAMEState{\let\@Color=\NAMEColor\NAMEFont\def\@@State{NAME}}
\def\@SpecialState{%
        \def\neka##1{\edef\@@stanje{##1}}%
        \neka{Directive}\ifx\@@State\@@stanje%
                \let\@Color=\DirectiveColor%
        \else
          \neka{Comment}\ifx\@@State\@@stanje%
                \let\@Color=\CommentColor%
          \else
            \neka{Text}\ifx\@@State\@@stanje%
                \let\@Color=\TextColor%
            \else%
                \let\@Color=\SpecialColor
        \fi\fi\fi%
        \SpecialFont}

\def\@Output#1{\@Color{#1}}

%
%      registers and constants used in the program
%
\newif\if@TempBool            % temporary boolean
\newread\@InFile              % file read by \Input macros
\newcount\@CharCode           % code of current character
\newcount\@PrevChar           % code of previous charater
\newcount\@WhereAmI           % one of the following values:
\chardef\@NothingSpecial = 0
\chardef\@Text = 1
\chardef\@Directive = 2       % used only in C
\chardef\@ShortComment = 3    % C: //... ;    Pascal: (* ... *)
\chardef\@LongComment = 4     % C: /* ... */; Pascal: { ... }
%
%      macro that compares two strings
%
\def\@Identical#1#2{%
  MG\fi
  \edef\@FirstString{#1}%
  \edef\@SecondString{#2}%
  \ifx \@FirstString \@SecondString
}
%
%      I need a "not eof" function
%
\def\neof#1{%
  MG\fi
  \ifeof#1
    \@TempBoolfalse
  \else
    \@TempBooltrue
  \fi
  \if@TempBool
}
%
%      macro for changing catcodes of some special characters
%
\def\@TurnSpecialCharsOff{%
  \catcode`\/=12
  \catcode`\~=12
  \catcode`\#=12
  \catcode`\$=12
  \catcode`\%=12
  \catcode`\^=12
  \catcode`\&=12
  \catcode`\_=12
  \catcode`\\=12
  \catcode`\{=12
  \catcode`\}=12
  \catcode`\ =12
  \catcode`\^^M=12
}
%
%      macro that initiates all the variables
%
\def\@PrepareCPas{%
  \begingroup
  \parindent=0pt
  \rightskip=0pt plus 1fil
  \@TurnSpecialCharsOff
  \def\@Word{}%
  \@WhereAmI = \@NothingSpecial
  \@PrevChar = 32
  \@SymbolState
}
%
%      macro that outputs the char specified as the argument;
%      characters < > _  \ { | } are written with \SpecialState,
%      except for _ which is written with \IdentifierColor and \SpecialFont
%
\def\@WriteChar#1{%
  \def\@Check##1{%
    \ifnum `#1=`##1%
      {\@SpecialState \@Output{#1}}%
      \@TempBooltrue%
    \fi
  }%
  \@TempBoolfalse
  \@Check{<}%
  \@Check{>}%
%  \@Check{_}%
  \ifnum`#1=`\_%
    \@IdentifierState\SpecialFont%
    \@Output{#1}\@TempBooltrue%
  \fi%
  \@Check{\\}%
  \@Check{\{}%
  \@Check{\}}%
  \@Check{|}%
  \if@TempBool
  \else
    \ifnum `#1=13
      \par\leavevmode
    \else
      \ifnum `#1=32
        \hskip\SpaceSkip
      \else
        \@Output{#1}%
      \fi
    \fi
  \fi
}
%
%      checks if word #1 is a keyword and writes it out;
%      #2 is a list of keywords separated with spaces
%
\def\@WriteWord#1#2{%
  \if\@OnListOfKeywords{ #1 }{#2}%
    {\@KeywordState\@Output{#1}}%
  \else
    {\@IdentifierState\@Output{#1}}%
  \fi
}
%
%      checks if string #2 contains string #1
%
\def\@OnListOfKeywords#1#2{%
  MG\fi
  \edef\@ExpandedArgument{{#1}}%
  \expandafter\@@OnListOfKeywords\@ExpandedArgument{#2}\relax
}
\def\@@OnListOfKeywords#1#2{%
  \def\@CheckList##1#1##2\@EndOfList{%
    \if\@Identical{##2}{}%
      \@TempBoolfalse
    \else
      \@TempBooltrue
    \fi
  }%
  \expandafter\@CheckList#2#1\@EndOfList\relax
  \if@TempBool
}
%
%      checks if the specified character is a digit or a letter
%
\def\@DigitLetter#1{%
  MG\fi
  \@TempBoolfalse
  \ifnum `\` < #1\relax   %   small letter?
    \ifnum `\{ > #1\relax
      \@TempBooltrue
    \fi
  \fi
  \ifnum `\@ < #1\relax   %   capital letter?
    \ifnum `\[ > #1\relax
      \@TempBooltrue
    \fi
  \fi
  \ifnum `\/ < #1\relax   %   digit?
    \ifnum `\: > #1\relax
      \@TempBooltrue
    \fi
  \fi
  \if@TempBool
}

\endinput
