Unit expfht;

  { Author: Trevor J Carlsen  Released into the public domain }
  {         PO Box 568                                        }
  {         Port Hedland                                      }
  {         Western Australia 6721                            }
  {         Voice +61 91 732 026                              }

  { EXPFHT: This Unit allows an application to expand the number of File }
  { handles in use. It is limited to the number permitted by Dos and     }
  { initialised in the FileS= of the config.sys File.                    }

Interface

Const
  NumbFiles= 105;
  { Set to the number of File handles needed. 99 will be the max With }
  { Dos 2.x and 254 With Dos 3.x. (I don't know why not 255!)         }
Type
  fht      = Array[1..NumbFiles] of Byte;
Var
  NewFHT   : fht;
  OldFHT   : LongInt;
  OldSize  : Word;
                    
Function MakeNewFHT: Boolean;
Procedure RestoreOldFHT;


Implementation

Const
  Successful : Boolean = False;

Var
  OldExitProc  : Pointer;

{$R-}
Function MakeNewFHT : Boolean;
  { create a new expanded File handle table - True if successful }
  Const
    AlreadyUsed : Boolean = False;
  begin
    if not AlreadyUsed then begin
      AlreadyUsed := True;
      MakeNewFHT := True;
      Successful := True;
      OldFHT  := MemL[PrefixSeg:$34];            { Store the old FHT address }
      FillChar(NewFHT,NumbFiles,$ff);              { Fill new table With 255 }
      Oldsize := MemW[PrefixSeg:$32];               { Store the old FHT size }
      MemW[PrefixSeg:$32] := NumbFiles;            { Put new size in the psp }
      MemL[PrefixSeg:$34] := LongInt(@NewFHT);      { new FHT address in psp }
      move(Mem[PrefixSeg:$19],NewFHT,$15);      { put contents of old to new }
    end { if not AllreadyUsed }
    else MakeNewFHT := False;
  end; { MakeNewFHT }
{$R+}

{$F+}
Procedure RestoreOldFHT;
  begin
    ExitProc := OldExitProc;
    if Successful then begin
      MemW[PrefixSeg:$32] := OldSize;
      MemL[PrefixSeg:$34] := OldFHT;
    end;  
  end;
{$F-}

begin
  OldExitProc := ExitProc;
  ExitProc    := @RestoreOldFHT;
end.

