Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pos & PosEx für Streams (https://www.delphipraxis.net/124186-pos-posex-fuer-streams.html)

jfheins 16. Nov 2008 14:11

Delphi-Version: -

Pos & PosEx für Streams
 
Da es doch einige gibt, die nicht so richtig warm werden mit Streams, hier mal 2 Funktionen, die wie Pos und PosEx funktionieren, nur eben mit Streams.

Die sind jetzt mehr für "Dummies" - also nicht auf Performance getrimmt ;)

PosStream gibt die erste Position des Suchstrings im Stream zurück.

PosExStream gibt die Position des ersten Vorkommens zurück, nach der übergebenen Position.

Die zurückgegebene Position ist nullbasiert (wie im Stream) - falls nicht gefunden wird -1 zurückgegeben.

Es wird dringend empfohlen, einen gepufferten Stream zu verwenden ;)

Delphi-Quellcode:
function PosStream(const Stream: TStream; needle: String) : Int64;
begin  
  Result := PosExStream(Stream, needle, -1);
end;


function PosExStream(const Stream: TStream; needle: String; position: Int64) : Int64;
var
  i: Integer;
  pos: Int64;
  pattern: String;
begin  
  Stream.Position := position + 1;
  setlength(pattern, length(needle));

  while (Stream.size - Stream.Position) >= length(needle) do
  begin
    pos := Stream.Position;
 
    Stream.ReadBuffer(pattern[1], length(needle));
     
    if comparemem(@pattern[1], @needle[1], length(needle)) then
    begin
      Result := pos;
      exit;
    end;
   
    Stream.position := pos + 1; // Wir müssen byteweise vorgehen
  end;
 
  Result := -1;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz