home *** CD-ROM | disk | FTP | other *** search
- {
- 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;
-