%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%     CAP  ---  Macros for typesetting programs in C and Pascal     %
%       Micha\l{} Gulczy\'nski, Szczecin, Feb 1997 / Feb 1998       %
%                     mgulcz@we.tuniv.szczecin.pl                   %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  version 1.2
%    This file contains common definitions used in the CAP package.
%    It does not contain any useful macros itself.
%


%
%      macro that compares two strings
%
\def\@Identical#1#2{%
  MG\fi
  \edef\@FirstString{#1}%
  \edef\@SecondString{#2}%
  \ifx \@FirstString \@SecondString
}
%
%      font declarations
%
{% a tiny trick that lets TeX check if the user has PL fonts...
 \catcode`\p = 12
 \catcode`\l = 12
 \catcode`\r = 12
 \xdef\xxx{plr10}
}
\if\@Identical{\xxx}{\fontname\tenrm}
  \font\tenttsl = plsltt10
  \font\tenttit = plitt10
\else
  \font\tenttsl = cmsltt10
  \font\tenttit = cmitt10
\fi
\let\IdentifierFont = \it
\let\TextFont = \sl
\let\KeywordFont = \bf
\let\CommentFont = \tenttit
\let\DirectiveFont = \tenttsl
\let\SymbolFont = \tt
\let\SpecialFont = \tt    % some characters: { } < > _ \ and | are very
                          % special -- they exist only in tt fonts
%
%      registers and constants used in the program
%
\newif\if@TempBool            % temporary boolean
\newread\@InFile              % file read by \Insert 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: { ... }
%
%      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
  \SymbolFont
}
%
%      macro that outputs the char specified as the argument;
%      characters < > _  \ { | } are written with \SpecialFont
%
\def\@WriteChar#1{%
  \def\@Check##1{%
    \ifnum `#1=`##1
      {\SpecialFont #1}%
      \@TempBooltrue
    \fi
  }%
  \@TempBoolfalse
  \@Check{<}%
  \@Check{>}%
  \@Check{_}%
  \@Check{\\}%
  \@Check{\{}%
  \@Check{\}}%
  \@Check{|}%
  \if@TempBool
  \else
    \ifnum `#1=13
      \par\leavevmode
    \else
      \ifnum `#1=32
        \hskip 1ex
      \else
        #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}%
    {\KeywordFont #1}%
  \else
    {\IdentifierFont #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
