title: Efficient way to find a string in a stream in Delphi
body: <p>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)</p>
  
  <pre><code>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] &lt;&gt; 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;
  </code></pre>
  
  <p>Can someone supply a procedure that is more efficient? </p>