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

    { 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 <Source_File> <Destination_File>');
        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.

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