home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
339.lha
/
M2Lib
/
M2Lib.mod
< prev
next >
Wrap
Text File
|
1990-02-08
|
4KB
|
159 lines
MODULE M2Lib;
FROM Terminal IMPORT
WriteString, WriteLn;
FROM DOSFiles IMPORT
FileHandle, ModeReadOnly, ModeNewFile, FileInfoBlock, FileInfoBlockPtr,
Open, Close, Read, Write, Examine, Lock, Unlock;
FROM DOSLibrary IMPORT
DOSName, DOSBase;
FROM Libraries IMPORT
OpenLibrary, CloseLibrary;
FROM Memory IMPORT
AllocMem, MemReqSet, MemChip, FreeMem;
FROM Resident IMPORT
MatchWord;
FROM CommandLine IMPORT
CLStrings, GetCL;
FROM SYSTEM IMPORT
NULL, ADDRESS, TSIZE;
TYPE
PA=POINTER TO ADDRESS;
PI=POINTER TO INTEGER;
SearchBytes=
RECORD
CASE :INTEGER OF
0: sbChars:ARRAY[1..4] OF CHAR;|
1: sbAddr:ADDRESS;|
END;
END;
VAR
Buf:ADDRESS;
BufSize:LONGCARD;
FileIn,FileOut:FileHandle;
FileLock:LONGCARD;
Size:LONGINT;
FIB:FileInfoBlockPtr;
BufP,BufEnd:PA;
MatchP:PI;
Search:SearchBytes;
ArgCount:CARDINAL;
Args:ARRAY[ 0..5 ] OF CLStrings;
CONST
FileName=0;
LibName=1;
PROCEDURE Msg( VAR s:ARRAY OF CHAR);
BEGIN
WriteString(s);WriteLn;
END Msg;
BEGIN
IF GetCL( ArgCount , Args ) THEN
ELSE
Msg( 'Too many arguments');
RETURN;
END;
IF ArgCount # 2 THEN
Msg('Format is fixhunk object_file lib_file');
RETURN;
END;
WriteString('Object file:');WriteString(Args[ FileName ] );WriteLn;
WriteString('Library file:');WriteString(Args[ LibName ] );WriteLn;
WITH Search DO
sbChars[1]:='Z'; sbChars[2]:='X'; sbChars[3]:='C'; sbChars[4]:='V';
END;
DOSBase := OpenLibrary( DOSName , 0 );
FileLock := Lock(Args[ FileName ] , ModeReadOnly );
IF FileLock = 0 THEN
WriteString('Could not open ');Msg(Args[ FileName ] );
RETURN;
END;
FileOut := Open(Args[ LibName ] , ModeNewFile );
IF FileOut = 0 THEN
WriteString('Could not open ');Msg(Args[ LibName ] );
Unlock( FileLock );
RETURN;
END;
FIB := FileInfoBlockPtr( AllocMem( TSIZE( FileInfoBlock ) ,
MemReqSet{ MemChip } ) );
IF FIB = NULL THEN
Msg('Could not allocate FileInfoBlock');
Unlock( FileLock );
Close( FileOut );
RETURN;
END;
IF Examine( FileLock , FIB^ ) THEN
Unlock( FileLock );
BufSize := FIB^.fibSize + 100;
Buf := AllocMem( BufSize , MemReqSet{ MemChip } );
IF Buf # NULL THEN
FileIn := Open(Args[ FileName ] , ModeReadOnly );
Size := Read( FileIn , Buf , BufSize );
BufP := PA( Buf );
BufEnd := PA( LONGCARD(BufP)+BufSize );
WHILE ( ADDRESS(BufP) < ADDRESS(BufEnd) ) AND ( BufP^ # Search.sbAddr ) DO
BufP := PA( ADDRESS( BufP ) + ADDRESS( 2 ) );
END;
IF ADDRESS(BufP) >= ADDRESS(BufEnd) THEN
Msg('Could not find Resident structure');
Close( FileIn );
Close( FileOut );
FreeMem( FIB , TSIZE( FileInfoBlock ) );
FreeMem( Buf , BufSize );
RETURN;
END;
MatchP := PI( ADDRESS( BufP ) + ADDRESS( 4 ) );
MatchP^ := MatchWord;
BufP := PA( ADDRESS( BufP ) + ADDRESS( 6 ) );
BufP^ := BufP^ + ADDRESS( 4 );
MatchP := PI( ADDRESS( BufP ) + ADDRESS( 18 ) );
MatchP^ := 0;
FileOut := Open(Args[ LibName ] , ModeNewFile );
IF FileOut = 0 THEN
WriteString('Could not open ');Msg(Args[ LibName ] );
Close( FileIn );
FreeMem( FIB , TSIZE( FileInfoBlock ) );
FreeMem( Buf , BufSize );
RETURN;
END;
Size := Write( FileOut , Buf , LONGCARD( Size ) );
IF Size = -1 THEN
WriteString('Could not write to ');Msg(Args[ LibName ] );
Close( FileIn );
Close( FileOut );
FreeMem( FIB , TSIZE( FileInfoBlock ) );
FreeMem( Buf , BufSize );
RETURN;
END;
Close( FileIn );
Close( FileOut );
FreeMem( FIB , TSIZE( FileInfoBlock ) );
FreeMem( Buf , BufSize );
ELSE
Msg('Could not allocate buffer space to hold objectfile');
FreeMem( FIB , TSIZE( FileInfoBlock ) );
Close( FileOut );
RETURN;
END;
ELSE
FreeMem( FIB , TSIZE( FileInfoBlock ) );
Close( FileOut );
Msg('Could not lock objectfile');
END;
CloseLibrary( DOSBase );
Msg('Successful');
END M2Lib.