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

{
HAGEN LEHMANN
> Can someone help me make a search Procedure that will read
> from a Record format, from the disk!!!

The easiest way to search a Record in a File is to read the Records from File
and compare them With the Record that is to be searched.

if you simply want to search For a String then I've got something For you. ;-)
Look at this Function:
}
Function Search(SearchFor : String; FileName  : String) : LongInt;
Var
  F               : File;
  Pos,Dummy       : LongInt;
  BufSize,ReadNum : Word;
  Buffer          : ^Byte;
  Found           : Boolean;

  Function SearchString(Var Data; Size : Word; Str  : String) : LongInt;
  Var
    S     : String;
    Loop  : LongInt;
    Found : Boolean;
    L     : Byte Absolute Str;
  begin
    Loop  := -1;
    Found := False;
    if L > 0 Then   { I don't search For empty Strings, I'm not crazy }
    Repeat
      Inc(Loop);
      { convert buffer into String }
      Move(Mem[Seg(Data) : Loop], Mem[Seg(S) : Ofs(S) + 1], L + 1);
      S[0] := Char(L);
      if S = Str Then
        Found := True;             { search For String }
    Until Found Or (Loop = Size - L);
    if Found Then
      SearchString := Loop   { that's the File position }
    else
      SearchString := -1;    { I couldn't find anything }
  end;

begin
  Search := -1;
  if MaxAvail > 65535 Then
    BufSize := 65535   { check available heap }
  else
    BufSize := MaxAvail;
  if (BufSize > 0) And (BufSize > Length(SearchFor)) Then
  begin
    GetMem(Buffer, BufSize);               { reserve heap For buffer }
    Assign(F, FileName);
    Reset(F, 1);                                         { open File }
    if IOResult = 0 Then
    begin
      Pos   := 0;
      Found := False;
      Repeat
        BlockRead(F, Buffer^, BufSize, ReadNum);          { read buffer }
        if ReadNum > 0 Then                             { anything ok? }
        begin
          Dummy := SearchString(Buffer^, ReadNum, SearchFor);
          if Dummy <> -1 Then                   { String has been found }
          begin
            Found := True;                            { set found flag }
            Inc(Pos, Dummy);
          end
          else
          begin
            Inc(Pos, ReadNum - Length(SearchFor));
            Seek(F, Pos);                       { set new File position }
          end;
        end;
      Until Found Or (ReadNum <> BufSize);
      if Found Then
        Search := Pos            { String has been found }
      else
        Search := -1;         { String hasn't been found }
      Close(F);
    end;
    Release(Buffer);                        { release reserved heap }
  end;
end;


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