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 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.