Unit WGTFile; {TextFile Reader for CRLF or LF TEXT FILES!}
              {eventually this unit will be a decendant of WGBFILE!}

{$I WGDEFINE.INC}  { SEE WGFFIND.PAS for this include }

Interface

Uses
   WGBFile,
{$IFDEF WINDOWS}
   WinDos;
{$ELSE}
   Dos;
{$ENDIF}

Type
   TFile = Object
      Decendant:FFileObj; {short cut for now!}
      StringFound:Boolean;
      MyIOResult:Word;
      Constructor Init(BSize:Word);
      Destructor Done;
      Procedure Open(FilePath:String); Virtual;
      Procedure CloseFile; Virtual;
{      Function  EraseFile; Virtual;}
      Function  GetString:String;             {Get CRLF string from file}
      Function  GetUString:String;            {Get LF delimited string}
      Function  Found:Boolean;                {Was a string found}
      Function  SeekFile(SeekPos:LongInt):Boolean; {Seek to position}
      Function  FilePos:LongInt;              {Get text file position}
      Function  RawSize:LongInt;              {Get text file position}
   End;

Implementation

Constructor TFile.Init(BSize:Word);
Begin
   Decendant.Init(BSize);
   If Decendant.MyIOResult<>0 then Fail;
   MyIOResult:=0;
   StringFound:=False;
End;

Destructor TFile.Done;
Begin
   If Decendant.IsOpen then Decendant.CloseFile;
   Decendant.Done;
   StringFound:=False;
End;

Procedure TFile.Open(FilePath:String);
Begin
   Decendant.Open(FilePath,fmReadOnly+fmDenyNone);
   MyIOResult:=Decendant.MyIOResult;
End;

Procedure TFile.CloseFile;
Begin
   Decendant.Closefile;
   MyIOResult:=Decendant.MyIOResult;
End;

Function  TFile.GetString:String;
Var
   TempStr:String;
   GDone:Boolean;
   Ch:Char;
   NRead:Word;

Begin
   TempStr:='';
   StringFound:=False;
   If Decendant.FilePos>=Decendant.RawSize then GDone:=True
   Else GDone:=False;
   While Not GDone Do Begin
      Decendant.BlkRead(Ch,1,NRead);
      MyIOResult:=Decendant.MYIOResult;
      If (MYIOResult<>0) or (NRead<>1) then Ch:=#0;
      Case Ch Of
 #0:If Decendant.FilePos>=Decendant.RawSize Then GDone:=True
       Else Begin
       Inc(TempStr[0]);
       TempStr[Ord(TempStr[0])]:=Ch;
       StringFound:=True;
       If Length(TempStr)=255 Then GDone:=True;
    End;
 #10:;
 #26:;
 #13: Begin
      GDone:=True;
      StringFound:=True;
      End;
      Else Begin
    Inc(TempStr[0]);
    TempStr[Ord(TempStr[0])]:=Ch;
    StringFound:=True;
    If Length(TempStr)=255 Then GDone:=True;
      End;
      End; {case}
   End;
   GetString:=TempStr;
End;

Function  TFile.GetUString:String;
Var
   TempStr:String;
   GDone:Boolean;
   Ch:Char;
   NRead:Word;

Begin
   TempStr:='';
   StringFound:=False;
   If Decendant.FilePos>=Decendant.RawSize then GDone:=True
   Else GDone:=False;
   While Not GDone Do Begin
      Decendant.BlkRead(Ch,1,NRead);
      MyIOResult:=Decendant.MYIOResult;
      If (MYIOResult<>0) or (NRead<>1) then Ch:=#0;
      Case Ch Of
      #0:If Decendant.FilePos>=Decendant.RawSize Then GDone:=True
  Else Begin
     Inc(TempStr[0]);
     TempStr[Ord(TempStr[0])]:=Ch;
     StringFound:=True;
     If Length(TempStr)=255 Then GDone:=True;
  End;
      #13:;
      #26:;
      #10:Begin
        GDone:=True;
        StringFound:=True;
        End;
      Else Begin
    Inc(TempStr[0]);
    TempStr[Ord(TempStr[0])]:=Ch;
    StringFound:=True;
    If Length(TempStr)=255 Then GDone:=True;
      End;
      End; {case}
   End;
   GetUString:=TempStr;
End;

Function  TFile.Found:Boolean;
Begin
   Found:=StringFound;
End;

Function  TFile.SeekFile(SeekPos:LongInt):Boolean; {Seek to position}
Begin
   Decendant.SeekFile(SeekPos);
   MyIOResult:=Decendant.MyIOResult;
End;

Function  TFile.FilePos:LongInt;              {Get text file position}
Begin
   FilePos:=Decendant.FilePos;
End;

Function  TFile.RawSize:LongInt;              {Get text file position}
Begin
   RawSize:=Decendant.RawSize;
End;

End.
