%%
%% substr.sty
%%
%% This package provides commands to deal with substrings in strings:
%% Determine if a string contains a substring, count appearances of a
%% substring in a string.
%%
%%
%% Commands:
%%
%% \IfSubStringInString{substring}{string}{true part}{false part}
%% This command searches <substring> in <string> and executes the 
%% <true part> if it is and else the <else part>
%%
%% \IfCharInString{char}{string}{true part}{false part}
%% Actualy the same as \IfSubStringInString.
%%
%% \BehindSubString{substring}{string}
%% Returns the part of <string> that is on the behind
%% <substring>. Always the first appearance of <substring> is taken.
%%
%% \BeforeSubString{substring}{string}
%% Returns the part of <string> that is on the before
%% <substring>. Always the first appearance of <substring> is taken.
%%
%% \CountSubStrings{substring}{string}
%% Counts the number of appearances of <substring> in <string> and
%% returns it as text.
%%
%% \SubStringsToCounter{counter}{substring}{string}
%% Counts the number of appearances of <substring> in <string> and
%% sets the counter <counter> to that value.
%%
%% \IfBeforeSubStringEmpty{substring}{string}{true part}{false part}
%% Calls <true part> if <substring> is equal to the beginning of <string>.
%% Else call <false part>.
%%
%% \IfBehindSubStringEmpty{substring}{string}{true part}{false part}
%% Calls <true part> if <substring> is equal to the end of <string>.
%% Else call <false part>.
%%
%%
%% History of this package:
%%
%% The package arises from a posting of me in the newsgroup
%% de.comp.text.tex in which I asked how to find out if a substring
%% is included in a string. Heiko Oberdiek
%% <oberdiek@ruf.uni-freiburg.de> posted the commands
%% \IfSubStringInString and \IfCharInString and suggested to write a
%% command which counts the appearances in a string. So, I wrote the
%% commands \CountSubStrings and \SubStringsToCounter.
%% After I wrote this package I sent it to Heiko Oberdiek
%% who improved and rewrote many parts of it.
%%
%%
%% ChangeLog
%%
%% 2009/10/20  v1.2  Uwe Lück
%% 	- Fix \IfSubStringInString which did not work if the string was contained in the substring
%% 
%% 2005/11/29  v1.1  Harald Harders
%% 	- Add \IfBeforeSubStringEmpty and \IfBehindSubStringEmpty.
%%
%%
%%
%% Copyright 2000, 2005, 2009 Harald Harders
%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN
%% archives in directory macros/latex/base/lppl.txt; either
%% version 1 of the License, or any later version.
%%
%%
%% 2009-10-20
%% Harald Harders
%% h.harders@tu-bs.de
%%
\ProvidesPackage{substr}[2009/10/20  v1.2  Handle substrings]
%%
% expands the first and second argument with
% \protected@edef and calls #3 with them:
\newcommand\su@ExpandTwoArgs[3]{%
  \protected@edef\su@SubString{#1}%
  \protected@edef\su@String{#2}%
  \expandafter\expandafter\expandafter#3%
  \expandafter\expandafter\expandafter{%
    \expandafter\su@SubString\expandafter
  }\expandafter{\su@String}%
}
%%
%% tests if #1 in #2. If yes execute #3, else #4
\newcommand*\IfSubStringInString[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@IfSubStringInString
}
%%
\newcommand*\su@IfSubStringInString[2]{%
  \def\su@compare##1#1##2\@nil{%
    \def\su@param{##2}%
    \ifx\su@param\@empty
      \expandafter\@secondoftwo
    \else
      \expandafter\@firstoftwo
    \fi
  }%
  \su@compare#2\@nnil#1\@nil
}
%%
%% tests if #1 in #2. If yes execute #3, else #4
\newcommand\IfCharInString{}
\let\IfCharInString\IfSubStringInString
%%
%% returns the part of the string behind the found substring
\newcommand*\BehindSubString[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@BehindSubString
}
\newcommand*\su@BehindSubString[2]{%
  \def\su@rest##1#1##2\@nil{##2}%
  \IfSubStringInString{#1}{#2}{\su@rest#2\@nil}{}%
}
%%
%% returns the part of the string before the found substring
\newcommand*\BeforeSubString[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@BeforeSubString
}
\newcommand*\su@BeforeSubString[2]{%
  \def\su@rest##1#1##2\@nil{##1}%
  \IfSubStringInString{#1}{#2}{\su@rest#2\@nil}{#2}%
}
%%
%% calls #3 if part of string before substring is empty, otherwise calls #4.
\newcommand*\IfBeforeSubStringEmpty[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@IfBeforeSubStringEmpty
}
%%
\newcommand*\su@IfBeforeSubStringEmpty[4]{%
  \def\su@rest##1#1##2\@nil{##1}%
  \IfSubStringInString{#1}{#2}{%
    \edef\su@resta{\su@rest#2\@nil}%	
    \ifx\@empty\su@resta #3\else #4\fi
  }{#4}%
}
%%
%% calls #3 if part of string after substring is empty, otherwise calls #4.
\newcommand*\IfBehindSubStringEmpty[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@IfBehindSubStringEmpty
}
%%
\newcommand*\su@IfBehindSubStringEmpty[4]{%
  \def\su@rest##1#1##2\@nil{##2}%
  \IfSubStringInString{#1}{#2}{%
    \edef\su@resta{\su@rest#2\@nil}%	
    \ifx\@empty\su@resta #3\else #4\fi
  }{#4}%
}
%%
%% counter for counting appearances
\newcounter{su@anzahl}
%%
% #1: String
% #2: Substring
% #3: Counter
\newcommand*\su@StringSubstringCounter[3]{%
  \su@IfSubStringInString{#2}{#1}{%
    \stepcounter{#3}%
    \def\su@rest##1#2##2\@nil{##2}%
    \expandafter\su@StringSubstringCounter\expandafter
    {\su@rest#1\@nil}{#2}{#3}%
  }{}%
}
%%
\newcommand*\CountSubStrings[2]{%
  \su@ExpandTwoArgs{#1}{#2}\su@CountSubStrings
}
\newcommand*\su@CountSubStrings[2]{%
  \setcounter{su@anzahl}{0}%
  \su@StringSubstringCounter{#2}{#1}{su@anzahl}%
  \thesu@anzahl
}
% #1: counter
% #2: substring
% #3: string
\newcommand*\SubStringsToCounter[3]{%
  \su@ExpandTwoArgs{#2}{#3}\su@SubStringsToCounter{#1}%
}
% #1: substring
% #2: string
% #3: counter
\newcommand*\su@SubStringsToCounter[3]{%
  \setcounter{#3}{0}%
  \su@StringSubstringCounter{#2}{#1}{#3}%
}
%%
\endinput
%% EOF
