home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
375.lha
/
IncrStorageManager_v1.0
/
HandleCollection.mod
< prev
next >
Wrap
Text File
|
1990-05-02
|
3KB
|
117 lines
IMPLEMENTATION MODULE HandleCollection;
(* Product: Incremental Storage Manager
Version: 1.0
Author:
Daniel B. Hankins
143 Montgomery Street
Poughkeepsie, NY 12601
dan-hankins@cup.portal.com
Creation Date: 1989
Release Date: November 21, 1989
Notice of Intellectual Property:
This material is *NOT COPYRIGHTED*. By this notice, I hereby place
this program and all its parts in the public domain, under the definitions
and restrictions of United States law.
History of Revisions:
None yet.
*)
FROM SYSTEM IMPORT ADDRESS, TSIZE, ADR;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
IMPORT DynamicItem;
IMPORT FreeHandle;
CONST
NumberOfHandlesInBlock = 255;
TYPE
HandleBlockPtr = POINTER TO HandleBlock;
HandleBlock = RECORD
Next: HandleBlockPtr;
Contents: ARRAY[1..NumberOfHandlesInBlock]
OF DynamicItem.Object;
END;
VAR
FirstFreeHandle: FreeHandle.Object;
CurrentHandleInBlock: ADDRESS;
CurrentHandlesLeft: CARDINAL;
FirstBlock: HandleBlockPtr;
PROCEDURE NewHandle(): ADDRESS;
VAR
NewItemHandle: DynamicItem.Object;
NewBlock: HandleBlockPtr;
BEGIN
IF NOT(FreeHandle.Nil(FirstFreeHandle)) THEN
NewItemHandle := DynamicItem.Object(FirstFreeHandle);
FirstFreeHandle := FreeHandle.Next(FirstFreeHandle);
RETURN ADDRESS(NewItemHandle);
END;
IF CurrentHandlesLeft > 0 THEN
NewItemHandle := DynamicItem.Object(CurrentHandleInBlock);
CurrentHandleInBlock :=
ADDRESS(LONGCARD(CurrentHandleInBlock) + TSIZE(DynamicItem.Object));
CurrentHandlesLeft := CurrentHandlesLeft - 1;
RETURN ADDRESS(NewItemHandle);
ELSE
ALLOCATE(NewBlock, TSIZE(HandleBlock));
IF NewBlock = NIL THEN
RETURN NIL;
END;
NewBlock^.Next := FirstBlock;
FirstBlock := NewBlock;
NewItemHandle := DynamicItem.Object(ADR(NewBlock^.Contents));
CurrentHandleInBlock :=
ADDRESS(LONGCARD(NewItemHandle) + TSIZE(DynamicItem.Object));
CurrentHandlesLeft := NumberOfHandlesInBlock - 1;
RETURN ADDRESS(NewItemHandle);
END;
END NewHandle;
PROCEDURE DisposeHandle(Item: ADDRESS);
VAR
TempItem: POINTER TO FreeHandle.Object;
BEGIN
TempItem := Item;
TempItem^ := FirstFreeHandle;
FirstFreeHandle := FreeHandle.Object(Item);
END DisposeHandle;
PROCEDURE DisposeAll();
VAR
CurrentBlock, Temp: HandleBlockPtr;
BEGIN
CurrentBlock := FirstBlock;
LOOP
IF CurrentBlock = NIL THEN
EXIT;
END;
Temp := CurrentBlock^.Next;
DEALLOCATE(CurrentBlock, TSIZE(HandleBlock));
CurrentBlock := Temp;
END;
FirstFreeHandle := FreeHandle.NilObject();
CurrentHandleInBlock := NIL;
CurrentHandlesLeft := 0;
FirstBlock := NIL;
END DisposeAll;
BEGIN
FirstFreeHandle := FreeHandle.NilObject();
CurrentHandleInBlock := NIL;
CurrentHandlesLeft := 0;
FirstBlock := NIL;
END HandleCollection.