[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]

    {
    There are many times when you need to compare two strings, but want to use
    wild cards in the match - all last names that begin with 'St', etc.  The
    following is a piece of code I got from Sean Stanley in Tallahassee Florida
    in C.  I translated it into Delphi an am uploading it here for all to use.
    I have not tested it extensivly, but the original function has been tested
    quite thoughly.

    I would love feedback on this routine - or peoples changes to it.  I want to
    forward them to Sean to get him to release more tidbits like this.

    {
      This function takes two strings and compares them.  The first string
      can be anything, but should not contain pattern characters (* or ?).
      The pattern string can have as many of these pattern characters as you want.
      For example: MatchStrings('David Stidolph','*St*') would return True.

      Orignal code by Sean Stanley in C
      Rewritten in Delphi by David Stidolph
    }
    function MatchStrings(source, pattern: String): Boolean;
    var
      pSource: Array [0..255] of Char;
      pPattern: Array [0..255] of Char;

      function MatchPattern(element, pattern: PChar): Boolean;

        function IsPatternWild(pattern: PChar): Boolean;
        var
          t: Integer;
        begin
          Result := StrScan(pattern,'*') <> nil;
          if not Result then Result := StrScan(pattern,'?') <> nil;
        end;

      begin
        if 0 = StrComp(pattern,'*') then
          Result := True
        else if (element^ = Chr(0)) and (pattern^ <> Chr(0)) then
          Result := False
        else if element^ = Chr(0) then
          Result := True
        else begin
          case pattern^ of
          '*': if MatchPattern(element,@pattern[1]) then
                 Result := True
               else
                 Result := MatchPattern(@element[1],pattern);
          '?': Result := MatchPattern(@element[1],@pattern[1]);
          else
            if element^ = pattern^ then
              Result := MatchPattern(@element[1],@pattern[1])
            else
              Result := False;
          end;
        end;
      end;

    begin
      StrPCopy(pSource,source);
      StrPCopy(pPattern,pattern);
      Result := MatchPattern(pSource,pPattern);
    end;

[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]