Contributor: MARK LEWIS               

{ MARK LEWIS }

PROGRAM EMSCopy;

USES
  Objects;  {The Object unit is need to access TStream}

VAR
  InFile,
  OutFile   : PStream;       {Pointer to InPut/OutPut Files}
  EmsStream : PStream;       {Pointer to EMS Memory Block}
  InPos     : LongInt;       {Where are we in the Stream}

BEGIN
  Writeln;
  Writeln('                  EMSCopy v1.00');
  Writeln;
  Writeln('{ Mangled together from code in the FIDO PASCAL Echo }');
  Writeln('{ Assembled by Mark Lewis                            }');
  Writeln('{ Some ideas and code taken from examples by         }');
  Writeln('{ DJ Murdoch and Todd Holmes                         }');
  Writeln('{ Released in the Public Domain                      }');
  Writeln;
  If ParamCount < 2 Then
  Begin
    Writeln('Usage: EMSCopy  ');
    Halt(1);
  End;

  Infile := New(PBufStream, init(paramstr(1), stOpenRead, 4096));
  If (InFile^.Status <> stOK) Then
  Begin
    Writeln(#7, 'Error! Source File Not Found!');
    InFile^.Reset;
    Dispose(InFile, Done);
    Halt(2);
  End;

  Outfile := New(PBufStream, init(paramstr(2), stCreate, 4096));
  If (OutFile^.Status <> stOK) Then
  Begin
    Writeln(#7,'Error! Destination File Creation Error!');
    OutFile^.Reset;
    Dispose(OutFile, Done);
    Halt(3);
  End;

  EmsStream := New(PEmsStream, Init (16000, InFile^.GetSize));
  If (EmsStream^.Status <> stOK) Then
  Begin
    Writeln(#7, 'Error! EMS Allocation Error!');
    Writeln('At Least One Page of EMS Required :(');
    EmsStream^.Reset;
    Dispose(EmsStream, Done);
    Halt(4);
  End;

  Writeln('InPut File Size : ', InFile^.Getsize : 10, ' Bytes');
  InPos := EmsStream^.GetSize;
  Repeat
    Write('Filling EMS Buffer...     ');
    EmsStream^.CopyFrom(InFile^, InFile^.GetSize - InPos);
    if (EmsStream^.Status <> stOK) then
      EmsStream^.Reset;

    InPos := InPos + EmsStream^.GetSize;
    Write(EmsStream^.GetSize : 10, ' Bytes   ');
    EmsStream^.Seek(0);
    Write('Writing DOS File... ');
    OutFile^.CopyFrom(EmsStream^, EmsStream^.GetSize);
    Writeln(OutFile^.Getsize : 10, ' Bytes');
    If (InFile^.Status <> stOK) Then
      InFile^.Reset;
    If (OutFile^.GetSize < InFile^.GetSize) Then
    Begin
      EmsStream^.Seek(0);
      EmsStream^.Truncate;
      InFile^.Seek(InPos);
    End;
  Until (OutFile^.GetSize = InFile^.GetSize);
  Writeln('Done!');
  DISPOSE(InFile, Done);
  DISPOSE(OutFile, Done);
  DISPOSE(EmsStream, Done);
END.