Efficient way to find a string in a stream in Delphi

Viewed 2942

I have come up with this function to return the number of occurrences of a string in a Delphi Stream. However, I suspect there is a more efficient way to achieve this, since I am using "higher level" constructs (char), and not working at the lower byte/pointer level (which I am not that familiar with)

function ReadStream(const S: AnsiString; Stream: TMemoryStream): Integer;
var
  Arr: Array of AnsiChar;
  Buf: AnsiChar;
  ReadCount: Integer;

  procedure AddChar(const C: AnsiChar);
  var
    I: Integer;
  begin
    for I := 1 to Length(S) - 1 do
      Arr[I] := Arr[I+1];
    Arr[Length(S)] := C;
  end;

  function IsEqual: Boolean;
  var
    I: Integer;
  begin
    Result := True;
    for I := 1 to Length(S) do
      if S[I] <> Arr[I] then
      begin
        Result := False;
        Break;;
      end;
  end;

begin
  Stream.Position := 0;
  SetLength(Arr, Length(S));
  Result := 0;
  repeat
    ReadCount := Stream.Read(Buf, 1);
    AddChar(Buf);
    if IsEqual then
      Inc(Result);
  until ReadCount = 0;
end;

Can someone supply a procedure that is more efficient?

2 Answers
Related