| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- MODULE Append;
- IMPORT Drectory;
- IMPORT HandleIO;
- IMPORT StringIO;
- IMPORT LowLevel;
- IMPORT M2Strings;
- IMPORT Numbers;
- IMPORT NumTypes;
- IMPORT EnvironUtils;
- IMPORT VStorage;
- (*
- IMPORT InitJPI;
- *)
- PROCEDURE AppendToFile(OldHandle : CARDINAL; DestFileName : ARRAY OF CHAR) :
- CARDINAL;
- TYPE
- memptr =
- RECORD
- addr : LowLevel.Address8086;
- size : CARDINAL;
- END;
- VAR
- TheDrive : CHAR;
- MemoryPtr : memptr;
- NewHandle : CARDINAL;
- SavedMessage : CARDINAL;
- FreeBytes, FileSize, DestSize, BytesToRead : LONGINT;
- PROCEDURE ReadOldFile(VAR MemoryPtr : memptr);
- VAR
- BytesAvailable : CARDINAL;
- rgstr : LowLevel.regpack;
- BEGIN
- (*ReadOldFile*)
- IF BytesToRead <= Numbers.Lc( 0 ) THEN
- MemoryPtr.addr.x := NIL;
- RETURN;
- END;
- BytesAvailable := EnvironUtils.MemAvail( 10000);
- WITH MemoryPtr DO
- IF BytesToRead > Numbers.Lc( BytesAvailable ) THEN
- size := BytesAvailable;
- ELSE
- size := Numbers.C( BytesToRead );
- END;
- VStorage.DosAlloc(addr.a, size);
- rgstr.c.x := size;
- (*CX gets number of bytes to read.*)
- rgstr.a.h := CHR(3FH);
- (*DOS Read From file Code*)
- rgstr.b.x := OldHandle;
- rgstr.d.x := addr.off;
- rgstr.ds := addr.seg;
- END;
- LowLevel.msdos(rgstr);
- IF LowLevel.FlaggedError(rgstr.flags) THEN
- StringIO.PrintMessage(StringIO.MessageType(rgstr.a.l));
- ELSE
- BytesToRead := BytesToRead - Numbers.Lc( MemoryPtr.size );
- (* Can't use DEC here because JPI doesn't allow LONGINTs
- to be decremented by CARDINAL values. *)
- END;
- END ReadOldFile;
- PROCEDURE WriteNewFile(MemoryPtr : memptr);
- VAR
- rgstr : LowLevel.regpack;
- BEGIN
- (*WriteNewFile*)
- IF MemoryPtr.addr.x=NIL THEN
- RETURN;
- END;
- rgstr.b.x := NewHandle;
- rgstr.c.x := MemoryPtr.size;
- rgstr.ds := MemoryPtr.addr.seg;
- rgstr.d.x := MemoryPtr.addr.off;
- rgstr.a.h := CHR(40H);
- (*Write to a file or device.*)
- LowLevel.msdos(rgstr);
- IF rgstr.a.x<rgstr.c.x THEN
- (*if fewer than c.x bytes were actually written*)
- SavedMessage := HandleIO.CloseHandle(NewHandle);
- StringIO.WriteEol(StringIO.outp, '');
- StringIO.WriteStr(StringIO.outp, 'No room.');
- HALT();
- END;
- VStorage.DosDealloc(MemoryPtr.addr.x, MemoryPtr.size);
- END WriteNewFile;
- BEGIN
- (*AppendToFile*)
- DestSize := Numbers.Lc( 0 );
- FileSize := HandleIO.FileLength(OldHandle);
- BytesToRead := FileSize;
- IF M2Strings.Pos(':',DestFileName)=(1) THEN
- TheDrive := DestFileName[0];
- ELSE
- TheDrive := 'Z';
- (*Determines the drive to which we're copying.
- 'Z' means "default drive" to FreeDiskSpace.*)
- END;
- SavedMessage := Drectory.FreeDiskSpace(TheDrive,FreeBytes);
- IF SavedMessage # StringIO.NoError THEN
- RETURN SavedMessage;
- END;
- SavedMessage := HandleIO.OpenFile(NewHandle,DestFileName);
- IF SavedMessage = StringIO.NoError THEN
- DestSize := HandleIO.FileLength(NewHandle);
- ELSE
- RETURN SavedMessage;
- END;
- IF FileSize > FreeBytes THEN
- SavedMessage := StringIO.AccessDenied;
- (*This will have to stand for 'Not enough room.'*)
- RETURN SavedMessage;
- END;
- HandleIO.SetFilePtr( NewHandle, HandleIO.FromEnd, NumTypes.L0 );
- IF SavedMessage # StringIO.NoError THEN
- RETURN SavedMessage;
- END;
- REPEAT
- ReadOldFile(MemoryPtr);
- WriteNewFile(MemoryPtr);
- UNTIL BytesToRead <= Numbers.Lc( 0 );
- RETURN HandleIO.CloseHandle(NewHandle);
- END AppendToFile;
- VAR
- fname1, fname2: ARRAY [0..79] OF CHAR;
- OldHandle : CARDINAL;
- BEGIN
- IF NOT EnvironUtils.ParsedParam( 1, fname1 ) THEN
- StringIO.WriteStr( StringIO.outp, 'Dest file: ' );
- StringIO.ReadStr( StringIO.inp, fname1 );
- END;
- IF NOT EnvironUtils.ParsedParam( 2, fname2 ) THEN
- StringIO.WriteStr( StringIO.outp, 'Srce file: ' );
- StringIO.ReadStr( StringIO.inp, fname2 );
- END;
- IF HandleIO.OpenFile( OldHandle, fname2 ) = StringIO.NoError THEN
- IF AppendToFile( OldHandle, fname1 ) = StringIO.NoError THEN
- IF HandleIO.CloseHandle( OldHandle ) = StringIO.NoError THEN
- StringIO.PrintMessage( Drectory.DeleteFile( fname2 ) );
- END;
- ELSE
- StringIO.WriteStr( StringIO.outp, 'Could not append to ' );
- StringIO.WriteStr( StringIO.outp, fname1 );
- END;
- ELSE
- StringIO.WriteStr( StringIO.outp, fname2 );
- StringIO.WriteStr( StringIO.outp, ' not found.' );
- END;
- END Append.
|